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)