OilRig新型BondUpdater木马的DNS隐蔽隧道通信行为分析

一款使用DNS隐蔽信道通信的木马分析。
这是之前在公司实习的时候写的木马分析文章。

1、概述

  OilRig是伊朗的APT组织unit42发现2016年中期以来,此组织一直很活跃,其经常对中东地区政府机构企业发动攻击。2018年8月,Unit42发现OilRig针对中东政府组织使用鱼叉式钓鱼邮件投递一个更新版本的BondUpdater。BondUpdater是FireEye2017年11月中旬首次发现的基于PowerShell的特洛伊木马。

  BondUpdater木马包含基本的后门功能,允许攻击者上传下载文件,以及执行命令。与OilRig组织的其它工具一样,BondUpdater使用DNS隧道C2服务器进行通信。更新版本的BondUpdater木马能够在DNS隧道中使用TXT记录C2进行通信,老版本的是使用A记录C2进行通信。

  近期,我在研究利用DNS隐蔽信道通信的技术,所以找到了这样一个样本来进行分析,想了解一下,使用这种技术通信的恶意软件实现通信的细节,以便我可以研究怎么去检测这种攻击。

2、样本分析

2.1、提取关键文件及代码

MD5:52b6e1ef0d079f4c2572705156365c06

此样本是一个word文档,用Microsoft Word打开一下看看。

  可以看到样本中嵌入了宏代码,但是利用word自带的宏编辑器是看不到宏代码的,我们可以通过oledump或者oletools来提取宏代码。我这里使用oledump来提取宏代码。

可以看到宏代码存在于第7段,我们将其转存为ThisDocument.vb

1
python oledump.py -s 7 -v 7cbad6b3f505a199d6766a86b41ed23786bbb99dab9cae6c18936afdc2512f00_doc > ThisDocument.vb

ThisDocument.vb内容如下:

  当运行宏之后,会首先执行Document_Open()函数,此函数调用了AAAA()函数,在AAAA()函数中,又调用了HGHG()函数,分别创建了两个文件,AppPool.vbsAppPool.ps1,并将宏代码中嵌入的vbs代码powershell代码写入这两个文件。之后通过执行wscript C:\ProgramData\WindowsAppPool\AppPool.vbs运行AppPool.vbs。

  我们在虚拟机中跑一下,将这两个文件提取出来。

AppPool.vbs内容如下:

  当AppPool.vbs首次执行时,其创建一个每分钟执行的计划任务,使木马文件能够被不断执行。然后通过PowerShell.exe -exec bypass -file C:\ProgramData\WindowsAppPool\AppPool.ps1运行AppPool.ps1。

  AppPool.vbs后续的执行过程中会判断是否存在"quid"的文件,如果存在,就使用上述powershell脚本运行AppPool.ps1。AppPool.ps1首次运行时会创建quid文件,以避免创建多个计划任务

AppPool.ps1内容如下:

  原始的AppPool.ps1是经过混淆的,这是经过初步处理的,不过还不是很好懂。主要的操作都是由此powershell代码实现的,通过DNS隐蔽信道C2进行通信的代码也在其中。

2.2、分析关键代码

AppPool.ps1代码大致流程:
1、在目录"C:\ProgramData\WindowsAppPool"创建lockqiud两个文件。
2、以quid中的内容文件夹名称在目录”C:\ProgramData\WindowsAppPool”创建文件夹,还创建了“files”文件夹。再在第一个文件夹中创建三个目录,“sendbox”“receivebox”“done”
3、构造域名,发起包含初始信标的DNS请求,通知C2开始通信
4、创建任务,定期与C2通信。从C2接收命令,将命令写入到文件,并保存在“receivebox”文件夹中。
5、对接收到的命令进行解析执行命令,然后将结果写入文件,保存在“sendbox”文件夹下,以待后续发往C2.
6、将命令执行结果传回C2服务器。

2.2.1、创建lockquid两个文件

  lock文件写入的是当前powershell进程PID号,powershell脚本会检测当前时间进程启动时间之差是否超过10分钟,如果超过10分钟就会终止进程并删除lock文件

  quid的内容是由GUID(全局唯一标识符)的前八个字符和一个两位的随机整数组成。

2.2.2、创建filessendboxreceiveboxdone文件夹

  files文件夹的作用未从代码中分析出来。sendbox用于存储将要发送到C2的文件receivebox用于存储从C2接收到的命令文件done也是用于存储从C2接收到的文件,以便将来使用。

2.2.3、受害者发送初始信标,开始与C2通信

参数中的“M”就是操作的类型,是初始信标,表示开始通信,“r”表示按接收数据的格式生成域名。

2.2.4、定期通信,从C2接收数据

每隔50毫秒尝试与C2进行通信一次

  dns_request_TXT()功能为构造DNS请求数据包,发起DNS请求,返回响应包数据。这里的dns_request()函数有两种,分别是发送DNS A记录请求TXT记录请求,下面在分析通信协议的时候会提到。如果木马发送的是DNS A记录请求,木马会从A记录响应包中的address段(ip)提取数据。如果木马发送的是DNS TXT记录请求,木马会从DNS TXT记录响应包中的TXT段(存储数据)提取数据。

  C2传输数据到木马总共有两种传输方式是通过域名响应ip进行传输,这种是通过发送A记录请求另一种是通过TXT记录进行传输。上面图片中的代码是对DNS TXT记录响应包进行处理的过程。木马会将接收到的TXT数据“>”分开,左边的作为指令右边的作为数据。左边的指令决定木马将会如何处理右边的数据。具体的处理规则会在下一节进行描述。从响应包中解析出的指令数据,会以文件的形式存储在receivebox文件夹下。以待后续处理。

2.2.5、解析接收到的文件,执行命令

  无论是通过A记录进行接收的数据还是通过TXT记录接收的数据,都以文件的形式保存在receivebox文件夹下,文件名以“rcvd”开头。而且会使用相同的文件处理程序。文件处理程序根据文件名最后一个字符,决定怎么处理以此文件名为名字的文件的内容

2.2.6、将执行结果发送回C2服务器

"s"是以发送数据的格式生成域名,文件的名称内容是通过域名来进行传送的。$SSE代表数据块,$TTE代表文件名。下节中的数据格式的介绍中会具体提到这些参数。

2.3、通信协议分析

2.3.1、数据格式

发送数据格式:
<包含分片号、操作类型、GUID前8字符、随机二位整数的字符串><序号><1~7个随机字符>C<分片号偏移><操作类型偏移>T.<数据块>.<文件名>.<C2域名>

接收数据格式:
<包含分片号、操作类型、GUID前8字符、随机二位整数的字符串><序号><1~7个随机字符>C<分片号偏移><操作类型偏移>T.<C2域名>

  分片号偏移操作类型偏移都是相对GUID前8字符和随机2位整数组成的字符串的。接收数据格式第一部分包含分片号操作类型GUID前8字符随机二位整数的字符串,木马首先生成GUID号,然后取GUID号的前8位与一个2位随机整数相连接形成基础字符串,最后将分片号操作类型随机插入基础字符串第二部分是1~7位的随机字符串。第三部分就是CT以及中间的两个数字第一个数字操作类型基础字符串中的偏移第二个数字分片号基础字符串中的偏移第四部分就是C2域名。发送数据格式接收数据格式的区别就是多了数据块文件名

2.3.2、DNS请求中包含的操作类型

操作类型 A/TXT 描述
M A/TXT 初始信标
0 A 提示C2发送文件名
1 A 提示C2发送数据
2 A 表明木马正在发送数据,可能是命令执行结果,也可能是受害者机器中的文件
W TXT 提示C2发送文件名
D TXT 提示C2发送数据
P TXT TXT记录方法失败,通知C2切换到A记录方法

  将此操作类型包含在生成的子域名中,可以通知C2在响应数据包中使用哪种数据格式。例如:如果操作类型是“W”,C2会发送响应包的TXT段“S000s”为开头的数据,发送的数据会作为文件名。如果操作类型是“0”,C2会将域名响应ip置为“24.125.[\d].[\d]”,使木马将ip地址的后两段作为文件名进行接收。powershell代码中写了两种记录的DNS请求方法。如下所示:
A记录请求

TXT记录请求

2.3.3、文件名末尾字符含义

末尾字符 目的 描述
0 执行命令 读取文件内容,并当做cmd命令执行。命令的输出保存到以“proc”开头的文件中,并存在“sendbox”文件夹中,等待发送给C2
1 下载文件 C2从受害者机器下载文件,木马读取文件内容以获取文件下载路径,将指定的文件复制到“sendbox”文件夹下,以便木马发送到C2
其他 上传文件 C2向受害者机器上传文件,上传的文件将存储在“done”文件夹下,以供将来使用。木马将“200 <> [文件上传路径]”写入“sendbox”文件夹下的文件,以便木马通知C2文件上传成功

  因为木马从C2接收的数据都是以文件的形式存储在“receivebox”文件夹下的,所以当木马从C2接收完所有的数据后,会执行文件处理程序。文件处理程序会根据以上协议接收到的数据进行处理。

2.3.4、原始数据传输过程中的域名解析IP地址及其含义

IP地址 描述
24.125.[\d].[\d] 在“receivebox”创建文件名为“rcvd [\d][\d]”的文件,以存储将要处理的数据
[\d].[\d].[\d].[\d] 前三个[\d]作为数据,第四个[\d]指向数据数组最后一个元素的后一个位置
1.2.3.[\d] 命令木马将数据写入文件,并开始处理数据
11.24.237.110 杀死木马进程

  原始数据传输就是通过A记录传输的,数据是放在DNS响应包address段的ip地址中的。木马发送包含“0”操作类型的DNS请求,C2就会将响应ip地址设为形如“24.125.[\d].[\d]”的地址,并将文件名填充在里面。木马接收到数据会将其与“rcvd”连接在一起,作为文件名,并修改操作类型为“1”。然后木马开始发送包含“1”操作类型的DNS请求,C2就会将响应ip设为形如“[\d].[\d].[\d].[\d]”的地址,并将数据填充在里面。如果数据发送完了,C2就会将响应ip地址设为形如“1.2.3.[\d]”形式的地址。木马接收到后就会将数据存在以前面接收到的文件名为名的文件中,并保存在“reveiveboc”文件夹下。

2.3.5、其他域名解析IP地址含义

IP地址 描述
99.250.250.199 响应初始信标,通过新型数据传输协议进行传输数据
[quid.substring.(0,2)].2.3.[\d] 从响应的ip地址中提取数据
253.25.42.87 杀死木马进程,删除命令执行结果文件

  这些IP地址是整个通信过程中除去原始数据传输过程中的域名解析IP地址以外的IP地址。“99.250.250.199”用于表示木马想要与C2开始通信。因为有些数据比较长,所以会分片进行传输,“[quid.substring.(0,2)].2.3.[\d]”的最后一段表示目前传输的分片号,用于判断数据是否完整传输完成。

  当文件的字节数大于60字节,就需要多次传输,木马作者设置了数据传输长度的阈值为60。

2.3.6、新数据传输协议指令含义

指令 含义
N 将下一次DNS请求中的操作类型置为“W”
S000s 在“receivebox”下,将接收到的数据与“rcvd”连接,作为将要存储接收数据的文件的文件名,并将下一次DNS请求中的操作类型置为“D”
S 将下一查询操作类型置为“D”,并将从响应包接收到的数据进行base64解码
E 将执行“S”指令后得到的结果写入执行“S000s”指令后生成的文件中
C 退出循环,取消通信

  新数据传输协议就是通过TXT记录进行传输数据。当木马发送操作类型为“W”的TXT记录DNS请求,C2就会回复一个包含TXT数据的响应包,响应包中的TXT字段存储了C2发给木马的数据,数据以“>”号分隔开来。如果“>”左边的字符串为“S000s”,木马就将“>”右边的数据与“rcvd”连接,作为将要存储数据的文件的文件名,然后将操作类型置为“D”。然后发送包含操作类型“D”的TXT记录请求,C2会回复TXT数据中“>”左边“S”的响应包,木马会将“>”右边的数据进行base64解码,并将下一次请求的操作类型置为“D”,再发送包含操作类型“D”的TXT记录请求,直到数据发送完成,然后C2会回复TXT数据中“>”左边“E”的响应包,木马会将base64解码后的数据写入执行“S000s”指令后生成的文件名的文件中,然后跳出循环。

3、总结

  通过对此样本的分析,我们可以得出一些DNS隐蔽隧道通信的特征,C2受控主机都要对对方发过来的数据进行解析,会有一套通信协议C2会向受控主机发送命令,让受控主机执行,受控主机会向C2发送命令执行结果或者是自己的比较机密的文件。数据可以通过A记录进行传送,数据包含在域名中(受控主机向C2发送数据)或者域名解析IP中(C2向受控主机发送数据)。也可以通过TXT记录进行传送,数据包含在响应包中的TXT字段中。

  由于C2已经挂了,所以无法再通过流量进行更详细的分析,所以有些细节可能分析的不到位。通过对此样本的分析,我们了解了一种实现DNS隐蔽信道通信的方式以及通信所使用的协议。以后遇到这样的恶意软件就可以类比分析。目前很多APT攻击和其他很多的恶意软件都使用DNS隐蔽信道进行通信,所以对DNS隐蔽信道通信进行检测是一件很重要的事。

参考链接

1、OilRig Uses Updated BONDUPDATER to Target Middle Eastern Government

文章目录
  1. 1、概述
  2. 2、样本分析
    1. 2.1、提取关键文件及代码
    2. 2.2、分析关键代码
      1. 2.2.1、创建lock、quid两个文件
      2. 2.2.2、创建files、sendbox、receivebox、done文件夹
      3. 2.2.3、受害者发送初始信标,开始与C2通信
      4. 2.2.4、定期通信,从C2接收数据。
      5. 2.2.5、解析接收到的文件,执行命令
      6. 2.2.6、将执行结果发送回C2服务器
    3. 2.3、通信协议分析
      1. 2.3.1、数据格式
      2. 2.3.2、DNS请求中包含的操作类型
      3. 2.3.3、文件名末尾字符含义
      4. 2.3.4、原始数据传输过程中的域名解析IP地址及其含义
      5. 2.3.5、其他域名解析IP地址含义
      6. 2.3.6、新数据传输协议指令含义
  3. 3、总结
  4. 参考链接