20192415 2021-2022-2 《网络与系统攻防技术》实验四实验报告
20192415 2021-2022-2 《网络与系统攻防技术》实验四实验报告
1.实验内容
1.1 实验内容
- 恶意代码文件类型标识、脱壳与字符串提取:对提供的rada恶意代码样本,进行文件类型识别,脱壳与字符串提取,以获得rada恶意代码的编写作者。
- 使用IDA Pro静态或动态分析crackme1.exe与crakeme2.exe,寻找特定输入,使其能够输出成功信息。
- 分析一个自制恶意代码样本rada,并撰写报告,回答问题。
- Windows 2000系统被攻破并加入僵尸网络的取证分析实践:数据源是Snort收集的蜜罐主机5天的网络数据源,并去除了一些不相关的流量,同时IP地址和其他敏感信息被混淆。
2.实验过程
2.1 恶意代码文件类型标识、脱壳与字符串提取
2.1.1 使用文件格式和类型识别工具,给出rada恶意代码样本的文件格式、运行平台和加壳工具
-
使用file命令查看文件格式,结果如下。
file命令用来识别文件类型,也可用来辨别一些文件的编码格式。它是通过查看文件的头部信息来获取文件类型,而不是像Windows通过扩展名来确定文件类型的。
“PE32”说明是一个32位的PE文件,“(GUI) Intel 80386”说明运行在Intel 80386 GUI上,“MS Windows”说明针对的操作系统是Windows。
┌──(root㉿20192415xingzhibin)-[~/rada] └─# file RaDa.exe RaDa.exe: PE32 executable (GUI) Intel 80386, for MS Windows
-
使用PE Explorer查看文件格式、运行平台
除了在linux中使用file命令,在windows中可以借助程序解析器等工具查看文件信息,如PE Explorer。
PE Explorer是功能超强的可视化Delphi、C++、VB程序解析器,能快速对32位可执行程序进行反编译,并修改其中资源。
如下图所示,这是使用PE Explorer查看RaDa.exe的文件头信息。
“Machine(处理器)”字段是运行平台,内容为0x014c,表明可运行在Intel386处理器或后续兼容处理器;
“Magic(魔术)”字段是文件类型,内容为0x010B,表明这是一个32位的PE文件。 -
使用PEID查看加壳工具
当加壳的程序运行时,会首先运行一小段脱壳代码,来解压缩加壳的文件。我在分析的时候是利用PEid这款工具对程序检查是否存在壳(PEid工具在2011年4月就停止更新了,但是还是可以识别大多数的壳)。
识别结果为“UPX 0.89.6 - 1.02 / 1.05 - 2.90 -> Markus & Laszlo”,可知该程序加的是UPX的壳,版本是0.89.6。
2.1.2 使用超级巡警脱壳机等脱壳软件,对rada恶意代码样本进行脱壳处理
使用超级巡警脱壳机进行脱壳,脱壳后程序为RaDa_unpacked.exe。
2.1.3 使用字符串提取工具,对脱壳后的rada恶意代码样本进行分析,从中发现rada恶意代码的编写作者是谁
-
使用strings命令分析
使用strings命令分析脱壳后的rada恶意代码样本(即RaDa_unpacked.exe),分析结果如下图所示(左图未脱壳,右图已脱壳)。
strings命令: 在对象文件或二进制文件中查找可打印的字符串。
-
用IDA Pro调整编码格式
在RaDa_unpacked.exe的string中,发现有一行为“(c) Raul Siles & David Perez”,猜测与编写作者相关。
用IDA Pro打开RaDa_unpacked.exe,“View”→“Open subviews”→“strings”查看字符串。右键单击选择“setup”,更改allowed string types为Unicode,再次查看,
出现“Copyright (C) 2004 Raul Siles & David Perez”。
“Copyright”有“版权、著作权”的意思,可知该恶意代码为Raul Siles和David Perez在2004年编写。
2.2 使用IDA Pro静态或动态分析crackme1.exe与crakeme2.exe,寻找特定输入,使其能够输出成功信息
2.2.1 在linux中安装IDA Pro6.4
IDA是比利时Hex-Rays公司出品的一款交互式静态反汇编工具。它可以直接反汇编出二进制文件的汇编代码,是目前软件逆向与安全分析领域最好用、最强大的一个静态反汇编软件,已成为众多软件安全分析人员不可缺少的利器!它支持Windows、Linux等多个平台,支持Intel X84、X64、ARM、MIPS等数十种CPU指令集。
Linux版本的IDA Pro比较稀少,很幸运的是吾爱破解论坛已经有大牛分享了Linux版本的IDA Pro,分享的作者已经对该IDA Pro进行了path,去掉了局域网检测的校验。下载该Linux版本IDA Pro直接解压,在Linux 32bit系统上可以直接使用,在Linux 64bit的系统上需要安装一些依赖库文件能正常使用该IDA Pro。
具体在kali中安装IDA Pro可参考ida pro6.4 linux安装使用。
2.2.2 分析crackme1.exe
-
使用file命令查看crackme1.exe的文件信息
可知crackme1.exe为windows系统下运行的32位可执行程序,没有图形界面,仅使用控制台操作。
┌──(root㉿20192415xingzhibin)-[~/exp4] └─# file crackme1.exe crackme1.exe: PE32 executable (console) Intel 80386, for MS Windows
-
运行程序并试探输入格式
希望通过特定输入使crackme1.exe输出成功信息,首先要确定“特定输入”可能包含几个参数。
多次运行crackme1.exe并尝试不同的参数个数,通过返回结果判断正确的参数个数(不含程序名)可能是一个。 -
利用IDA查看crackme1.exe包含哪些字符串
程序中往往包含很多字符串资源,这些资源存在于PE文件的rdata段,使用IDA反编译后,可以查找到这些字符串。
选择“View”→“Open subviews”→“strings”,查看字符串。
可知共有4种字符串,目前我们试探出其中两种为返回情况:“I think you are missing something.”是“参数数量不对”时的返回情况、“Pardon? What did you say?”是“参数数量对但内容不对”的返回情况。 -
利用IDA查看crackme1.exe的函数调用图
选择“View”→“Graphs”→“Function calls”,查看函数调用图。
可以看到,_main函数可以调用_fprintf和_printf。据此,我们判断_main中包含选择输出哪些信息的逻辑结构。fprintf是C/C++中的一个格式化库函数,位于头文件中,其作用是格式化输出到一个流文件中。
printf 是指格式化输出函数,主要功能是向标准输出设备按规定格式输出信息。printf是C语言标准库函数,定义于头文件。 -
查看函数与反编译
通过“Jump”→“Jump to function”→“_main”查看_main函数。按下F5(或“View”→“Open subviews”→“Generate pseudocode”)进行反编译。
读代码可知,程序首先会判断参数个数,若参数个数不为2(包含函数名),输出“I think you are missing something.”,否则进入下一层选择结构。下一层判断第二个参数是不是“I know the secret”,若是则输出“You konw how to speak to programs,Mr.Reverse-Engineer”,否则输出“Pardon? What did you say?”。
希望通过特定输入使crackme1.exe输出成功信息,就需要将“I know the secret”作为第二个参数,这样就可以得到成功信息“You konw how to speak to programs,Mr.Reverse-Engineer”。效果如下。argc和argv这两个C语言预订的参数可以实现给main函数传参:
argc是int类型,表示运行程序的时候给main函数传递了几个参数
argv是一个字符串数组,这个数组用来存储argc个字符串,每个字符串就是我们给main函数传的一个参数。第一个参数argv[0]一定是程序名称。
2.2.3 分析crackme2.exe
对crackme2.exe的分析过程与crackme1.exe类似。
-
使用file命令查看文件信息
crackme2.exe同样为windows系统下运行的32位可执行程序、没有图形界面仅使用控制台操作。
-
运行程序并试探输入格式
通过返回结果判断正确的参数个数(不含程序名)可能是一个。
-
利用IDA查看crackme2.exe包含哪些字符串
可知共有5种字符串,目前我们试探出其中两种为返回情况:“I think you are missing something”是“参数数量不对”时的返回情况、“Pardon? What did you say?”是“参数数量对但内容不对”的返回情况。
-
利用IDA查看函数调用图
可以看到,_main函数可以调用_fprintf、puts、putchar。据此判断_main中包含选择输出哪些信息的逻辑结构。
puts()函数用来向标准输出设备(屏幕)输出字符串并换行。
putchar把指定的字符(一个无符号字符)写入到标准输出stdout中。 -
查看函数与反编译
查看_main函数,按下F5(或“View”→“Open subviews”→“Generate pseudocode”)进行反编译。
读代码可知,程序首先会判断参数个数,若参数个数不为2(包含函数名),输出“I think you are missing something.”,否则进入下一层选择结构。下一层判断第一个参数是不是“crackmeplease.exe”,不是则输出“I have an identity problem.”,否则进入下一层选择结构。下一层判断第二个参数是不是“I know the secret”,若是则输出成功信息,否则输出“Pardon? What did you say?”。
希望通过特定输入使crackme2.exe输出成功信息,就需要将“crackmeplease.exe”作为第一个参数,将“I know the secret”作为第二个参数,这样就可以得到成功信息。
要求第一个参数是“crackmeplease.exe”,而第一个参数是程序名,所以要先对crackme2.exe重命名为“crackmeplease”后再运行。效果如下。
2.3 分析自制恶意代码样本rada,并回答问题
2.3.1 提供对这个二进制文件的摘要,包括可以帮助识别同一样本的基本信息
-
RaDa.exe的摘要
Certutil是Windows操作系统上预装的工具,可用于校验文件MD5、SHA1、SHA256,下载恶意文件和免杀。
我们使用Certutil来计算RaDa.exe的摘要,在所在目录打开cmd并输入如下命令。
certutil -hashfile D:\DKY6\class\NetAD\exp\exp4\tool\rada\RaDa.exe certutil -hashfile D:\DKY6\class\NetAD\exp\exp4\tool\rada\RaDa.exe MD5 certutil -hashfile D:\DKY6\class\NetAD\exp\exp4\tool\rada\RaDa.exe SHA256
RaDa.exe的摘要分别如下:
MD5:caaa6985a43225a0b3add54f44a0d4c7
SHA1:4164423ece62c5c4c287f8c2003b84e4e3a6cfda
SHA256:13c2379e9d9f679396e21a3391804cc834892f25691381b6d078d07b56d38f90 -
其他基本信息
用file命令用来识别文件类型,这是一个windows系统下运行的32位可执行程序。
┌──(root㉿20192415xingzhibin)-[~/exp4] └─# file RaDa.exe RaDa.exe: PE32 executable (GUI) Intel 80386, for MS Windows
同时查看文件属性,大小为20992字节。
2.3.2 找出并解释这个二进制文件的目的
打开process explorer进行监听,运行RaDa_dump.exe,查看Strings。
可知该二进制文件有以下行为:
- 通过HTTP协议请求10.10.10.10\RaDa\RaDa_commands.html。
- 在C盘中创建一个RaDa文件夹,包含tmp和bin两个子文件夹,其中将RaDa.exe复制在bin子文件夹中。
- 对注册表进行读、写和删除。添加2个注册表项,路径为分别为HKLM(即HKEY_LOCAL_MACHINE)\Software\Microsoft\Windows\CurrentVersion\Run\和HKLM\Software\VMware, Inc.\VMware Tools\InstallPath。
其中HKLM(即HKEY_LOCAL_MACHINE)\Software\Microsoft\Windows\CurrentVersion\Run里名称为RaDa,类型为REN_SZ,数据内容为C:\RaDa\bin - 疑似发起DDOS Smurf攻击。
- 与一些指令相关,如put、get、screenshot、sleep。
这里的2/3连在一起,就是将自身复制至感染主机系统盘,并激活自启动;1/4/5连在一起,可以联想到接收指令发动DDOS Smurf攻击。
2.3.3 识别并说明这个二进制文件所具有的不同特性
- 当文件被执行时,其将自身安装到系统中,并修改注册表使得系统启动时执行该文件。
- 文件被执行后,将通过浏览器上网,请求页面并获得来自攻击者的指令。
- 文件运行使,支持put上传、get下载、screenshot截屏、sleep挂起等指令。
2.3.4 识别并解释这个二进制文件中所采用的防止被分析或逆向工程的技术
- 文件使用UPX进行了加壳,加壳后可能还尽量了一些其他操作(脱壳后的RaDa_unpacked.exe与RaDa_dump.exe中的Strings还是有区别)。
- 若文件不在Vmware虚拟机上运行,将“--authors”作为参数可输出作者信息,在则不输出。
2.3.5 对这个恶意代码样本进行分类(病毒、蠕虫等),并给出你的理由
这应该是一个后门程序。它能够接收指令、操控主机,但不具备网络传播、感染等特性,也没有伪装成良性程序进行欺骗。
2.3.6 给出过去已有的具有相似功能的其他工具
Bobax、Setiri。
2.3.7 可能调查处这个二进制文件的开发作者吗?如果可以,在什么样的环境和什么样的限定条件下?
可以,不在Vmware虚拟机上运行,并使用“--authors”作为参数。
2.4 取证分析实践:Windows 2000系统被攻破并加入僵尸网络
数据源botnet_pcap_file.dat是Snort收集的蜜罐主机5天的网络数据源,并去除了一些不相关的流量,同时IP地址和其他敏感信息被混淆。回答下列问题。
2.4.1 IRC是什么?当IRC客户端申请加入一个IRC网络时将发送哪个消息?IRC一般使用那些TCP端口?
-
IRC即Internet Relay Chat,互联网中继聊天,是一种使用客户端-服务器架构的多用户聊天系统。客户端用户可以加入特定的频道(channel)与该频道中的所有用户聊天,也可以采用私聊的方式。特点是速度非常之快,聊天时几乎没有延迟的现象,并且只占用很小的带宽资源。
-
IRC客户端申请加入一个IRC网络时将发送JOIN信息。
使用IRC首先要进行注册,注册时需要发送的消息有三种,分别是口令、昵称和用户信息。格式如下:USER <username> <hostname> <servername> <realname> PASS <password> NICK <nickname>
注册完成后,客户端就使用JOIN信息来加入频道,格式如下:
JOIN <channel>
-
IRC服务器明文传输通常在6667端口监听,也会使用 6660—6669 端口。
当攻击者滥用IRC构建僵尸网络时,可能使用任意的端口构建IRC僵尸网络控制信道。
2.4.2 僵尸网络是什么?僵尸网络通常用于什么?
- 僵尸网络(BotNet)是指攻击者(botmaster)出于恶意目的,传播僵尸程序(Bot)控制大量主机(Zombie,傀儡主机、肉鸡),并通过一对多的命令与控制信道所组成的网络。
- 僵尸网络构成了一个攻击平台,利用这个平台可以有效地发起各种各样的攻击行为,可以导致整个基础信息网络或者重要应用系统瘫痪,也可以导致大量机密或个人隐私泄漏,还可以用来从事网络欺诈等其他违法犯罪活动。
- 拒绝服务攻击
利用Botnet发动DDos攻击是当前最主要的威胁之一,攻击者可以向自己控制的所有bots发送指令,让它们在特定的时间同时开始连续访问特定的网络目标,从而达到DDos的目的。 - 发送垃圾邮件
一些bots会设立sockv4、v5代理,这样就可以利用Botnet发送大量的垃圾邮件,而且发送者可以很好地隐藏自身的IP信息。 - 窃取秘密
Botnet的控制者可以从僵尸主机中窃取用户的各种敏感信息和其他秘密,例如个人帐号、机密数据等。同时bot程序能够使用sniffer观测感兴趣的网络数据,从而获得网络流量中的秘密。 - 滥用资源
攻击者利用Botnet从事各种需要耗费网络资源的活动,从而使用户的网络性能受到影响,甚至带来经济损失。例如:种植广告软件、利用僵尸主机搭建假冒的银行网站从事网络钓鱼的非法活动。 - 僵尸网络挖矿
网络安全商fortiguard labs的网络安全研究报告指出,虚拟货币的僵尸挖矿ZeroAccess已经成为全球网络当下主要威胁。
- 拒绝服务攻击
2.4.3 蜜罐主机(IP地址:172.16.134.191)与那些IRC服务器进行了通信?
使用Wireshark打开数据源botnet_pcap_file.dat,设置过滤条件“ip.src == 172.16.134.191 && tcp.dstport == 6667 and tcp.flags == 0x2”,过滤出蜜罐主机尝试连接6667端口的SYN包。
可知,蜜罐主机与5台IRC服务器进行了通信:209.126.161.29、66.33.65.58、63.241.174.144、217.199.175.10、209.196.44.172。
2.4.4 在这段观察期间,多少不同的主机访问了以209.196.44.172为服务器的僵尸网络?
这里我们尝试使用估计方法统计主机数,即观察期间不同昵称出现个数(每个IRC的使用者都有一个昵称Nickname)。
-
用tcpflow进行分流处理
首先获取在209.196.44.172与172.016.134.191之间的所有的IRC数据包。在kali终端中输入如下命令:apt-get install tcpflow#安装 tcpflow -r botnet_pcap_file.dat 'host 209.196.44.172 and port 6667' # 进行抓包,-r读取该数据包
可以得到三个文件:209.196.044.172.06667-172.016.134.191.01152、
172.016.134.191.01152-209.196.044.172.06667、
report.xml。 -
观察不同昵称出现个数
在主机进入到IRC频道后,频道会将当前频道中所有的主机的信息都发送过来,可以从其中的数据包中计算当前频道共有多少主机。
使用如下命令对209.196.044.172.06667-172.016.134.191.01152文件进行筛选,可以得到共有3461个主机访问过服务器。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 , # grep获取昵称输出行;sed去除前缀(有可能无法匹配);tr -d将空格转换为换行;tr去除“\r”;grep -v去除空行;sort -u排序并去除重复;wc -l获得行数
2.4.5 哪些IP地址被用于攻击蜜罐主机?
-
tcpdump介绍
这里使用了tcpdump,Linux上强大的网络数据采集分析工具。
tcpdump [-adeflnNOpqStvx][-c<数据包数目>][-dd][-ddd][-F<表达文件>][-i<网络接口>][-r<数据包文件>][-s<数据包大小>][-tt][-T<数据包类型>][-vv][-w<数据包文件>][输出数据栏位] 类型关键字:host,net,port; 传输方向关键字:src,dst,dst or src,dst and src; 协议关键字:ip,arp,udp,tcp,fddi; -n 指定将每个监听到数据包中的域名转换成IP地址后显示,不把网络地址转换成名字; -nn 指定将每个监听到的数据包中的域名转换成IP、端口从应用名称转换成端口号后显示。
-
找出所有连接蜜罐主机的IP地址
由于蜜罐具有特殊性,将所有进入蜜罐的流量都视为可疑流量、都是攻击。用下列命令将所有连接蜜罐主机的IP地址输出到20192415ip_list.txt。可知共有165个IP地址被用于攻击蜜罐主机,具体IP见20192415ip_list.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> 20192415ip_list.txt;wc -l 20192415ip_list.txt # tcpdump -nn见1.tcpdump介绍;cut -d '.' -f 10截取以'.'为分隔符的第10列;uniq检查并删除 文本文件中重复出现的行列;wc -l获得行数
2.4.6 & 2.4.7 攻击者尝试攻击了那些安全漏洞?那些攻击成功了?是如何成功的?
-
使用wireshark了解网络流分布情况
使用Wireshark打开数据源botnet_pcap_file.dat,选择“统计”→“协议分级”,大致了解网络流分布情况。
可发现其中只包含IP包,186个为UDP协议,54350个为TCP协议。
UDP中包含NetBIOS Datagram、Data等,TCP中包含NetBIOS Session、HTTP、Data、IRC等。 -
筛选TCP端口
由于TCP包数目较多,我们先对TCP端口进行筛选。
可知,攻击者扫描了90个TCP端口,其中开放并响应的有135(rpc)、139(netbios-ssn)、25(smtp)、445(smb)、4899(radmin)、80(http)。端口服务详见网络端口号大全。# 攻击者扫描了哪些TCP端口 tcpdump -r botnet_pcap_file.dat -nn 'dst host 172.16.134.191' and tcp[tcpflags]== 0x2 | cut -d ' ' -f 5 | more | cut -d '.' -f 5 | cut -d ':' -f 1 | sort | uniq # 哪些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
-
筛选UDP端口
接下来筛选UDP端口。可知,攻击者扫描了3个UDP端口:137(netbios-ns)、1434(ms-sql-m)、28431(unknow)。其中开放并响应的是137(netbios-ns)。
137端口的主要作用是在局域网中提供计算机的名字或地址查询服务,一般安装了NetBIOS协议后,该端口会自动处于开放状态。
端口发送一个连接请求时,就可能获得目标主机的相关名称信息。例如目标主机的计算机名称,注册该目标主机的用户信息,目标主机本次开机、关机时间等。# 攻击者扫描了哪些UDP端口 tcpdump -r botnet_pcap_file.dat -nn 'dst host 172.16.134.191' and udp | cut -d ' ' -f 5 | more | cut -d '.' -f 5 | cut -d ':' -f 1 | sort | uniq # 哪些UDP端口时开放的、响应的 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 | more
-
TCP135端口
只进行了连接,没有数据内容交换,可能是对端点进行connect扫描。
-
TCP139端口
大部分连接没有传递具体会话内容,主要是SMB查点(空会话连接)。
-
TCP25端口
只进行了连接,没有数据内容交换,可能是对端点进行connect扫描。
-
TCP445端口
在No.33280的报文中发现了“PSEXESVC.EXE”,这个文件主要是一种通过IRC进行通信的Dv1dr蠕虫。这里发生了口令蠕虫攻击。后面的报文中包含主机响应,攻击成功。
-
TCP4899端口
4899端口是一个远程控制软件Radmin服务端监听的端口,经常被黑客用来控制被控机。且这类软件一般不会被杀软查杀,比后门更安全。这里发生了Radmin远程控制,攻击成功。
-
TCP80端口
存在缓存区溢出攻击,通过缓冲区溢出获得命令行。
在No.32889的报文中发现了“c:\notworm”,这是一个蠕虫攻击。
此外,还通过该端口持续使用脚本攻击IIS服务器的漏洞,从而获取系统权限。但蜜罐主机均以IIS服务器的默认页面作为回应,攻击失败。
-
UDP137端口
这里的NBNS是NetBIOS name service的缩写,是NetBIOS的命名服务。可知此处是在进行NetBIOS查点。
-
UDP1434端口
这里存在SQL slammer蠕虫攻击,详见SQL slammer蠕虫王汇编代码详解
-
UDP28431端口
没看出来问题。
3.问题及解决方案
问题1:kali中无法运行exe,exe是windows中的可执行文件
问题1解决方法:使用wine命令。wine会在linux和文件(为windows编写)之间充当一个兼容层。
问题2:Linux中的IDA Pro6.4不具备反编译功能
问题2解决方法:由于其他版本的IDA Pro没有找到Linux破解版。所以最后又在win11上安装了IDA Pro7.0,具有反编译功能。当然也可以直接分析汇编语言。
4.学习感悟、思考等
在本次实验中,我完成了对恶意代码进行脱壳、提取字符串、分析函数调用关系等操作,并且多方面分析了一个恶意代码样本和一个dat数据源。
这次实验用到了许多Windows、Linux下的命令以及软件工具。我对这些命令和工具的了解和熟悉度还有待加深,其他需要掌握的与网络攻防相关的命令还有很多。
当前恶意代码攻击的背后是大量技术融合交织、技术原理错综复杂,需要采用各种类型的静态分析与动态分析技术手段进行结构与行为的剖析,充分认知恶意代码。要学习的东西很多很多!