20242320 2026-2027-1 《网络与系统攻防技术》实验四实验报告
20242320 2026-2027-1 《网络与系统攻防技术》实验四实验报告
实验名称:恶意代码分析技术与蜜罐取证
实验环境:
- Kali Linux 2026.2 虚拟机(主机名 fanxingru):strings / file / md5sum / tshark / tcpdump / Wireshark / snort,交叉验证与取证分析
- Windows 11 24H2 宿主机(计算机名 fancy):PEiD、超级巡警脱壳机、IDA 9.4、Process Explorer,样本分析与动态观察
- 样本:
RaDa.exe(SotM 32 恶意代码样本)、crackme1.exe/crackme2.exe(教材配套逆向练习)- 数据源:
botnet_pcap_file.dat(18 MB,Snort 蜜罐 5 天流量,54536 个数据包)
1. 基础知识
1.1 PE 文件结构
PE(Portable Executable)是 Windows 可执行文件格式,本质是 COFF 的扩展。从文件头到尾依次是:
| 部分 | 内容 | 分析时的用途 |
|---|---|---|
| DOS 头 + DOS Stub | MZ 开头,stub 里一句 "This program cannot be run in DOS mode" |
判断"是不是 PE"的第一眼特征 |
| PE 签名 | PE\0\0 |
定位文件头 |
| COFF 文件头 | 机器类型(0x14C = Intel 386)、节区数、时间戳 |
判断运行平台、编译时间 |
| 可选头 | 子系统(GUI/Console)、入口点 RVA、ImageBase | 判断程序类型,给 IDA 加载用 |
| 节区表 | .text(代码)/ .data(数据)/ .rdata(只读数据,字符串常在这里)等 |
strings、交叉引用的查找范围 |
本实验中 file RaDa.exe 输出 PE32 executable (GUI) Intel 80386,三个结论——文件格式、运行平台、图形界面子系统——全部来自 PE 头。
1.2 壳与脱壳
加壳是用压缩或加密手段包裹原始 PE,运行时由壳代码先自解密/解压再跳转执行原始程序。查壳工具(PEiD)靠入口点字节特征和区段名(UPX 典型特征是区段名 UPX0/UPX1、入口点在最后一个区段)识别壳类型。
脱壳有两条路:
- 静态脱壳:脱壳机直接解开文件,得到可分析的原始 PE(本实验用超级巡警,得到
RaDa_unpacked_20242320.exe); - 动态脱壳:运行程序,等它在内存中自解密后从内存 dump 出来。
Q:为什么壳能对抗静态分析?
加壳后磁盘上的
.text是密文/压缩数据,strings看到的一堆乱码就是压缩后的字节。不脱壳直接提取字符串,得到的没有任何语义信息——本实验第一步在 Kali 对加壳样本跑 strings 就是满屏乱码,脱壳后同样的命令立刻读出了作者署名,这个对比本身就是最直观的说明。
1.3 strings 原理
strings 顺序扫描文件,把"可打印字符连续达到最小长度(默认 4)的字节序列"当作字符串输出。它不认识文件格式、不解析编码,所以有两个坑本实验都踩过:
- 只看 ASCII:默认模式只提取 ASCII。VB6 程序的字符串大量以 UTF-16LE 宽字符存放(BSTR),必须
strings -el才能看到。本样本的 C&C URL、注册表键、文件路径全部藏在宽字符里,ASCII 模式下 grephttp一无所获,-el之后全出来了。 - 分不清语义:导入表里的函数名、运行时符号也一并输出,需要人工分类。
1.4 IDA 静态分析方法
IDA 的反汇编结果不是平的,而是带交叉引用(xref)的图。本实验反复用的标准路径:
- Shift+F12 打开字符串窗口,找语义敏感的串(提示语、URL、命令字);
- 双击字符串跳到数据段,光标停在上面按 X,列出所有引用它的代码位置;
- 跳到引用处,F5 反编译为伪代码,看懂逻辑。
Q:交叉引用为什么重要?
字符串本身只是"尸体",引用它的代码才是"行为"。同一个
I know the secret,只看字符串窗口只能猜它是口令;按 X 追到strcmp(argv[1], "I know the secret")才知道它是怎么被校验的。任务三找到 C&C URL 后也是靠 X 引用定位到配置初始化函数,一次拿到 URL、指令页面、上下行接口、工作目录、注册表键五样配置。
1.5 IRC 是什么(任务四问题一)
IRC(Internet Relay Chat,互联网中继聊天)是基于 TCP 的实时文本群聊协议,C/S 架构:客户端连到 IRC 服务器,服务器之间互联成网,频道(Channel)是群聊房间。
僵尸网络偏爱它是因为:协议简单纯文本、服务器可自建、频道天然适合一对多广播指令。
客户端加入 IRC 网络的消息顺序:
NICK <昵称>:设置昵称;USER <用户名> <模式> <未用> :<真实名>:注册用户信息;JOIN <#频道>:加入频道,之后服务器把频道内消息转发给它。
常用端口:TCP 6667(以及 6660-6669 区间)。抓包时过滤 tcp port 6667 就能捞出僵尸网络 C&C 流量——本实验任务四就是这么定位蜜罐通信过的 IRC 服务器的。
1.6 僵尸网络是什么(任务四问题二)
僵尸网络(Botnet)是被攻陷主机(僵尸/Bot)在攻击者(牧牛人/Botmaster)通过 C&C 信道统一指挥下组成的网络。攻击者不需要逐个登录被控机,在频道里发一条命令,成千上万台僵尸同时执行。
常见用途:DDoS 攻击、发送垃圾邮件、窃取信息、点击欺诈、挖矿、作为跳板攻击第三方。
典型的生命周期:扫描打洞 → 漏洞利用植入 bot 程序 → bot 主动回连 C&C 加入频道 → 接收指令干活。任务四的蜜罐数据完整记录了这一链条。
1.7 网络取证分析
面对抓包数据找"发生过什么",核心思路是统计先行、会话跟进、时间线定因果:
- 统计:按端口/源 IP/会话做频次排序,找出"谁 busiest、哪个端口最反常";
- 会话:
tshark -z conv,tcp看会话列表,区分"建成且有数据"与"只有 SYN 的试探"; - 时间线:找到标志性事件(如蜜罐首次外连 C&C),回溯之前的密集交互,锁定突破口;
- 实锤:导出嫌疑会话单独开 Wireshark 追踪 TCP 流,直接读载荷内容。
2. 实验内容
| 任务 | 内容 | 技术点 | 涉及主机 |
|---|---|---|---|
| 任务一 | rada 样本文件类型识别、脱壳、字符串提取找作者 | PEiD、超级巡警脱壳机、strings、file、md5sum | Win11(Kali 交叉验证) |
| 任务二 | IDA 分析 crackme1/2,找到使程序输出成功信息的输入 | IDA 字符串窗口、交叉引用、F5 反编译 | Win11 |
| 任务三 | rada 样本完整分析并回答 8 个问题 | 动态(Process Explorer)+ 静态(IDA/strings)综合分析 | Win11 + Kali |
| 任务四 | Snort 蜜罐 5 天流量取证,回答 7 个问题 | capinfos、tshark 统计、会话导出、Wireshark 追踪流 | Kali |
方案简介:任务一用 PEiD 得出"PE32 / Intel 80386 / UPX 壳"三结论后,用超级巡警静态脱壳,再用 strings 从脱壳产物里捞出作者署名,Kali 侧 file/md5sum 做交叉验证。任务二走 IDA 标准路径:盲跑确定参数个数 → 字符串窗口找候选 → 交叉引用看比较逻辑 → cmd 验证口令,crackme2 额外发现一层基于 argv[0] 的文件名自检。任务三先动态后静态:Process Explorer 观察样本运行后的进程、目录释放、注册表、网络行为,再回 IDA 对脱壳样本做字符串分类与交叉引用,两处证据互相印证。任务四纯 Kali:capinfos 验证数据 → tshark 按端口/IP/会话统计 → 时间线锁定 445 突破口 → Wireshark 追踪流读攻击载荷。
3. 实验过程
3.1 任务一:rada 文件类型识别、脱壳与字符串提取
3.1.1 解压样本与查壳
rada.rar 用密码 rada 解压到已加排除项的目录,先不运行,PEiD 打开:

三条结论:
- 文件格式:PE32 executable(Windows 可执行文件);
- 运行平台:Intel 80386 / 32 位 Windows(子系统 Win32 GUI);
- 加壳工具:UPX 0.89.6 - 1.02(Markus & Laszlo 压缩壳)。
3.1.2 Kali 交叉验证
样本拖进 Kali(方法见问题 1),file + md5sum 验证:
file ~/RaDa.exe
# PE32 executable (GUI) Intel 80386, for MS Windows
md5sum ~/RaDa.exe
# caaa6985a43225a0b3add54f44a0d4c7

与 Win11 侧 PEiD 结论一致,MD5 也与脱壳机界面显示的指纹吻合。
3.1.3 脱壳
超级巡警脱壳机拖入 RaDa.exe,点"脱壳",提示 Unpack successfully!,产物改名为 RaDa_unpacked.exe:

脱壳判据:PEiD 再查一次,壳特征消失,识别为编译器 Microsoft Visual Basic 5.0/6.0;文件体积明显变大。

插曲:先试的 Kali 官方方案
upx -d直接报错CantUnpackException: file is modified/hacked/protected——这个样本的 UPX 壳被修改过,加了防自动脱壳保护,标准 upx 命令解不开。
最后还是超级巡警成功。这个失败经历后来成了任务三问题四(反分析技术)的实证素材。
3.1.4 字符串提取找作者
strings ~/RaDa_unpacked_20242320.exe | less
strings ~/RaDa_unpacked_20242320.exe | grep -iE "Raul|Siles|Perez|copyright|2004"
# (c) Raul Siles && David Perez
# SotM 32 - September 2004


作者:Raul Siles && David Perez,2004 年 9 月。 "SotM" 的含义在任务三静态分析时找到了出处(见 3.3)。
3.2 任务二:IDA 分析 crackme1 与 crackme2
3.2.1 crackme1.exe
第一步:盲跑。
crackme1.exe
crackme1.exe test
无参数输出 I think you are missing something.,带一个错误参数输出 Pardon? What did you say?——说明程序要恰好 1 个命令行参数。

第二步:字符串窗口。 拖入 IDA,Shift+F12:


I think you are missing something. 和 Pardon? What did you say? 之间夹着一个语义突兀的 I know the secret,旁边还有成功信息 You know how to speak to programs, Mr. Reverse-Engineer。
第三步:交叉引用。 双击 I know the secret → 按 X → 跳到 main → F5:
if ( argc == 2 )
{
if ( strcmp(argv[1], "I know the secret") == 0 )
{
printf("You know how to speak to programs, Mr. Reverse-Engineer\n");
return 0;
}
...
}

逻辑一目了然:参数个数校验 → strcmp 口令比对 → 相等则打印成功信息。
第四步:验证。
crackme1.exe "I know the secret"
输出 You know how to speak to programs, Mr. Reverse-Engineer。任务一完成。

3.2.2 crackme2.exe
流程相同。字符串窗口比 crackme1 多出两个关键串:crackmeplease.exe 和 I have an identity problem.。

先直接喂正确口令:
crackme2.exe "I know the secret"

仍提示失败——这就是文件名自检在起作用。对 crackmeplease.exe 按 X 追引用,F5 看 main:
if ( argc == 2 )
{
if ( strcmp(argv[0], "crackmeplease.exe") == 0 ) // 第一层:文件名
{
if ( strcmp(argv[1], "I know the secret") == 0 ) // 第二层:口令
{
for ( i = 0; i <= 0x21; ++i )
putchar( (char)(byte_403080[i] ^ 0x42) ); // 异或解码后逐字符输出
puts(Buffer);
return 0;
}
...

两层判断:argv[0](程序运行时的文件名)必须等于 crackmeplease.exe,argv[1] 口令必须是 I know the secret。
有意思的细节:成功信息不是明文存储的。字符串窗口里那句乱码
b^*4#b,+66.'b!^0x6b其实是密文,程序运行时用^ 0x42逐字节异或还原成明文再输出——一种简单的字符串混淆,防止静态 strings 直接看到成功提示。
解法一:改名运行。
copy crackme2.exe crackmeplease.exe
crackmeplease.exe "I know the secret"
输出 We have a little secret: Chocolate,成功。

解法二:原理说明即上面的伪代码分析:argv[0] 是命令行第 0 项、包含运行时的程序名,文件名不符时第一层 strcmp 必然失败,所以口令再对也没用。
3.3 任务三:rada 样本完整分析(8 问)
问题(1):二进制摘要
| 项目 | 值 |
|---|---|
| 文件类型 | PE32 executable (GUI) Intel 80386 |
| 文件大小(加壳) | 20992 字节(20.5 KB) |
| 文件大小(脱壳) | 68833 字节(68 KB) |
| MD5 | caaa6985a43225a0b3add54f44a0d4c7 |
| SHA256(加壳) | 13c2379e9d9f679306e2133391804cc834892f25691381b6d078d07b56d38f90 |
| SHA256(脱壳) | 3412a75d91fc69985c9b122215e80d4b3a21b757e5b587724ee0ae7252a4a05 |
| 加壳情况 | UPX 0.89.6(被修改,标准 upx -d 无法脱壳) |
| 编译时间戳 | Sat Oct 30 07:59:58 2004(Process Explorer Image 页 / PEiD 扩展信息) |
脱壳前后体积从 20 KB 涨到 68 KB,是压缩壳的典型表现。哈希是样本的"身份证",同一文件任何改动都会改变哈希;但哈希只能精确比对已知样本,改一个字节即失效——这正是问题八要用多种检测方法互补的原因。
问题(2):样本的目的
综合静态与动态证据,样本目的是建立远程控制通道:使目标主机长期驻留,按攻击者通过 HTTP 下发的指令执行操作。
证据链:
- 脱壳样本字符串与 IDA 伪代码中有完整的 C&C 配置:
http://10.10.10.10/RaDa+RaDa_commands.html,即周期性从该页面取指令; - 配置初始化函数(
sub_404FB0,F5 伪代码)把五样配置写进全局变量:C&C 基础 URL、指令页面RaDa_commands.html、cgi-bin目录下的download.cgi(下载)与upload.cgi(上传)、工作目录C:\RaDa\tmp、注册表路径HKLM\Software\Microsoft\Windows\CurrentVersion\Run\;

- 字符串
Upload file using http And multipart/form-data说明支持 HTTP multipart 文件上传——不只是收指令,还能把目标机上的文件传回去; - 版本资源里 CompanyName 赫然写着 "Malware",ProductName 为 "RaDa"。

关于 C&C 地址:教材原版样本连公网域名,本样本被改为内网地址
10.10.10.10,字符串里还留有http://10./http://192.168./http://172.16.三个私网网段前缀,推测支持按部署环境配置 C&C——属于样本分发者针对封闭实验环境的改造。
问题(3):样本的特性
按四个维度归纳,每条都有截图佐证:
传播:无自我复制、无邮件/共享传播逻辑,靠人工投递或攻击者种植。运行后只在本地落盘。
驻留:
- 动态观察到运行后立刻创建
C:\RaDa\bin\与C:\RaDa\tmp\两个目录(时间戳与进程启动时间吻合),并在bin\下释放自身副本RaDa.exe(21 KB); - 释放副本的时间戳被伪造成 2008/12/23(样本编译于 2004 年,运行日是 2026 年),用固定旧时间戳降低文件在目录列表中的显眼程度,属于反取证手法;
- 代码中存在 Run 键自启动逻辑(配置初始化函数末尾注册了
HKLM\...\CurrentVersion\Run\路径),但实测裸运行不写注册表——安装/自启动应由Command_install分支触发。



远程控制:命令集 Command_install / Command_uninstall / Command_usage / Command_conf / Command_go / Command_exit(IDA 字符串窗口),对应安装、卸载、用法、配置、执行、退出六条远控指令;取指令走 HTTP GET RaDa_commands.html。

攻击能力:下载(download.cgi)与上传(upload.cgi,multipart)双向文件通道;可以释放并运行任意可执行内容(SotM 挑战背景即模拟此类场景)。
动态行为补充(Process Explorer):进程无界面静默运行,父进程为 explorer.exe;TCP/IP 页为空,Wireshark 抓包期间未见任何 DNS 查询。
这两个"没有"不是疏忽而是互相印证:C&C 是 IP 字面量,不触发 DNS;
10.10.10.10在当前网络中不存在,TCP 连接超时失败——所以进程安静得像没联网。"静态发现它要回连 + 动态看到连不上"这个组合,比单看任何一边都更接近真相。


问题(4):使用了什么反分析/反逆向技术
至少两种,均有实证:
- 修改版 UPX 加壳:静态 strings 对加壳样本只能看到乱码,必须脱壳。且壳被针对性修改——Kali 官方
upx -d报CantUnpackException: file is modified/hacked/protected拒绝脱壳,Process Explorer 也提示 "Image is probably packed"。壳不只是"有",还做了防自动化处理的加固。 - 释放文件时间戳伪造:
C:\RaDa\bin\RaDa.exe落地即带 2008/12/23 的固定旧时间戳,干扰按时间排序的取证排查。
(同类手法参考:crackme2 成功信息的异或混淆也是字符串级反静态分析,任务二已分析。)
问题(5):样本属于哪种恶意代码分类
判定为后门程序(Backdoor)/ 僵尸程序(Bot),理由:
- 不自我复制 → 排除病毒、蠕虫;
- 无伪装正常软件诱导安装的逻辑 → 不属木马投递型;
- 核心行为是静默驻留 + 按远程指令行动(六条 Command、HTTP 取指令、上传下载),具备典型后门特征;若被接入统一指挥的 C&C(如 IRC 频道,任务四即此类),同一批受控机即构成僵尸网络。本样本取指令的设计(命令页面 + go 执行)正是单 bot 形态。
问题(6):有相似功能的已有工具
举三个同期或同类真实软件:
| 工具 | 相似点 |
|---|---|
| 冰河 / 灰鸽子(2000 年代国内著名 RAT) | 静默驻留、文件上传下载、远程执行命令,与本样本能力集高度重合 |
| SubSeven / Back Orifice 2000 | 早期 Windows 后门标杆:进程隐藏、注册表自启动、双向文件传输 |
| PsExec(合法工具,亦常被滥用) | 任务四实际出现了:经 SMB 上传服务程序并远程创建服务——本样本的"释放 exe 并运行"驻留思路与之同构 |
问题(7):能否调查出开发者
能给出署名,但要讨论可信度:
- 脱壳样本字符串明确署名 (c) Raul Siles && David Perez,SotM 32 - September 2004;字符串里还有
http://www.honeynet.org/scans/index.html,与开头This program is the binary of SotM 32互相印证——该样本出自 Honeynet Project 第 32 期 "Scan of the Month" 分析挑战,作者为参赛分析者/出题者署名。 - 署名不等于事实:二进制里的版权字符串可随意伪造,攻击者完全可以借他人名字署名以嫁祸或蹭名。只有当署名与外部可验证信息(Honeynet 官网的 SotM 32 存档页面、作者本人公开报告、样本在其他分析文献中的一致归属)相互印证时,溯源结论才可靠。
- 条件限定:样本未加壳或已成功脱壳(本实验满足);署名信息与公开档案吻合;若能再查到 C&C 基础设施的注册信息、编译环境的语言/时区元数据,可信度更高。反之,只有壳内字符串而无任何旁证时,只能作为线索不能作为结论。
问题(8):至少 5 种检测方法
| 方法 | 原理 | 针对本样本的具体特征 |
|---|---|---|
| 1. 哈希黑名单 | MD5/SHA256 精确比对已知样本库 | 本样本 MD5 caaa6985...,入库即报;局限:改一个字节哈希全变 |
| 2. 查壳启发 | "可执行文件 + UPX 壳"本身即高危启发项 | PEiD 识别 UPX,Process Explorer 提示 "probably packed",可设"壳+联网/写注册表"组合规则 |
| 3. 特征码/签名 | 提取样本独有字节串做签名 | UPX 被修改处的魔改字节、配置初始化代码序列 |
| 4. YARA 规则 | 字符串组合匹配,检同类样本 | RaDa_commands.html + download.cgi/upload.cgi + Command_uninstall 组合出现即可命中家族 |
| 5. 行为检测(HIDS) | 监控写自启动键、系统目录释放文件 | 创建 C:\RaDa\bin\tmp、释放 exe 并伪造时间戳、写 Run 键(install 后) |
| 6. 网络检测(NIDS) | Snort 规则匹配 C&C 特征 | 对 http://*/RaDa + RaDa_commands.html 的 HTTP GET 做特征匹配,与任务四呼应 |
3.4 任务四:蜜罐取证分析(7 问)
3.4.0 数据验证
botnet_pcap_file.dat 拖入 Kali 后先验证:
capinfos ~/botnet_pcap_file.dat

关键参数:标准 pcap,Ethernet 封装,54536 个数据包,捕获时长 429588 秒(4.97 天,3 月 1 日 04:08 至 3 月 6 日 03:27)——与题目"蜜罐被收集 5 天数据"吻合。
问题(1):IRC 是什么
见 1.5:基于 TCP 的实时文本群聊协议,C/S 架构,僵尸网络最常用的 C&C 信道;客户端依次发送 NICK、USER 完成注册,再 JOIN 加入频道;常用端口 TCP 6667(6660-6669)。
问题(2):僵尸网络是什么
见 1.6:牧牛人经 C&C 信道统一指挥被控主机(僵尸)组成的网络,用于 DDoS、垃圾邮件、窃密、点击欺诈、挖矿、跳板攻击等。
问题(3):蜜罐与哪些 IRC 服务器通信过
tcpdump -nn -r ~/botnet_pcap_file.dat 'tcp port 6667' | awk '{print $3, $5}' | cut -d. -f1-4 | sort -u
tshark -r ~/botnet_pcap_file.dat -q -z conv,tcp | grep 6667

蜜罐 172.16.134.191 与 6667 端口通信过的服务器共 5 个:
| 服务器 | 会话规模 | 性质 |
|---|---|---|
| 209.196.44.172 | 18700 个包,收发 2.1 MB | 主 C&C,深度参与的僵尸网络频道 |
| 209.126.161.29 | 多次尝试,0 字节 | 已失效,握手未建成 |
| 66.33.65.58 | 3 个包 | 试探性连接 |
| 63.241.174.144 | 9 个包 | 短暂尝试 |
| 217.199.175.10 | 8 个包 | 短暂尝试 |
即蜜罐实际"入群"的是 209.196.44.172,其余是 bot 程序内置的备用/历史 C&C 轮询尝试。
问题(4):多少不同主机访问了 209.196.44.172
tshark -r ~/botnet_pcap_file.dat -Y "ip.addr == 209.196.44.172" -T fields -e ip.src | sort -u | wc -l
# 2
tshark -r ~/botnet_pcap_file.dat -Y "ip.addr == 209.196.44.172" -T fields -e ip.src | sort | uniq -c | sort -rn
# 9798 209.196.44.172
# 8902 172.16.134.191

统计口径:以与 209.196.44.172 出现过 IP 层通信的不同源地址计,共 2 个——服务器自身与蜜罐。也就是说,外部主机只有蜜罐 1 台访问过这台僵尸网络服务器(9798 个包为服务器下行指令流量,8902 个包为蜜罐上行)。这台 C&C 只服务这一个"客户",或者说蜜罐是它当时在线的活跃僵尸之一。
问题(5):哪些 IP 攻击了蜜罐
tshark -r ~/botnet_pcap_file.dat -Y "ip.dst == 172.16.134.191" -T fields -e ip.src | sort | uniq -c | sort -rn | head -30

向蜜罐发过包的源 IP 共 166 个。按包数头部:
| 排名 | 源 IP | 包数 | 性质 |
|---|---|---|---|
| 1 | 209.196.44.172 | 9798 | C&C 指令下发(非攻击,身份特殊) |
| 2 | 207.172.16.150 | 8985 | 高频交互,待查 |
| 3 | 24.197.194.106 | 4549 | 高频交互,待查 |
| 4 | 61.111.101.78 | 1433 | 突破口(见问题七) |
| 5 | 210.22.204.101 | 1165 | 高频交互,待查 |
166 个源 IP 中绝大多数是 Internet 背景噪音(蠕虫扫描、漏洞探测),真正"打进来"的藏在高频交互的几个 IP 里,由问题七的时间线定案。
问题(6):攻击了哪些端口(对应哪些漏洞)
TCP 目标端口分布(top):
tshark -r ~/botnet_pcap_file.dat -Y "ip.dst == 172.16.134.191" -T fields -e tcp.dstport | sort -n | uniq -c | sort -rn | head -20

UDP:137(65,NetBIOS 名字服务)、1434(55,SQL Server 监听端口,Slammer 蠕虫特征)、1026。
| 端口 | 协议/服务 | 背景 |
|---|---|---|
| 1152 | 沦陷后 C&C 通道(IRC) | 蜜罐上线后主动外连的本地端口 |
| 1061 | 高频持续数据传输 | 疑似二级控制通道,本次未能完全确认,留作开放结论 |
| 80 | HTTP | Web 探测/异常浏览 |
| 445 | SMB(直接 TCP) | Windows 2000 SMB 服务,本次突破口 |
| 4899 | RAdmin 远程管理 | 常被攻击者装作远控 |
| 139 | NetBIOS Session(SMB) | 微软文件共享,与 445 同类 |
| 10xx 高端口(99/1041/1046/1051/1053/1056/1064/1067/1100/1117/1118/1121…) | 扫描/后门试探 | 扫描器逐端口敲门 |
| UDP 1433 | SQL Server | Slammer 时代背景蠕虫 |
问题(7):哪个攻击成功了?如何确定
定位方法:蜜罐最终加入僵尸网络,必有"沦陷时刻"。找到它首次主动外连 C&C 的时间,回溯之前的密集交互即可锁定突破口。
# 蜜罐第一次向 209.196.44.172 发 SYN 的时间
tshark -r ~/botnet_pcap_file.dat -Y "ip.src == 172.16.134.191 && ip.dst == 209.196.44.172 && tcp.flags.syn == 1 && tcp.flags.ack == 0" -T fields -e frame.time | head -3
# 2003-03-05 23:23:18.775020

03-05 23:23:18,蜜罐上线。回看当晚 445 端口:
tshark -r ~/botnet_pcap_file.dat -Y "ip.dst == 172.16.134.191 && tcp.dstport == 445" -T fields -e frame.time -e ip.src -e tcp.flags | grep "2003-03-05T2[0-3]" | tail -40

03-05 22:33 起,61.111.101.78 对蜜罐 445 端口发起持续 4 分 40 秒的密集会话(大量 PSH+ACK 数据传输);45 分钟后蜜罐主动连上僵尸网络服务器。
导出该会话看载荷:
tshark -r ~/botnet_pcap_file.dat -Y "ip.addr == 172.16.134.191 && ip.addr == 61.111.101.78" -w ~/attack_20242320.pcap

Wireshark 打开 → 追踪 TCP 流:

载荷完整 readable:
- SMB 协议协商:
PC NETWORK PROGRAM 1.0→LANMAN1.0→NT LM 0.12; - NTLMSSP 认证:域用户
PC0191,Windows 2000 5.0/LAN Manager——认证通过,会话建立; - 经
ADMIN$共享向\System32\写入PSEXESVC.EXE(PsExec 工具的服务端组件),随后创建并启动服务。
结论:攻击者 61.111.101.78 于 03-05 22:33 通过 445 端口的 SMB 服务,用 PsExec 手法(ADMIN$ 写文件 + 创建服务)取得蜜罐控制权;45 分钟后蜜罐外连 209.196.44.172:6667 上线入群。攻击成功的直接证据是"写入 PSEXESVC.EXE 并建服务"的完整会话 + 随后的 C&C 外连,两个事件在时间线上前后衔接、互为因果。
成功原因:Windows 2000 的 SMB 服务当时暴露于公网且没有针对此类远程管理服务创建的防护,攻击者拿到足够权限的账户(或利用空会话/弱口令)后即可直接投放并启动服务程序。
4. 问题及解决方案
问题 1:VMware 拖放文件到 Kali 失败。 直接把 exe 从 Win11 拖进 Kali 窗口不落地;拖进终端会粘出 /var/run/vmblock-fuse/blockdir/XXXXXX/文件名 的路径。这是 VMware 的拖放临时挂载点,几十秒自动消失,且有两次拷到 0 字节空文件(less 打开满屏 ~)。解决:粘出路径后立刻 cp 到 ~,随机目录名每次拖放都变,必须用手头这次实际路径;大文件(18 MB pcap)一次拖好马上拷。后续文件传输基本靠这个办法完成。
问题 2:upx -d 脱壳失败。 Kali 官方方案报 CantUnpackException: file is modified/hacked/protected——样本的 UPX 被魔改加固。改用任务书点名的超级巡警脱壳机,一次成功。该失败后来作为反分析技术的实证写进任务三问题四。
问题 3:strings 找不到关键字符串。 ASCII 模式下 grep http 一无所获,误以为样本不含 URL。实际上 VB6 字符串以 UTF-16LE 存放,strings -el 后 C&C 地址、注册表键、文件路径全部出现。教训:strings 默认 ASCII,分析 Windows 程序记得宽字符模式。
问题 4:snort 不可用 + Snort 3 规则不兼容。 Kali rolling 默认没装 snort;sudo apt install snort 装上的还是 Snort 3(snort.lua 配置),任务书命令基于经典版 Snort 2。手工给 ips 段加载 snort-rules-default 规则集后产生 5433 条规则解析错误(Snort 2 语法与 Snort 3 不完全兼容),放弃 snort 路线。改用 tshark 时间线分析 + Wireshark 会话追踪独立完成任务四第 6、7 问,结论未受影响。
问题 5:Process Explorer 驱动被拦截。 Win11 的易受攻击驱动阻止列表拦下 procexp 老驱动 PROCEXP152.SYS。点"取消"继续用即可,进程查看/属性/TCP 页等核心功能不受影响(标题栏仍显示 Administrator)。
5. 学习感悟
这次实验最大的收获是体会到"证据链"三个字在恶意代码分析里的分量。任务三里,单看 Process Explorer 会以为样本"很安静、没联网",单看字符串又只知道它"想联网";把两边拼起来——C&C 是 IP 字面量所以无 DNS、内网地址不存在所以连不上——样本的行为才完整。取证也一样:166 个攻击源 IP 摆在那里没有意义,把"蜜罐首次上线时间"往回一拉,突破口自己浮出来了。工具会过时(PEiD、超级巡警都是 2008 年的老古董,snort 版本说变就变),但"静态+动态交叉验证""时间线定因果"这些方法论是工具背后的东西。
另一个意外之喜是 crackme2 的异或混淆和 rada 的魔改 UPX、伪造时间戳——攻击者和分析者的博弈不在某个高深技术上,而在"你想省事的那一步":想直接 strings?字符串加密了;想 upx -d 一键脱壳?壳被改了;想按时间排序找新文件?时间戳是假的。反过来,分析者每识破一层,对这种攻防不对称的理解就深一层。
(另外,老工具配新系统处处是坑:拖放临时挂载、驱动拦截、Snort 3 配置……踩坑记录见第 4 节,这些坑本身也是实验的一部分。)
6. 参考资料
- 诸葛建伟.《网络攻防技术与技术实践》. 电子工业出版社 —— crackme 练习与恶意代码分析方法的主要依据
- Honeynet Project. Scan of the Month #32. https://www.honeynet.org/scans/index.html —— 样本 RaDa.exe 的出处与原始挑战页面
- Microsoft Learn. Process Explorer(Sysinternals 文档). https://learn.microsoft.com/sysinternals/downloads/process-explorer
- Snort 官方文档. https://docs.snort.org/ —— Snort 3 配置与规则语法
- Wireshark 官方文档. https://www.wireshark.org/docs/ —— tshark / 追踪 TCP 流
- Raul Siles, David Perez. "RaDa: When Malware goes to Hollywood"? (SotM 32 参赛分析)—— 作者署名溯源旁证

浙公网安备 33010602011771号