1
概述
近期,我们正在研究DNS隐蔽信道通信技术,找到了⼀个BondUpdater样本,通过对此样本的分析,来了解某些恶意软件是如何使⽤DNS隐蔽信道通信技术实现通信的,从而方便我们研究如何检测此种攻击。
2018年8⽉,Unit42发现OilRig针对中东政府组织使⽤⻥叉式钓⻥邮件,投递了⼀个新版本的BondUpdater。
OilRig是伊朗的APT组织,2016年被Unit42发现,⼀直处于活跃状态,经常对中东地区的政府机构和企业发动网络攻击。2017年11⽉,基于PowerShell的特洛伊⽊⻢——BondUpdater被FireEye⾸次发现,其包含基本的后⻔功能,能够使攻击者上传/下载⽂件,执⾏命令。
与OilRig组织的其它⼯具⼀样,BondUpdater使⽤DNS隧道与C2服务器进⾏通信,新版本的BondUpdater⽊⻢能够在DNS隧道中使⽤TXT记录与C2进⾏通信。
2
样本分析
MD5:52b6e1ef0d079f4c2572705156365c06
(2.1)提取关键文件及代码
此样本是⼀个word⽂档,⽤Microsoft Word打开⼀下看看。
可以看到样本中嵌⼊了宏代码,而利⽤word⾃带的宏编辑器是看不到宏代码的。
我们可以通过oledump或者oletools来提取宏代码,我这⾥使⽤oledump。
如图所示,宏代码存在于第7段,我们将其转存为ThisDocument.vb
Python oledump.py -s 7 -v
7cbad6b3f505a199d6766a86b41ed23786bbb99dab9cae6c18936afdc25
12f00_doc > ThisDocument.vb
ThisDocument内容如下:
运⾏宏,⾸先执⾏Document_Open函数,此函数调⽤AAAA函数,在AAAA函数中,调⽤HGHG函数,分别创建两个⽂件,AppPool.vbs和AppPool.ps1,将宏代码中嵌⼊的vbs代码和powershell代码写⼊这两个⽂件中。
之后通过执⾏
wscript
C:ProgramDatawindowsAppPoolAppPool.vbs
运行AppPool.vbs
我在虚拟机中跑⼀下,将这两个⽂件提取出来。
AppPool.vbs内容如下:
当AppPool.vbs⾸次执⾏时,其创建了⼀个每分钟执⾏的计划任务,使⽊⻢⽂件能够被不断执⾏。
然后通过
PowerShell.exe -exec bypass -file
C:ProgramDataWindowsAppPoolAppPool.ps1
运⾏AppPool.ps1
AppPool.vbs后续的执⾏过程中,会判断是否存在"quid"的⽂件,如果存在,就使⽤上述powershell脚本运⾏AppPool.ps1。
AppPool.ps1⾸次运⾏时会创建quid⽂件,以避免创建多个计划任务。
AppPool.ps1内容如下:
此处的AppPool.ps1是经过经过初步处理的,主要的操作都是由此powershell代码实现,通过DNS隐蔽信道与C2进⾏通信的代码也在其中。
(2.2)分析关键代码
AppPool.ps1代码⼤致流程:
2.2.1 创建lock、qiud文件
在⽬录
C:ProgramDataWindowsAppPool
创建lock、qiud两个⽂件
lock⽂件写⼊的是当前powershell进程的PID号,powershell脚本会检测当前时间和进程启动时间之差是否超过10分钟,如果超过10分钟就会终⽌进程并删除lock⽂件。
quid的内容是由GUID(全局唯⼀标识符)的前⼋个字符和⼀个两位的随机整数组成。
2.2.2 在quid中创建3目录
以quid中的内容为⽂件夹名称在⽬录
C:ProgramDataWindowsAppPool
创建⽂件夹,还创建了“files”⽂件夹,再在第⼀个⽂件夹中创建三个目录,“sendbox”、“receivebox”、“done”。
sendbox⽤于存储将要发送到C2的⽂件,receivebox⽤于存储从C2接收到的命令⽂件,done也是⽤于存储从C2接收到的⽂件,以便将来使⽤。
2.2.3 发起DNS请求
构造域名,发起包含初始信标的DNS请求,通知C2开始通信
参数中的“M”就是操作的类型,是初始信标,表示开始通信,“r”表示按接收数据的格式⽣成域名。
2.2.4 定期与C2通信
从C2接收命令,将命令写⼊到⽂件,并保存在“receivebox”⽂件夹中。
每隔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 命令解析
对接收到的命令进⾏解析,执⾏命令,然后将结果写⼊⽂件,保存在“sendbox”⽂件夹下,以待后续发往C2。
⽆论是通过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位的随机字符串。
第三部分就是C和T以及中间的两个数字,第⼀个数字为操作类型在基础字符串中的偏移,第⼆个数字为分⽚号在基础字符串中的偏移。
第四部分就是C2域名,发送数据格式和接收数据格式的区别就是多了数据块和⽂件名。
2.3.2 DNS请求中包含的操作类型
将此操作类型包含在⽣成的⼦域名中,可以通知C2在响应数据包中使⽤那种数据格式。
例如:如果操作类型是“W”,C2会发送响应包的TXT段以“S000s”为开头的数据,发送的数据会作为⽂件名。
如果操作类型是“0”,C2会将域名响应ip置为“24.125.[d].[d]”,使⽊⻢将ip地址的后两段作为⽂件名进⾏接收。powershell代码中写了两种记录的DNS请求⽅法。如下图所示:
A记录请求:
TXT记录请求:
2.3.3 文件名末尾字符含义
因为⽊⻢从C2接收的数据都是以⽂件的形式存储在“receivebox”⽂件夹下的,所以当⽊⻢从C2接收完所有的数据后,会执⾏⽂件处理程序。⽂件处理程序会根据以上协议对接收到的数据进⾏处理。
2.3.4 原始数据传输过程中的域名解析IP 地址及含义
原始数据传输就是通过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地址以外的IP地址。“99.250.250.199”⽤于表示⽊⻢想要与C2开始通信。
因为有些数据⽐较⻓,所以会分⽚进⾏传输,“[quid.substring.(0,2)].2.3.[d]”的最后⼀段表示⽬前传输的分⽚号,⽤于判断数据是否完整传输完成。
当⽂件的字节数⼤于60字节,就需要多次传输,⽊⻢被我设置了数据传输⻓度的阈值为60。
2.3.6 新数据传输协议指令含义
新数据传输协议就是通过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和受控主机对对彼此之间传输的数据进⾏解析,形成有⼀套通信协议。数据如果通过A记录传送,就存在于域名中(受控主机向C2发送数据)或者域名解析IP中(C2向受控主机发送数据);如果通过TXT记录传送,就存在于响应包中的TXT字段中。
⽬前很多APT攻击和恶意软件使⽤DNS隐蔽信道进⾏通信,所以对DNS隐蔽信道通信进⾏检测是⼀件很有意义的事情。
本文转自公众号“安恒风暴中心”