20192408胡益琳 实验四 恶意代码分析实践报告

实验四 恶意代码分析实践报告

1.实验内容

  • 恶意代码文件类型标识、脱壳与字符串提取
  • 使用IDA Pro静态或动态分析crackme1.exe与crakeme2.exe,寻找特定输入,使其能够输出成功信息。
  • 分析一个自制恶意代码样本rada,并撰写报告,回答问题。
  • 取证分析实践

2.实验过程

任务一 恶意代码文件类型标识、脱壳与字符串提取

  • 对提供的rada恶意代码样本,进行文件类型识别,脱壳与字符串提取,以获得rada恶意代码的编写作者。
    • (1)使用文件格式和类型识别工具,给出rada恶意代码样本的文件格式、运行平台和加壳工具;

    • (2)使用超级巡警脱壳机等脱壳软件,对rada恶意代码样本进行脱壳处理;

    • (3)使用字符串提取工具,对脱壳后的rada恶意代码样本进行分析,从中发现rada恶意代码的编写作者是谁?

  • 使用file命令查看rada.exe的文件类型,可以看到它是一个32位的PE可执行文件,GUI表示有图形界面,intel 80386表示处理器架构
  • 使用PEiD打开rada.exe文件,可以看到文件的入口点、文件偏移、EP段等信息,还可以看到文件的加壳信息,是版本为0.89.6的UPX壳
  • 用strings rada.exe查看可打印字符,发现都是乱码,是由于加壳导致
  • 用超级巡警软件进行脱壳操作,可以看到也能识别出为0.89.6的UPX壳,脱壳后输出为rada_unpacked.exe,可以根据输出路径找到脱壳后的文件
  • 再次用strings rada_unpacked.exe指令查看脱壳后的文件,可以看到一些函数名,但并未发现作者名字
  • 使用IDA Pro Free打开脱壳后的文件

    点击Strings,经过查找可以发现作者的名字和文件编写的日期

任务二 使用IDA Pro静态或动态分析crackme1.exe与crakeme2.exe,寻找特定输入,使其能够输出成功信息。

1.crackme1.exe

  • 首先执行crackme1.exe,对参数个数进行猜测,依次输入0/1/2个参数,观察程序输出

    可以猜测程序大概率需要1个参数
  • 使用IDA Pro Free打开crackme1.exe,点击Strings查看字符串

    可以看到1和3是之前输入参数时出现过的,而第2条和第4条并未出现,猜测其中一个即为正确的口令,另一个为输入正确后的反馈。
  • 在主页面上点击View-Graphs-Function calls,查看函数结构

    可以看到与printf直接相关的为sub_401280函数,在Functions中找到sub_401280函数,双击可以看到他的汇编代码
    如图可以看到,sub_401280首先判断参数个数,若不是一个则输出"I think you are missing something."(左边第一个红色箭头指向)若为一个参数且参数不为"I know the secret"则输出"Pardon?What did you say?"(第二个红色箭头指向)若为一个参数且参数为"I know the secret"
    则输出"You know how to speak to programs,Mr.Reverse—Engineer"(最右边绿色箭头指向)
  • 再次运行程序并输入正确口令,验证成功。

2.crackme2.exe

  • 与对crackme1.exe的分析类似,首先通过运行crackme2.exe猜测参数个数
  • 使用IDA Pro Free打开crackme2.exe,点击Strings查看字符串

    同样地,我们猜测口令和提示语句就在这些字符串中
  • 用同样的方式查看函数结构,可以看到与fprintf和puts等输出函数有关的仍为sub_401280
  • 找到sub_401280的流程图,同样第一步时判断参数个数是否为2,若是则接着用strcmp函数对argc中第一个字符串即程序名进行判断,若为crackmeplease.exe则再将口令与"I know the secret"进行比对。

  • 将文件复制为crackmeplease.exe,运行crackmeplease.exe输入参数"I know the secret",即可输出成功信息

任务三 分析一个自制恶意代码样本rada,并撰写报告,回答问题。

  • 使用md5sum rada.exe命令得到二进制文件的MD5摘要值为caaa6985a43225a0b3add54f44a0d4c7
  • 打开process explorer,双击运行该程序,在进程中找到rada_unpacked.exe,右键选择Properties—Strings查看。

    可以看到该程序有以下行为:
  • (1)使用http连接到10.10.10.10主机的一个叫做RaDa_commands.html的网页上,进行一些上传和下载操作,并在受害者C盘中创建文件夹“C:/RaDa/tmp”。
  • (2)将文件rada.exe复制到C:\RaDa\bin\路径下,并修改注册表设置为开机自启动。
  • (3)该恶意程序中可执行DDos拒绝服务攻击
  • (4)对主机的注册表进行了读写和删除操作。

    还可以看到一些get、put、screenshot截屏、sleep休眠等指令,以及作者信息与编写年份。由这些指令功能可以推测这是个后门程序,可以远程控制受害者电脑。
  • 打开IDA,点击Strings,找到--authors双击进行分析


    可以看到流程图如下,由sub_40AAA0进行判断决定输出的是Unknown argument还是Authors:Raul Siles & David Perze, 2004

    点击sub_40AAA0查看流程图,进一步判断函数功能

    可以看到这个函数进行网卡配置信息的查询(红色方框内的select语句)。该函数判断程序是否在Vmware虚拟机上运行,若是则输出Unknown argument: --authors,否则输出Authors:Raul Siles & David Perze, 2004。

回答以下问题:

(1)提供对这个二进制文件的摘要,包括可以帮助识别同一样本的基本信息;
MD5摘要值:caaa6985a43225a0b3add54f44a0d4c7
基本信息:PE32 executable(GUI) Intel 80386 ,for MS Windows
(2)找出并解释这个二进制文件的目的;
是一个后门程序。可以进行http请求,使攻击者远程连接被控主机并进行一些指令操作,同时还修改了注册表使得文件具有开机自启动功能,
(3)识别并说明这个二进制文件所具有的不同特性;
程序被执行时会将自身安装到系统C盘中,并创建文件夹用来存放从攻击主机下载到受控主机的文件和从受控主机获取的文件;同时通过修改注册表的方式使得程序能够开机自启动;具有一定的隐蔽性。
(4)识别并解释这个二进制文件中所采用的防止被分析或逆向工程的技术;
使用0.89.6版本的UPX壳进行加壳处理;通查看网卡地址判断系统是否运行在虚拟机上,若是则隐藏作者信息
(5)对这个恶意代码样本进行分类(病毒、蠕虫等),并给出你的理由;
后门程序。因为该程序不能自主传播,且没有伪装成正常功能的程序,可以供攻击者远程连接并用指令操纵被控主机
(6)给出过去已有的具有相似功能的其他工具;
Bobax – 2004、Windows Update、海阳顶端等后门。
(7)可能调查处这个二进制文件的开发作者吗?如果可以,在什么样的环境和什么样的限定条件下?
可能。在非VMware的虚拟机或者Windows下输入--authors参数可以显示作者名字,通过ida或者Process Explorer查看strings也可以找到作者名字是Raul Siles & David Perze,写于2004年。

任务四 取证分析实践

Windows 2000系统被攻破并加入僵尸网络
问题: 数据源是Snort收集的蜜罐主机5天的网络数据源,并去除了一些不相关的流量,同时IP地址和其他敏感信息被混淆。回答下列问题:

  • (1)IRC是什么?当IRC客户端申请加入一个IRC网络时将发送那个消息?IRC一般使用那些TCP端口?
    • IRC指的是因特网中继聊天(Internet Relay Chat)。IRC用户使用特定的用户端聊天软件连接到IRC服务器,通过服务器中继与其他连接到这一服务器上的用户交流。
    • 申请时需要发送口令,昵称和用户信息。格式如下:USER 、PASS 、NICK 。
    • IRC服务器明文传输通常在6667端口监听,也会使用6660—6669端口。SSL加密传输在6697端口。
  • (2)僵尸网络是什么?僵尸网络通常用于什么?
    • 僵尸网络 Botnet 是指采用一种或多种传播手段,将大量主机感染bot程序(僵尸程序)病毒,从而在控制者和被感染主机之间所形成的一个可一对多控制的网络。攻击者通过各种途径传播僵尸程序感染互联网上的大量主机,而被感染的主机将通过一个控制信道接收攻击者的指令,组成一个僵尸网络。
    • 可以一对多地执行相同的恶意行为,往往被黑客用来发起大规模的网络攻击,如分布式拒绝服务攻击(DDoS)、海量垃圾邮件等,使得攻击者能够以极低的代价高效地控制大量的资源为其服务。
  • (3)蜜罐主机(IP地址:172.16.134.191)与那些IRC服务器进行了通信?
    • 使用Wireshark分析文件botnet_pcap_file.dat,并设置的过滤条件ip.src == 172.16.134.191 and tcp.dstport == 6667 and tcp.flags.syn==1(由前面问题可知,IRC服务器明文传输通常在6667端口监听,所以条件包括6667端口)



      可以看到蜜罐主机与以下服务器进行了通信: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为服务器的僵尸网络?

  • 在Kali内使用如下命令
apt-get install tcpflow   #出现tcpflow: command not found时安装更新

tcpflow -r botnet_pcap_file.dat "host 209.196.44.172 and port 6667"    #读取文件,筛选host和端口6667后进行分流


生成如下三个文件:

  • 接着执行如下两条问题,避免出现字符编码问题,导致计数不准确
export LC_COLLATE='C'

export LC_CTYPE='C'

  • 利用如下指令进行搜索有多少主机连接(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


如图,得到结果是3457
(5)哪些IP地址被用于攻击蜜罐主机?

  • 使用如下指令找出所有连接主机的IP地址(cut -d是指定字段的分隔符,uniq命令用于删除文本文件中重复出现的行),将结果输出到2.txt文件中,wc -l 2.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 > 2.txt;wc -l 2.txt


如图可以看到生成的2.txt文件,所有可能连接到主机的IP地址有165个


(6)攻击者尝试攻击了那些安全漏洞?

  • 使用snort -r botnet_pcap_file.dat -c /etc/snort/snort.conf -K ascii指令查看网络流分布情况

    可以看到大部分都是TCP包,极少部分是UDP包。
    接下来进一步筛选出响应的TCP和UDP包,命令如下(注意TCP包的筛选指令多了响应0x12的条件)
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响应端口为135、139、25、445、4899、80
UDP响应端口为137

  • 使用wireshark打开botnet_pcap_file.dat,首先查看TCP的135和25端口,筛选条件为tcp.port135 || tcp.port25

    可以看到这两个端口只是进行了连接,并没有数据的交互,猜测攻击者对这两个端口进行了connect扫描
  • 接下来分析TCP 139端口,可以看到大部分都是连接,并没有数据的传递,猜测应该只是进行了SMB服务的查点
  • 下一个是445端口,设置过滤条件ip.dst172.16.134.191 and tcp.dstport445

    在61.111.101.78发起的请求中发现了PSEXESVC.EXE,这是一种Dv1dr32蠕虫,通过IRC进行通信

    为判断蠕虫攻击是否成功,使用ip.dst==61.111.101.78查看从蜜罐发往攻击主机的数据包,可以看到results:Acceptance,且返回信息中含有\PIPE\lsass,攻击者可以进行远程调用。而且以后的数据包中含有很多response字样,猜测是被控主机在响应攻击者的命令。

    再看发往蜜罐的报文,其中包含了很多SVCCTL的报文。经过搜索得知Windows的svcctl MSRPC接口用于同SCM(服务控制管理器)通讯。svcctl漏洞允许匿名用户连接到SCM,然后就可以枚举所安装的或正在运行的服务。进一步验证了攻击成功。
  • 再看TCP的4899端口,设置条件为ip.dst172.16.134.191 and tcp.dstport4899

    查资料得知,4899端口是一个远程控制软件Radmin服务端监听的端口,经常被黑客用来控制被控机
  • 接着看TCP的80端口,设置筛选条件ip.dst172.16.134.191 and tcp.dstport80 and http
  • 可以看到210.22.204.101向蜜罐发送了一长串C,可能是在进行缓冲区溢出攻击
  • 同时,24.197.194.106发起了很多次连接,这是用脚本不停地攻击IIS服务器的漏洞,从而获取系统权限。
  • 此外,在218.25.147.83向蜜罐发送的数据包中发现了C:\notworm,经过查询可以了解到它是一个红色代码蠕虫攻击

  • 使用tcp.srcport == 80 && ip.src== 172.16.134.191 && http筛选从蜜罐80端口往外发送的数据包,可以看见蜜罐主机均以IIS服务器的默认页面作为回应,说明80端口的攻击均失败了。
  • 最后一个是UDP的137端口,137端口主要用于“NetBIOS Name Service”(NetBIOS名称服务),猜测这里主要用来进行NetBIOS查点。

    (7)那些攻击成功了?是如何成功的?
  • 来自61.111.101.78的PSEXESVC.EXE,即Dv1dr32蠕虫攻击成功了。是通过向对TCP445端口发送含有PSEXESVC.EXE的数据包,且将PSEXESVC.EXE地址改到系统目录下攻击成功的。攻击成功后通过利用SVCCTL漏洞获取目标主机服务。

3.问题及解决方法

  • 问题1:使用IDA时对汇编代码不够了解,无法正确分析程序的函数逻辑
  • 问题1解决方法:通过向同学请教,发现可以查看伪代码更好地了解函数结构即对输入参数的要求,同时还须加强对汇编语句的掌握。
  • 问题2:进行取证分析实践时,统计多少不同的主机访问了以209.196.44.172为服务器的僵尸网络时存在重复计数的问题。
  • 问题2解决方法:
    使用如下两句指令避免出现字符编码问题导致重复计数;
export LC_COLLATE='C'
export LC_CTYPE='C'

4.学习感悟、思考等

这次实验任务量大、分析内容复杂,很多地方都需要对汇编语言的熟练掌握,造成了一定的困难。在以后的学习中还要加强对汇编语言的学习。同时通过这次实验学会了使用各种工具来查看文件类型、对加壳文件进行脱壳操作、显示程序的函数逻辑等,对于恶意代码的结构和功能有了更深的理解。

posted @ 2022-04-17 20:12  猫咪小铺  阅读(445)  评论(0编辑  收藏  举报