实践八 恶意代码分析实践
20212806 2021-2022-2 《网络攻防实践》实践八报告
1.实践内容
1.1浅谈恶意代码检测分析
- 恶意代码分类
现有的恶意代码变种,在实现上可大致分为两类:一类是基于基础技术的共用,恶意代码开发人员通过重用基础模块实现变种;一类是恶意代码专门针对现有防范技术而设计开发的混淆技术。
混淆技术按实现机理,可分为两类:一类是干扰反汇编的混淆,使反汇编无法得到正确结果,从而阻碍进一步分析;另一类是指令/控制流混淆,此类混淆技术通常采用垃圾代码插入、寄存器重分配、等价指令替换及代码变换等方式,改变代码的语法特征,隐藏其内部逻辑关系。
从混淆技术产生作用的层面,可将其分为代码层混淆和行为层混淆两类:代码层混淆通过变形、压缩等方式,模糊、隐藏或改变原有代码特征,从而使基于代码特征的检测失效;行为层混淆则通过垃圾行为插入、执行顺序变换及等价行为替换等方式,改变行为序列或执行流程,使基于行为序列或流程图的检测失效。 - 恶意代码检测
恶意代码检测方法,可以分为基于启发式(heuristic-based)的检测和基于特征(signature-based)的检测两大类。
基于启发式的检测方法,通过比较系统上层信息和取自内核的系统状态来识别隐藏的文件、进程及注册表信息.还有一些研究工作通过监控系统特定资源来识别恶意代码。根据预先设定的规则判断恶意代码存在的可能性,其优势在于可检测新恶意代码样本;但其规则的生成依赖于分析人员的经验,在应用中易引发高误报及漏报率,因此在实际检测系统中应用较少。基于特征的检测方法,则根据由恶意代码中提取的特征进行检测,与基于启发式的检测方法相比吗,具有效率高、误报率低等优点,因此被广泛应用于恶意代码检测工具之中,是目前恶意代码检测比较常见的方法。
传统的特征检测,大多采用基于代码特征的检测方法,该方法从已有恶意代码样本中提取代码语法(syntactic)特征用于检测,此类特征通常精确匹配单一样本,恶意代码使用简单混淆方法即可绕过相应检测。并且,不同变种需使用不同特征进行描述,特征库数据量往往十分庞大,且在出现变种时需及时、不断地更新。目前很多商用杀毒软件就是采取的此类方法。
此后,提出了基于行为特征的检测方法,通过提取恶意代码执行的行为作为特征进行检测。此方法着眼于恶意代码的实际行为,因此可避免仅针对代码的混淆方法的影响,不过无法抵御等价行为替换等行为层混淆方法的干扰。
基于语义的检测方法的提出,为更好地对抗混淆技术、检测变种提供了可能。通过分析当前的混淆技术原理可以发现,混淆技术具有改变代码语法特征,但是,其仍保留行为语义的特点。利用这一特点,通过抽象语义特征来实施检测,可以提高对恶意代码变种的检测能力。 - 恶意代码分析
恶意代码分析,一般分为静态分析和动态分析两种。
静态分析会首先对可执行程序进行反汇编,在此基础上,分析并提取代码的特征信息。可以看出,静态分析本身并不需要实际执行代码,因此,不会对系统产生实质上的危害。但是,由于静态所分析的代码不一定是最终执行的代码,可能消耗大量时间于无用代码。于此同时,静态分析对反汇编技术的依赖也导致了其局限性。首先,恶意代码可使用各种混淆技术阻碍反汇编分析,主要有重排、加壳、垃圾代码插入等方法,有很多工作都试图将混淆代码恢复为混淆前的代码,来提高检测能力。但很多时候不能解决寄存器重分配、等价替换等其他混淆手段。
动态分析,则是在代码执行过程中进行分析,直接执行所分析的代码,但动态分析一次执行过程只能获取单一路径行为,而一些恶意代码存在多条执行路径,有一部分工作建立系统快照递归探索多执行路径的方法,使得动态分析方法有所进步。此外还开发了一系列动态分析工具来辅助人工分析如CWSandbox等。
另外,也有两者结合的混合分析方法,如针对间谍软件(spyware)的行为特征,利用动态分析监控组件与浏览器的交互确定代码区域,然后静态分析检查该代码区域,识别系统调用信息等来检测恶意代码。
常见的序列描述法,针对代码或行为的先后次序,易受代码混淆手段的干扰;常用的还有控制流程图(control flow graph,简称CFG)描述法,局限于代码执行顺序,易受顺序无关操作调换等混淆方法的干扰。有一部分工作在解决垃圾代码插入及代码顺序变换等问题,但还未能完全解决等价代码替换的干扰问题。
目前还有许多工作利用深度学习来检测恶意代码,通过搜集大量的良性数据和VirusShare样本库中的恶意数据,来对模型进行训练,使其学会如何区分良性和恶意的Windows可执行文件。这方面的工作有很多,同时也面临着许多独特的挑战,例如上万级别长度的API调用序列等,还有待我们去解决,以及去推广神经网络的普适性。
1.2僵尸网络
- 何为僵尸网络?
僵尸网络 Botnet 是指采用一种或多种传播手段,将大量主机感染bot程序(僵尸程序)病毒,从而在控制者和被感染主机之间所形成的一个可一对多控制的网络。
攻击者通过各种途径传播僵尸程序感染互联网上的大量主机,而被感染的主机将通过一个控制信道接收攻击者的指令,组成一个僵尸网络。之所以用僵尸网络这个名字,是为了更形象地让人们认识到这类危害的特点:众多的计算机在不知不觉中如同中国古老传说中的僵尸群一样被人驱赶和指挥着,成为被人利用的一种工具。 - 网络特点
首先这是一个可控制的网络,这个网络并不是指物理意义上具有拓扑结构的网络,它具有一定的分布性,随着bot程序的不断传播而不断有新位置的僵尸计算机添加到这个网络中来。僵尸病毒被人放到计算机时机器会滴滴的响上2秒。
其次,这个网络是采用了一定的恶意传播手段形成的,例如主动漏洞攻击,邮件病毒等各种病毒与蠕虫的传播手段,都可以用来进行Botnet的传播,从这个意义上讲,恶意程序bot也是一种病毒或蠕虫。
最后,这也是Botnet的最主要的特点,就是可以一对多地执行相同的恶意行为,比如可以同时对某目标网站进行分布式拒绝服务(DDos)攻击,同时发送大量的垃圾邮件等,而正是这种一对多的控制关系,使得攻击者能够以极低的代价高效地控制大量的资源为其服务,这也是Botnet攻击模式近年来受到黑客青睐的根本原因。在执行恶意行为的时候,Botnet充当了一个攻击平台的角色,这也就使得Botnet不同于简单的病毒和蠕虫,也与通常意义的木马有所不同。这里我们可以引用国内外一些研究者的一些定义。僵尸网络是攻击者出于恶意目的,传播僵尸程序bot以控制大量计算机,并通过一对多的命令与控制信道所组成的网络,我们将之称之为僵尸网络,botnet。
2.实践过程
动手实践任务一
对提供的rada恶意代码样本,进行文件类型识别,脱壳与字符串提取,以获得rada恶意代码的编写作者,具体操作如下:
(1)使用文件格式和类型识别工具,给出rada恶意代码样本的文件格式、运行平台和加壳工具;
(2)使用超级巡警脱壳机等脱壳软件,对rada恶意代码样本进行脱壳处理;
(3)使用字符串提取工具,对脱壳后的rada恶意代码样本进行分析,从中发现rada恶意代码的编写作者是谁?
- 实验环境: WinXPattacker
- 将下载好的RaDa.exe程序放到WinXPattacker虚拟机当中,用
file Rada.exe
命令查看一下文件类型
- 继续在当前界面操作,用
strings RaDa.exe
命令查看一下字符串,发现乱码,说明文件被加壳。再使用PEiD工具查看RaDa.exe的基本信息
- 下一步是我们要进行脱壳。(超级巡警工具对文件进行脱壳,该工具有这个壳的样本库,可以自动脱壳,省去了手工脱壳的麻烦,并在恶意程序同目录下生成了一个脱壳以后的程序)
- 再用strings RaDa_unpacked.exe查看脱壳后的RaDa.exe,可以看到产生大量函数调用名以及其他有用字符串,但是并未查找到作者信息
- 再用 IDA PRO Free 打开一下脱壳后的程序,可以看到作者信息和发布时间,还有邮箱
动手实践任务二:分析Crackme程序
任务:在WinXP Attacker虚拟机中使用IDA Pro静态或动态分析crackme1.exe和crackme2.exe,寻找特定的输入,使其能够输出成功信息。
Crackme1.exe:
- 对 crackme1.exe 进行执行,猜测参数执行,可以发现一个参数输入与其他的参数输入得到的输出明显不一样,所以可以猜测这个程序的输入是一个参数。
利用IDA Pro打开程序分析,通过Strings窗口可以查看该程序中出现的字符串,发现 I think you are missing something. 和 Pardon? What did you say? 前面见过了,* * 猜测第一个是参数不对的返回情况,第二个是给的参数数量对了,但是具体的内容不对。还有两个不知道意思,所以继续进行分析。
- 验证一下猜想
Crackme2.exe:
- 回到IDA,发现I have ...越过了第一层判断,回到第一层判断,猜测“crackmeplease.exe”是密码。
- 验证:把程序名改为crackmeplease.exe试验一下,通过了第二个判断,最终出现了字符串明文中没有的信息,猜测成功。
分析实践任务一:
分析一个自制恶意代码样本rada,并撰写报告,回答以下问题:
1、提供对这个二进制文件的摘要,包括可以帮助识别同一样本的基本信息;
2、找出并解释这个二进制文件的目的;
3、识别并说明这个二进制文件所具有的不同特性;
4、识别并解释这个二进制文件中所采用的防止被分析或逆向工程的技术;
5、对这个恶意代码样本进行分类(病毒、蠕虫等),并给出你的理由;
6、给出过去已有的具有相似功能的其他工具;
7、可能调查处这个二进制文件的开发作者吗?如果可以,在什么样的环境和什么样的限定条件下?
- 首先查看摘要和文件类型,执行
md5sum RaDa.exe
指令得到其md5摘要值如下,再利用file RaDa.exe
识别出这是32位PE文件,并且还是个GUI文件
- 打开之前用过的监视工具 process explorer 和 wireshark 开启监听,并运行恶意程序RaDa.exe,分析其程序运行详细信息。通过HTTP协议请求 10.10.10.10RaDaRaDa_commands.html ,连接到目标为10.10.10.10的主机下的一个名为RaDa_commands的网页,之后又下载和上传文件到 C:/RaDa/tmp 。将文件 RaDa.exe 复制到了 C:RaDain 目录下,可以看出该恶意代码将其自我复制到主机系统盘,并激活了自启动,还试图从一个HTML页面获取并解析命令,故猜测这应该是一个后门程序。往下看可以发现该恶意程序对主机实行了DDos拒绝服务攻击。
- 再往下看可以发现该恶意程序对主机的注册表进行了读写和删除操作。
- 再往下看可以看到一些指令,exe 在宿主主机中执行指定的命令,get下载,put上传,screenshot截屏,sleep休眠。
- 使用wireshark进行分析,可以看到受害主机向目标主机 10.10.10.10 发送了大量的数据包
- 再打开 IDA Pro 进行简单分析,首先查看字符串 string ,string里把unicode选中查看字符串。这时可以查看到很多的字符串,点击这些字符串就可以找到调用的函数。
- 看一下VMware tools的意思,双击选中的字符串进行定位:
- 发现其调用函数为 sub_404FB0
答案梳理:
①提供对这个二进制文件的摘要,包括可以帮助识别同一样本的基本信息。
摘要为caaa6985a43225a0b3add54f44a0d4c7
;
使用了UPX加壳工具进行了加壳处理,加壳方式: UPX 0.89.6 - 1.02 / 1.05 - 2.90 -> Markus & Laszlo
②找出并解释这个二进制文件的目的。
这个二进制文件通过网络获取指令,连接互联网时,该恶意程序就会通过http请求连接到指定主机,进行接受攻击者指令操作,并且攻击者可以完全控制该系统,所以这应该是一个后门程序。
③识别并说明这个二进制文件所具有的不同特性。
该程序启动之后将自己复制到c盘之中,并且每过一段时间就会尝试与10.10.10.10建立tcp连接。
④识别并解释这个二进制文件中所采用的防止被分析或逆向工程的技术。
UPX加壳
⑤对这个恶意代码样本进行分类(病毒、蠕虫等),并给出你的理由。
不具有自主传播模块,不具有传播和感染的性质,所以它不属于病毒和蠕虫;也没有将自己伪装成有用的程序以欺骗用户运行,不是木马。并且该程序执行需攻击者远程发送指令,故猜测是一个后门程序。
⑥给出过去已有的具有相似功能的其他工具。
Bobax——2004也是使用HTTP协议从指定的服务器下载命令文件,然后解析并执行其中的指令。
⑦可能调查出这个二进制文件的开发作者吗?如果可以,在什么样的环境和什么样的限定条件下?
可以,作者Raul siles和David Perze,他们在2004年编写完成。
取证分析实践:Windows 2000系统被攻破并加入僵尸网络
任务:分析的数据源是用Snort工具收集的蜜罐主机5天的网络数据源,并通过编辑去除了一些不相关的流量并将其组合到了单独的一个二进制网络日志文件中,同时IP地址和其他特定敏感信息都已经被混淆以隐藏蜜罐主机的实际身份和位置。回答下列问题:
(1)IRC是什么?当IRC客户端申请加入一个IRC网络时将发送哪个消息?IRC一般使用哪些TCP端口?
- 定义:IRC是Internet Relay Chat的英文缩写,中文一般称为“互联网中继聊天" 。
- 工作原理:您只要在自己的PC上运行客户端软件,然后通过因特网以IRC协议连接到一台IRC服务器上即可。它的特点是速度非常之快,聊天时几乎没有延迟的现象,并且只占用很小的带宽资源。
- IRC是一种公开的协议,采用TCP和SSL协议。一个IRC服务器可以连接其他的IRC服务器以扩展为一个IRC网络。
- 连接方式:IRC用户通过客户端软件和服务器相连。大多数的IRC服务器不需要客户注册登录,但在连接前必须设定好昵称(nickname)。IRC是一个分布式的客户端/服务器结构。通过连接到一个IRC服务器,我们可以访问这个服务器以及它所连接的其他服务器上的频道。IRC频道存在于一个IRC服务器上。一个频道类似于一个聊天室,频道名称必须以#符号开始,例如#irchelp。IRC机器人是一些运行在后台或者服务器上的程序,通过登陆某一个频道,分析接受到的内容并做出相应的动作。
- 当IRC客户端申请加入一个IRC网络时,发送nickname。
- 一般使用6667(6660~6669)端口。
(2)僵尸网络是什么?僵尸网络通常用于干什么?
- 定义:IRC语境下的僵尸网络是指IRC机器人连接成的IRC网络;采用一种或多种传播手段,将大量主机感染bot程序(僵尸程序)病毒,从而在控制者和被感染主机之间所形成的一个可一对多控制的网络 。
- 用处:通常用于DDos攻击、分布式扫描、暴力密码破解等。
(3)蜜罐主机(IP:172.16.134.191)与哪些IRC服务器进行了通信?
-
由于IRC协议使用TCP连接,要找出与蜜罐主机通讯的IRC主机,可以利用建立TCP连接的三次握手过程进行分析。
-
只需要找出蜜罐主机向哪些机器的IRC端口发送过SYN包,即可找出蜜罐主机试图通讯的IRC服务器。
-
IRC协议最常用的端口为6667,在WireShark中对日志文件进行分析,可以看到除了6667外其他端口上没有数据包,因此这里所有的IRC数据都使用的是6667端口。利用如下命令过滤出蜜罐主机向6667端口发送的SYN包,过滤条件为:
ip.src == 172.16.134.191 && tcp.dstport == 6667
(4)在这段观察期间,多少不同的主机访问了以209.196.44.172为服务器的僵尸网络。 -
发现蜜罐主机与5台IRC服务器进行了连接,分别是:209.126.161.29、66.33.65.58、63.241.174.144、217.199.175.10、209.196.44.172。
-
用
tcpflow -r botnet_pcap_file.dat "host 209.196.44.172 and port 6667"
tcpflow分流筛选指定host与端口6667,产生了三个文件,分别是:209.196.044.172.06667-172.016.134.191.01152、172.016.134.191.01152-209.196.044.172.06667、report.xml。
根据题目要求重点查看第一个文件。
-
使用管道命令进行筛选,得到3462个。grep搜索获取昵称输出行;sed:去除前缀;tr:将空格转换为换行;tr -d删除\r;grep -v:去除空行;sort -u排序并去除重复;wc -l:输出行数
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
(5)哪些IP地址被用于攻击蜜罐主机? -
使用tcpdump查找可能连接主机ip的地址,uniq命令用于检查及删除文本文件中重复出现的行列,输出到1.txt中,查看ip.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 > ip.txt;wc -l ip.txt
-
查看ip.txt,其中的ip地址可能被用于攻击蜜罐主机
-
然后使用
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端口,即SYN/ACK标志为1 -
再用
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端口
(6)攻击者尝试了哪些安全漏洞?哪些攻击成功了?是如何成功的 -
打开wireshark对各个端口进行分析,过滤http请求,发现攻击者尝试了溢出、目录穿越等攻击,但均未成功
-
过滤445端口,发现执行了
\System32\PSEXESVC.EXE
,其他端口也未发现攻击成功
3.学习中遇到的问题及解决
- 问题1: 在使用tcpflow命令时,执行失败
- 问题1解决方案:执行sudo apt-get install tcpflow 命令安装即可
4.实践总结
本周实践主要是对恶意代码进行检测和分析,通过使用一些小工具,来实现了对恶意程序类型的识别,同时也懂得了如何利用巡警工具去进行脱壳处理。接下来理解了如何对恶意代码进行分类,以及对僵尸网络有了初步的理解。之后还需多实践,通过实际操作来加深对网络攻防知识的认知。