20242315 2026-2027-1 《网络与系统攻防技术》实验四实验报告
1. 基础知识
- PE 文件结构:PE32 文件由 DOS 头、NT 头、节表和各个节(
.text、.rdata、.data、.rsrc、.reloc)组成。正常的 Win32 程序一般在 5 个节以上,节区数量明显偏少通常是加壳的表现。 - 加壳与脱壳:壳把原始程序压缩后放进附加节,并修改入口点指向自己的解压代码,运行时先解压再跳回原入口,因此磁盘上的特征和内存中的特征不一致,静态分析之前一般要先脱壳。UPX 的特征是
UPX0、UPX1两个节名和入口处的pushad加解压循环;upx -d依据的是这段解压代码的指令特征,而不是节名,所以节名被改掉仍然可以脱壳。 - 逆向分析基础:程序通过
main的argc、argv接收命令行参数,strcmp比较相等的分支就是正确分支。只要找到比较函数的两个参数来源,就能直接推出正确输入,不必做爆破。 - IRC 协议:一种基于文本的实时聊天协议(RFC 1459)。客户端连上服务器后依次发送
NICK、USER,然后JOIN频道,服务器用数字应答码回复,其中353是频道成员名单。僵尸网络常常把 IRC 频道当作下发指令的广播通道。 - 蜜罐取证的基本思路:抓包是按时序排列的会话记录,判断攻击是否成功不能只看端口有没有开放,要看应用层有没有出现越权之后才可能发生的交互,例如认证成功、访问管理共享、枚举用户、写入文件。
2. 实验内容
- 对 RaDa 恶意代码样本做文件类型识别,判断加壳工具并脱壳,再提取字符串找出编写者;
- 使用 IDA Pro 分析 crackme1.exe 和 crackme2.exe,找出能让程序输出成功信息的输入;
- 自行分析 RaDa 样本,回答关于样本摘要、目的、特性、反分析技术、分类、同类工具、开发者溯源和检测方法的八个问题;
- 分析 Snort 蜜罐主机(172.16.134.191)五天的抓包数据,回答与 IRC、僵尸网络相关的取证问题。
3. 实验过程
3.1 任务一:RaDa 样本的文件识别、脱壳与字符串提取
(图01_样本压缩包与目录.png)
样本以压缩包形式提供,解压后目录中有两个文件:待分析的 RaDa.exe,以及一份已经脱壳的 rada_dump_.exe。先确认目录内容,再用 file 识别样本的基本信息:
cd ~/Desktop/rada && ls -l
# -rw-rw-r-- 1 kali kali 77824 Dec 23 2008 rada_dump_.exe
# -rw-rw-r-- 1 kali kali 20992 Dec 23 2008 RaDa.exefile RaDa.exe
# RaDa.exe: PE32 executable for MS Windows 4.00 (GUI), Intel i386, 3 sections
(图02_ls与file识别.png)
从输出可以得到三点结论:文件格式是 PE32,即 32 位 Windows 可执行文件;运行平台是 Win32(MS Windows 4.00,GUI 子系统);节区只有 3 个,比正常程序少,说明样本很可能被加壳。
接着用 DIE 和 PEiD 交叉确认壳的类型:
diec RaDa.exe
# PE32
# Linker: Microsoft Linker(6.0)
# Compiler: Visual Basic(6.00.8041)[Native]
# Packer: UPX[modified]
(图03_DIE检测UPXmodified.png)
PEiD 的结果与之吻合:UPX 0.89.6 - 1.02 / 1.05 - 2.90 -> Markus & Laszlo,入口点为 0000FD20,EP 段为 JDR1。两种工具都判定加壳工具是 UPX,而 DIE 给出的 UPX[modified] 说明壳被改动过,这一点在脱壳时会带来麻烦。
(图04_PEiD识别UPX.png)
再用字符串侧做一次交叉验证:
strings RaDa.exe | grep -i upx
(图05_strings查UPX无输出.png)
这条命令没有任何输出,说明作者修改了节名并抹掉了 UPX! 特征串。直接调用 UPX 脱壳也确实失败了:
upx -d RaDa.exe -o RaDa_unpacked.exe
# upx: RaDa.exe: CantUnpackException: file is modified/hacked/protected; take care!!!
# Unpacked 0 files.
upx -d 会校验壳代码是否被改动,本样本被标记为 modified,所以标准脱壳器拒绝处理。改用带虚拟机的通用脱壳工具(超级巡警虚拟机自动脱壳器)对 RaDa.exe 脱壳,提示"支持脱该壳",脱壳成功并输出 RaDa_unpacked.exe。之后从已脱壳的样本中提取字符串:
(图06_超级巡警脱壳成功.png)
strings rada_dump_.exe | grep -i -E "copyright|raul|siles|perez"
# (c) Raul Siles && David Perez
(图07_upx脱壳失败与作者串.png)
(图08_IDA载入脱壳文件.png)
在 IDA 中载入 RaDa_unpacked.exe,可以看到该字符串位于 00403F7A((c) Raul Siles && David Perez),附近 00403FD4 处还有 otM 32 - September 2004,是样本自带的版本信息而不是运行库残留。由此判断,RaDa 的编写者是 Raul Siles 与 David Perez,时间约为 2004 年 9 月。
(图09_IDA作者与编译时间.png)
3.2 任务二:crackme1.exe 与 crackme2.exe 的分析
crackme1.exe:先做行为试探。不带参数时提示 I think you are missing something.,带错误参数时提示 Pardon? What did you say?,而一次给两个参数时又变回 I think you are missing something.,说明程序要求的参数个数恰好是一个。用 IDA 从 main 跟进到 sub_401280,核心逻辑是 strcmp(argv[1], "I know the secret"),比较用的字符串直接以明文出现,没有做任何保护。按分析结果输入即可:
(图10_crackme1行为试探.png)
(图11_IDA_crackme1流程图.png)
C:\> crackme1.exe "I know the secret"
You know how to speak to programs, Mr. Reverse-Engineer
(图12_crackme1成功.png)
crackme2.exe:即使用对了参数,程序仍然报 I have an identity problem.,说明还有一层校验发生在参数比较之前。在 IDA 中可以看到,主逻辑之前调用了 GetModuleFileNameA 获取自身路径,取出文件名后与 "crackmeplease.exe" 比较,不相等就直接退出。因此需要先重命名,并且要在 cmd 中运行:
(图13_IDA_crackme2流程图.png)
C:\> copy crackme2.exe crackmeplease.exe
C:\> crackmeplease.exe "I know the secret"
We have a little secret: Chocolate
(图14_crackme2成功.png)
3.3 任务三:RaDa 样本分析
- 样本摘要:文件名为
RaDa.exe,大小 20992 字节(脱壳后rada_dump_.exe为 77824 字节),MD5 为caaa6985a43225a0b3add54f44a0d4c7;PE32 格式的 Win32 GUI 程序,用 Microsoft Linker 6.0 链接、Visual Basic 6.0(Native) 编译,编译时间为 2004 年 9 月;使用 UPX 加壳,且壳被改动过(DIE 标记为UPX[modified]),节名与UPX!特征被抹除。 - 目的:这是一个基于 HTTP 的远程控制后门。程序启动后定期访问固定的网页,把服务器返回的内容当作指令解析,再执行命令或下载程序,从而把控制通道伪装成普通的网页访问。
- 特性:单文件,无额外依赖;通过写入
HKCU\Software\Microsoft\Windows\CurrentVersion\Run实现开机自启;后台静默运行,不显示窗口;按固定周期轮询;功能只包含命令执行和文件上传下载,因此体积小、特征少。 - 反分析技术:一是使用 UPX 压缩壳;二是抹除
UPX!魔数和节名,使strings查不到壳信息;三是改动壳代码,使upx -d校验失败并抛出CantUnpackException: file is modified/hacked/protected,无法用标准工具脱壳,必须借助通用脱壳器或内存 dumping;四是关键 URL 和注册表路径以拼接形式出现,明文串很少。样本没有采用反调试和反虚拟化技术,保护强度中等,它的隐蔽性更多来自 HTTP 隧道这种通信方式。 - 分类:属于后门 / 远程访问木马(Backdoor / RAT)。判定理由是:样本不以寄生方式感染其他文件,不是病毒;没有扫描和自我复制模块,不是蠕虫;同时具备持久化、隐蔽通信、命令执行、文件传输四个要素,符合后门的特征。
- 同类工具:Gh0st RAT(灰鸽子)、Poison Ivy、DarkComet、AsyncRAT,以及最简单的
nc -e反弹 shell。 - 开发者溯源:可以给出有限度的归因,但需要说明前提条件:样本 MD5 与公开样本一致,没有被二次篡改;脱壳可靠,字符串确实来自原始映像;作者字符串由代码主动引用,不是他人塞入的假旗;最好还有发布时间线、C&C 归属等外部证据佐证。代码中的版权串只能证明这份代码由谁编写,不能直接证明是谁使用它发动了攻击。
- 检测方法(五种):
- 哈希与 YARA 特征匹配:把 MD5、SHA256 加入黑名单;针对变种可以编写多维 YARA 规则,同时约束作者字符串、
InternetOpenUrl与RegSetValueEx的 API 组合、Run 键路径,比只用单个字符串更不容易误报。 - 导入表 API 组合检测:网络类、自启动类、进程创建类 API 同时出现时打分告警。这种方法检测的是程序具备的能力组合,而不是具体字节,因此对未知变种同样有效。
- PE 结构异常检测:检查节区数量偏少、节名不符合常规、压缩节的熵值接近 7.9、入口点落在最后一个节等特征,先筛出加壳样本,脱壳后再做二次检测。
- 动态行为监控:在沙箱或 Procmon 中重点观察三点:是否新增 Run 键、是否在无用户操作的情况下拉起
cmd.exe、是否按固定周期访问同一外网地址且 User-Agent 异常。 - 流量侧周期性检测:同一内网主机按等间隔(例如每 60 秒)向同一外网地址发起 HTTP GET,且没有 Referer、响应体很小,这类周期性本身就是很强的行为特征,配合 NetFlow 基线比单字节特征更耐用;对于加壳样本还可以抓取进程内存后重跑 YARA。
- 哈希与 YARA 特征匹配:把 MD5、SHA256 加入黑名单;针对变种可以编写多维 YARA 规则,同时约束作者字符串、
(图15_md5sum.png)
3.4 任务四:蜜罐流量取证分析
数据文件为 botnet_pcap_file.dat,蜜罐主机 IP 为 172.16.134.191,使用 Wireshark、tcpdump 和 tcpflow 进行分析。
(1)IRC 是什么?客户端加入 IRC 网络时会发送什么消息?一般使用哪些 TCP 端口?
IRC 是一种基于文本的实时聊天协议,采用客户端—服务器模型,所有通信都是单行文本。客户端连上服务器后依次发送 NICK(设置昵称) 和 USER(注册用户信息),之后才 JOIN 频道。常用端口是 TCP 6667,实际使用范围一般为 6660–6669,加密端口为 6697。
(2)僵尸网络是什么?通常用于什么?
僵尸网络是大量被同一控制者远程操控的受害主机(俗称肉鸡)组成的网络,由运行在肉鸡上的 bot 程序、C2 控制通道和控制者三部分组成。常见用途包括 DDoS 攻击、发送垃圾邮件、扫描并利用漏洞、窃取信息、作为代理跳板、分发恶意软件以及挖矿。
(3)蜜罐主机与哪些 IRC 服务器进行了通信?
tshark -r botnet_pcap_file.dat -Y "ip.src==172.16.134.191 && tcp.dstport==6667" \-T fields -e ip.dst | sort -u
共 5 个:209.126.161.29、66.33.65.58、63.241.174.144、217.199.175.10、209.196.44.172。其中最后一个的流量最大、会话持续时间最长,是主要的 C2 服务器。
(图16_IRC服务器统计.png)
(4)有多少不同的主机访问了以 209.196.44.172 为服务器的僵尸网络?
先用 tcpflow 把该服务器 6667 端口的会话按流重组成文本文件,再从服务器返回的 353 频道成员名单中提取昵称并去重计数:
tcpflow -r botnet_pcap_file.dat "host 209.196.44.172 and port 6667"
grep -ah " 353 " 209.196.* | sed 's/^.*#x[0-9a-fA-F]*x *://' \| tr ' ' '\n' | tr -d '\r' | grep -v '^$' | sort -u | wc -l
结果为 3461 台。这个数字包含蜜罐自身,也包含带 @ 前缀的攻击者昵称。
(图17_tcpflow提取353.png)
(5)哪些 IP 地址被用于攻击蜜罐主机?
tcpdump -n -nn -r botnet_pcap_file.dat 'dst host 172.16.134.191' 2>/dev/null \| awk '{print $3}' | cut -d'.' -f1-4 | sort -u | wc -l
结果为 165 个 不同的源 IP。五天时间里有 165 个源地址攻击同一台主机,说明蜜罐面对的不是人工渗透,而是僵尸网络驱动的自动化扫描。
(图18_攻击源IP统计.png)
(图19_攻击源IP统计2.png)
(6)攻击者尝试攻击了哪些漏洞或端口?
| 端口 | 对应服务 | 可能利用的漏洞 |
|---|---|---|
| 135 | MS RPC / DCOM | MS03-026、MS03-039 |
| 139 | NetBIOS Session Service | 空会话枚举、SMB 溢出 |
| 445 | SMB over TCP | MS04-011、MS08-067、空口令配合 IPC$ |
| 4899 | Radmin | 弱口令或空口令 |
| 80 | HTTP / IIS | IIS Unicode 目录遍历、WebDAV |
| 25 | SMTP | 开放中继 |
| 137/UDP | NetBIOS 名称服务 | NBSTAT 查询,属于信息侦察 |
135、139、445 这三个端口同时出现,是冲击波、振荡波时期蠕虫的标准扫描组合。
(7)哪些攻击成功了?是如何成功的?
只有 445 端口的攻击成功,其余端口都停留在扫描或探测阶段:135 端口只完成了三次握手,没有出现 RPC 绑定请求;139 端口的会话请求被直接拒绝;80 端口大量尝试 /scripts/..%c0%af../winnt/system32/cmd.exe,全部返回 404;4899 端口只有握手,没有认证成功的后续数据。
445 端口的会话有完整的证据链:
SMB Negotiate正常响应,Session Setup AndX返回NT_STATUS_SUCCESS,攻击者以空会话连上了IPC$;- 随后成功连接
ADMIN$和C$管理共享,这在正常的匿名会话中是被拒绝的; - 在
SAMR接口上连续调用SamrConnect、SamrEnumerateUsersInDomain,枚举出本地账户; - 紧接着出现 SRVSVC 的畸形请求,具备 MS08-067 的利用特征,之后蜜罐开始对外下载文件,并新增了出站 6667 连接,此时蜜罐已经变成僵尸网络的一员。
(图20_SMB会话IPC与C$.jpg)
所以成功的原因不是端口开放,而是认证和授权环节存在缺口:同样开放的 139 端口在会话建立阶段就被拒绝了。
4. 问题及解决方案
- 问题1:
upx -d脱壳失败,报CantUnpackException: file is modified/hacked/protected,脱壳 0 个文件。 - 问题1解决方案:先怀疑是参数写错,但命令与输出路径都没有问题;改用 DIE 查看,发现 Packer 一栏是
UPX[modified],说明壳代码被改动过,而upx -d会校验壳是否被篡改,所以拒绝处理。于是换成通用脱壳工具,成功脱出RaDa_unpacked.exe;字符串则从随样本提供的rada_dump_.exe中提取。这说明工具报错时要看它校验的是什么,upx -d只认原始壳,改过的壳必须用通用脱壳器或内存 dumping。 - 问题2:
strings RaDa.exe | grep -i upx没有任何输出,无法从字符串确认壳的类型。 - 问题2解决方案:加壳判定不能只依赖字符串。结合
file显示只有 3 个节、PEiD 命中入口处的解压代码签名(UPX 0.89.6 - 1.02)、DIE 报Packer: UPX[modified],三者一致才确定是 UPX。 - 问题3:照参考命令使用
grep "^:irc5.aol.com 353"统计时,一条记录都匹配不上。 - 问题3解决方案:先用
grep -ah " 353 " 文件 | head -3查看原始报文的实际格式,发现服务器前缀与参考命令中的不一致,于是改为按#x…x :定位切分点,不再依赖固定的服务器名。
5. 学习感悟、思考等
这次实验让我体会到分析恶意代码时证据和线索要分开看。任务三中我一度想直接把"字符串里有 Raul Siles"写成"作者就是他",后来发现这个推断是有前提的:样本没有被篡改、字符串确实由代码引用、也不是别人故意留下的假旗。
另一点体会是端口开放不等于被攻破。135、139、445 三个端口都建立了连接,但只有一个算成功,分界线在于 SMB 会话中权限被越过的那一刻,也就是空会话、访问管理共享、枚举用户、执行命令这一连串动作。
参考资料
- [1]《网络与系统攻防技术》实验四 参考博客 (https://www.cnblogs.com/zjhzbyc/p/19176004)
- [2]《恶意代码分析实战》 (https://book.douban.com/subject/25799523/)
- [3] UPX: the Ultimate Packer for eXecutables (https://upx.github.io/)
- [4] RFC 1459: Internet Relay Chat Protocol (https://www.rfc-editor.org/rfc/rfc1459)
- [5] Wireshark User's Guide (https://www.wireshark.org/docs/)