20242409 2025-2026-1 《网络与系统攻防技术》实验4实验报告
网络攻防与实践
实验指导书
题目:实验四恶意代码分析实践
学生姓名:伍宸崟
所在系别:网络空间安全系
:网络空间安全专业
学号:20242409
指导教师:王志强
20262026年11月
1.基础知识
1.1 PE文件结构 PE(Portable Executable)是Windows可执行文件格式,由COFF格式扩展而来,是Windows恶意代码分析的基础。
| 组成部分 | 作用 |
|---|---|
| DOS头+DOS | MZ标志,经典提示 This program cannot be run in DOS mode, |
| Stub | 快速判断是否为PE文件 |
| PE签名 | PE\0\0,定位PE文件头起始位置 |
| COFF文件头 | 记录机器架构、节数量、编译时间戳,判断运行平台 |
| 可选头 | 标记子系统(GUI/控制台)、程序入口RVA、基址ImageBase, IDA加载依赖该信息 |
| 节区表 | .text代码段、.data数据段、.rdata只读字符串段,字符串提 取、逆向分析重点区域 |
file命令识别 RaDa.exe输出PE32 executable(GUI)Intel 80386,就是读取PE头信息得到文件格式、运行平台、程序子系统。
1.2壳与脱壳
加壳:使用压缩/加密算法封装原始PE文件,壳代码优先执行,在内存中解密解压原始程序后跳转原始入口。查壳工具PEiD依靠入口字节特征、区段名识别壳类型,UPX典型特征区段名UPX0、UPX1。脱壳分为两类:
1.静态脱壳:脱壳软件直接解析壳算法,输出原始PE文件(本次实验使用超级巡警脱壳机);
2.动态脱壳:恶意程序运行,内存完成自解密后,使用工具dump内存得到原始程序。壳对抗静态分析原理:磁盘上.text段是压缩密文,未脱壳直接strings提取只会得到乱码,无法读取有效字符串。
1.3 strings工具原理
strings按指定最小长度,扫描文件中连续可打印字符序列并输出;默认仅提取ASCII字符串,Windows VB6程序大量UTF-16LE宽字符字符串,需要strings-el参数提取宽字符。缺点:不会区分导入函数名、有效业务字符串,提取结果需要人工筛选。
1.4IDA静态逆向分析流程
IDA具备交叉引用(XREF)功能,标准分析流程:
1.Shift+F12打开字符串窗口,筛选敏感提示、URL、命令字符串;
2.双击字符串跳转数据段,按X查看所有引用该字符串的代码位置;
3.跳转至对应代码,F5生成C伪代码,理解校验、分支逻辑。交叉引用的意义:字符串只是静态数据,引用字符串的代码才代表程序真实行为,是逆向破解 crackme的核心思路。
1.5 IRC协议
IRC(Internet Relay Chat,互联网中继聊天)是TCP文本协议,C/S架构,服务器互联形成IRC网络,频道Channel为群聊房间。僵尸网络常用IRC作为C&C信道,协议简单、纯文本、支持一对多广播指令。客户端接入流程:NICK设置昵称→USER提交用户信息完成注册→JOIN#频道名加入频道接收消息。默认端口:TCP 6667,扩展端口6660~6669。
1.6僵尸网络Botnet
大量被恶意程序攻陷的主机(Bot/僵尸主机),由攻击者(Botmaster)通过C&C信道统一管控组成的网络。攻击者在C&C信道下发指令,所有僵尸主机同步执行。典型用途:DDoS攻击、垃圾邮件发送、信息窃取、挖矿、跳板渗透、刷量欺诈。生命周期:漏洞扫描→漏洞利用植入bot→bot主动回连C&C→接收指令执行恶意行为。
1.7网络流量取证分析
针对pcap流量包取证分析思路:
1.统计:按源IP、目的端口、TCP会话统计流量,找出异常通信;
2.会话分析:tshark查看 TCP会话,区分握手成功的有效会话和单纯SYN扫描包;
3.时间线回溯:找到恶意主机上线标志性事件,向前回溯定位攻击触发点;
4.载荷验证:导出可疑会话,Wireshark追踪TCP流,读取明文载荷确认攻击行为。
2.实验内容
本实验分为四大模块:
RaDa木马样本识别、UPX脱壳、字符串提取,定位样本作者;
IDA逆向 crackme1.exe、crackme2.exe,找到正确输入触发成功输出;
综合分析RaDa木马:文件摘要、功能目的、样本特性、反逆向技术、恶意分类、同类工具对比、溯源条件、五种检测方法;
IRC僵尸网络蜜罐取证:理解IRC协议、僵尸网络,解析pcap流量,提取IRC服务器IP、肉鸡数量、攻击源IP、攻击漏洞、成功攻击行为。
3.实验过程
3.1任务一:RaDa文件类型识别、脱壳与字符串提取
3.1.1样本解压、查壳
解压密码rada解压rada.rar,将RaDa.exe放到排除杀毒监控目录,使用PEiD打开样本:
PEiD识别结果为“UPX0.89.6-1.02(Markus& Laszlo)”,据此得到三条结论:文件格式为PE32可执行文件;运行平台为Intel80386,即32位Windows,子系统为Win32GUI;加壳工具为UPX0.89.6-1.02压缩壳。3.1.2 Kali交叉验证 在Kali终端执行文件识别与哈希校验命令:file RaDa.exe;md5sum RaDa.exe,结果如下:
file输出 PE32 executable(GUI) Intel 80386, for MS Windows, md5sum输出caaa6985a43225a0b3add54f44a0d4c7。文件格式、运行平台、哈希三项结果均与Windows侧PEiD一致,说明样本在传输和存放过程中未被改动,可作为后续比对的基准。
3.1.3脱壳操作
尝试Kali原生UPX脱壳:
输出 CantUnpackException: file is modified/hacked/protected,说明该样本的UPX壳已被修改加固,不具备标准UPX的自解压特征,官方upx-d拒绝脱壳。
在Windows侧打开超级巡警脱壳机,载入RaDa.exe后点击“脱壳”,提示 Unpack successfully,产物另存为 RaDa_unpacked_20242409.exe
PEiD二次检测脱壳文件:壳特征消失,识别编译器 Microsoft Visual Basic 5.0/6.0,文件体积变大,脱壳成功。
3.1.4字符串提取,查找作者 在Kali执行宽字符字符串提取命令: strings-el RaDa_unpacked_20242409.exe|grep-iE"Raul|Siles|Perez|copyright|2004",输出如下:
结论:脱壳样本中检索到版权串“(c) Raul Siles&& David Perez# SotM 32-September 2004”。据此可判定RaDa样本的编写作者为Raul Siles与David Perez,编写时间约为 2004年 9月,样本出自 Honeynet Project第 32期 Scan of the Month挑战,SotM 32即该期编号。3.2任务二:IDA分析crackme1.exe、crackme2.exe
3.2.1 crackme1.exe
直接使用 crackmel的口令测试,仍提示失败;字符串窗口比 crackmel多出两个关键串: crackmeplease.exe与 I have an identity problem.,说明程序还额外校验了程序名。
无参数:I think you are missing something.错误参数:Pardon?What did you say?判断程序需要1个命令行参数。
IDA载入crackmel.exe,Shift+F12打开字符串窗口,找到关键字符串:I know the secret、 You know how to speak to programs, Mr. Reverse-Engineer
选中I know the secret,按X查看交叉引用
输出 We have a little secret: Chocolate,与伪代码中异或解码后的结果一致,crackme2破解完成。 3.2.2 crackme2.exe
直接使用 crackme1的口令测试,失败;字符串窗口发现额外字符串crackmeplease.exe、I have an identity problem.。
在IDA的Strings窗口中发现了 crackmeplease.exe和 I know the secret。查看流程图发现程序有两次strcmp:第一次比较argv0是否为 crackmeplease.exe,第二次比较输入参数是否为I know the secret。
因此,将程序重命名为crackmeplease.exe,并执行验证,成功输出隐藏信息。
3.3任务三:RaDa样本完整分析 3.3.1二进制摘要
| 项目 | 内容 |
|---|---|
| 文件类型 | PE32 executable(GUI) Intel 80386 |
| 加壳文件大小 | 20992字节 |
| 脱壳文件大小 | 68833字节 |
| MD5加壳 | caaa6985a43225a0b3add54f44a0d4c7 |
| SHA256加壳 | 13c2379e9d9f679306e2133391804cc834892f25691381b6d078d07b56 d38f90 |
| SHA256脱壳 | 3412a75d91fc69985c9b122215e80d4b3a21b757e5b587724ee0ae7252 a4a05 |
| 壳信息 | 修改版UPX0.89.6,原生upx-d无法脱壳 |
| 编译时间戳 | Sat Oct 30 07:59:58 2004 |
3.3.2二进制目的
该样本是远程控制后门程序,目标主机运行后静默驻留,周期性访问HTTP C&C页面获取攻击者下发指令,支持双向文件上传、下载,执行攻击者指定操作。证据:静态提取C&C地址http://10.10.10.10/RaDa/RaDa_commands.html;存在download.cgi、upload.cgi接口,支持multipart文件上传;代码包含注册表自启动逻辑。
动态观察(ProcessExplorer)显示:进程无界面静默运行,父进程为explorer.exe,TCP/IP页为空,抓包期间未见DNS查询。这两处“没有”并非疏忽,而是与静态结论互相印证:C&C使用IP字面量因而不触发DNS,10.10.10.10在实验网络中不存在导致连接超时。静态“想回连”与动态“连不上”合起来才完整描述了样本行为。
3.3.3样本特性
(1)传播特性:无自我复制代码,不主动传播,依靠人工投递、攻击者手动部署;
(2)驻留特性:运行自动创建C:\RaDa\bin、C:\RaDa\tmp目录,释放自身副本;释放副本时间戳固定伪造为2008-12-23;触发install指令后写入HKLM\Software\Microsoft\Windows\CurrentVersion\Run实现开机自启;
(3)通信特性:HTTP协议拉取指令,内置内网网段C&C地址,无DNS解析;
(4)指令能力:支持install、uninstall、conf、go、exit等指令,文件双向传输、执行任意程序;
(5)界面:无GUI窗口,后台静默运行。
3.3.4反分析、逆向对抗技术
修改加固UPX壳:标准UPX脱壳命令无法解密,阻止自动化批量脱壳;未脱壳时 strings只能读取乱码,阻碍静态字符串分析;
文件时间戳伪造:释放的副本固定旧时间戳,干扰取证人员按文件修改时间排查新增恶意文件;补充:同crackme2的字符串异或混淆属于同类对抗思路,隐藏明文提示。
3.3.5恶意代码分类
归类:后门程序(Backdoor/Bot僵尸程序)
理由:不具备病毒、蠕虫的自我复制传播能力;核心行为是静默驻留主机,等待远程C&C指令执行操作;接入统一C&C服务器后,该主机就成为僵尸网络中的Bot节点。不具备木马伪装欺骗用户的特征。
3.3.6同类功能工具
灰鸽子、冰河:国内经典RAT远控,支持驻留、文件上传下载、命令执行;
SubSeven、Back Orifice 2000:早期经典 Windows后门,进程隐藏、注册表自启、文件传输;
PsExec:合法运维工具,常被攻击者滥用,SMB写入程序、创建服务远程执行。
3.3.7能否定位开发者
可以得到署名线索,但署名不能直接作为确凿证据。
脱壳后字符串标注作者Raul Siles&&DavidPerez,该样本是Honeynet项目SotM#32挑战样本,该署名是挑战文档中标注的作者。
限制条件:
可信场景:脱壳成功,字符串署名和Honeynet公开存档、多篇分析文献交叉印证;
不可信场景:仅二进制字符串署名,无外部佐证,字符串可以被攻击者随意篡改伪造,用于嫁祸。
额外溯源辅助:C&C服务器注册信息、编译环境时区、编译器元数据等辅助佐证。
3.3.85种及以上检测方法
(1)哈希黑名单检测:MD5/SHA256哈希入库,精确匹配已知恶意样本;局限:样本轻微修改,哈希失效;
(2)壳启发式检测:PE检测识别UPX壳,搭配行为规则(写注册表、释放文件)告警;适合发现未入库加壳恶意样本;
(3)字节特征码检测:提取样本独有的机器码字节序列作为特征,匹配恶意代码片段;可检测同家族变体;
(4)YARA规则检测:组合RaDa_commands.html、download.cgi、upload.cgi等独有字符串编写YARA规则,批量识别同家族样本;
(5)主机行为检测HIDS:监控行为:创建C:\RaDa目录、释放可执行文件、修改Run启动项、伪造文件时间戳;
(6)网络NIDS检测:Snort/Wireshark规则匹配HTTP访问*/RaDa/RaDa_commands.html流量,识别C&C通信。
3.4任务四:蜜罐取证分析
3.4.1数据校验
capinfos输出显示:文件为标准pcap、Ethernet封装,共54536个数据包,捕获时长429588秒,约4.97天,时间跨度自3月1日04:08至3月6日03:27,与题目所述“蜜罐主机5天网络数据”完全吻合,数据完整可用。
3.4.2IRC是什么
IRC是TCP文本型C/S聊天协议,服务器互联形成IRC网络,频道是群组。客户端接入顺序:NICK设置昵称→USER注册信息→JOIN#频道加入频道;常用TCP端口6667,6660-6669。
3.4.3僵尸网络是什么
被恶意程序控制的主机集群,由攻击者通过C&C信道统一下发指令;用途:DDoS、窃取信息、垃圾邮件、挖矿、跳板渗透。
3.4.4蜜罐 172.16.134.191通信的 IRC服务器
209.196.44.172:成功建立会话,蜜罐成功加入频道,主C&C服务器
209.126.161.29:握手失败,无有效数据
66.33.65.58:少量包,试探连接
63.241.174.144:短暂尝试
217.199.175.108:短暂尝试
可见蜜罐真正“入群”的对象只有209.196.44.172;其余四个地址是bot程序内置的备用/历史 C&C轮询,均未建立有效会话。
3.4.5访问 209.196.44.172的不同主机
按ip.addr==209.196.44.172统计出现过的不同源地址,共2个:服务器自身209.196.44.172(9798个包,指令下行)与蜜罐172.16.134.191(8902个包,上行应答)。也就是说,观察期内访问该僵尸网络服务器的外部主机只有蜜罐1台,这台C&C当时仅服务这一个在线僵尸。 3.4.6攻击蜜罐的源IP
统计得共有166个源IP向蜜罐发过包。其中209.196.44.172是C&C指令下发(身份特殊,不计为攻击);其余绝大多数只发送单个SYN探测包,属互联网背景扫描(蠕虫、端口扫描)。真正“打进来”的攻击源是61.111.101.78,判定依据见3.4.8的会话与时间线。 3.4.7攻击者尝试的漏洞/端口
| 访问次数 | TCP 目的端口 | 常见服务/风险说明 |
|---|---|---|
| 9798 | 1152 | 自定义端口,恶意扫描尝试 |
| 8906 | 1061 | 自定义端口,恶意扫描尝试 |
| 4488 | 80 | HTTP网页服务,Web攻击、爬虫 |
| 2547 | 445 | SMB,永恒之蓝等勒索/蠕虫重点利用端口 |
| 1020 | 1077 | 自定义端口,恶意扫描尝试 |
| 490 | 4899 | Radmin远程控制端口 |
| 294 | 139 | NetBIOS,SMB相关,内网渗透 |
| 访问次数 | TCP 目的端口 | 常见服务/风险说明 |
| --- | --- | --- |
| 290 | 1051 | 自定义端口,恶意扫描尝试 |
| 122 | 122 | 自定义端口,恶意扫描尝试 |
| 77 | 1118 | 自定义端口,恶意扫描尝试 |
| 75 | 1056 | 自定义端口,恶意扫描尝试 |
| 70 | 1121 | 自定义端口,恶意扫描尝试 |
| 59 | 1117 | 自定义端口,恶意扫描尝试 |
| 54 | 1046 | 自定义端口,恶意扫描尝试 |
| 43 | 99 | 自定义端口,恶意扫描尝试 |
| 38 | 1064 | 自定义端口,恶意扫描尝试 |
| 37 | 1041 | 自定义端口,恶意扫描尝试 |
| 34 | 1067 | 自定义端口,恶意扫描尝试 |
| 29 | 1100 | 自定义端口,恶意扫描尝试 |
| 29 | 1053 | 自定义端口,恶意扫描尝试 |
UDP侧另有137(NetBIOS名字服务,65个包)与1434(SQL Server监听端口,55个包,Slammer蠕虫特征)为主的探测流量。综合TCP与UDP结果可知,攻击者重点试探SMB(445、139)、HTTP(80)、RAdmin(4899)与SQL Server(1434)等高危服务,同时大量敲击非标准高端口,属于典型的批量端口扫描与漏洞探测行为。 3.4.8成功的攻击、攻击方式
该命令筛选攻击者发往蜜罐172.16.134.191的TCP SYN包(无ACK),代表攻击者发起端口探测、扫描行为;提取攻击源IP、访问端口、发包时间,用于识别攻击来源与攻击方式。重点观察:139端口大量扫描(NetBIOS/SMB)、80 Web、1433MSSQL、1080代理端口探测。
蜜罐首次外连C&C时间2003-03-05 23:23:18.775020→回溯445端口61.111.101.78的 4分 40秒密集会话→导出 pcap追踪 TCP流→ SMB协商+ NTLMSSP认证通过→ADMIN$写入 PSEXESVC.EXE并建服务→45分钟后入群,并说明成功原因(Win2000 SMB暴露公网、空会话/弱口令、无需内存破坏漏洞)。
上一步统计只能说明“有人在扫”,要回答“谁成功了、怎么成功的”,需先定位蜜罐的沦陷时刻:蜜罐最终加入僵尸网络,必然存在首次主动外连C&C的时刻。执行tshark-r botnet_pcap_file.dat-Y"ip.src172.16.134.191&& ip.dst 209.196.44.172&& tcp.flags.syn== 1&& tcp.flags.ack== 0"-T fields-e frame.time,得到2003-03-05 23:23:18.775020,即蜜罐上线时间。
再回溯该时刻之前的 445端口交互:执行 tshark-r botnet_pcap_file.dat-Y"ip.dst172.16.134.191&& tcp.dstport445"-T fields-e frame.time-e ip.src-e tcp.flags,可见 03-05 22:33起,61.111.101.78对蜜罐445端口发起持续约4分40秒的密集会话,包含大量PSH+ACK数据传输;约45分钟后蜜罐才主动连上209.196.44.172:6667。两个事件在时间线上前后衔接,构成明确因果。
导出该会话单独分析:tshark-r botnet_pcap_file.dat-Y"ip.addr172.16.134.191&& ip.addr 61.111.101.78"-w attack_20242409.pcap,用Wireshark打开后对任意一个包右键“追踪TCP流”,即可读取完整载荷。
载荷内容显示:SMB协商依次为 PC NETWORK PROGRAM 1.0→ LANMAN1.0→ NT LM 0.12;随后 NTLMSSP认证通过(会话主机信息为 PC0191、 Windows 20005.0/ LAN Manager), SMB会话成功建立;接着攻击者通过 ADMIN$共享向\System32\写入 PSEXESVC.EXE,并创建、启动对应服务。
结论:攻击者61.111.101.78于 2003-03-05 22:33通过 445端口的 SMB服务,以PsExec手法(ADMIN$投放文件+创建服务)取得蜜罐控制权,约45分钟后蜜罐回连209.196.44.172:6667加入僵尸网络。攻击成功的直接证据是“写入 PSEXESVC.EXE并建服务”的完整会话,以及随后紧接的 C&C外连,两者互为因果。成功原因是Windows 2000的SMB服务直接暴露在公网,系统未对远程管理类服务创建做限制,攻击者用具备足够权限的账户(空会话或弱口令)即可投放并启动程序,无需内存破坏类漏洞。
4.问题及解决方案
- 问题1:端口统计排序逻辑错误
- 原因:最初管道使用sort-m,该参数用于合并有序文件,不能实现按访问次数降序统计。
- 解决方案:修改为sort-nr,按照统计数值从高到低排序,直观展示攻击者高频探测端口。
5.学习感悟、思考等
这次实验最大的收获是体会到“证据链”三个字在恶意代码分析里的分量。任务三里,单看ProcessExplorer会以为样本很安静、没联网;单看字符串又只知道它想联网。把两边拼起来一-C&C是IP字面量所以没有DNS查询,内网地址10.10.10.10在实验网络中不存在所以连不上一一样本的行为才完整。取证也是同一个道理:166个攻击源IP摆在那里没有意义,把“蜜罐首次上线时间”往回一拉,突破口自己就浮出来了。工具会过时,PEiD、超级巡警都是十几年前的老软件,Snort的版本说变就变,但“静态与动态交叉验证”“用时间线定因果”这些方法论是工具背后的东西。
另一个意外之喜是攻防博弈的层次感:crackme2的成功信息异或0x42混淆、rada被魔改到upx-d都解不开的壳、释放文件伪造的2008年时间戳。攻击者并没有用什么高深技术,只是专门堵住分析者想省事的那一步一一想直接strings?字符串加密了;想一键脱壳?壳被改了;想按时间排序找新文件?时间戳是假的。每识破一层,对这种不对称的理解就深一层。此外,tshark的过滤语法、字段提取与sort/uniq管道配合,可以完全脱离图形界面完成原始流量统计;但也正因如此,过滤方向一旦写反,结论会整体失真,这让“先确认通信两端再动手”变成了我的固定习惯。老工具配新系统处处是坑,拖放临时挂载、驱动被拦截、Snort3配置不兼容,踩坑记录见第4节,这些坑本身也是实验的一部分。
参考资料
- 1.课程PPT(第4章恶意代码分析技术)
- 2.诸葛建伟.《网络攻防技术与技术实践》.电子工业出版社-crackme练习与恶意代码分析方法的主要依据
- 3.豆包对实验报告的文案润色(https://www.doubao.com/thread/xpNrBQRgQZv5vrAk4)