实验四 恶意代码分析实践
一、实验内容
- 恶意代码文件类型标识、脱壳与字符串提取
- 使用IDA Pro静态或动态分析crackme1.exe与crakeme2.exe,寻找特定输入,使其能够输出成功信息。
- 分析一个自制恶意代码样本rada,并撰写报告,回答相应问题
- 取证分析实践
二、实验过程
(一)恶意代码文件类型标识、脱壳与字符串提取
对提供的rada恶意代码样本,进行文件类型识别,脱壳与字符串提取,以获得rada恶意代码的编写作者
使用文件格式和类型识别工具,,给出rada恶意代码样本的文件格式、运行平台和加壳工具
首先解压rada.rar,得到rada.exe并复制到虚拟机中,并使用file命令查看rada.exe的文件类型:

分析图中信息:
RaDa.exe: PE32 executable for MS Windows 4.00 (GUI), Intel i386, 3 sections
- RaDa.exe:文件名,即被分析的可执行文件名称。
- PE32 executable:表示文件为 32 位 PE 格式可执行程序
- for MS Windows 4.00 (GUI):说明适配 Windows 系统,且是图形界面(GUI)程序(非命令行工具)。
- Intel i386:处理器架构
- 3 sections:文件内部包含 3 个数据段
使用PEiD打开RaDa.exe:

可以看到文件的入口点、EP段等等信息,最下方红框处显示的是加壳信息,可以看到其版本为0.89.6的UPX壳
在虚拟机中输入strings rada.exe查看可打印字符,观察到均为乱码:

这是因为文件被加壳了,如果想要看到“像人话”的字符,我们就要进行脱壳处理
这里选用超级巡警软件来进行脱壳:

可以看到输出文件名为rada_unpacked.exe,找到脱壳后的文件复制到虚拟机中,执行Strings rada_unpacked.exe指令,发现顺眼多了:

出现了一些函数的名字,但是我们还是无法发现作者名。
我们使用IDA Pro Free打开脱壳后的文件:

在图中可以看到作者和时间,如红框所示

(二)使用IDA Pro静态或动态分析crackme1.exe与crakeme2.exe,寻找特定输入,使其能够输出成功信息
1.crackme1.exe的正确输出
下载crackme1.exe,在命令行中尝试运行,输入不同的参数对输出结果进行猜测,得到如下结果:

根据输出结果来看,只有在输入1个参数时,才会输出Pardon? What did you say?,而其他都是I think you are missing something.
猜测程序需要的应该是1个参数。
在IDA Pro中打开该文件,打开strings页面查看字符串,在图中位置我们不仅发现了刚刚的输出结果,还发现了两个额外没见过的输出:

这很有可能是正确的输出,我们在命令行中输入"I know the secret",进行测试:

可以看到输出结果发生了改变,那么也就是说,正确口令是"I know the secret",而正确的输出是
You know how to speak to programs, Mr. Reverse-Engineer
将crackme1.exe导入IDA pro:

在IDA pro中按照View-Graphs-Function calls的点击顺序,查看函数调用图:

发现与printf函数直接相关的是sub_401280函数

在function中查看此函数,双击查看器查看其汇编代码:
总体如下:

接下来将分开说明:


程序执行时,首先判断输入参数个数(如图中①处所示)
如果参数不正确则会直接跳到④中的输出,若输出正确,则调用③中的strcmp函数与②中的期待输入进行比对,如果比对正确,则会跳转至⑥的输出,如果参数个数正确而输入不正确,则会跳到⑤中的输出,由此实现了刚刚发现的输入-输出逻辑。
2.crackme2.exe的正确输出
首先猜测正确参数个数

点击strings查看字符串:

这些字符串中含有正确的口令和提示语句
查看函数结构:

仍然是sub_401280与fprint函数有关
查看其流程图:

具体流程:



从图中可以首先函数会判断输入参数,为1个时会进入第二级判断,否则直接输出④的内容,与crackme1.exe不同的是,②中会比对文件的名字是否为crackmeplease.exe,如果不是的话,会输出⑤中的内容,如果文件名正确,则再判断参数是否为"I know the secret",如果不是的话会输出Pardon? What did you say?
如果参数正确则会有正确的输出。
在命令行中进行测试:

可以看到逻辑是完全正确的,我们得到了正确的输出
任务三 分析一个自制恶意代码样本rada,并撰写报告,回答问题
输入指令md5sum RaDa.exe对二进制文件进行采用了md5进行摘要,结果如下

摘要值为caaa6985a43225a0b3add54f44a0d4c7
在虚拟机中输入file RaDa.exe
得到如下信息:

双击运行rada_unpacked程序,打开process exploer找到该程序,右键点击Properties-Strings查看该程序




通过观察该程序的strings,我们可以大致了解其 行为:
- 修改注册表自启动项(HKLM\Software\Microsoft\Windows\CurrentVersion\Run\RaDa),实现开机自动运行。
- 创建C:\RaDa\tmp、C:\RaDa\bin目录,用于存储临时文件和程序文件。
- 连接http://10.10.10.10/RaDa/RaDa_commands.html,通过 cgi 脚本执行命令交互、文件上传/下载、屏幕截图等操作。
*对主机注册表进行读写、删除操作
通过分析我们大致了解了这个程序要进行的功能,但还要在IDA Pro中进一步验证:
可以在strings页面勾选字符串类型为unicode,可以去掉很多不必要的字符

很明显从这里可以看到程序作者以及发布时间等:

在Strings中找到找到--authors双击进行分析


可以看到主要是由sub_40AAA0进行判断决定作者输出是什么
再查看sub_40AAA0的流程图

我们发现其主要判断逻辑为:
该函数会判断该程序是否是在VMware虚拟机上运行的,如果是的话就会输出Unknown argument,否则就输出Authors:Raul Siles & David Perze, 2004
在这里发现了一个网页地址,两个本地地址,三个私有网段:


查看相关路径也不难发现该程序将文件RaDa.exe复制到了C:\RaDa\bin目录下,也就是加入了自启动项

问题回答:
(1)提供对这个二进制文件的摘要,包括可以帮助识别同一样本的基本信息;
摘要值为caaa6985a43225a0b3add54f44a0d4c7
基本信息为:
RaDa.exe: PE32 executable for MS Windows 4.00 (GUI), Intel i386, 3 sections
(2)找出并解释这个二进制文件的目的;
这个文件可以连接到指定网址尝试连接目的主机,获取相关权限,以达到操纵主机的目的
(3)识别并说明这个二进制文件所具有的不同特性;
该二进制文件运行后会在目标主机C盘安装并进行上传、下载操作,并可以修改注册表是自己开机自启动,推测是后门程序
(4)识别并解释这个二进制文件中所采用的防止被分析或逆向工程的技术;
该二进制文件使用了UPX加壳来防止被分析,导致直接查看Strings会发现是乱码
(5)对这个恶意代码样本进行分类(病毒、蠕虫等),并给出你的理由;
该程序不能自我复制、传播,排除了病毒和蠕虫的坑,但这个程序可以运行并远程连接、操纵被控主机,也没有伪装成正常程序,推测为后门程序
(6)给出过去已有的具有相似功能的其他工具;
比如我们之前用过的Meterpreter,还有Havoc、Empire等均具备远程命令执行、文件操作或持久化功能。
(7)可能调查处这个二进制文件的开发作者吗?如果可以,在什么样的环境和什么样的限定条件下?
可以,通过之前的时间我们发现是可以发现作者的详细信息的,只要在非VMware的虚拟机中运行调用--authors参数即可
(8)给出至少5种检测该恶意软件的方法,例如基于特征码的方法,需要详细介绍每种方法。
方法具体如下:
- 基于特征码检测:通过匹配样本的MD5值、特殊字符串或二进制片段,如果命中特征库就告警
- 基于行为检测:通过EDR来监控创建RaDa目录、修改自启动注册表、发起对外HTTP请求的异常组合行为
- 基于网络流量检测:NIDS匹配与10.10.10.10的HTTP请求及特殊路径(如 RaDa_commands.html)
- 基于注册表监控:审计自启动项RaDa的未授权写入操作
- 基于文件系统监控:检测未知程序创建或写入 C:\RaDa\tmp、C:\RaDa\bin目录的行为。
任务四:取证分析实践:
Windows 2000系统被攻破并加入僵尸网络,在学习通获得相应.dat文件,导入wireshark如下:

问题:
(1)IRC是什么?当IRC客户端申请加入一个IRC网络时将发送那个消息?IRC一般使用那些TCP端口?
IRC是互联网中继聊天,它是一种基于文本的网络聊天协议。客户端申请加入 IRC 网络中的频道时发送/join命令,join命令会包含要加入的频道的信息。常用TCP端口为6667和6697,其中6667是明文传输的,而6697是密文传输的
(2)僵尸网络是什么?僵尸网络通常用于什么?
僵尸网络是攻击者控制的大量感染僵尸程序的主机组成的恶意网络。通常用于发起DDoS攻击、发送垃圾邮件、窃取敏感信息、进行加密勒索和虚拟货币挖掘等等恶意活动。在这些手段中僵尸网络是DDoS攻击的主要工具。
(3)蜜罐主机(IP地址:172.16.134.191)与那些IRC服务器进行了通信?
在刚刚打开的wireshark中输入ip.src == 172.16.134.191 && tcp.dstport == 6667来进行过滤:

可以发现一共有五台IRC服务器:
- 63.241.174.144,
- 217.199.175.10,
- 209.126.161.29,
- 66.33.65.58,
- 209.196.44.172
(4)在这段观察期间,多少不同的主机访问了以209.196.44.172为服务器的僵尸网络?
将.dat文件复制到虚拟机中,输入如下命令安装tcpflow并执行相关操作:
sudo apt-get install tcpflow
tcpflow -r 20192410.dat "host 209.196.44.172 and port 6667"

生成了三个文件

使用管道命令
cat 209.196.044.172.06667-172.016.134.191.01152 | grep -a "^:irc5.aol.com 353" | sed "s/^:irc5.aol.com 353 rgdiuggac @ #x[^x]*x ://g" | tr ' ' '\n' |tr -d "\15" | grep -v "^$" | sort -u | wc -l
该命令会从我们刚刚生成的文件中,选出 IRC 服务器irc5.aol.com发送的包含频道成员列表的信息,提取出相关频道里的所有成员昵称,去除重复和空行后,统计出不重复的成员数量。

可以发现一共有3461个主机访问了以209.196.44.172为服务器的僵尸网络
(5)哪些IP地址被用于攻击蜜罐主机?
输入命令
tcpdump -n -nn -r botnet_pcap_file.dat 'dst host 172.16.134.191' | awk -F " " '{print $3}' | cut -d '.' -f 1-4 | sort | uniq | more > 20232301ipad.txt;wc -l 20232301ipad.txt
这个命令的作用在于先用tcpdump从 botnet_pcap_file.dat中筛选目的主机为 172.16.134.191 的流量,再提取源 IP、去重排序后存到20232301ipad.txt文件中;再统计 20232301ipad.txt的行数

输入cat ipaddr.txt查看相关ip地址

(6)攻击者尝试攻击了那些安全漏洞?
输入命令
tcpdump -r botnet_pcap_file.dat -nn 'src host 172.16.134.191' and tcp[tcpflags]== 0x12 | cut -d ' ' -f 3 | cut -d '.' -f 5 | sort | uniq

发现了6个TCP端口,分别是:
135、139、25、445、4899、80
接下来在wireshark中查看
输入命令:
tcp.dstport == * && ip.dst == 172.16.134.191(这里的*替换为相应端口)
或
ip.addr==172.16.134.191 and tcp.port==*
对于135端口:只有TCP连接

对于139端口:

发现NBSS包、SMB包、TCP包
对于25端口:

只有TCP

推测135和25端口都只进行了扫描
对于445端口:

这个包比较多,翻找之后我们在记录中发现了PSEXESVC.EXE文件,这个文件是Dv1dr32蠕虫病毒的相关文件,通过IRC进行通信 该蠕虫会通过445端口传播,感染后可能使攻击者远程控制获取系统权限,进而进行数据窃取、勒索等恶意活动。根据抓包结果,推测攻击者对于蜜罐主机进行了网络蠕虫攻击
对于4899端口:

清一色的TCP链接。
对于80端口:

有一个值得注意的现象,在红框所示位置我们发现了大量重复的"C"字符,推测这很可能是缓冲区溢出攻击
同时在还可以看到worm字样

说明是一个蠕虫攻击
接下来筛选udp端口:

得到端口为137
输入如下面命令:
udp.dstport == 137 && ip.dst == 172.16.134.191
在wireshark上筛选相关包:

发现都是NBNS包,137端口主要用于NetBIOS Name Service,这里可能是用于NetBIOS查点
查询相关资料得知:
这种服务主要通过广播方式在局域网内查询目标主机的IP地址。当一台主机需要访问另一台主机时,会发送名称解析请求,目标主机若匹配请求名称,则返回其IP地址。
这种机制类似于DNS,但是主要用于局域网环境
如果不关闭这种服务,可能会造成信息泄露等问题
(7)那些攻击成功了?是如何成功的?
通过抓包发现,
1.对于445端口,ip 61.111.101.78与蜜罐主机建立了会话(ACK=1):

我们再详细查看相关报文:

在红框中发现了文件的创建、写入数据等等操作,说明攻击已经成功,获得了相关权限
该攻击主要是利用445端口对蜜罐主机发送
PSEXESVC.EXE,并将其地址改到系统目录下
2.对于4899端口

攻击成功,因为外部主机向蜜罐主机建立三次握手后发送了大量的[PSH,ACK]数据包传送了大量数据,同时根据下图:

可以发现攻击者利用HTTP请求进行了目录遍历攻击
3.对于80端口

在攻击者发送大量重复的“C”进行缓冲区溢出攻击后,目标主机没有返回错误信息(图中的RST包是攻击者发的而不是目标主机发的),后续还进行了HTTP的交互,说明攻击成功
三、问题与解决方案
问题1:
在分析crackme1.exe和crackme2.exe时时发现其都是判断是否为一个参数,但是当我在两个程序中都是输入一个参数时,在命令行窗口中得到的结果是不一样的,但是在检查了两个程序的相关函数的流程图的第一步时发现检查的参数数量是一样的,这令我很困惑
问题解决方案1:
经过询问同学等学习方法,最后终于明白是因为在crackme2.exe中,函数还会检查程序名称是否正确,如果不正确的话就会出现意外的结果
问题2:在IDA Pro上有些时候想要查看流程图是发现是灰色的点不开
问题2解决方法:
无脑办法:重进
实际解决办法:不能在string页面查看流程图,可以先跳转到IDA view界面再查看相应流程图
问题3:
为了利用老师提供的软件对RaDa.exe进行分析,我在windows主机上运行了此程序,但是听说可能会留下注册表开机自启动,于是进行检查发现并没有相关注册表,并不清楚是否会留下隐患
问题3解决方法:
在经过询问老师之后得知,只需要找到C:/RaDa文件夹将其整个删除即可,不会有其他问题再出现
四、实验感想与体会
这次恶意代码分析实践让我收获颇丰,通过这次实验不仅熟练掌握了IDA Pro、Wireshark等工具的使用,还理清了恶意代码脱壳、静态分析、行为识别的核心流程。
从破解crackme1、2程序的验证逻辑、拆解rada程序的各种行为这些学习中,我深刻体会到在逆向分析中,需要抽丝剥茧的耐心和逆向思维。最后对抓包结果的取证分析中,通过筛选流量、提取攻击 IP 与漏洞信息这些操作让我直观认识到了僵尸网络的运作模式,这一块耗费了大量的实验时间,但也让我明白了网络安全防护的重要性。
这次实验中,我遇到的工具操作难题、逻辑困惑等等问题在查阅资料和请教交流中也都渐渐解决了,这让我掌握了更多的相关知识可以运用到后续的学习中,这次实验不仅提升了我的技术实操能力,更让我对网络安全领域的攻防对抗有了更真切的认知,为后续学习打下了坚实基础,让我受益匪浅。