20242424 2026-2027-1 《网络与系统攻防技术》实验四实验报告
20242424 2026-2027-1 《网络与系统攻防技术》实验四实验报告
1.基础知识
1.1 恶意代码与分类
恶意代码(Malware)是指使计算机按照攻击者意图运行、以达到恶意目的的指令集合。用来干坏事的代码。
恶意代码有六种:
| 类型 | 特点 |
|---|---|
| 病毒 | 具有复制自身,往外传播的特性(和生物学的病毒特征差不多),寄生在宿主文件上,靠感染其他文件传播 |
| 蠕虫 | 通过网络自动扫描和传播,不需要宿主 |
| 木马 | 伪装成正常程序,诱骗用户运行(特洛伊木马) |
| 后门 | 绕过正常认证,为攻击者保留远程访问通道 |
| Rootkit | 隐藏自身和攻击痕迹,常驻内核或用户态,常用来夺取最高权限 |
| 僵尸程序(Bot) | 被控制端统一指挥,组成僵尸网络,被控制的主机又叫肉鸡 |
恶意代码分析分为静态分析(不运行样本,看文件结构、字符串、反汇编)和动态分析(在受控环境运行,观察文件、注册表、网络行为)。静态分析安全但可能被加壳干扰,动态分析直观但需要隔离环境。
1.2 PE 文件结构
Windows 可执行文件采用 PE(Portable Executable)格式,主要结构包括:
- DOS 头:开头的
MZ和e_lfanew(指向 NT 头); - NT 头:文件头(机器类型、节数量)+ 可选头(入口点
AddressOfEntryPoint、镜像基址ImageBase、节对齐、镜像大小); - 节表:每节的名字、虚拟地址
VirtualAddress、虚拟大小VirtualSize、文件偏移PointerToRawData、文件大小SizeOfRawData; - 节:
.text(代码)、.rdata(只读数据、字符串)、.data(全局变量)、.rsrc(资源,含版本信息)、.idata(导入表)。
两个关键概念:
- RVA:相对虚拟地址,相对于镜像基址的偏移;
- 文件偏移:数据在磁盘文件中的位置。
二者通过节表换算:文件偏移 = PointerToRawData + (RVA - VirtualAddress)。
节按 SectionAlignment(通常 0x1000)在内存对齐、按 FileAlignment(通常 0x200)在文件中对齐,所以 VirtualSize 往往大于 SizeOfRawData,多出来的部分加载时补 0。
导入表(IAT) 记录程序调用了哪些 DLL 的哪些函数。导入表越少、越集中,程序的行为越难从静态看出。
1.3 加壳与脱壳
壳(Packer)在原始程序外面包一层解压/解密代码:程序运行时先执行壳的代码,把原始代码解压到内存,再跳回原始入口(OEP)执行。
加壳后的典型特征:
- 节名异常,如
UPX0/UPX1、JDR0/JDR1; - 入口点落在最后一个节,且该节通常是壳代码;
- 导入表很少(只有
LoadLibrary、GetProcAddress等); - 文件熵高,
strings看不到有用信息。
脱壳的一般思路是:让程序运行到 OEP,把内存中的镜像 dump 下来,再修复导入表。常用工具包括 PEiD/Detect It Easy(识别壳)、超级巡警脱壳机、OllyDump、Scylla、x64dbg。
dump 出来的文件常见问题是节表与实际文件长度不一致:工具按内存大小写 SizeOfRawData,但文件只写到实际数据末尾,导致 PointerToRawData + SizeOfRawData 超出文件长度。IDA 加载时会提示节被截断,只加载文件中真实存在的部分。处理办法是修改节表、把文件补零到声明长度,或者重新规范地 dump 并修复 IAT。
1.4 字符串提取
字符串是恶意代码分析中性价比最高的信息。因此我们总会想办法先拿到一些字符串,程序中的 URL、IP、注册表路径、文件路径、提示语、作者信息,通常都以字符串常量形式存放,这些字符串常量可能用在代码中很多地方,后面用IDA进行逆向分析的时候就可以通过搜索不同的字符串常量来逐渐摸清楚恶意代码究竟是怎么个运行逻辑。相比于汇编语言,字符串看着不烧心。
strings 工具的原理是扫描文件中连续的可打印字符序列。需要注意编码:
- ASCII:每个字符 1 字节;
- UTF-16LE:每个字符 2 字节(低字节在前),Windows 的宽字符 API 和 VB6 程序大量使用。
因此对 VB6 程序必须用 Unicode 模式提取,否则会漏掉大部分内容。IDA 的 Strings 窗口(Shift+F12)可以在 Setup 里勾选 Unicode。
字符串窗口只能看到"被识别为字符串"的数据,资源段、压缩数据、运行时才解密的字符串可能不在其中,所以还要结合资源查看器、strings 命令交叉验证。
1.5 IDA Pro 的使用
IDA Pro 是交互式反汇编器,常用操作:
| 操作 | 作用 |
|---|---|
Shift+F12 |
打开字符串窗口 |
Ctrl+X |
查看交叉引用(谁引用了这个地址) |
F5 |
Hex-Rays 反编译为类 C 伪代码 |
| 空格 | 在列表视图和图形视图之间切换 |
F2 / F9 |
下断点 / 动态调试 |
G |
跳转到指定地址 |
IDA 默认显示的是反汇编(汇编语言),按 F5 后显示的是反编译器生成的伪代码,接近 C 语言,但不是原始源码,变量名是 v1、a2 这类自动生成的名字。
逆向的基本套路是:字符串 → 交叉引用 → 关键函数 → 伪代码 → 结论。先找到有意义的字符串,再看谁引用了它,就能快速定位到处理逻辑。
1.6 crackme 与 C 语言基础
crackme 是专门用于逆向练习的小程序,输入正确时打印成功信息。它的典型结构是:
int main(int argc, char **argv) {
if (argc == 2 && !strcmp(argv[1], "口令"))
printf("成功\n");
else
printf("失败\n");
}
几个必须掌握的点:
argc是参数个数,程序名本身算argv[0],所以带一个参数时argc == 2;argv[0]是程序自身的名字或路径,有的程序会检查它;strcmp(a, b)相等时返回 0,所以!strcmp(...)表示"相等";- 异或:
a ^ b ^ b == a,单字节异或是最简单的字符串混淆方式,密钥固定时很容易还原; - 命令行参数含空格时必须加引号,否则会被拆成多个参数。
1.7 僵尸网络与 IRC
僵尸网络(Botnet)是攻击者通过恶意代码感染大量主机后,由控制端(C2)统一指挥形成的网络,被感染主机称为"僵尸"或"肉鸡"。它常被用于 DDoS 攻击、发送垃圾邮件、窃取信息、作为代理跳板等。
IRC(Internet Relay Chat)是早期的实时聊天协议,采用客户端/服务器模型。客户端连接服务器后先发送 NICK 设置昵称、再发送 USER 提供用户信息,然后用 JOIN 加入频道。服务器用 353(NAMES 回复)消息把频道成员列表发给客户端,用 PRIVMSG 转发消息。
IRC 的默认端口是 6667,另有 6660–6669、7000 等。因为 IRC 服务器遍地都是、协议简单,早期僵尸网络大量使用 IRC 作为控制通道,把命令藏在频道消息里。
1.8 网络取证分析
网络取证的数据源通常是 pcap/pcapng 格式的抓包文件,用 Wireshark(图形)或 tshark/tcpdump(命令行)分析。
Wireshark 的显示过滤器是核心工具,常用语法:
| 过滤器 | 含义 |
|---|---|
ip.addr == 1.2.3.4 |
源或目的地址为该 IP |
ip.dst == 1.2.3.4 |
目的地址 |
tcp.port == 6667 |
TCP 端口 |
tcp.flags.syn == 1 && tcp.flags.ack == 0 |
只看主动发起的 SYN |
http.request |
只看 HTTP 请求 |
irc.response contains "353" |
IRC 响应中包含 353 |
统计功能:
Statistics → Endpoints:按 IP/端口统计通信端点,注意勾选"限制到显示过滤器",否则会把整份抓包的所有地址都列出来;Statistics → Conversations:按会话统计;Follow → TCP Stream:还原一条 TCP 连接的全部明文。
命令行工具 tshark 适合批量统计,例如按目的端口分组计数、提取 HTTP 请求 URI、统计某字段取值。
分析时要区分"主动连入"和"回包":蜜罐自己对外连接时使用的临时源端口,会在回包中表现为目的端口,若不加以区分就会误判成被攻击的端口。只统计 SYN=1, ACK=0 的包,才能得到真正的连接发起方。
常见端口与服务:80 HTTP、139 NetBIOS、445 SMB、1433/1434 SQL Server、4899 Radmin、6129 DameWare、21 FTP、25 SMTP、110 POP3、137/53 等。UDP 1434 是 SQL Slammer 蠕虫的特征端口,TCP 80 上的 /default.ida、/scripts/root.exe、cmd.exe?/c+dir 分别是 CodeRed、Nimda 等蠕虫的特征 URL。
2.实验内容
一、恶意代码文件类型标识、脱壳与字符串提取
对提供的rada恶意代码样本,进行文件类型识别,脱壳与字符串提取,以获得rada恶意代码的编写作者,具体操作如下:
(1)使用文件格式和类型识别工具,给出rada恶意代码样本的文件格式、运行平台和加壳工具;
(2)使用超级巡警脱壳机等脱壳软件,对rada恶意代码样本进行脱壳处理;
(3)使用字符串提取工具,对脱壳后的rada恶意代码样本进行分析,从中发现rada恶意代码的编写作者是谁?
二、使用IDA Pro静态或动态分析crackme1.exe与crakeme2.exe,寻找特定输入,使其能够输出成功信息。
三、分析一个自制恶意代码样本rada,并撰写报告,回答以下问题:
(1)提供对这个二进制文件的摘要,包括可以帮助识别同一样本的基本信息;
(2)找出并解释这个二进制文件的目的;
(3)识别并说明这个二进制文件所具有的不同特性;
(4)识别并解释这个二进制文件中所采用的防止被分析或逆向工程的技术;
(5)对这个恶意代码样本进行分类(病毒、蠕虫等),并给出你的理由;
(6)给出过去已有的具有相似功能的其他工具;
(7)可能调查处这个二进制文件的开发作者吗?如果可以,在什么样的环境和什么样的限定条件下?
(8)给出至少5种检测该恶意软件的方法,例如基于特征码的方法,需要详细介绍每种方法。
四、取证分析实践
Windows 2000系统被攻破并加入僵尸网络
问题: 数据源是Snort收集的蜜罐主机5天的网络数据源,并去除了一些不相关的流量,同时IP地址和其他敏感信息被混淆。回答下列问题:
(1)IRC是什么?当IRC客户端申请加入一个IRC网络时将发送那个消息?IRC一般使用那些TCP端口?
(2)僵尸网络是什么?僵尸网络通常用于什么?
(3)蜜罐主机(IP地址:172.16.134.191)与那些IRC服务器进行了通信?
(4)在这段观察期间,多少不同的主机访问了以209.196.44.172为服务器的僵尸网络?
(5)哪些IP地址被用于攻击蜜罐主机?
(6)攻击者尝试攻击了那些安全漏洞?
(7)那些攻击成功了?是如何成功的?
3.实验过程
3.1 恶意代码文件类型标识、脱壳与字符串提取
3.1.1 文件格式、运行平台与加壳工具
先把样本放到 Kali 共享目录,用 file 命令做初步判断:
file RaDa.exe
输出为 RaDa.exe: PE32 executable for MS Windows 4.00 (GUI), Intel i386, 3 sections,说明它是 32 位 Windows GUI 程序。

再用 Detect It Easy 打开样本,结果显示:文件类型 PE32、大小 20.50 KiB、字节序 LE、32 位、架构 I386、类型 GUI;编译器为 Visual Basic(6.00.8041)[Native];打包工具为 UPX[modified]。

用 PEiD 复核,结果一致:入口点 0000FD20、EP 段 JDR1、文件偏移 00004120、首字节 60 BE 00 C0、连接器版本 6.0、子系统 Win32 GUI、壳为 UPX 0.89.6 - 1.02 / 1.05 - 2.90。

入口点 0xFD20 落在最后一个节 JDR1,首字节 60 BE 00 C0 又是 UPX 解压头的 pushad; mov esi, 0x40C000,可以确定这是壳的入口,不是程序真正的入口。
表 3-1 文件类型识别结果
| 项目 | 结果 |
|---|---|
| 文件格式 | PE32 可执行文件(Windows GUI 子系统) |
| 运行平台 | Windows,32 位,Intel i386,语言英语(美国) |
| 入口点 | 0x0000FD20(位于 JDR1 节,为壳入口) |
| 加壳工具 | UPX 0.89.6 - 1.02 / 1.05 - 2.90(节名被改为 JDR0/JDR1) |
3.1.2 使用超级巡警脱壳机脱壳
用超级巡警脱壳机载入 RaDa.exe 执行脱壳,得到 RaDa_unpacked.exe,大小 68,833 字节。再用 PEiD 检查脱壳结果:不再显示 UPX,入口点变为 000018A4,编译器显示为 Microsoft Visual Basic 5.0 / 6.0,说明壳已脱掉、入口已回到程序本身。
需要说明的是,这个脱壳文件的大小是 0x10CE1,不是 0x200 的整数倍,最后一个节 .dswlab 在节表里声明 0x1000 字节,实际只写了 0x6E1 字节,所以 IDA 加载时会提示“节的范围超出文件末尾”。这是脱壳工具按内存长度直接写盘、没有做文件对齐造成的;被截掉的是末尾的数据节,代码段和字符串都完整,不影响后续分析。
3.1.3 字符串提取与作者分析
脱壳前在 Kali 里对原文件执行 strings,只能看到 KERNEL32.DLL、MSVBVM60.DLL、LoadLibraryA、GetProcAddress、ExitProcess 等少量字符串,其余内容都被 UPX 压缩,看不出有用信息。

脱壳后用 IDA 打开 RaDa_unpacked.exe,按 Shift+F12 打开 Strings 窗口,右键 Setup 勾选 Unicode(VB6 的字符串是 UTF-16LE,不勾会漏掉大部分),搜索 Copyright,得到:
Copyright (C) 2004 Raul Siles & David Perez

由此可以确定,rada 样本的作者是 Raul Siles 和 David Perez,编写时间为 2004 年。另外还有两条旁证:字符串 Scan Of The Month 32 (SotM) - September 2004,以及 Authors: Raul Siles & David Perez, 2004。
需要注意,截图里第二条 Copyright (C) 2001 Antonin Foller, PSTRUH Software 并不是样本作者,而是样本内嵌的公开上传脚本 fupload.vbs 的作者,不能混为一谈。
3.2 使用 IDA Pro 分析 crackme1.exe 与 crackme2.exe
crackme 是专门用于逆向练习的小程序,输入正确时打印成功信息。本节先用 IDA 做静态分析(字符串、交叉引用、伪代码),再用运行验证,找出两个程序的特定输入。
3.2.1 crackme1.exe
先直接运行,观察两种失败提示:不带参数时输出 I think you are missing something.,参数错误时输出 Pardon? What did you say?。这说明程序通过命令行参数接收输入,并在 main 里用 strcmp 比较。

用 IDA 打开 crackme1.exe,按 Shift+F12 打开 Strings 窗口,可以看到三条提示语以及 I know the secret。

双击 Pardon? What did you say? 跳到 .rdata,按 Ctrl+X 查看交叉引用,发现它只被 _main+71 引用,由此定位到主函数。

进入 _main 按 F5 反编译,逻辑一目了然:
if (argc == 2) {
if (!strcmp(argv[1], "I know the secret")) {
printf("You know how to speak to programs, Mr. Reverse-Engineer\n");
return 0;
}
...
}
strcmp 相等时返回 0,所以 !strcmp(...) 表示"相等"。由此得到特定输入为 I know the secret。

在 cmd 中执行 crackme1.exe "I know the secret",程序输出成功信息。

3.2.2 crackme2.exe
直接执行 crackme2.exe "I know the secret",输出 I have an identity problem.,说明除了参数之外还有别的检查。
用 IDA 查看字符串,发现比 crackme1 多了一条 crackmeplease.exe,另外还有一串乱码 'b*#4'b#b.+66.'b1'!0'6xb。

对 crackmeplease.exe 按 Ctrl+X,定位到 _main+5B。

按 F5 查看伪代码:
if (!strcmp(*argv, "crackmeplease.exe")) {
if (!strcmp(argv[1], "I know the secret")) {
for (i = 0; i <= 0x21; ++i)
putchar(byte_403080[i] ^ 0x42);
...
}
}
程序先比较 argv[0](程序自身名字)是否等于 crackmeplease.exe,再比较参数。因此把程序复制并改名为 crackmeplease.exe,在 cmd 中先 cd 到该目录、直接执行 crackmeplease.exe "I know the secret"(不能写成 .\crackmeplease.exe,否则 argv[0] 会带路径前缀),程序输出 We have a little secret: Chocolate。


成功信息并不是以明文存放的,而是把 0x403080 处的 0x22 个字节逐字节与 0x42 异或后输出,字符串窗口里那串乱码就是密文。这种单字节异或属于编码级别的保护,密钥固定、算法公开,只能干扰 strings 和字符串窗口,稍微分析就能还原。
3.3 分析自制恶意代码样本 rada
3.3.1 样本摘要
先用 certutil 计算样本指纹:
certutil -hashfile RaDa.exe MD5
certutil -hashfile RaDa.exe SHA256
结果为 MD5 caaa6985a43225a0b3add54f44a0d4c7,SHA256 13c2379e9d9f679396e21a3391804cc834892f25691381b6d078d07b56d38f90。

查看脱壳后文件的属性,产品名称为 RaDa,文件版本 1.0.0.0,原始文件名 RaDa,语言为英语(美国)。资源里的公司名写的是 Malware。

表 3-2 样本基本信息
| 项目 | 内容 |
|---|---|
| 文件名 | RaDa.exe |
| 大小 | 20,992 字节 |
| 文件类型 | PE32 GUI 可执行文件(x86) |
| 编译器 | Visual Basic 6.0(导入 MSVBVM60.DLL) |
| 加壳工具 | UPX(节名改为 JDR0/JDR1) |
| MD5 | caaa6985a43225a0b3add54f44a0d4c7 |
| SHA256 | 13c2379e9d9f679396e21a3391804cc834892f25691381b6d078d07b56d38f90 |
| PE 时间戳 | 2004-10-30 07:59:58(UTC+8) |
| 版本资源 | ProductName=RaDa,FileVersion=1.00,CompanyName=Malware |
3.3.2 样本目的
在字符串中搜索 http,可以看到 http://10.10.10.10/RaDa、RaDa_commands.html、cgi-bin、download.cgi、upload.cgi 等字符串。

结合后面的 InternetExplorer.Application 可以判断,这是一个基于 HTTP 的远程控制后门:程序通过 COM 驱动 IE 访问 http://10.10.10.10/RaDa,从 RaDa_commands.html 读取攻击者下发的命令,再把执行结果或文件回传,从而让攻击者长期控制被感染主机。
3.3.3 样本特性
在字符串中搜索 HKLM,可以看到 HKLM\Software\Microsoft\Windows\CurrentVersion\Run\,说明程序会把自身写入注册表启动项实现开机自启;同一个位置还能看到 HKLM\Software\VMware, Inc.\VMware Tools\InstallPath,用于反虚拟机检测。

搜索 RaDa,可以看到 C:\RaDa\bin、C:\RaDa\tmp、RaDa.exe、RaDa_commands.html 以及 RaDa Usage、RaDa Current Configuration 等字符串,说明程序会把自身复制到 C:\RaDa\bin 目录,并在 C:\RaDa\tmp 下存放临时文件。

此外,程序还具备命令执行(COMSPEC、/C)、文件上传(ADODB.Stream、multipart/form-data)、文件下载(download.cgi)、屏幕截图(screenshot)、主机信息收集(WMI 查询 Win32_NetworkAdapterConfiguration)等能力。
搜索 DDoS 还能看到 Starting DDoS Smurf remote attack...,说明它还能发起 Smurf 反射放大攻击。

3.3.4 反分析技术
(1)UPX 加壳:原始代码被压缩,静态分析看不到真实逻辑,节名还被改成 JDR0/JDR1 以躲避按节名识别的工具。
(2)反虚拟机:字符串中存在 00:0C:29:、00:50:56:、00:05:69: 三个 VMware 网卡 MAC 前缀,程序通过 WMI 取本机 MAC 地址后进行比对,一旦发现运行在 VMware 中就停止工作。

(3)白利用(Living off the Land):程序不直接调用 WinINet、WinSock 等网络 API,而是通过 InternetExplorer.Application 让 IE 发请求,用 Wscript.Shell 操作注册表,用 ADODB.Stream 读写文件,导入表里看不到敏感函数。

(4)动态调用 API:导入表里只有 VB6 运行库 MSVBVM60,IDA 只能解析出 DllFunctionCall 一条,其余 API 都在运行时动态解析。

(5)Security through obscurity:样本里直接写着 Security through obscurity is the key.,作者用这种方式自嘲其"靠隐蔽性"的设计思路。
3.3.5 样本分类
该样本属于后门程序(Backdoor)/ 远程控制木马,同时具备僵尸网络节点的 DDoS 能力。理由是:它不具备自我复制和感染其他文件的能力,不是病毒;也不会主动扫描网络传播自己,不是蠕虫;它需要在系统里长期潜伏、等待攻击者通过 HTTP 下发命令,符合后门的定义;再加上 Smurf DDoS 功能,可以被控制端当作"肉鸡"使用。
3.3.6 相似功能工具
Back Orifice 2000、Sub7 等经典 Windows 远程控制后门;Poison Ivy、Gh0st RAT、njRAT 等现代 RAT,功能上都包含命令执行、文件上传下载和屏幕截取;网络通道方面与 reGeorg、China Chopper 这类 HTTP 隧道思路相近;DDoS 部分则与 smurf.c 等 Smurf 攻击工具同类。
3.3.7 作者溯源
可以调查出作者,本样本可确定为 Raul Siles 与 David Perez(2004 年)。依据是样本内嵌的版权串、作者串和 SotM 32 标识,作者本人也公开发表过分析论文,Honeynet 官方还保留着该挑战的题目和多份公开解答。
但溯源只能在"公开资料互证"的范围内下结论:字符串可以伪造,代码可以被复用,样本也没有数字签名和 PDB 信息,所以必须结合时间戳、编译器特征、代码风格和公开文献交叉验证,不能只凭一条 Copyright 就认定作者。
3.3.8 检测方法
(1)基于特征码的检测:提取样本独有的字节序列或字符串,例如 http://10.10.10.10/RaDa、RaDa_commands.html、Copyright (C) 2004 Raul Siles、节名 JDR0/JDR1,组合成 YARA 规则,同时把 MD5、SHA256 加入黑名单。优点是准确、误报低,缺点是样本稍作修改就会失效。
(2)基于启发式的静态检测:按"VB6 程序 + UPX 加壳 + 反虚拟机字符串 + COM 白利用"这类组合特征打分。只要一个 PE 文件同时命中 MSVBVM60 导入、00:0C:29 之类的 VMware 前缀和 ADODB.Stream,就判为可疑。优点是能发现变种,缺点是可能误报正常的 VB6 程序。
(3)基于主机行为的检测:用 Process Monitor 或 Sysmon 监控进程行为,重点看是否创建 C:\RaDa\bin 目录、是否写入 HKLM\...\Run\RaDa 启动项、是否启动 iexplore.exe 访问内网地址、是否调用 cmd /C 执行命令。优点是不依赖特征码,缺点是必须在受控环境里运行样本。
(4)基于网络流量的检测:在 IDS 或代理上匹配 HTTP 请求路径 /RaDa、RaDa_commands.html、upload.cgi 的 multipart 上传,以及固定周期的回连流量。由于它借用 IE 发请求,User-Agent 和正常浏览器一致,需要结合目的 IP 和行为一起判断。
(5)基于内存取证与沙箱的检测:程序运行后内存中一定有解密后的 PE 头和明文字符串,可以对可疑进程 dump 内存,搜索 MZ 头以及 RaDa、10.10.10.10 等关键字;也可以在沙箱中运行并记录 InternetExplorer.Application、ADODB.Stream 等 COM 调用。这种方法对抗加壳最有效,但需要完整的运行环境。
此外还可以做注册表和文件完整性监控,重点盯 Run 启动项和 C:\RaDa 目录,作为第六种补充手段。
3.4 取证分析实践
3.4.1 数据与工具
数据源是 Snort 在蜜罐主机 172.16.134.191(Windows 2000)上采集的 5 天网络流量,IP 地址和敏感信息已做混淆处理,抓包文件为 botnet_pcap_file.dat(54,536 个包,18 MB,时间跨度 2003-03-01 至 2003-03-06)。分析时用 Wireshark 做协议过滤和会话还原;由于实验在 Windows 环境下进行,没有 tcpdump 和 tcpflow,批量统计改用 Wireshark 自带的 tshark 配合 PowerShell 完成。

3.4.2 问题解答
(1)IRC 是什么?客户端申请加入 IRC 网络时发送哪个消息?IRC 一般使用哪些 TCP 端口?
IRC(Internet Relay Chat,互联网中继聊天)是一种基于 TCP 的应用层实时聊天协议,采用客户端/服务器模型,用户通过频道(channel)进行群聊或私聊。
客户端连接服务器后,先发送 NICK 消息设置自己的昵称,再发送 USER 消息提供用户名、主机名、服务器名和真实姓名,完成注册后才能用 JOIN 加入频道。因此"NICK + USER"就是加入 IRC 网络的第一步。
IRC 的默认端口是 6667,另外还常用 6660–6669 这一段以及 7000 等端口。

(2)僵尸网络是什么?通常用于什么?
僵尸网络(Botnet)是攻击者通过恶意代码(bot)感染大量主机后,由控制端统一指挥而形成的网络,被感染的主机称为"僵尸"或"肉鸡"。
它通常被用于:发起 DDoS 攻击、发送垃圾邮件、窃取账号和敏感信息、作为代理跳板隐藏真实来源、传播新的恶意代码、进行点击欺诈和挖矿等。本实验中的蜜罐主机就是被植入 bot 后加入了 IRC 僵尸网络。
(3)蜜罐主机与哪些 IRC 服务器进行了通信?
在 Wireshark 中设置过滤条件 ip.src == 172.16.134.191 && tcp.dstport == 6667,再用 Statistics → Endpoints 按目的地址统计,得到蜜罐连接过的 IRC 服务器共 5 台:
| 序号 | IRC 服务器 IP |
|---|---|
| 1 | 63.241.174.144 |
| 2 | 217.199.175.10 |
| 3 | 209.126.161.29 |
| 4 | 66.33.65.58 |
| 5 | 209.196.44.172 |

(4)观察期间有多少不同主机访问了以 209.196.44.172 为服务器的僵尸网络?
IRC 服务器返回的 353(NAMES 回复)消息中列出了频道内所有昵称,统计这些昵称并去重即可。用 tshark 提取全部 353 响应:
$names = & $tshark -r $pcap -Y 'irc.response contains "353"' -T fields -e irc.response |
ForEach-Object { ($_ -split ':',3)[-1] -split '\s+' } |
Where-Object { $_ -ne "" }
($names | Sort-Object -Unique).Count
统计结果为 1840 个不同昵称(总提及 2082 次)。由于 NAMES 列表很长、会跨多个 TCP 分段,Wireshark 的 IRC 解析对部分跨段消息只取到第一段,所以 1840 是本次抓包能够解析出的结果。

(5)哪些 IP 地址被用于攻击蜜罐主机?
在 Wireshark 中过滤 ip.dst == 172.16.134.191,打开 统计 → 端点 → IPv4,勾选左下角“限制到显示过滤器”。端点总数为 166,其中一个是蜜罐自己,因此攻击蜜罐的源 IP 共 165 个。

(6)攻击者尝试攻击了哪些安全漏洞?
只统计主动连入蜜罐的 SYN 包(SYN=1, ACK=0),可以排除蜜罐自己对外连接产生的回包:
& $tshark -r $pcap -Y 'ip.dst==172.16.134.191 && tcp.flags.syn==1 && tcp.flags.ack==0' -T fields -e tcp.dstport |
Group-Object | Sort-Object Count -Descending | Select-Object Name,Count -First 15
统计结果及对应漏洞如下:
| 端口 | SYN 次数 | 服务 | 攻击方式 |
|---|---|---|---|
| 80/TCP | 1107 | HTTP | Nimda 目录穿越、IIS .htr 溢出探测 |
| 139/TCP | 84 | NetBIOS | 空会话、共享枚举 |
| 99/TCP | 43 | 未知 | 端口扫描 |
| 1433/TCP | 23 | MS SQL | SQL 服务探测 |
| 445/TCP | 19 | SMB | PsExec 横向移动 |
| 21/TCP | 15 | FTP | 弱口令、匿名登录探测 |
| 4899/TCP | 10 | Radmin | 远程控制 |
| 110/TCP | 9 | POP3 | 弱口令探测 |
| 6129/TCP | 9 | DameWare | 远程控制 |
| 111/TCP | 5 | rpcbind | 服务探测 |
| 25/TCP | 3 | SMTP | 邮件服务探测 |
| 137/UDP | 65 | NetBIOS | 名称服务查询 |
| 1434/UDP | 55 | MS SQL | SQL Slammer 蠕虫 |
其中 80 端口的请求主要是 /msadc/../../winnt/system32/cmd.exe?/c+dir、/scripts/../../winnt/system32/cmd.exe?/c+dir 这类目录穿越 URL,是 Nimda 蠕虫的典型特征;UDP 1434 则是 SQL Slammer 蠕虫。



(7)哪些攻击成功了?是如何成功的?
逐个端口回放会话后可以判断:
- 445/TCP 成功:抓包中出现
61.111.101.78发起的 SMB 会话,它以Administrator账号通过 NTLM 认证,连接\\172.16.134.191\IPC$,随后绑定 SAMR 接口枚举域和用户;同一来源还出现了PSEXESVC.EXE,说明攻击者用 PsExec 在蜜罐上创建服务执行命令,拿到了系统权限。另有195.36.247.77也在 445 端口传输过数据。 - 4899/TCP 成功:
210.22.204.101与蜜罐之间存在持续的双向数据交互,说明 Radmin 远程控制已被安装并建立了会话。 - 80/TCP 失败:1107 次连接中只有 5 个 HTTP 200 响应,且全部对应
/和/pagerror.gif等正常页面,Nimda 的cmd.exe?/c+dir请求没有返回 200,目录穿越未成功;抓包中也没有出现 TFTP 下载,说明后续载荷没有落地。 - 139、1433、21、25、110、6129、111 等:只有 SYN 或探测,没有看到成功的交互;UDP 1434 的 Slammer 探测也未形成有效会话。





4.问题及解决方案
- 问题1:rada 脱壳后用 IDA 打开,提示"节的范围超出文件末尾",只加载了 0x6E1 字节,反汇编看起来残缺不全。
- 问题1解决方案:检查节表发现最后一个节
.dswlab声明大小为 0x1000,但文件中实际只有 0x6E1 字节,PointerToRawData + SizeOfRawData超出了文件长度。这是脱壳工具按内存中的 VirtualSize 写节表、而文件没有按 0x200 对齐写满造成的。由于被截断的是末尾的数据节,代码段和字符串都完整,所以先继续分析;若要得到完整镜像,可以修改节表的SizeOfRawData/VirtualSize,或把文件补零到声明长度,更规范的做法是用 x64dbg 运行到 OEP 后配合 Scylla dump 并修复 IAT。 - 问题2:在 IDA 的 Strings 窗口里搜不到版本资源中的
CompanyName = Malware,一度以为版本信息被脱壳工具弄丢了。 - 问题2解决方案:Strings 窗口只列出被 IDA 识别为"字符串数据"的内容,
.rsrc资源段里的版本信息不一定在其中。改为右键文件 → 属性 → 详细信息查看版本信息,并用十六进制搜索确认文件里确实存在该字符串,最终确认是查看方式的问题,不是数据丢失。
5.学习感悟、思考等
此次实验我学会了对恶意代码进行静态分析的流程,学习并掌握了一些分析恶意代码的工具,从使用Peid,在linux操作系统中find和strings等指令查看其文件类型,用Detect It Easy查看加密壳的类型,再到使用超级巡警万能脱壳工具把恶意代码的加密壳剥掉,最后用IDA对脱壳后的恶意代码文件进行逆向分析。充分的感受了一个逆向的过程。
对于恶意代码RaDa使用的一些反分析技术,还有其功能都分析了出来,有了一个较为全面的了解。用UPX加壳,反虚拟机,白利用,动态调用API的手段来躲避静态分析的工具,实现一个隐蔽的后门程序。此外,搜索了DDos还能看到它有发起Smurf反射放大攻击的能力。
在静态分析不管用的时候,我们还可以通过在安全环境下运行代码看看会发生什么事情,得到一些有用的字符串信息,这些字符串信息在逆向的时候就很有用,这就是动态分析,在分析两个crackme的时候就用到了这个方法。
在做取证分析实践的时候,了解了攻击者利用僵尸网络攻击蜜罐的大致流程。蜜罐在 5 天内遭到大量自动化蠕虫与扫描,同时被攻击者借助PsExec 落地 PSEXESVC.exe 获得执行权限;随后主机被植入bot ,作为客户端连接 5 台 IRC 服务器加入僵尸网络。从抓包数据来看,攻击手法相当杂。
对恶意代码的分析不拘泥于形式、工具,我们可以用到的工具太多了,从专门的逆向工具,到操作系统提供的一些特殊查看方式,能得到有效信息的方法就是好方法。

浙公网安备 33010602011771号