恶意代码分析实践
一、实验内容
- 恶意代码文件类型标识、脱壳与字符串提取
- 使用IDA Pro静态或动态分析crackme1.exe与crakeme2.exe,寻找特定输入,使其能够输出成功信息
- 分析一个自制恶意代码样本rada
- 取证分析实践
二、实验过程
(一)恶意代码文件类型标识、脱壳与字符串提取
对提供的rada恶意代码样本,进行文件类型识别,脱壳与字符串提取,以获得rada恶意代码的编写作者
在这个过程中我们需要达到的目的有以下几个方面:
- 使用文件格式和类型识别工具,给出rada恶意代码样本的文件格式、运行平台和加壳工具
- 使用超级巡警脱壳机等脱壳软件,对rada恶意代码样本进行脱壳处理
- 使用字符串提取工具,对脱壳后的rada恶意代码样本进行分析,从中发现rada恶意代码的编写作者是谁
(1)首先,我们将目的文件RaDa.exe下载下来,然后就可以进行简单分析了。我们先使用file指令对文件进行简单地查看,代码如下。
file RaDa.exe
从图中我们可以看到输出的结果,关于RaDa.exe文件一共有四部分内容,首先PE32
代表了这是一个32位的文件,GUI
代表了这个文件有图形界面,Intel 80386
代表了处理器,最后的for MS Windows
代表了这个文件是运行在Windows操作系统上的。
(2)我们并不满足于了解这一点内容,所以我们需要用到工具,这里选择了PEiD工具查看RaDa.exe的基本信息,如图所示。
图二 PEiD查看
对图中的信息进行分析,这里可以看到文件的入口点、文件偏移、连接器版本、EP段、首字节、子系统、以及我们这里最想知道的加壳类型,也就是UPX壳,如图中箭头标注。
到这里第一个目标就已经完成了,RaDa恶意代码样本的文件格式为PE文件,运行平台为Windows操作系统,加壳工具为UPX也就是压缩壳。
(3)接下来我们继续分析,使用strings指令分析RaDa.exe文件中的可打印字符串,代码如下。
strings RaDa.exe
图三 strings命令查看(1)
图四 strings命令查看(2)
以上就是我们查看到的可打印字符串,但是如图三所示,后面很大一部分内容都是乱码。这是为什么呢?通过查找资料我们了解到,出现这种情况的原因就是文件被加壳了,所以我们要进行脱壳处理,这里用到的工具是超级巡警工具,脱壳过程如下。
图五 脱壳处理
(4)这时候我们发现生成了脱完壳的文件RaDa_unpacked.exe,然后我们就可以重新使用strings指令查看脱壳后文件的可打印字符串,如下图所示。
图六 strings命令查看(3)
图七 strings命令查看(4)
从这里可以看出,前一部分内容还是跟RaDa.exe一样,没有被更改,但是后面的乱码部分已经变成了可以读取的内容,也就是图七所示的内容。到这里,第二个目标也就是脱壳处理我们已经完成了,但是我们非常失望,从脱壳后得到的这些字符串中,我们并没有找到作者的信息,只能找到一些函数调用名以及其他的可用字符串。
(5)于是我们要用到更加高级的工具,也就是Process Explorer,这个软件的功能也就是它名字的字面意思——进程监控。我们打开Process Explorer,并且运行刚刚脱壳得到的RaDa_unpacked.exe文件,可以得到如下图所示的结果。
图八 Process Explorer使用
那么我们想要的作者信息在哪里呢?找到运行的RaDa_unpacked.exe文件,右键单击选择Properties查看详细信息,然后选择Strings页面,我们就得到了以下结果。
图九 详细信息
如图所示,这个程序是Raul siles和David Perze于2004年编写的,这也就是我们想要的作者信息。到这里,第一项实验的三个目标就全部完成了。
(二)使用IDA Pro静态或动态分析crackme1.exe与crakeme2.exe,寻找特定输入,使其能够输出成功信息
(1)同样的,我们先把目标文件crackme1.exe和crackme2.exe下载下来,并向第一部分实验一样,先使用file指令简单查看文件的信息,如下图所示。
图十 file指令
我们简单的了解到,这个文件是windows系统下运行的32位可执行程序,并没有图形界面,是命令行程序。
(2)然后通过命令行先对输出结果进行猜测,我们得到了如下图所示的结果。
图十一 输出猜测
我们可以看到,只有当输入参数为1个的时候,输出为“Pardon? What did you say?”,而当输入参数个数为其他任意值的时候,输出结果都是“I think you are missing something.”。从这一点我们可以猜测输入参数的个数为1,但是具体要输入什么才会有正确的输出,我们并不知道,所以我们又要使用工具,这次采用的是功能强大的反汇编和反编译工具IDA PRO。
(3)我们使用IDA pro工具打开crackme1.exe,选择文件类型为PE。这时候出现了很多界面,我们先打开Strings页面用于查看字符串,和之前的strings指令很像,如图所示。
图十二 IDA strings界面
(4)在这里我们可以查看到该程序中出现的明文字符串,发现了有两个没有出现过的字符串,分别是:“I know the secret”和“You know how to speak to programs, Mr.Reverse-Engineer”。所以我们猜测,这两个字符串就有可能是正确的输入或者是输出,所以我们进行测试。
图十三 字符串测试
当我们输入“I know the secret”的时候程序执行的输出就是另一个字符串“You know how to speak to programs, Mr.Reverse-Engineer”,而当输入后者的时候,输出的是和其他错误输入一样的“Pardon? What did you say?”,所以我们暂时得出结论,程序的正确输入为“I know the secret”,正确输出为“You know how to speak to programs, Mr.Reverse-Engineer”。
(5)接下来我们继续利用IDA对这一结论进行验证,首先我们在IDA中切换到页面IDA-viewA,然后在view中找到graphs选项并打开Function Call查看函数调用图(或者使用快捷键Ctrl+F12),如下图所示。
图十五 Function Calls
(6)在函数调用图中我们能发现,画圈的部分中调用了输出函数并且还使用了strcmp函数,我们有理由怀疑strcmp函数是用来比较输入的字符串和有正确输出的输入字符串的,所以关键就在于sub_401280中,我们在view中找到graphs选项并打开Flow Chart查看函数流程图(或者使用快捷键F12),我们找到sub_401280的函数流程图如下。
图十六 Flow Chart
(7)接着我们对各个部分进行具体分析。
图十七 流程图分析(1)
就第一部分来说,我们通过对汇编语言进行分析发现,程序执行的时候首先判断输入参数的个数,如果个数不一致就会输出“I think you are missing something.”并换行。如果输入的参数个数正确,程序就会接着进行判断输入是否正确。
图十八 流程图分析(2)
将我们的输入与正确输入“I know the secret”进行对比,一致的话就能得到我们正确的输出,如果错误就会提示“Pardon? What did you say?”并换行。
(8)将这一部分画成简化的流程图得到以下的结果。
图十九 流程图分析(3)
(9)接下来对crackme2.exe进行分析。同样用IDA PRO打开,并查看strings页面,得到下图所示的明文字符串。
图二十 strings页面
有了分析crackme1.exe的经验,我们猜测图中方框部分的字符串比较重要。
(10)然后我们打开Function Calls进一步地分析,发现在crackme2.exe中依旧是sub_401280部分与输入的对比有关,如图所示。
图二十一 Function Calls
(11)还是跟分析crackme1.exe时一样,我们打开函数流程图做最后的确认。
图二十二 Flow Chart
(12)接下来对各个部分进行具体分析。
图二十三 流程图分析(1)
图二十四 流程图分析(2)
(13)总体来说跟crackme1.exe差不多,区别在于在判断参数个数正确之后增加了对于程序名的确认,只有程序名为crackmeplease.exe的时候才能被执行,否则就会提示“I have an identity problem.”并换行。同时最后的输出也发生了变化,变为了。我们画出流程图如下图所示。
图二十五 流程图分析(3)
(14)最后我们进行测试,首先copy一份crackme2.exe文件并将文件名改为crackmeplease.exe,再输入“I know the secret”,得到正确输出,如下图所示。
图二十六 结果测试
(三)分析一个自制恶意代码样本rada
这一部分内容需要回答以下问题。
- 提供对这个二进制文件的摘要,包括可以帮助识别同一样本的基本信息;
- 找出并解释这个二进制文件的目的;
- 识别并说明这个二进制文件所具有的不同特性;
- 识别并解释这个二进制文件中所采用的防止被分析或逆向工程的技术;
- 对这个恶意代码样本进行分类(病毒、蠕虫等),并给出你的理由;
- 给出过去已有的具有相似功能的其他工具;
- 可能调查处这个二进制文件的开发作者吗?如果可以,在什么样的环境和什么样的限定条件下?
(1)首先我们对二进制文件进行摘要,我们这里采用了md5进行摘要,代码如下。
md5sum RaDa.exe
图二十八 md5摘要(1)
(2)然后我们更改样本的文件名并再次进行md5摘要,发现结果没有发生变化,所以我们认为摘要值可以作为帮助识别同一样本的信息。同时我们像第一个实验目标中一样使用file指令查看文件信息,我们可以知道这是一个运行在Windows系统上的有图形界面的32位PE文件,这也可以作为识别同一样本的信息。
图二十九 md5摘要(2)
图三十 file查看文件信息
(3)接下来我们需要找出这个文件的目的并进行解释。我们打开Process Explorer工具并运行RaDa_unpacked.exe,这时候就可以在工具中的strings页面内看到这个文件中的字符串。
图三十一 字符串
从这个字符串的表中,我们可以得到RaDa_unpacked.exe要达到的目的以及各种特性,具体解释如图所示,但是这些内容都是我们猜测的,所以我们需要使用IDA PRO进一步分析验证。
(4)我们用IDA打开RaDa_unpacked.exe并切换到strings页面,我们可以看到很多字符串但是大部分字符串是我们不需要的,所以我们右键打开setup strings window并选择允许的字符串类型为Unicode,如图所示。
图三十二 setup strings window
(5)这样操作之后我们看到的大部分字符串都是有实际意义的了。我们先看一些比较直观的信息,比如程序的作者以及发布时间,如下图所示。
图三十三 作者及发布时间
(6)同时我们还发现了一个网页地址和两个本地地址,以及upload和download的功能,所以我们猜测这个网页地址可能是上传下载所使用的地址,而bin和tmp是在本地新建的两个文件夹。我们还看到有三个私有网段的信息,很可疑,需要进一步进行分析。如图所示。
图三十四 地址信息
图三十五 私有网段
(7)我们查看注册表编辑器来判断bin文件夹和tmp文件夹的作用。我们在注册表编辑器中发现,在bin目录下新建了一个RaDa.exe文件,所以说明这里的bin文件夹是将RaDa.exe放进去,也就是加入自启动项,如图所示。
图三十六 注册表编辑器
(8)然后再看那个网页地址,我们猜测这个RaDa.exe程序应该是与目标地址10.10.10.10进行连接,并且访问RaDa_commands.html,所以我们打开Wireshark进行抓包,我们发现,在目标程序运行的时候向10.10.10.10的地址发送了大量的TCP包并返回了大量ICMP包,如下图所示。
图三十七 抓包信息
(9)我们可以看到,这些TCP包和ICMP包都是空的,我们想到了DDoS拒绝服务攻击和ICMP洪泛攻击,又鉴于该目标程序不会自己进行传播,排除了蠕虫和病毒类的可能,所以初步猜测这个程序很有可能是后门程序或者是木马程序,当然也不排除僵尸程序的可能。
(10)回到刚刚IDA PRO的Strings页面,我们发现还有一些字符串被遗漏了,如下图所示。
图三十八 命令行参数
在图中我们可以看到,有很多--开头的字符串,通过搜索发现,这些字符串的意义是命令行参数,具体实现的功能如下图所示。
图三十九 参数分析
(11)接下里就是分析三个私有网段的意义,我们先双击私有网段的字符串内容来查看详细这一段字符串所在的位置,得到以下的结果。
图四十 字符串信息
(12)然后找到对应的函数也就是sub_4052C0,并双击打开,然后查看Flot Chart得到下图所示的结果。
图四十一 私有网段信息
通过这一段我们可以发现,这三个私有网段出现的意义就是判断目标主机的IP地址是否在私有网段内,如果是,就访问10.10.10.10,并进行之后的操作。
总结:
1、提供对这个二进制文件的摘要,包括可以帮助识别同一样本的基本信息;
答:这个二进制文件的md5摘要为caaa6985a43225a0b3add54f44a0d4c7。可以帮助识别同一样本的信息:首先是可以通过摘要值来进行判断,因为文件名的更改不会影响摘要值,同时查看到文件的属性为在Windows操作系统下运行的32位PE文件,并且被加了UPX壳,也可以用于判断同一样本。
2、找出并解释这个二进制文件的目的;
答:这个二进制文件可以通过连接到互联网的指定地址与目的主机取得会话连接,并获得目的主机的部分权限,从而达到操纵目的主机进行一些操作的目的,所以猜测这个程序可能是后门程序和木马程序,而通过杀软的检测也确定了这一点。
3、识别并说明这个二进制文件所具有的不同特性;
答:这个二进制文件被运行之后会在目的主机上创建文件夹,并将自己加入自启动项,然后会通过访问指定的地址在目的主机上上传或者是下载一些文件及数据,并且可以在目的主机上执行其他的指令对目的主机进行操控。
4、识别并解释这个二进制文件中所采用的防止被分析或逆向工程的技术;
答:在上面的分析中提到了,这个程序采用了UPX加壳技术来达到防止被分析或者是逆向工程的技术,也就是在程序外面加压缩壳,这也是为什么我们在脱壳之前查看Strings会出现乱码的原因。
5、对这个恶意代码样本进行分类(病毒、蠕虫等),并给出你的理由;
答:通过对程序的分析,我们发现这个程序不能进行自我复制和自我传播,所以肯定不是病毒或者是蠕虫程序,但是这个程序可以通过在目的主机上执行来获取目的主机的Shell,所以猜测这个程序很有可能就是后门程序、木马程序或者是僵尸程序,然后我们使用VirusTotal对我们的猜想进行验证,结果发现我们的猜想正确,如图所示。
图四十二 Virus Total
6、给出过去已有的具有相似功能的其他工具;
答:在后门程序实验中,我们也生成过backdoor文件,和这次遇到的文件非常像,也是在目的主机上运行之后,就可以进行反弹连接,然后得到目的主机的Shell和权限,然后就可以使用目的主机进行一系列操作;这次的文件也是一样,在目的主机上运行后可以通过访问指定地址来获取目的主机的Shell,从而达到某些操作。
7、可能调查处这个二进制文件的开发作者吗?如果可以,在什么样的环境和什么样的限定条件下?
答:可以,脱壳之后,使用Process Explorer查看文件中的字符串就可以找到作者信息,如下图所示。所以能够查到作者信息的条件,首先是要脱壳,因为在有壳的情况下,该文件是可以防止被分析的,我们能看到的只有乱码,并且文件的作者还要将自己的信息写入文件我们才能看到,否则我们就得不到文件开发作者的信息了。
图四十三 作者信息
(四)取证分析实践
Windows 2000系统被攻破并加入僵尸网络:在2003年3月初,Azusa Pacific大学蜜网项目组部署了一个未打任何补丁的Windows2000蜜罐主机,并且设置了一个空的管理员密码。在运营的第-一个星期内,这台蜜罐主机就频繁地被攻击者和蠕虫通过利用几个不同的安全漏洞攻陷。在一次成功的攻击之后,蜜罐主机加入到一个庞大的僵尸网络中,在蜜罐主机运营期间,共发现了15164个不同主机加入了这个僵尸网络。这次案例分析的数据源是用Snort工具收集的该蜜罐主机5天的网络流日志,并通过编辑去除了一些不相关的流量并将其组合到了单独的一个二进制网络日志文件中,同时IP地址和一些其他的特定敏感信息都已经被混淆以隐藏蜜罐主机的实际身份和位置。
这一部分需要回答以下问题:
- IRC是什么?当IRC客户端申请加入一个IRC网络时将发送那个消息?IRC一般使用那些TCP端口?
- 僵尸网络是什么?僵尸网络通常用于什么?
- 蜜罐主机(IP地址:172.16.134.191)与哪些IRC服务器进行了通信?
- 在这段观察期间,多少不同的主机访问了以209.196.44.172为服务器的僵尸网络?
- 哪些IP地址被用于攻击蜜罐主机?
- 攻击者尝试攻击了那些安全漏洞?
- 那些攻击成功了?是如何成功的?
(1)IRC是Internet Relay Chart的缩写,也就是因特网中继聊天,也叫互联网中继聊天。
IRC的工作原理非常简单,只要在自己的PC上运行客户端软件,然后通过因特网以IRC协议连接到一台IRC服务器上即可。
IRC的最大特点是实现了在线实时交谈,速度快、功能多的优点使它比电子邮件或新闻组等联络沟通方式更具吸引力。IRC可以设置单独的频道,在这个频道内,输出的文字可供所有人都看到。这样,来自世界不同角落的人能同时得到有关信息。而如果是两个人之间的单独交谈,甚至可以不用通过服务器,以保证谈话的保密性。随着网络带宽的增加和技术的发展,有一些IRC不仅可以传输文字信息,还能传输声音或图像信息,这样的功能就更强了。
如果要申请加入一个IRC网络时,客户端会发送服务器的域名和端口信息,一般端口号为6667,但是在特殊情况下6660-6669范围的端口都会被使用,该端口为明文传输,如果要进行SSL加密传输,则会使用6697端口。
(2)僵尸网络是指采用一种或多种传播手段,让大量主机感染bot程序(僵尸程序)病毒,然后就可以对这些主机或者叫傀儡机进行控制,对某些网站进行洪水攻击或者是拒绝服务攻击,来达到破坏的目的。
(3)我们在Kali虚拟机中对目标文件进行抓包,并且使用要求的IP地址和端口号进行过滤,代码如下。
ip.src == 172.16.134.191 && tcp.dstport == 6667 || tcp.dstport == 6697
图四十四 抓包信息
所以我们可以知道蜜罐主机通信的IRC服务器有五个,分别是66.33.65.58、63.241.174.144、217.199.175.10、209.196.44.172和209.126.161.29。
(4)这里需要用到tcpflow这个命令,也就是对我们抓到的数据包进行分流。首先需要安装指令tcpflow,需要通过指令apt-get install tcpflow进行安装,然后执行以下指令,会生成172.016.134.191.01152-209.196.044.172.06667,209.196.044.172.06667-172.016.134.191.01152和report.xml三个文件。
tcpflow -r botnet_pcap_file.dat 'host 209.196.44.172 and port 6667'
图四十五 tcpflow
图四十六 三个文件
然后通过cat指令获取209.196.044.172.06667-172.016.134.191.01152文件中的数据并通过管道传送给grep搜索有关IRC通信的数据。
图四十七 查看数量
所以我们可以知道一共有3461台主机访问了僵尸网络。
(5)这里我们采用tcpdump指令进行查找并将结果重定向输出到ipaddr.txt文件当中,然后我们发现一共有165个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 > ipaddr.txt;wc -l ipaddr.txt
图四十八 tcpdump命令
图四十九 IP地址查看
(6)通过snort进行查看我们发现数据包主要是TCP包和UDP包,所以我们对这两种协议进行筛选,得到以下的结果。
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 //对TCP进行筛选
tcpdump -r botnet_pcap_file.dat -nn 'src host 172.16.134.191' and udp | cut -d ' ' -f 3 | cut -d '.' -f 5 | sort | uniq //对UDP进行筛选
图五十 TCP查看
图五十一 UDP查看
可以发现响应端口有以下这些:
- TCP:135(rpc),139(netbios-ssn),25(smtp),445(smb),4899(radmin),80(http)
- UDP:137(netbios-ns)
我们分别对TCP的各个端口使用Wireshark进行抓包分析,得到以下的结果。
(tcp.dstport == 135 || tcp.dstport == 25)&& ip.dst == 172.16.134.191
tcp.dstport==80 && ip.dst == 172.16.134.191
tcp.dstport==139 && ip.dst == 172.16.134.191
tcp.dstport==445 && ip.dst == 172.16.134.191
tcp.dstport==4899 && ip.dst == 172.16.134.191
图五十二 25和135端口查看
图五十三 80端口查看
图五十四 139端口查看
图五十五 445端口查看
图五十六 4899端口查看
通过对图片的分析,我们可以发现,25端口和135端口仅仅进行了TCP三次握手,可能只是用来测试端口开放情况,80端口和139端口都被蜜罐主机识别并发送RST包,其中80端口主要通过该端口使用脚本攻击IIS服务器的漏洞,从而获取系统权限,并且包的数量非常多,所以猜测是通过缓冲区溢出获得命令行。而445端口包含了PSEXESVC.EXE,是一种可以通过在远程主机上运行命令来执行维护任务的工具,对此,蜜罐主机回复的reply数据包中出现了命名管道,如图所示。而4899端口,只有210.22.204.101访问过,查资料得知,4899端口其实是一个远程控制软百件所开启的服务端端口,由于这些控制软件功能强大,所以经常被黑客用来控制被自己控制的远程电脑。
图五十七 PSEXESVC.EXE
(7)通过上面的分析可以得知成功的是61.111.101.78,它是通过445端口使用蠕虫攻击实现的,如图所示。
图五十八 蠕虫
三、问题与解决方案
(1)使用tcpflow命令进行分流的时候找不到命令。
解决办法:通过apt-get install tcpflow进行安装。
(2)使用snort命令的时候提示找不到命令。
解决办法:直接根据提示安装snort。
(3)使用IDA PRO的时候Flow Chart是灰色的打不开。
解决办法:在Strings页面是打不开流程图的只有在IDA View界面才能打开流程图,或者是在某个函数的界面也可以查看流程图。
四、实验感想与体会
通过本次实验,主要是对于恶意代码的认识上升了一个等次。本学期,我们也开设了恶意代码课,所以对于恶意代码有了一定的了解,但是没有本次实验这么深入,本次实验涉及到了后门程序、木马程序、僵尸网络、蠕虫病毒等一系列恶意代码程序,可以说是为我之后的学习打下了良好的基础。
但是在本次实验中也暴露出了对于恶意代码分析所需要使用的各种工具的不熟练,在各个工具进行操作的时候,可能会出现找不到功能,或者是看不懂页面等等一系列的问题,但是最后都通过自己的努力进行了解决。当然,除了,工具使用的熟练问题,不同操作系统的转换也让我很是烦恼,在本次实验中,涉及到了本机、XP虚拟机、Kali虚拟机,所以在有些时候可能会有些迷糊。
当然,总的来说,我对于各种恶意代码之间的分别以及如何识别不同的恶意代码都有了很深的体会,现在如果给我一个恶意的软件或者是程序,我也能按照一定的方法对其进行分析,虽然没有特别的深入,但是基本的信息也是都能获得到,对于其目的、特性等等的掌握也都有所心得。
最后,感谢王老师的细心讲解和耐心帮助,也感谢在实验过程中给我帮助的同学们。正因为有你们的帮助我才能够顺利地完成本次实验,谢谢!