20212308 2022-2023-2 《网络与系统安全技术》实验四报告
文章目录
1.实践内容
- (1)恶意代码文件类型标识、脱壳与字符串提取;
- (2)使用IDA Pro静态或动态分析crackme1.exe与crakeme2.exe,寻找特定输入,使其能够输出成功信息;
- (3)分析一个自制恶意代码样本rada;
- (4)取证分析实践:Windows 2000系统被攻破并加入僵尸网络。
2.实践过程
2.1 恶意代码文件类型标识、脱壳与字符串提取
对提供的rada恶意代码样本,进行文件类型识别,脱壳与字符串提取,以获得rada恶意代码的编写作者
(1)使用文件格式和类型识别工具,给出rada恶意代码样本的文件格式、运行平台和加壳工具;
- 使用file命令查看文件的格式和类型信息,file命令是Kali(Linux内核)自带的,Windows需要找第三方开源平台安装。
- file命令的原理是基于文件头的魔术字段来识别文件类型。
- 参考:https://blog.csdn.net/jks212454/article/details/134037147
如上图所示,RaDa.exe文件是32位PE文件,80386处理器,微软Windows操作系统,有三个节。
在恶意代码中,我学习过使用PE Explorer工具观察PE文件的细节。此处打开PE Explorer工具查看一下。
接下来使用PEiD工具查看文件的加壳工具。下图是看雪工具对PEiD的介绍。
接下来使用一下该工具。
根据上图可以判断出文件使用了UPX压缩壳,UPX在实验三中使用过。
(2)使用超级巡警脱壳机等脱壳软件,对rada恶意代码样本进行脱壳处理;
脱壳的步骤非常简单,下载好超级巡警脱壳机后,选择RaDa.exe文件,点击“给我脱”!即可完成。
除此之外,PEiD也有脱壳的功能。
同时,我们可以观察到脱壳后多了一个节。
使用PEview工具观察脱壳前后的PE文件结构,可以发现,多了一个名为dswlab的节,但这个节的命名并非常规命名,是自定义的名字,包括JDR0和JDR1也是自定义的名字。
(3)使用字符串提取工具,对脱壳后的rada恶意代码样本进行分析,从中发现rada恶意代码的编写作者是谁?
首先编写一段脚本,用于提取字符串。
function Get-Strings {
param(
[Parameter(Mandatory=$true, Position=0)]
[string]$FilePath
)
$bytes = [System.IO.File]::ReadAllBytes($FilePath)
$strings = New-Object System.Text.StringBuilder
for ($i = 0; $i -lt $bytes.Length - 1; $i++) {
if (($bytes[$i] -ge 32 -and $bytes[$i] -le 126) -and ($bytes[$i + 1] -ge 32 -and $bytes[$i + 1] -le 126)) {
$strings.Append([char]$bytes[$i]) | Out-Null
$strings.Append([char]$bytes[$i + 1]) | Out-Null
$i++ # Skip the next byte since we already processed it
}
}
$strings.ToString() -split "`n" | Where-Object { $_ -ne "" }
}
# 使用示例
Get-Strings "C:\path\to\your\binary\file.exe"
这是一段非常简单的脚本:函数接受一个强制性的参数 $FilePath,表示要从中提取字符串的文件的路径。使用 [System.IO.File]::ReadAllBytes($FilePath) 读取整个文件的内容,并将其存储为字节数组 $bytes。使用 New-Object System.Text.StringBuilder 创建一个新的字符串构建器对象 $strings,用于构建最终的字符串。函数通过一个 for 循环遍历字节数组。循环的每次迭代检查当前字节和下一个字节是否都在 ASCII 字符集中可打印字符的范围内(即 32 到 126)。如果是,则将这两个字节转换为字符,并追加到 $strings 字符串构建器中。最后,函数将 $strings 构建器的内容转换为字符串,并使用 -split “\n” 将其按换行符拆分为多个字符串。然后,使用 Where-Object { $_ -ne “” } 过滤掉空字符串,并返回剩余的非空字符串数组。
当然也可以使用现有的字符串提取工具strings,在Kali(LInux内核)中是自带的,Windows需要额外安装。通过字符串提取,我们可以找到恶意代码的编写作者Raul Siles和David Perez的名字。
2.2 使用IDA Pro静态或动态分析crackme1.exe与crakeme2.exe,寻找特定输入,使其能够输出成功信息;
2.2.1 分析crackme.1exe
双击运行失败,需要特定输入,打开IDA Pro,查看函数调用关系。根据函数调用关系,找到输出信息的位置。
再看一下反汇编的信息,一共有四种特定输出。_mian函数中存在一条条件语句,判断是否满足条件语句的布尔值会进一步产生两种输出,某一种输出还会存在一条条件语句,同样会因判断的布尔值不同又存在两种不同输出。
从函数调用可以看出,只有_main函数调用输出函数来输出特定信息,所以生成_main函数的反编译。
编译:高级语言 —> 汇编语言
反编译:汇编语言 —> 高级语言
汇编:汇编语言 —> 机器码
反汇编:机器码 —> 汇编语言
分析反编译出的高级语言,如上图所示。
根据上面的分析实践一下:
2.2.2 分析crackme.2exe
双击不能直接运行,打开IDA Pro逆向分析,先看函数调用关系。
依旧是从_main函数中调用各种输出函数,反编译看看。
分析反编译出的高级语言如上图所示。接下来实践一下:
这里涉及到修改文件名,使用rename命令。可以看到终极输出。
IDA Pro中还有很多非常好用的逆向分析功能,由于这个文件比较基本,可以反编译生成高级语言。如果反编译得不到有效信息,就只能通过反汇编的信息来寻找文件入口了。
2.3 分析一个自制恶意代码样本rada;
(1)提供对这个二进制文件的摘要,包括可以帮助识别同一样本的基本信息;
使用windows自带的certUtil工具即可计算文件的摘要,其原本是用来用于证书服务的配置和证书的管理任务。
但这里我没懂要获取摘要的目的是什么?
这个文件是一个加了压缩壳的32位PE文件,这在前面已经用工具和命令查看过了。
继续分析文件,使用process explorer进行监听运行的rada_dump.exe文件,动态查看strings。(也可以在IDA Pro中查看,效果一样)
从上面的strings中,可以分析得到以下信息:该程序连接到10.10.10.10的主机下名为RaDa_commands.html的网页上,程序会自动创建文件夹C:\RaDa\tmp,保存下载文件,进行DDOS Smurf远程攻击。程序会将RaDa.exe复制到C:\RaDa\bin。RegRead、RegWrite、RegDelete体现出该程序还依次读、写和删除注册表。并且其中还存在exe、put、get、screenshot、sleep命令,这些指令的非法运行会造成隐私的泄露。
同时,我的杀软弹出提示,告诉我该程序是开机自动运行的。
查看上面strings中的目录,可以发现程序确实创建了文件夹并实现自我复制,再次作证。
在其运行时,用wireshark抓包看一下。
发现了tcp和ICMP的数据包,虽然都没有成功连接。
打开Ollydbg,查看文件的内存映射,可以看到他对c盘中的真实的文件修改。
用OD查看其可执行板块。
上面已经分析的足够了,也可以打开IDA Pro使用反汇编工具观察一下,得出的结论和上面相同。
(2)找出并解释这个二进制文件的目的;
该程序在运行时将建立远程连接,并对注册表进行修改。所下载的文件将被存储至C:\RaDa\tmp目录下,并且该程序还会修改注册表以实现随系统开机自启动的功能。此外,该程序还具备访问指定网址http://10.10.10.10/Rada/Rada_command.html的能力,并能够解析从该网址接收到的指令,进而执行相应的操作。
(3)识别并说明这个二进制文件所具有的不同特性;
反向连接、修改注册表、自我复制、自动启动。
(4)识别并解释这个二进制文件中所采用的防止被分析或逆向工程的技术;
使用UPX压缩壳。同时在strings中加入干扰信息,如SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True是一句没有用的SQL语句(这压根也涉及不到数据库查询)。以及starting DDOS smurf remote attack也是干扰,因为Smurf攻击要用伪造的源地址,向局域网的广播地址发送ICMP的‘echo’请求数据报,局域网内所有主机向该地址返回‘echo’响应数据报,造成该主机服务中断,这种攻击特性在此代码的反汇编中体现不出来。
(5)对这个恶意代码样本进行分类(病毒、蠕虫等),并给出你的理由;
首先要理清几种恶意代码的特征:
病毒:需要宿主、可以自我复制
蠕虫:不需要宿主,可以自我复制
木马:不需要宿主,不可以自我复制
僵尸程序:会自动执行并与僵尸网络的服务器相连,被控制执行攻击
后门:攻击者对系统非授权访问
Rootkit:修改OS软件,使攻击者扩大权限
该程序自动执行,不具备感染性,可以自我复制,会反弹连接,非法授权,具有僵尸程序和后门的特征。
(6)给出过去已有的具有相似功能的其他工具;
msf、ncat、socat
(7)可能调查处这个二进制文件的开发作者吗?如果可以,在什么样的环境和什么样的限定条件下?
使用命令可以直接查看RaDa.exe的作者。
当然前面通过脱壳机脱壳后查看字符串也能发现作者的名字,这是匹配的。
2.4 取证分析实践:Windows 2000系统被攻破并加入僵尸网络。
问题: 数据源是Snort收集的蜜罐主机5天的网络数据源,并去除了一些不相关的流量,同时IP地址和其他敏感信息被混淆。回答下列问题:
(1)IRC是什么?当IRC客户端申请加入一个IRC网络时将发送那个消息?IRC一般使用那些TCP端口?
- IRC是Internet Relay Chat的缩写,意为“互联网中继聊天”。它是一种基于互联网的即时通讯协议,通过客户端软件连接到服务器上,用户可以在不同的聊天室中进行实时交流。
- IRC是最简单的客户机是任何能够连接到服务器的套接字程序,使用TCP/IP网络协议,依据C-S模型。
- IRC注册时需要发送的消息有口令,昵称和用户信息。实际通信时发送JOIN信息来加入频道。
- IRC服务器明文传输通常在6667端口监听。SSL加密传输在6697端口。
(2)僵尸网络是什么?僵尸网络通常用于什么?
- 僵尸网络(Botnet)是指采用一种或多种传播手段,将大量主机感染bot程序(僵尸程序)病毒,从而在控制者和被感染主机之间所形成的一个可一对多控制的网络。攻击者通过各种途径传播僵尸程序感染互联网上的大量主机,而被感染的主机将通过一个控制信道接收攻击者的指令,组成一个僵尸网络。
- 僵尸网络的应用:
- 发动大规模的DDoS攻击,将目标网络或网站淹没在大量的流量中,导致服务不可用。
- 发送大量垃圾邮件,用于传播恶意软件、钓鱼链接或其他诈骗活动。
- 窃取敏感数据,如个人身份信息、银行账户信息或商业机密。
- 传播恶意软件,包括勒索软件、间谍软件和其他恶意代码。
- 挖掘加密货币,以获取非法收益。
- ……
(3)蜜罐主机(IP地址:172.16.134.191)与那些IRC服务器进行了通信?
Wireshark打开数据文件botnet_pcap_file.dat,设置ip源地址和协议端口号为过滤条件。
ip.src == 172.16.134.191 && tcp.dstport == 6667
可以看到蜜罐主机与五个IRC服务器通信(IRC中,A和B不会直接通信,而是通过第三方转发,即IRC服务器),ip地址分别为:
209.126.161.29
66.33.65.58
63.241.174.144
217.199.175.10
209.196.44.172
> 补充:蜜罐是一种主动防御技术,运行在互联网上的计算机系统,是一个包含漏洞的诱骗系统。蜜罐通过模拟一个或多个易受攻击的主机和服务,来吸引和诱骗那些试图非法闯入他人计算机系统的人对它实施攻击。蜜罐的设计初衷是让黑客入侵,借此收集证据,同时隐藏真实的服务器地址。
(4)在这段观察期间,多少不同的主机访问了以209.196.44.172为服务器的僵尸网络?
- 下载tcpflow工具。TCPFlow是一个功能强大的、基于命令行的免费开源工具,用于在Linux上分析网络流量。它能够捕获通过TCP连接接收或传输的数据,并将这些数据存储在文件中以供后续分析,它支持丰富的过滤条件。
tcpflow -r botnet_pcap_file.dat 'host 209.196.44.172 and port 6667'
- 使用tcpflow工具读取指定的dat文件,设置过滤条件。
- TCPFlow会尝试重建 TCP 会话,并将每个会话的数据保存到一个单独的文件中。除xml文件外,每个文件代表了一个 TCP 会话,文件名会包含会话的源和目标 IP 地址以及端口号。
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 ,
- cat 命令查看以209.196.44.172为服务器的的文件,僵尸网络的主机数
- grep 命令用于搜索文件中的特定模式,即搜索 :irc5.aol.com 353 开头的行, -v 参数表示选择不匹配的行,-a匹配二进制文件
- sed 命令用于流编辑器,它可以对输入流(或文件)进行基本的文本转换
- tr 命令用于替换或删除字符
- sort 命令用于排序文本行,-u去重
- wc 命令,-l 参数用于计算文件中的行数
- 正则表达式
结论:得到3461台主机访问过服务器
(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> ip.txt;wc -l ip.txt
- tcpdump是一个网络抓包工具,能够捕获网络数据包并进行分析和显示,能够根据不同的过滤条件进行数据包的筛选和分析。
该命令解释和结果如下图所示
结论:ip.txt文件中,一共165个IP地址被用于攻击蜜罐主机
(6)攻击者尝试攻击了那些安全漏洞?
思路:通过协议筛选
-
查看wireshark中的协议分级统计,传输层上,大量基于tcp的攻击及少量基于udp的攻击;网络层及链路层不存在其他协议。
-
接下来使用tcpdump工具进一步筛选
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 > scanned_ports.txt
wc -l scanned_ports.txt
- 蜜罐主机ip为目的主机,该命令的目的是查看攻击者扫描了多少基于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
- 蜜罐主机ip为源主机,即蜜罐主机与攻击者产生了数据交互,那么这6个有数据交互的端口就有可能被攻击,如下图所示
-
同样的思路再看看udp协议
-
如下两图所示,蜜罐主机一共有三个udp端口被扫,有一个端口产生了数据交互
-
接下来用wireshark设置过滤条件,查看刚刚存在数据交互的6个tcp端口和1个udp端口,查看攻击者试图攻击哪些安全漏洞
①TCP port:135
上图中的数据包交互是一次完整的三报文握手和一次完整的四报文挥手,135端口是主要用于使用RPC(Remote Procedure Call,远程过程调用)协议并提供DCOM(分布式组件对象模型)服务,通过RPC可以保证在一台计算机上运行的程序可以顺利地执行远程计算机上的代码;使用DCOM可以通过网络直接进行通信,能够包括HTTP协议在内的多种网络传输。
可以理解为,攻击者想扫描一下,看看这个端口是不是正常开放的,为后续使用RPC执行攻击做准备,但没有实际攻击,还是准备阶段。
②TCP port:25
上图数据包与①的情况相同,也是建立TCP连接和断开TCP连接,其目的是扫描端口,但没有做实际的攻击行为。其中有部分数据包重传了很多回,有可能是网络路由原因或者是攻击者故意不回。25端口为SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)服务器所开放,主要用于发送邮件
③TCP port:139
上图中那个除了TCP三报文握手连接外,还有NBSS协议和SMB协议的数据包。我查询了许多资料,终于弄清楚这两个协议的关系。NBSS协议是NetBIOS协议的一部分,主要作用是建立会话,其目的是为SMB协议的连接提供服务,SMB是一种网络传输协议,主要功能是使网络上的机器能够共享计算机文件、打印机、串行端口和通讯等资源。它也提供经认证的进程间通信机能。SMB协议并不指定协议如何实现,它可以用NetBIOS接口实现。139端口是为“NetBIOS Session Service”提供的,主要用于提供Windows文件和打印机共享以及Unix中的Samba服务。
但是上面的数据包传输也仅仅是连接阶段,并没有真正使用共享打印机功能,也可以理解为是扫描端口、网络查点,没实施实际攻击手段。
④TCP port:445
百度百科中这样写道:“445端口是一个毁誉参半的端口,有了它我们可以在局域网中轻松访问各种共享文件夹或共享打印机,但也正是因为有了它,黑客们才有了可乘之机,他们能通过该端口偷偷共享你的硬盘,甚至会在悄无声息中将你的硬盘格式化掉。”
445端口和139端口功能很相似,都可以通过SMB协议实现。但是根据数据包的传输量和传输内容,很明显可以看出此时SMB协议不仅仅处于连接的初步阶段,甚至已经开始有数据传输。其中61.111.101.78这个攻击者获取了更高的权限,并给蜜罐主机的445端口发送了PSEXESVC.EXE,通过上网查询,这是一种Dv1dr32蠕虫,这种蠕虫正是通过IRC进行通信。
故可以判定此处攻击成功了。
⑤TCP port:4899
4899端口是一个远程控制软件Radmin服务端监听的端口,由于其控制功能强、传输速度快、免杀效果好,经常被黑客利用。上图中的TCP数据包中,有一种[PSH,ACK]数据包,PSH是表示“传送”的字段,这说明攻击者成功利用该端口实现数据收发。第二个图中,有一个HTTP协议调用了windows的cmd并使用了dir命令,这说明攻击成功了。
⑥TCP port:80
通过上图可以发现很多异常的http数据包,有类似shellcode、堆栈溢出、跳转html等的特征,判断是缓冲区溢出然后连接某个html,程序很可能是一个蠕虫,因为有“www.worm.com” “c:\notworm”的字样。
⑦UDP port:137
NBNS是NetBIOS Name Service的缩写,它在基于 NetBIOS 名称访问的网络上提供主机名和地址映射方法。
上图并未发现异常数据包,只是在不停的问答,没有攻击行为。
(7)那些攻击成功了?是如何成功的?
具体分析见(6):
④TCP port:445攻击成功了,攻击机利用445端口开放的共享文件功能,使用SMB协议向蜜罐主机传送蠕虫文件;
⑤TCP port:4899攻击成功了,攻击者利用Radmin服务远程攻击,传输数据并连接cmd;
⑥TCP port:80攻击成功了,攻击者注入shellcode实施缓冲区攻击,最终跳转到一个html页面上,判断是蠕虫;
3.学习中遇到的问题及解决
本次实验主要是使用工具,所以问题多出在工具的使用上
- 问题1:最开始不指导file和strings命令
- 问题1解决方案:查看学习通资料区的指导资料,结合网络博客。使用起来并不难
- 问题2:IDA Pro第一次用,不咋会
- 问题2解决方案:查询网络博客,从零开始学起,需要什么功能就查一查,以使用为导向
4.实践总结
已经完成第四个实验了,进度条完成一半!对于知识点没有什么想要总结的了,前面已经写的够多了(累)。本次实验难度不在于代码的编写,实验所用到的windows和Linux命令都很基础,主要是锻炼学习使用逆向分析工具(工具还是十分强大的)。实验给我印象最深的就是第四环节,之前对wireshark的使用都很简单,这一次利用wireshark细节信息逆向分析攻击者攻击手段,还是学到很多知识的。
最后想说,“学而不思则罔,思而不学则殆”,享受大三下学习和思考的时光吧!
参考资料
- https://bbs.csdn.net/topics/618420685
- http://www.faqs.org/rfcs/rfc1459.html
- https://zhuanlan.zhihu.com/p/500414390
- https://blog.csdn.net/bai0324lin/article/details/82684193
- https://www.cnblogs.com/Moyuqiezi/p/9554153.html
- https://mylovesaber.gitee.io/dophin-blog/2020/09/11/irc-basic/
- https://blog.csdn.net/weixin_51173317/article/details/124314199
- https://www.jianshu.com/p/1e422cebd79a
- https://www.etsme.com/wiki/1855/
- https://www.cnblogs.com/yuzly/p/10480438.html