20192426 2021-2022-2 《网络与系统攻防技术》实验四实验报告
20192426 2021-2022-2 《网络与系统攻防技术》实验四实验报告
1.实验内容
- 恶意代码文件类型标识、脱壳与字符串提取
- 使用IDA Pro静态或动态分析crackme1.exe与crakeme2.exe,寻找特定输入,使其能够输出成功信息。
- 分析一个自制恶意代码样本rada
- 取证分析实践
2.实验过程
2.0 准备工作
-
本次实验使用VirutalBox的Windows XP虚拟机作为实验环境,具体版本为Windows XP Professional with Service Pack 3 (x86),相关镜像可以在MSDN中获取。
-
在正式进行实验之前,我们首先在Windows XP上安装Cygwin(安装包)、PEid、超级巡警脱壳器V1.3、IDA Pro(安装包)、Process Explorer(安装包)。
Cygwin:Cygwin是一个在windows平台上运行的类UNIX模拟环境,它对于学习UNIX/Linux操作环境,或者从UNIX到Windows的应用程序移植,或者进行某些特殊的开发工作,尤其是使用GNU工具集在Windows上进行嵌入式系统开发,非常有用。我们在实验中安装Cygwin的目的是为了在Windows XP中使用Linux命令file和strings。
PEiD(PE Identifier):一款著名的查壳工具,其功能强大,几乎可以侦测出所有的壳,其数量已超过470 种PE 文档 的加壳类型和签名。
超级巡警脱壳器:超级巡警虚拟自动脱壳机是一款实用的脱壳工具,可以轻松脱去各种加密壳。支持超过100类的壳,该工具完全基于虚拟机技术,对各种已知未知壳进行脱壳处理,适合病毒分析中对加壳的木马样本进行脱壳处理。
IDA Pro:交互式反汇编器专业版(Interactive Disassembler Professional),人们常称其为IDA Pro,或简称为IDA。IDA Pro是一款交互式的,可编程的,可扩展的,多处理器的,交叉Windows或Linux WinCE MacOS平台主机来分析程序, 被公认为最好的花钱可以买到的逆向工程利器。IDA Pro已经成为事实上的分析敌意代码的标准并让其自身迅速成为攻击研究领域的重要工具。它支持数十种CPU指令集其中包括Intel x86,x64,MIPS,PowerPC,ARM,Z80,68000,c8051等等。
Process Explorer:由Sysinternals开发的Windows系统和应用程序监视工具,不仅结合了Filemon(文件监视器)和Regmon(注册表监视器)两个工具的功能,还增加了多项重要的增强功能。包括稳定性和性能改进、强大的过滤选项、修正的进程树对话框(增加了进程存活时间图表)、可根据点击位置变换的右击菜单过滤条目、集成带源代码存储的堆栈跟踪对话框、更快的堆栈跟踪、可在 64位 Windows 上加载 32位 日志文件的能力、监视映像(DLL和内核模式驱动程序)加载、系统引导时记录所有操作等。
2.1 恶意代码文件类型标识、脱壳与字符串提取
-
打开cmd.exe并使用
file RaDa.exe
命令查看RaDa.exe的文件类型,如图一所示,可以发现这是一个运行在32位Windows操作系统上的32位PE可执行文件。
图一 使用file命令查看RaDa.exe的文件类型 -
为了进一步获取该PE文件的详细信息以便我们脱壳,我们使用PEiD打开RaDa.exe,如图二所示。可以发现,RaDa.exe使用了0.89.6版本的UPX压缩壳。
图二 使用PEiD查看RaDa.exe的文件信息 -
然后我们使用超级巡警脱壳器进行脱壳,只需要指定RaDa.exe的位置然后点击”给我脱“便可以完成脱壳。如图三所示,根据程序的输出信息,可以发现脱壳后的RaDa.exe的文件名为RaDa_unpacked.exe。
图三 使用超级巡警脱壳器对RaDa.exe进行脱壳 -
一般程序的作者会在自己写的程序中留下自己的信息,根据这一线索我们通过
strings
命令对脱壳后的样本进行分析,为了便于我们寻找编写作者的名字,我们将strings命令得到的结果通过管道传送给more
进行处理,具体命令如下:strings RaDa_unpacked.exe | more
如图四所示,经过一番寻找,我们就可以找到作者的名字:Raul Siles && David Perez
图四 使用strings命令寻找作者姓名 -
经过以上分析,我们可以确定以下信息:
- Rada.exe的文件格式为32位的PE可执行文件,运行平台为32位的Windows系统,使用了0.89.6版本的UPX压缩壳
- Rada.exe的作者为Raul Siles && David Perez
2.2 使用IDA Pro静态或动态分析crackme1.exe与crakeme2.exe,寻找特定输入,使其能够输出成功信息
2.2.1 分析crackme1.exe
-
首先我们运行一下crackme1.exe,分别给该程序不传入参数、传入一个参数、传入两个参数,观察该程序的输出结果,如图五所示。
图五 传入不同参数后程序输出结果 -
程序既然可以输出信息“I think you are missing something.”、“Pardon? What did you say?”,那就说明在该程序中一定包含了对应的字符串,我们使用IDA Pro打开该程序,并查看程序所包含的字符串,如图六所示,可以找到对应的字符串。
图六 使用IDA Pro查看程序中对应的字符串信息 -
我们随便双击一个图六中圈出的字符串,IDA会自动跳到程序中对应的地方,如图七所示。可以发现,如果可以输入正确的参数,应该可以输出‘You know how to speak to programs, Mr. Reverse-Engineer’,而且很有可能这个正确的参数就为图七中剩下没被圈出的字符串‘I know the secret’。为了验证这个猜想我们继续分析,可以观察到,这三个字符串都指向了同一个函数sub_401280,我们使用IDA Pro查看sub_401280这个函数。
图七 程序中保存的字符串信息 -
我们查看函数列表,可以找到sub_401280这个函数,如图八所示。
图八 函数列表中的sub_401280 -
双击函数名可以转到该函数对应的汇编代码,对该代码进行简要分析,如图九所示,根据分析所得的程序流程可以发现只要给程序传入参数“I know the secret”即可获得正确的输出。
图九 分析sub_401280的汇编代码 -
我们给程序传入参数“I know the secret”,具体命令如下:
crackme1.exe "I know the secret"
-
可以发现,成功得到了我们想要的结果,如图十所示。
图十 传入正确参数成功得到正确输出
2.2.2 分析crackme2.exe
-
首先我们运行一下crackme2.exe,分别给该程序不传入参数、传入一个参数、传入两个参数、尝试使用"I know the secret",观察该程序的输出结果,如图十一所示,可以发现,直接输入"I know the secret"会提示“I have an identity problem.”。
图十一 传入不同参数后程序输出结果 -
和2.2.1相同,程序既然可以输出信息“I think you are missing something.”、“Pardon? What did you say?”、“I have an identity problem.”,那就说明在该程序中一定包含了对应的字符串,我们使用IDA Pro打开该程序,并查看程序所包含的字符串,如图十二所示,可以找到对应的字符串。
图十二 使用IDA Pro查看程序中对应的字符串信息 -
我们随便双击一个图十二中圈出的字符串,IDA会自动跳到程序中对应的地方,如图十三所示。可以发现,如果可以输入正确的参数,应该可以输出‘You know how to speak to programs, Mr. Reverse-Engineer’,而且很有可能这个正确的参数就为图七中剩下没被圈出的字符串‘I know the secret’。继续分析可以观察到,这三个字符串都指向了同一个函数sub_401280,我们使用IDA Pro查看sub_401280这个函数。
图十三 程序中保存的字符串信息 -
我们查看函数列表,可以找到sub_401280这个函数,如图十四所示。
图十四 函数列表中的sub_401280 -
双击函数名可以转到该函数对应的汇编代码,对该代码进行简要分析,如图十五所示,根据分析所得的程序流程可以发现首先程序名应该为”crackmeplease.exe“,然后给程序传入参数“I know the secret”才能获得正确的输出。
图十五 分析sub_401280的汇编代码 -
我们复制crackme2.exe并起名为crackmeplease.exe,然后给程序传入参数“I know the secret”,具体命令如下:
cp crackme2.exe crackmeplease.exe crackmeplease.exe "I know the secret"
-
可以发现,成功得到了我们想要的结果,如图十六所示。
图十六 传入正确参数成功得到正确输出
2.3 分析一个自制恶意代码样本rada
2.3.1 提供对这个二进制文件的摘要,包括可以帮助识别同一样本的基本信息
使用md5sum
命令计算RaDa.exe的md5值,其值为caaa6985a43225a0b3add54f44a0d4c7,如图十七所示。
图十七 计算RaDa.exe的md5值
2.3.2 找出并解释这个二进制文件的目的
我们使用process explorer来查看该二进制文件在内存中的字符串,如图十八所示:
图十八 RaDa.exe在内存中的字符串
根据以上的分析,可以判断该程序是一个后门程序。它能够使远程的攻击者控制系统,通过程序主动访问10.10.10.10/RaDa的方式获取攻击者的指令。
2.3.3 识别并说明这个二进制文件所具有的不同特性
根据2.3.2的分析可知,Rada.exe在执行后会自动复制到C:\Rada\bin目录中并通过修改注册表的方式实现自启动,程序启动后,会自动获取10.10.10.10/RaDa中的RaDa_commands.html,这个网页中包含了攻击者的相关指令,程序拿到指令后对相应的IP进行DDos攻击。
2.3.4 识别并解释这个二进制文件中所采用的防止被分析或逆向工程的技术
- 程序通过UPX加壳的方式对程序的机器指令进行了保护,这样在进行安全分析时实现需要进行脱壳然后才能够反汇编分析其中的内容。
- 程序主动通过HTTP协议和10.10.10.10的网站进行通信,获取相应的攻击指令,这样通过反弹连接的方式可以防止防火墙对攻击数据包进行过滤。
2.3.5 对这个恶意代码样本进行分类(病毒、蠕虫等),并给出你的理由
- 这是一个后门程序,它采取了多种方法防止被分析或逆向工程。程序自动运行并从对应IP地址获取攻击指令并执行这些攻击指令。
- 之所以说它不属于病毒或蠕虫,是因为它们有传播、感染、隐藏的性质,而说它不是木马,则是因为它是一个独立的程序,并没有隐藏在正常的程序中欺骗用户运行。
2.3.6 给出过去已有的具有相似功能的其他工具
Bobax、Setiri和GatSlag。这些程序的共同点就是从指令的服务器下载命令文件,然后解析并执行相应的指令。
2.3.7 可能调查出这个二进制文件的开发作者吗?如果可以,在什么样的环境和什么样的限定条件下?
可以通过给程序传入参数--authors
来调查开发作者,也可以在process explorer中查看作者的名字,如图十九所示,目前这两种方法还没有发现限定条件。
图十九 查看作者名字
2.4 取证分析实践
2.4.1 IRC是什么?当IRC客户端申请加入一个IRC网络时将发送那个消息?IRC一般使用那些TCP端口?
IRC(Internet Relay Chat):因特网中继聊天,是一种应用层的协议。其主要用于群体聊天,但同样也可以用于个人对个人的聊天。IRC使用的服务器端口有6667(明文传输,如irc://irc.libera.chat
)、6697(SSL加密传输,如ircs://irc.libera.chat:6697
)等。
2.4.2 僵尸网络是什么?僵尸网络通常用于什么?
僵尸网络(Botnet)是指骇客利用自己编写的分布式拒绝服务攻击程序将数万个沦陷的机器,即骇客常说的傀儡机或“肉鸡”(肉机),组织成一个个命令与控制节点,用来发送伪造包或者是垃圾数据包,使预定攻击目标瘫痪并“拒绝服务”。通常蠕虫病毒也可以被利用组成僵尸网络。
僵尸网络通常被黑客用来发起大规模的网络攻击,如分布式拒绝服务攻击(DDoS)、海量垃圾邮件等。
2.4.3 蜜罐主机(IP地址:172.16.134.191)与哪些IRC服务器进行了通信?
-
使用Wireshark打开数据文件botnet_pcap_file.dat,根据题目要求应该过滤源IP地址为172.16.134.191,又因为是IRC通信,所以应该过滤目的端口为6667或6697。具体过滤条件如下:
ip.src == 172.16.134.191 && tcp.dstport == 6667 || tcp.dstport == 6697
-
我们使用Wireshark的统计功能统计在
ip.src == 172.16.134.191 && tcp.dstport == 6667 || tcp.dstport == 6697
过滤条件下的目的地址和端口情况,如图二十所示。
图二十 统计172.16.134.191通信的目的地址和端口 -
可以发现,蜜罐主机分别和66.33.65.58、63.241.174.144、217.199.175.10、209.196.44.172和209.126.161.29这五个IRC服务器进行了通信。
2.4.4 在这段观察期间,多少不同的主机访问了以209.196.44.172为服务器的僵尸网络?
-
首先我们对捕获到的数据包进行分流,指令如下:
tcpflow -r botnet_pcap_file.dat 'host 209.196.44.172 and port 6667'
执行该指令我们能够得到三个文件172.016.134.191.01152-209.196.044.172.06667、209.196.044.172.06667-172.016.134.191.01152、report.xml
-
由于需要的是多少不同的主机访问了以209.196.44.172为服务器的僵尸网络,我们使用如下命令获取访问该服务器的主机数量:
cat 209.196.044.172.06667-172.016.134.191.01152 | grep --text "^: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 # 获取209.196.044.172.06667-172.016.134.191.01152文件中的数据并通过管道传送给grep搜索有关IRC通信的数据 # grep --text: 和grep -a作用相同,即不要忽略二进制的数据。 # sed:去除前缀; # tr:将空格转换为换行 # tr -d删除\r # grep -v:去除空行 # sort -u排序并去除重复 # wc -l:输出行数。
可以发现有3461个主机,如图二十一所示。
图二十一 统计访问的主机数量
2.4.5 哪些IP地址被用于攻击蜜罐主机?
-
使用如下命令查找攻击的IP地址并输出到ipaddr.txt中:
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 # -nn: 指定将每个监听到的数据包中的域名转换成IP、端口从应用名称转换成端口号后显示 # grep -v:排除指定字符串 # cut -d '.' -f 10:截取以'.'为分隔符的第10列 # uniq:检查及删除文本文件中重复出现的行列 # wc -l:统计文件的行数 cat ipaddr.txt
结果如图二十二所示:
图二十二 被用于攻击蜜罐主机的IP地址
2.4.6 攻击者尝试攻击了那些安全漏洞?
-
我们将端口分为TCP端口和UDP端口两部分,分别查看它们受攻击的情况。
-
首先我们利用下述指令筛选出蜜罐主机被攻击的TCP端口:
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[tcpflags]== 0x12,即为0b00010010,也就是TCP标志位的SYN,ACK置为1
然后我们利用下述指令筛选出蜜罐主机被攻击的UDP端口:
tcpdump -r botnet.pcap -nn 'src host 172.16.134.191' and udp | cut -d ' ' -f 3 | cut -d '.' -f 5 | sort | uniq
得出结果如图二十三所示,可以发现响应端口为
TCP:135(rpc),139(netbios-ssn),25(smtp),445(smb),4899(radmin),80(http)
UDP:137(netbios-ns)
图二十三 蜜罐主机被攻击的TCP端口和UDP端口 -
其中UDP的137端口是NetBIOS 名称服务器。使用者只需要向局域网或互联网上的某台计算机的137端口发送一个请求,就可以获取该计算机的名称、注册用户名,以及是否安装主域控制器、IIS是否正在运行等信息,所以访问这个端口进行了NetBIOS查点。
-
使用Wireshark过滤相关条件,过滤条件如下。
(tcp.dstport == 135 || tcp.dstport == 25)&& ip.dst == 172.16.134.191
可以发现,25端口和135端口仅仅进行了TCP三次握手,判断可能为测试端口开放情况,如图二十四所示。
图二十四 查看25端口和135端口的连接情况 -
接下来看TCP的80端口,筛选命令如下:
tcp.dstport==80 && ip.dst == 172.16.134.191
可以发现24.197.194.106与蜜罐主机传送的数据包次数最多,并且进行了类似缓冲区溢出攻击的相关数据包,但都被蜜罐主机识别并发送RST数据包,如图二十五所示。
图二十五 查看80端口的连接情况 -
接下来看TCP的139端口,筛选命令如下:
tcp.dstport==139 && ip.dst == 172.16.134.191
可以发现虽然多个IP尝试和蜜罐主机在此端口建立连接,但都被蜜罐主机识别并发送RST数据包,如图二十六所示。
图二十六 查看139端口的连接情况 -
接下来看TCP的445端口,筛选命令如下:
tcp.dstport==445 && ip.dst == 172.16.134.191
如图二十七所示,可以发现,在33280包有一个PSEXESVC.EXE。PsExec 是由 Mark Russinovich 创建的 Sysinternals Suite中包含的工具。最初,它旨在作为系统管理员的便利工具,以便他们可以通过在远程主机上运行命令来执行维护任务。后来因为太过方便,被利用到内网渗透之中。
psexec远程运行需要远程计算机启用文件和打印共享且默认的Admin$共享映射到C:\windows目录。
psexec建立连接之后目标机器上会被安装一个“PSEXESVC”服务。但是psexec安全退出之后这个服务会自动删除(在命令行下使用exit命令退出)。
图二十七 查看445端口的连接情况命名管道 \Pipe\Ntsvcs是作为 SCM 和与特定服务交互的 SCP(服务控制进程)之间的远程过程调用接口。
图二十八 蜜罐主机回复的数据包 -
最后看TCP的4899端口,筛选命令如下:
tcp.dstport==4899 && ip.dst == 172.16.134.191
可以发现只有210.22.204.101访问过这个端口,经查询可知该端口是Radmin远程控制工具,可能是被利用来控制蜜罐主机。
图二十九 查看4899端口的连接情况
2.4.7 哪些攻击成功了?是如何成功的?
经过2.4.6分析可知,成功的攻击发起者是61.111.101.78,它是通过445端口使用蠕虫攻击实现的。
3.问题及解决方案
- 问题1:对于IDA的使用不够熟练
- 问题1解决方案:通过上网查找获取IDA Pro的使用教程,完成了相关程序的分析。
4.学习感悟、思考等
本次实验进行了对恶意代码的综合性分析,通过动手实践的方式我弄懂了恶意代码分析的基本思路和常用的方法。在本次实验中,经过在网上寻找相关资料,我成功地完成了相关的实验内容。
本次实验也暴露出了我在某些方面还有所欠缺,例如对于汇编语言的了解还不够深入,对于IDA Pro的使用方法也十分模糊。此外,kali中的tcpflow我也是第一次接触,相关命令经过查询才能够理解。另外,在对于网络数据包的分析方面我对Wireshark的使用和对于IRC协议的了解也不够深入,有待加强。
最后,感谢王老师的细心讲解和耐心帮助,也感谢在实验过程中给我帮助的同学们。正因为有你们的帮助我才能够顺利地完成本次实验,谢谢!