导语:FireEye发现一波利用CVE-2017-11882漏洞发起针对中东政府组织的攻击。攻击可能是伊朗的黑客组织APT34发起的,利用PowerShell后门完成攻击。
背景
APT34是长期从事网络攻击的伊朗黑客组织,该组织从2014年开始活动,活动的主要目的是为了国家利益。APT34组织的攻击目标广泛,包括金融业、政府、能源行业、化学行业和电信业,主要攻击目标在中东。
APT34使用的工具有公开的和非公开的,经常使用鱼叉式钓鱼攻击和社会工程系技巧。今年7月,FireEye发现了一起使用基于PowerShell的后门——POWRUNER 和BONDUPDATER对中东的组织进行攻击活动。BONDUPDATER是含有DGA功能的下载器。该后门利用的是CVE-2017-0199漏洞通过恶意rtf文件进行传播。
这次攻击中,APT34利用了最近的office漏洞CVE-2017-11882来应用POWRUNER和BONDUPDATER。
CVE-2017-11882: Microsoft Office栈内存破坏漏洞
CVE-2017-11882影响许多的Office版本,利用该漏洞没有在内存中合理处理对象,远程用户可以在当前用户环境下执行任意代码。微软11月14日就修复了该漏洞,漏洞的报告者1周后公布了POC代码。
该漏洞存在与老版的公式编辑器(EQNEDT32.EXE)中,公式编辑器是office的组件之一,用于插入数学公式和对公式求值。公式编辑器是用OLE(Object Linking and Embedding,对象连接与嵌入)技术嵌入在office文档中。
公式编辑器创建后是一个单独的进程,而不是office应用的子进程。 如果有伪造的公式传递给公式编辑器,在拷贝数据时,也是不会合理地检查数据长度,这会导致栈内存破坏。而且EQNEDT32.exe用的旧版的编译器进行编译,也不支持ASLR(address space layout randomization地址空间随机化),这样攻击者就可以很容易地改变程序执行流。ASLR是保护缓冲区溢出问题的安全技术。
漏洞分析
APT34向攻击的目标组织发送一封恶意的鱼叉式钓鱼邮件,钓鱼邮件附件中含有一个.rtf文件(MD5: a0e6933f4e0497269620f44a083b2ed4)。恶意rtf文件利用CVE-2017-11882破坏内存中的栈,然后将恶意数据送进栈内。恶意软件会用EQNEDT32.EXE的指令地址覆写函数地址。覆写的指令(图1)用于从kernel32.dll中调用WinExec函数,指令地址为00430c12。
Figure 1覆写函数地址
利用该漏洞之后,在当前登录用户环境下,调用WinExec函数创建了一个子进程mshta.exe。进程mshta.exe会从http://mumbai-m.site/b.txt下载恶意脚本,并执行,如图2。
Figure 2 拷贝到破坏的栈缓存的攻击者数据
执行工作流
恶意脚本通过这些步骤成功地执行,最终建立与C2服务器的连接。从利用漏洞开始的所有事件如图3。
Figure 3 CVE-2017-11882和POWRUNER攻击序列
1. 恶意.rtf文件利用 CVE-2017-11882;
2. 恶意软件利用EQNEDT32.EXE的现存指令覆写函数地址;
3. 恶意软件创建子进程mshta.exe,mshta.exe从http://mumbai-m.site/b.txt下载恶意脚本;
4. b.txt含有PowerShell命令,可从http://dns-update.club/v.txt下载一个dropper。PowerShell命令会将v.txt重命名为v.vbs,并执行该脚本。
5. v.vbs脚本会在C:ProgramDataWindowsMicrosoftjava目录下释放4个组件,hUpdateCheckers.base,dUpdateCheckers.base,cUpdateCheckers.bat和GoogleUpdateschecker.vbs。
6. v.vbs用CertUtil.exe来解码hUpdateCheckers.base、dUpdateCheckers.base 2个base64编码的文件,释放hUpdateCheckers.ps1 和dUpdateCheckers.ps1到staging目录。CertUtil.exe是合法的Microsoft命令行程序,是Certificate Services的一部分。
7. 运行cUpdateCheckers.bat来建立一个GoogleUpdateschecker.vbs的计划任务。
8. GoogleUpdateschecker.vbs在休眠5秒后执行。
9. 然后从staging目录下删除cUpdateCheckers.bat 和*.base文件。
Figure 4 Execution Workflow Section of v.vbs的执行工作流部分
在成功执行了Execution Workflow部分的步骤后,Task Scheduler会每分钟运行一次GoogleUpdateschecker.vbs,轮流执行dUpdateCheckers.ps1 和 hUpdateCheckers.ps1脚本。这些PowerShell脚本是最后一阶段的payload,含有DGA功能的下载器和后门组件,可以连接C2服务器接受命令,并执行其他恶意活动。
hUpdateCheckers.ps1 (POWRUNER)
POWRUNER是一个后门,是可以从C2服务器发送和接收命令的PowerShell 脚本。POWRUNER可以通过Task Scheduler设定后每分钟执行一次。
Figure 5 POWRUNER PowerShell脚本hUpdateCheckers.ps1
POWRUNER首先发送随机的GET请求到C2服务器,然后等待响应。服务器会响应一个not_now或11位随机数。如果响应是随机数,POWRUNER会发送另一个随机的GET请求到服务器,并保存响应消息。然后,POWRUNER检查保存的随机数响应的最后一位,并把值翻译为对应的命令,并执行相应的动作。数字、命令和动作的对应表见表1。
Table 1 POWRUNER命令
成功地执行命令后,POWRUNER发送结果到C2服务器并停止执行。
C2服务器可以发送PowerShell命令来获取受害者系统的截屏并保存。如果fileupload命令执行了,POWRUNER会发送截屏文件到C2服务器。图6是发给C2服务器的PowerShell “Get-Screenshot”函数。
Figure 6 Powershell截屏函数
dUpdateCheckers.ps1 (BONDUPDATER)
APT34的高级之处就是使用DGA来生成子域名。BONDUPDATER脚本是基于硬编码的B007命名的,用传统的DGA算法来生成与C2服务器通信的子域名。
DGA 实现
图7是用BONDUPDATER的DGA生成示例域名的分解过程。
Figure 7 BONDUPDATER创建的子域名的分解
1. 用下面的表达式创建的随机数生成器:$rnd = -join (Get-Random -InputObject (10..99) -Count (%{ Get-Random -InputObject (1..6)}))
2. This value is either 0 or 1. It is initially set to 0. If the first resolved domain IP address starts with 24.125.X.X, then it is set to 1.
3. 值是0或者1,初始值设定为0。如果域名第一次解析的IP地址为24.125.X.X,就设为1。
4. 初始值设为000,然后每次DNS请求后增加3。
5. 系统UUID的前12个字符。
6. “B007”硬编码字符串。
7. 硬编码的域名mumbai-m.site。
BONDUPDATER 会尝试解析生成的DGA域名,基于IP地址解析执行下面的动作:
1. 在%temp% 文件夹下创建文件,创建的文件名为解析的IP地址的最后2个8位字节。
2. BONDUPDATER计算文件名的最后一个字符,执行相应的动作。
Table 2 BONDUPDATER动作
Figure 8 Domain Generation Algorithm
执行后生成的子域名的例子:
143610035BAF04425847B007.mumbai-m.site
835710065BAF04425847B007.mumbai-m.site
376110095BAF04425847B007.mumbai-m.site
网络通信
图9是POWRUNER后门客户端和服务器之间的网络通信示例。
Figure 9 网络通信示例
在本例中,POWRUNER客户端发送随机的GET请求到C2服务器,然后C2服务器发送随机数字(99999999990)作为响应。因为响应以0结尾,POWRUNER会发送另1个随机的GET请求来获取其他的命令字符串。C2服务器会返回Base64编码的响应。如果服务器返回的响应是not_now,POWRUNER就中止请求并停止执行。
Figure 10 "not now"服务器响应示例
Batch命令
POWRUNER 可能从C2服务器接收batch命令来从系统手机host信息。这包括当前登录的用户信息、主机名、网络配置数据、激活的连接、进程信息、本地和域名管理帐号、用户目录枚举和其他数据。图11是batch命令示例。
Figure 11 POWRUNER C2发送的batch命令
POWRUNER / BONDUPDATER的其他使用
2017年7月,APT34就开始使用POWRUNER和BONDUPDATER来攻击中东的组织了。FireEye发现利用CVE-2017-0199漏洞的恶意rtf文件(MD5: 63D66D99E46FB93676A4F475A65566D8)。该文件用GET请求来从http://94.23.172.164/dupdatechecker.doc下载恶意文件。
图12所示,dupatechecker.doc文件中的脚本尝试从同一服务器下载名为dupatechecker.exe的文件。
Figure 12 dupdatechecker.doc脚本的内容
dupatechecker.exe 文件 (MD5: C9F16F0BE8C77F0170B9B6CE876ED7FB) 释放了BONDUPDATER和POWRUNER。这些文件连接到 proxychecker.pro与C2通信。
IOCs