【技术分享】组合攻击——漏洞利用的新尝试

http://p6.qhimg.com/t01a20a806a9dba1c2d.png

译者:紫曦归来

预估稿费:200RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


简介

今年4月曝光的CVE-2017-0199漏洞,可在无需用户交互的情况下,直接打开Word文档就可以通过HTA脚本执行任意代码。此漏洞的成因主要是Word在处理内嵌OLE2LINK对象时,通过网络更新对象时没有正确处理Content-Type所导致的一个逻辑漏洞。

近日,Cisco Talos团队发现,有黑客组织将CVE-2017-0199漏洞与较早前的CVE-2012-0158漏洞合并,以逃避Word的安全提示,或通过使用不同的机制以达到强制执行的目的。还有一种可能,那就是黑客仅仅是想测试一种新的漏洞概念。但无论出于哪种目的,使用组合漏洞的黑客都犯了错误而导致攻击效果远远低于预期。

通过对组合漏洞的文档载荷进行分析,研究者发现内嵌OLE2LINK对象具有被利用的潜力,除了可被用于Word文档,还可用于其他文档。但目前,大众对于这点的认识显然不够。

当前,黑客已开始寻找绕开系统发出的安全警告的方式。这篇报告详细分析了黑客如何合并CVE-2017-0199和CVE-2012-0158两个漏洞,并将其置于一条感染链之中。报告还将对组合漏洞失败的原因进行剖析。

虽然组合漏洞的攻击失败了,但这种尝试确实是一种具有开创性的新尝试。攻击者企图利用CVE-2017-0199作为“挡箭牌”,从而绕过系统提示。但从目前效果来看,这种尝试作用不大,还有待进一步完善。


标准CVE-2017-0199漏洞利用

标准的CVE-2017-0199漏洞利用一般包含邮件分发和一个带有嵌入式恶意脚本的假RTF文件。攻击者通过电子邮件向目标用户发送含有OLE2嵌入式链接对象的Microsoft Word文档。

https://p0.ssl.qhimg.com/t0161cdc1834897c542.png

图1:标准CVE-2017-0199漏洞

当用户打开文档时,winword.exe将会向远程服务器发出HTTP请求,以获得恶意HTA文件。服务器返回的文件是一个带有嵌入式恶意脚本的假RTF文件。winword.exe通过COM对象查找application/hta的文件处理程序,从而导致Microsoft HTA应用程序(mshta.exe)加载并执行恶意脚本。恶意脚本将终止winword.exe进程,下载其余的payload,并加载诱饵文件。之所以要终止原始的winword.exe进程,是为了掩盖OLE2link生成的用户提示。该提示具体如图1所示。 

https://p2.ssl.qhimg.com/t01d080f05ab3e94ae6.png

图2:Word向用户发出的提示


升级后的CVE2017-0199漏洞

攻击者此次对CVE-2017-0199漏洞进行了升级,黑客攻击行动最初也是从一份包含恶意程序的邮件开始的。邮件采用了一般的诱骗手段促使用户打开并阅读包含恶意程序的附件。一般此类包含恶意程序的垃圾邮件会伪装成用户合作伙伴的采购订单。

https://p0.ssl.qhimg.com/t0135a4618d03a25303.png

图3:发起攻击的邮件范例

邮件的附件是一个含有OLE2嵌入式链接对象的RTF文件(文件名:hxxp://multplelabs [dot] com/ema/order.doc)。在这种情况下,远程文件的mime类型不是application/hta而变为了application/msword

在对其中一个Word样本进行研究时,研究者发现在系统显示CVE-2017-0199的系统提示之前,word会自动对下载文档转换格式。在这之后,word程序会自动暂停,并最终崩溃(如下图所示)。

https://p5.ssl.qhimg.com/t011cf5ff2cd18e98a2.png

图4:Word程序崩溃

Word程序的崩溃不是因CVE-2017-0199漏洞导致的,而是由于CVE-2012-0158漏洞。下图所示即MSComctlLib.ListViewCtrl.2 ActiveX的嵌入式指令,这就是典型的CVE-2012-0158漏洞。指令由一串ROP链开始,当漏洞被激活,指令就开始自动运行。在ROP链为包含其他指令的内存块设置正确的权限之后,漏洞指令的第一阶段就开始自动执行。

https://p4.ssl.qhimg.com/t01e5a179eaf5214bbd.png

图5:CVE-2012-0158漏洞第一阶段的指令

CVE-2012-0158漏洞第一阶段的指令就是导致Word崩溃的罪魁祸首!但或许是因为攻击者技术方面仍存在短板,所以导致后续的漏洞运作出现问题。

该shellcode将调用数个API函数地址,通过暴力破解文件句柄号(handle number)来遍历所有文件。这一过程将从句柄号为0的文件开始,每次递增4个句柄号打开新的文件。如果句柄存在,shellcode将利用GetFileSize API函数检测文件大小。如果文件大小符合预期,shellcode将记录该文件,进行文件类型检测。

https://p0.ssl.qhimg.com/t012e4397a03b8822e2.png

图6:检查文档大小和确定文档类型

漏洞指令的失误就在于,如果找到的是一个RTF文件,那么所有的条件就符合了,找到的这个RTF文件也将包含另一串指令。如果寻找到的文档类型和大小满足要求,那么下一个步骤就是读取该文档,以寻找下一串指令。但在我们的试验中,这一步就失败了,因为原始的CVE-2017-0199漏洞利用文件还储存在系统之中。这一文件满足之前提到过的几个条件。由于CVE-2017-0199漏洞利用文件先于CVE-2012-0158文件打开,CVE-2017-0199漏洞利用文件的句柄较小,这就导致他被首先读取。

https://p5.ssl.qhimg.com/t0188747fc0058b43a1.png

图7:第一阶段指令开始搜索下一阶段指令标记

漏洞指令开始在错误的文档搜索下一个指令的标记0xfefefefefeffffffff,这就会最终导致内存保护错误(memory protection error)。如果漏洞制造者技术更好,他就会意识到这一错误并进行相应更正。因为只要同时运行两个漏洞利用文件就会运行成功。

一个改进方法就是对单一的字节进行修改,将漏洞命令中对判断文件大小的命令修改的更加严格些,从而能在搜索时可排除对CVE-2017-0199漏洞利用文件的搜索。另一个方法,稍微有些难度,这个方法可以在指令没有在RTF文件内搜索到下一条命令标记的情况下,假定Word已经打开了符合条件的RTF文件。

如果没有其他打开的RTF文件,CVE-2012-0158漏洞就会自动执行。因此,为了保障研究的完整性,我们对剩余的部分进行了研究。

  

第二阶段的shellcode

第二阶段的shellcode要稍微复杂一些,其首先将调用ntdll.dll中的必需API函数。API函数通常被用作在计算机处于挂起状态时创建系统进程svchost.exe,以及利用最终阶段的“下载和执行” shellcode来重写初始入口点,最终植入可执行payload。

https://p3.ssl.qhimg.com/t018415d469e634052d.png

图8:调用ntdll.dll的API函数以注入最终阶段的shellcode,同时恢复svchost.exe进程

写入svchost.exe进程的最终阶段shellcode会使用UrlDownloadToFile API函数从C&C服务器上下载可执行文件至临时文件夹当中,并命名为此(%temp%name.exe),同时再调用ShellExecute最终注入payload。

https://p0.ssl.qhimg.com/t01f4822c17ac500bdd.png

图9:下载和执行阶段

通过监控C&C服务器的流量可以得知,此前下载的可执行payload实际为一个基于VB脚本的木马施放程序(dropper),包含有旧版Ramnit 木马,并且运行着Lokibot。Ramnit是一种非常常见的信息窃取恶意软件,能够自行复制,它同时还包含了rootkit,帮助其躲避杀毒软件检测,具有很强的隐蔽性。本篇博客文章并未对该恶意软件的这一特别部分进行深入讨论。虽然已经有些年头,但Talos团队还是能够经常碰到Ramnit家族恶意软件。在此次攻击过程中,攻击者原本可能想要发动Lokibot攻击,但其目标却恰巧阴差阳错感染了Ramnit木马。

https://p0.ssl.qhimg.com/t01e3f343d967049ead.png

图10:multplelabs.com网站的DNS活动情况

携带恶意软件的域名和其C&C服务器于2016年10月注册,很像是一个遭到入侵的站点,虽然该站点似乎也为其他的Lokibot攻击活动所服务。该站点的DNS活动出现了两个峰顶,说明了两次并不成功的恶意邮件活动,从这里的数据反应出,受感染系统和C&C服务器再无通信活动增多的情况。

相关的DNS活动使我们确认了自己的发现,也为该攻击活动的失败提供了证据。

结论

CVE-2017-0199是垃圾邮件包含恶意软件最常使用的漏洞之一。此前有研究显示,网络攻击者对其的利用频率甚至超过了CVE-2012-0158漏洞。

在本博客中,我们分析了同时合并上述两种漏洞,发动单一网络攻击时出现的情况。在此次攻击过程中,攻击者犯下了一个重大错误,即阻止了Ramnit payload的下载和执行。

https://p2.ssl.qhimg.com/t0119962c1d106f3952.png

图11:组合攻击尝试的各阶段

我们十分好奇,为什么攻击者会选择将新旧两种漏洞同时进行合并?如果目标系统打有任意一个漏洞的应对补丁,这样的组合攻击手段就会被瓦解。同时,如果目标系统确实存在CVE-2012-0158漏洞,攻击者发动针对单一漏洞的攻击活动应该更加容易得手。

我们猜测,攻击者使用这种合并攻击手段,目的是为了防止Word弹出对话框,引起被攻击目标的怀疑。另一种可能是,攻击者意图通过这种手段躲避行为检测系统,从而萌生了在Word文件中组合Ole2Link以及HTA文件的设计。

此次攻击活动并不成功,说明攻击者缺乏相关测试,或者在控制阶段手法不精。然而,我们从中看出了攻击者寻求利用 CVE-2017-0199漏洞作为攻击手段,并且躲避用户察觉的试验精神。此次试验的攻击可能并未奏效,但未来的攻击中或许就会将其实现。

IOCs

文件

5ae2f13707ee38e4675ad1bc016b19875ee32312227103d6f202874d8543fc2e – CVE-2017-0199
       6a84e5fd6c9b2c1685efc7ac8d763048913bad2e767b4958e7b40b4488bacf80 – CVE-2012-0158

可执行文件

351aec22d926b4fb7efc7bafae9d1603962cadf0aed1e35b1ab4aad237723474
       f34e5af97ccb3574f7d5343246138daf979bfd1f9c37590e9a41f6420ddb3bb6
       43624bf57a9c7ec345d786355bb56ca9f76c226380302855c61277bdc490fdfe
       d4fbca06989a074133a459c284d79e979293625262a59fbd8b91825dbfbe2a13

URLs

hxxp://multplelabs[dot]com/ema/order.doc – CVE-2012-0158

hxxp://multplelabs[dot]com/ema/nextyl.exe – dropper

hxxp://multplelabs[dot]com/freem/50/fre.php – Lokibot C2

(完)