20253917 2025-2026-2 《网络攻防实践》实践8报告

动手实践任务一

对提供的rada恶意代码样本,进行文件类型识别,脱壳与字符串提取,以获得rada恶意代码的编写作者,具体操作如下:
PEiD查壳,存在UPX壳,子系统为Win32 GUI
image
使用winattacker中的超级巡警脱壳机进行脱壳,左侧为源文件以及脱壳后的文件
image
其为32位程序,所以拖到IDA32位中去打开
在右侧将整体文件拖到最上测,能看到文件的一些基本信息
image
使用shift+f12打开IDA的字符串工具,具体显示如下
image
向下进行翻阅发现了版权信息其作者为:Raul Siles && David Perez

JDR0:00403F7A	0000001E	C	(c) Raul Siles && David Perez

image

动手实践任务二:分析Crackme程序

Crackme1

image

入口函数处具体分析如下

var_8= dword ptr -8
var_4= dword ptr -4
argc= dword ptr  8
argv= dword ptr  0Ch
envp= dword ptr  10h
push    ebp
mov     ebp, esp
sub     esp, 8
and     esp, 0FFFFFFF0h
mov     eax, 0
add     eax, 0Fh
add     eax, 0Fh
shr     eax, 4
shl     eax, 4
mov     [ebp+var_8], eax
mov     eax, [ebp+var_8]
call    __alloca
call    ___main
cmp     [ebp+argc], 2 #比较参数数量是否为2,包含本身函数名,也就是说在正常运行时使用cmd ./crackme1.exe 2 后方应该跟一个参数
jz      short loc_4012D2 #判定成功后进入下一个函数也就是 loc_4012D2

接下来我们对loc_4012D2进行分析
image

loc_4012D2:
mov     eax, [ebp+argv]       #
add     eax, 4
sub     esp, 8
push    offset Str2     ; "I know the secret"  #压栈参数2,Str2
push    dword ptr [eax] ; Str1 #压栈参数1,Str1
call    _strcmp                #对比Str2与Str1 是否相同
add     esp, 10h
test    eax, eax
jz      short loc_401310       #跳转到函数loc_401310 该函数主要输出内容“You know how to speak to programs, Mr.” 逆向成功

如果不想看汇编,新版的IDA可以使用f5查看反汇编后的C语言代码
本质上来讲,该程序,判断程序运行时后方紧跟的参数内容是否为"I know the secret"
也就是说要破解该程序只需要在cmd中使用./crackme1.exe "I know the secret" 即可

int __cdecl main(int argc, const char **argv, const char **envp)
{
  void *v3; // esp
  int v5; // [esp+4h] [ebp-4h]

  v3 = alloca(16);
  __main(16);
  if ( argc == 2 )
  {
    if ( !strcmp(argv[1], "I know the secret") )
    {
      printf("You know how to speak to programs, Mr. Reverse-Engineer\n");
      v5 = 0;
    }
    else
    {
      fprintf(&__iob[2], "Pardon? What did you say?\n");
      v5 = 2;
    }
  }
  else
  {
    fprintf(&__iob[2], "I think you are missing something.\n");
    v5 = 1;
  }
  return v5;
}

Crackme2

IDA使用32位打开程序后,使用F5进行反汇编具体反编译程序如下
有了之前crackme1 的经验我们知道,该程序,先是判断程序名是否为crackmeplease.exe
随后验证方式便是与crackme1 一致判断后续紧跟参数是否为"I know the secret"

int __cdecl main(int argc, const char **argv, const char **envp)
{
  void *v3; // esp
  int v5; // [esp+10h] [ebp-8h]
  unsigned int i; // [esp+14h] [ebp-4h]

  v3 = alloca(16);
  __main();
  if ( argc == 2 )
  {
    if ( !strcmp(*argv, "crackmeplease.exe") )
    {
      if ( !strcmp(argv[1], "I know the secret") )
      {
        for ( i = 0; i <= 0x21; ++i )
          putchar((char)(byte_403080[i] ^ 0x42));
        puts(Buffer);
        v5 = 0;
      }
      else
      {
        fprintf(&__iob[2], "Pardon? What did you say?\n");
        v5 = 3;
      }
    }
    else
    {
      fprintf(&__iob[2], "I have an identity problem.\n");
      v5 = 2;
    }
  }
  else
  {
    fprintf(&__iob[2], "I think you are missing something.\n");
    v5 = 1;
  }
  return v5;
}

先对文件进行改名更改为crackmeplease.exe,随后使用cmd 执行,后方紧跟第一个参数"I know the secret"
结果如下所示
image
我们还能怎么做去拿到这个信息呢?
请看这里,下方使用的是puts(Buffer)函数,如果我们要拿到这个信息,就需要查看for循环内到底做了什么,
也非常简单他将byte_403080[i]与 0x42进行异或。

      if ( !strcmp(argv[1], "I know the secret") )
      {
        for ( i = 0; i <= 0x21; ++i )
          putchar((char)(byte_403080[i] ^ 0x42));
        puts(Buffer);
        v5 = 0;
      }

先在Ida中双击byte_403080[i] 查看里面到底存了什么东西

.rdata:00403080 byte_403080     db 15h, 27h, 62h, 2Ah, 23h, 34h, 27h, 62h, 23h, 62h, 2Eh
.rdata:00403080                                         ; DATA XREF: _main+E4↑o
.rdata:00403080                 db 2Bh, 2 dup(36h), 2Eh, 27h, 62h, 31h, 27h, 21h, 30h
.rdata:00403080                 db 27h, 36h, 78h, 62h, 1, 2Ah, 2Dh, 21h, 2Dh, 2Eh, 23h
.rdata:00403080                 db 36h, 27h, 0

也就是说里面存放着这些16进制数我们需要所做的就是利用这些16进制数和0x42进行异或即可,我们编写C++语言脚本

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int a[0x21]={0x15, 0x27, 0x62, 0x2A, 0x23, 0x34, 0x27, 0x62, 0x23, 0x62, 0x2E,
				0x2B, 0x36, 0x2E, 0x27, 0x62, 0x31, 0x27, 0x21, 0x30,
				0x27, 0x36, 0x78, 0x62, 0x1, 0x2A, 0x2D, 0x21, 0x2D, 0x2E, 0x23,
				0x36, 0x27}; //原数据转16进制
	char Buffer[0x21]={'\0'}; //\0截断字符串
	for ( int i = 0; i < 0x21; ++i )
        putchar((char)(a[i] ^ 0x42)); //异或
    puts(Buffer);

} 

其输出结果如下与我们正常逆向一致:
image

分析实践任务一:

具体脱壳操作与上方实验动手实践任务一相同,这程序实际上不是C语言写的而是VBA写的,所以用IDA看反汇编代码实际上是有一点问题的,就不要用F5自动反汇编了

  1. 提供对这个二进制文件的摘要,包括可以帮助识别同一样本的基本信息;
    使用Rada放入IDA中进行分析,在文件头部可以查看到相关信息其未脱壳情况下的摘要如下
    image

使用微步云沙箱对源文件进行分析
image
大概率能知道,他在做什么,首先是注册表问题,一般情况下创建注册表是为了维持后门程序的持久化也就是开机自启动
同时里面还涉及到了一个异常的ip地址10.10.10.10,这是作者所设置的一个用来通信的地址。
此时在虚拟机中使用进程观测以及wireshark,并打开我们的rada程序,在右侧wireshark监控中能够明显的看到存在着向外访问的情况也就是10.10.10.10这个IP地址
image
对该IP进行TCP流追踪:其使用GET请求访问了/RaDa/RaDa_commands.html,
在url大概可知,该程序在利用宿主机,请求远程服务器上所发出的指令,但因为实际上并不存在这么一个服务器所以没有任何情况发生

image
在运行一段时间后弹出了窗口因为没有任何数据返回他报错了
image
我们回到IDA中查看该函数的汇编信息:
该函数sub_404FB0,很明显有相关的ip信息10.10.10.10,其中字段也出现了download 以及 upload,可以推测该程序实际上还有向目标服务器上传于下载文件的功能
image
对于下一个函数,其中出现了IE浏览器相关的参数
image
接下来我们需要查看的是一个比较关键的函数sub_405E40
其调用关系如下:
image
其下方有很多的参数可选,我们可以对各个参数进行使用
image
以下是使用--help 的结果其中有作者信息以及密网网关的网址
image
我们尝试使用--gui命令成功进入了他的可视化界面,在原来他的程序默认是后台执行
image

就先做这么多分析,剩下的可以自行测试
2、找出并解释这个二进制文件的目的;
远程后门执行,持久化保持
3、识别并说明这个二进制文件所具有的不同特性;
默认情况下为后台运行,但实际上存在gui窗体,同时程序使用VBA编写,期间还使用了IE浏览器
4、识别并解释这个二进制文件中所采用的防止被分析或逆向工程的技术;
UPX 与手动修改
5、对这个恶意代码样本进行分类(病毒、蠕虫等),并给出你的理由;
算不上蠕虫和病毒,是一个远程的后门控制
6、给出过去已有的具有相似功能的其他工具;
bobax 2004年木马 也是同样借助http服务来进行攻击
7、可能调查处这个二进制文件的开发作者吗?如果可以,在什么样的环境和什么样的限定条件下?
可以使用Rada.exe --authors 进行查看,不过默认请款修改不会泄露信息

分析实践任务二:

暂时留空
Windows 2000系统被攻破并加入僵尸网络
学习通下载相关文件botnet_pcap_file.data 并更改文件后缀名为.pcap

任务:分析的数据源是用Snort工具收集的蜜罐主机5天的网络数据源,并通过编辑去除了一些不相关的流量并将其组合到了单独的一个二进制网络日志文件中,同时IP地址和其他特定敏感信息都已经被混淆以隐藏蜜罐主机的实际身份和位置。回答下列问题:

1、IRC是什么?当IRC客户端申请加入一个IRC网络时将发送那个消息?IRC一般使用那些TCP端口?
IRC采用客户端-服务器模式,一个服务器可以连接其他IRC服务器来扩展成更大的IRC网络。用户使用IRC客户端(如mIRC、Irssi、HexChat等)连接到服务器,进入不同的“频道”(以#开头的聊天室),与频道内的其他成员进行文字交流,也支持一对一私聊和文件共享。由于其轻量、高效和开放的特性,IRC一直是开源社区、技术爱好者和开发者的重要沟通工具。
当IRC客户端向服务器发起连接请求时,需要发送一系列特定的命令来完成“握手”和身份验证。这个初始过程被称为连接注册序列。这个序列的关键命令包括:

  • PASS:发送连接密码。这通常用于客户端向受密码保护的服务器提供认证信息,是一个可选步骤。
  • NICK:设置用户的昵称(Nickname)。这是必需的,用户不能以“匿名”身份存在。
  • USER:提供用户的身份信息,格式为 USER <用户名> <主机名> <服务器名> <真实名>。这也是必需的。
  • IRC 默认使用TCP 6667端口

2、僵尸网络是什么?僵尸网络通常用于什么?
僵尸网络(Botnet)是指攻击者通过恶意软件(如木马、蠕虫)感染大量联网设备(如电脑、手机、路由器、物联网设备等),将这些设备变成可被远程控制的“僵尸”(Bot)。这些被控制的设备形成一个由攻击者(常称为“僵尸网络控制者”或“Bot Master”)统一指挥的网络,可在用户不知情的情况下执行各种恶意指令。

  • 僵尸网络的用途多为非法牟利或发起网络攻击,常见的用途包括:
  • 分布式拒绝服务攻击(DDoS):控制成千上万的僵尸同时向目标服务器发送海量请求,导致其网络资源耗尽、无法正常服务。
  • 垃圾邮件发送:利用僵尸网络大量发送垃圾邮件、钓鱼邮件或传播勒索软件。
  • 点击欺诈/广告欺诈:模拟真实用户的点击行为,骗取广告平台的点击费用,或通过自动化点击降低竞争对手广告效果。
  • 加密货币挖矿:在用户不知情的情况下占用僵尸设备的计算资源进行加密货币(如门罗币)挖矿。
  • 数据窃取与间谍活动:收集僵尸设备上的敏感信息(如密码、银行卡号、浏览器记录)并回传给控制者。
  • 代理/流量转发:利用僵尸网络作为跳板,隐藏攻击者的真实IP地址,从而进行其他非法活动(如撞库、入侵网站)。
  • 勒索软件分发:向大量设备推送勒索软件,加密用户文件后索要赎金。
  • 传播更多恶意软件:利用已被控制的僵尸作为“繁殖站”,进一步感染更多设备,扩大僵尸网络规模。
  • 现代僵尸网络(如Mirai、Emotet、Trickbot等)通常采用P2P架构或加密通信来抵抗传统检测与关闭手段,危害极大。
  1. 蜜罐主机(IP地址:172.16.134.191)与那些IRC服务器进行了通信?

wireshark中使用ip.src == 172.16.134.191 and tcp.port==6667 进行筛选
并打开分析,端点,勾选显示过滤器的限制,可得到如下结果
image
4. 在这段观察期间,多少不同的主机访问了以209.196.44.172为服务器的僵尸网络?
使用 ip.dst == 209.196.44.172 and tcp.port==6667 进行过滤
目前过滤出的结果只有1个
image
5. 那些IP地址被用于攻击蜜罐主机?
使用ip.dst == 172.16.134.191 and not irc 过滤,并使用分析会话可以得到以下结果
image
6. 攻击者尝试攻击了那些安全漏洞?
利用过滤器 ip.dst == 172.16.134.191 and not irc 将irc流量排除在外
image
udp端口是117 被攻击
image
tcp端口是进行了扫描随后重点在80,99,端口445端口以及1433,139,
image
利用过滤器 ip.dst == 172.16.134.191 and not irc 4899端口出现等
image

  1. 那些攻击成功了?是如何成功的?
    以80端口为例ip.dst == 172.16.134.191 and tcp.port==80
    实际上是存在着回显问题
    image
    继续查找出口流量ip.dst == 172.16.134.191 and tcp.dstport==445
    存在敏感信息携带了SVCCTL,在报文中可以看到确实有敏感回显信息
    image
    对于4899端口实际上只有一个攻击ip进行过访问,是一个后门程序攻击成功了
    4899端口是远程控制软件 Radmin(Remote Administrator) 的默认TCP端口,一个合法且功能强大的远程管理工具。但它因功能强大、默认安全配置薄弱且常被恶意利用,也成为了攻击者眼中的“香饽饽”。对于网络分析而言,在Wireshark中检测到针对4899端口的流量,是一个需要高度警惕的高危信号。
    image
posted @ 2026-04-21 12:26  Maxn_Rain  阅读(32)  评论(0)    收藏  举报