恶意代码分析实战14-02

Posted Neil-Yale

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了恶意代码分析实战14-02相关的知识,希望对你有一定的参考价值。

本次实验我们将会分析lab14-02文件。先来看看要求解答的问题
Q1.这个恶意代码使用哪些网络库?使用这些库的好处和坏处是什么?
Q2.恶意代码信令中URL的信息源是什么?这个信息源提供了哪些优势?
Q3.恶意代码利用了HTTP协议的哪个方面,来完成它的目的?
Q4.在恶意代码的初始信令中传输的是哪种信息?
Q5.这个恶意代码通信信道的设计存在什么缺点?
Q6.恶意代码的编码方案是标准的吗?
Q7.通信是如何被终止的?
Q8.这个恶意代码的目的是什么?在攻击者的工具中,它可能会起到什么作用?

运行恶意程序,可以捕获从捕获到的数据包中看到比较重要的信息

在这里插入图片描述在这里插入图片描述

我们看到user-agent的值比较奇怪,而如果继续运行,值保持不变,而在其他主机上运行,其值还会改变。说明这里编码出的信息依赖于特定主机信息的信息
接着我们尝试使用IDA进行分析
查看其导入函数表
在这里插入图片描述

看到,从WinINet库中导入了函数InternetOpenA、InternetOpenUrlA,InternetReadFile,和InternetCloseHandle。
Q1.这个恶意代码使用哪些网络库?使用这些库的好处和坏处是什么?
A1.恶意代码使用了WinlINet 库。这些库的缺点之一就是需要提供一个硬编码的User-Agent字段,另外,如果需要的话,它还要硬编码可选的头部。相比于Winsock API, WinINet 库的一个优点是对于一些元素,比如cookie和缓存,可以由操作系统提供。
先来看看InterOpenUrlA
在这里插入图片描述

先跟入sub_401750
在这里插入图片描述

可以看到其deFlags的值为0x8000000,查询后可知这个参数值含义是INTERNET_FLAG_PRELOAD标志。当该标志被置位时,会在信令中产生Cache-Control:no-cache字符串

那么这两个信令之间有什么关系呢,我们跟入winmain
在这里插入图片描述

00401395处调用CreateThread,其lpStartAddresss参数被标记为StartAddress,它就是新线程的开始地址
在这里插入图片描述

可以看到其地址位于0x004014c0
下图是第二处CreateThread函数调用
在这里插入图片描述

其lpStartAddress参数被标记为sub_4015c0,这也是一个新线程开始的地址
为了便于后续分析,将sub_4015c0重命名为s_thread2_start

我们先分析StartAddress
在这里插入图片描述
在这里插入图片描述

调用了malloc,PeerkNamePiep,ReadFile,ExitThread,Sleep和一些内部函数,以及下图
在这里插入图片描述

它调用了sub_401750,跟入
在这里插入图片描述

看到是在调用在import窗口中看到的网络相关函数。所以给sub_4017050重命名为s_Internet1。

再来看看s_thread_start
可以看到malloc,WriteFile,ExitThread,Sleep调用,以及下图
在这里插入图片描述

调用了sub_401800
在这里插入图片描述

可以看到其结构和之前那个函数类似
所以sub_401800重命名为s_internet2

这两个都有调用PeedNamedPipe,这个函数是用于检测命名管道的新输入。(与命令shell相关的stdin,stdout都是命名管道)
为了确定这两个线程读取或者写入的内容,我们需要继续分析线程的来源,也就是winmain函数。
在这里插入图片描述在这里插入图片描述

可以看到,在调用CreateThread启动线程之前,发生的调用包括:CreatePipeA,GetCurrentProcess,DuplicateHandle以及CreateProcessA。CreateProcessA是创建一个新的cmd.exe进程,其他函数设置新进程,使stdin,stdout与提供的命令进程的句柄进行绑定
查看winmain的xrefs from
在这里插入图片描述

箭头标出来的是重点,。这种结构是一种常见的反向命令shell的模式。攻击者启动一个新的命令shell作为它的线程,并启动单独的线程向命令shell读取输入和写入输出。StartAddress使用PeekNamedPipe,检查命令shell的输入,如果有内容存在,则用ReadFile进行读取。读取之后,通过s_Internet1将读取内容发送到一个远程位置。另一个线程s_thread2_start使用s_ineternet2连接到远程位置。如果命令shell上有新输入,则这个线程会将他们写到命令shell的输入管道。

那么我们来看看传递给s_inetrnet1中Internet函数的参数,看看这些参数的来源。
InternetOpenUrlA
在这里插入图片描述

lpszUrl参数就是要URL,往上回溯
在这里插入图片描述

可以看到是它是s_internet1的第二个参数
回到其上层函数是StartAddress,而其参数是lpParameter,往上回溯,发现它来自LoadString
在这里插入图片描述

其功能是从资源节里读取字符串
所以我们可以使用Resource Hacker分析该文件的资源内容
在这里插入图片描述

可以看到有一个用于信令的url
Q2.恶意代码信令中URL的信息源是什么?这个信息源提供了哪些优势?
A2.PE文件中的字符串资源节包含一个用于命令和控制的URL。在不重新编译恶意代码的情况下,可以让攻击者使用资源节来部署多个后门程序到多个命令与控制服务器位置。

这个用作信令的url和我们抓到的信令相比较,可以看到发送出的信令的部分内容就是来自于资源节
s_Inetrnet一个参数是url,还有个参数是user-agent,回到IDA中s_internet1处继续分析
在这里插入图片描述

在0040176b看到了(!<,这和我们在信令中看到的user-agent字符串开头是一样的,可是user-agent其他的内容来自哪里呢?
我们回到StartAddress调用s_internet1附近
在这里插入图片描述

在其之前,调用了sub_401000,这个函数会接收两个输入参数,并输出user-agent字符串中的主要内容。
在这里插入图片描述

这是一个自定义的base64的变种,它使用的base64字符串保存在byte_403010,内容如下所示
在这里插入图片描述

那么我们就可以来解码第一个字符串,解码后如图下
在这里插入图片描述

Q6.恶意代码的编码方案是标准的吗?
A6.编码方案类似Base64, 但是使用自定义的字母
再来跟入s_internet2
在这里插入图片描述

它接收的url和s_internet1是一样的,不同的是user-agent,并静态定义为了Internet Surf
再看看s_thread2start,这个函数是用于向命令shell传递输入
在这里插入图片描述

如0040167a,00401692所示,strnicmp是用于测试传入的网络内容。如果传入的是exit,则会往左,退出。说明这函数还有根据输入内容自动终止的功能。
Q4.恶意代码利用了HTTP协议的哪个方面,来完成它的目的?
A3.攻击者滥用HtTP的User-Agent域,它应该包含应用程序的信息。恶意代码创建了一个线程,来对这个域传出信息进行编码,以及另一个线程,使用静态域表示它是通道的“接收”端。

Q4.在恶意代码的初始信令中传输的是哪种信息?
A4.初始的信令是一个编码后的shell命令行提示。

回到winmain
我们可以看到,最后是有三个可能的函数结局,第一个
在这里插入图片描述

第一个进程没有成功创建则会终止
第二处:
在这里插入图片描述

第二个线程没有成功创建则终止
第三处:
在这里插入图片描述

当s_thread2_start退出后,则左边的流程,会调用sub_401880,其作用是一旦恶意代码退出,则会从磁盘上删除恶意代码
在这里插入图片描述

跟入之后,看到:0x401880实现了自我删除的ComSpec方法
具体而言,是这样的:
用定义的ComSpec环境变量,与命令行/c del [要删除的文件] > nul。来运行一个shell命令进行删除
Q5.这个恶意代码通信信道的设计存在什么缺点?
A5.尽管攻击者对传出信息进行编码,但他并不对传入命令进行编码。此外,由于服务器必须通过User-Agent域的静态元素,来区分通信信道的两端,所以服务器的依赖关系十分明显,可以将它作为特征生成的目标元素
Q7.通信是如何被终止的?
A7.使用关键字exit来终止通信。退出时恶意代码会试图删除自己。
Q8.这个恶意代码的目的是什么?在攻击者的工具中,它可能会起到什么作用?
A8.这个恶意代码是一个小巧简单的后门程序。它的唯一目的是给远端的攻击者提供一个 shell 命令接口,而通过查看出站shell命令活动的常见网络特征不能监测到它。基于它尝试删除自己这个事实,我们推断这个特殊的恶意代码可能是攻击者工具包中的一个一次性组件。

以上是关于恶意代码分析实战14-02的主要内容,如果未能解决你的问题,请参考以下文章

恶意代码分析实战3-2

恶意代码分析实战11-1

恶意代码分析实战9-1

恶意代码分析实战11-2

恶意代码分析实战15-3

恶意代码分析实战21-2