1、概述
OilRig
是伊朗的APT组织
,unit42
发现2016年
中期以来,此组织一直很活跃,其经常对中东地区
的政府机构
和企业
发动攻击。2018年
8月,Unit42
发现OilRig针对中东政府组织使用鱼叉式钓鱼邮件
投递一个更新版本的BondUpdater
。BondUpdater是FireEye
于2017年
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.vbs
和AppPool.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"
创建lock
、qiud
两个文件。
2、以quid中的内容
为文件夹名称
在目录”C:\ProgramData\WindowsAppPool”创建文件夹,还创建了“files”
文件夹。再在第一个文件夹
中创建三个目录,“sendbox”
、“receivebox”
、“done”
。
3、构造域名
,发起包含初始信标
的DNS请求,通知C2开始通信
。
4、创建任务,定期
与C2通信。从C2接收命令
,将命令写入到文件
,并保存在“receivebox”
文件夹中。
5、对接收到的命令进行解析
,执行命令
,然后将结果写入文件
,保存在“sendbox”
文件夹下,以待后续发往C2.
6、将命令执行结果
传回C2服务器。
2.2.1、创建lock
、quid
两个文件
lock文件
写入的是当前powershell进程
的PID号
,powershell脚本会检测当前时间
和进程启动时间
之差是否超过10分钟
,如果超过10分钟就会终止进程
并删除lock文件
。
quid的内容
是由GUID
(全局唯一标识符)的前八个字符
和一个两位的随机整数
组成。
2.2.2、创建files
、sendbox
、receivebox
、done
文件夹
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域名>1~7个随机字符>
接收数据格式:
<包含分片号、操作类型、GUID前8字符、随机二位整数的字符串><序号><1~7个随机字符>C<分片号偏移><操作类型偏移>T.<C2域名> 1~7个随机字符>
分片号偏移
和操作类型偏移
都是相对GUID前8字符和随机2位整数
组成的字符串的。接收数据格式
的第一部分
包含分片号
、操作类型
、GUID前8字符
、随机二位整数
的字符串,木马首先生成GUID号
,然后取GUID号的前8位
与一个2位随机整数
相连接形成基础字符串
,最后将分片号
和操作类型
随机插入基础字符串
。第二部分
是1~7位的随机字符串。第三部分
就是C
和T
以及中间的两个数字
,第一个数字
为操作类型
在基础字符串中的偏移
,第二个数字
为分片号
在基础字符串中的偏移
。第四部分
就是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