今年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文档。
图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所示。
图2:Word向用户发出的提示
升级后的CVE-2017-0199漏洞
攻击者此次对CVE-2017-0199漏洞进行了升级,黑客攻击行动最初也是从一份包含恶意程序的邮件开始的。邮件采用了一般的诱骗手段促使用户打开并阅读包含恶意程序的附件。一般此类包含恶意程序的垃圾邮件会伪装成用户合作伙伴的采购订单。
图3:发起攻击的邮件范例
邮件的附件是一个含有OLE2嵌入式链接对象的RTF文件(文件名:hxxp://multplelabs [dot] com/ema/order.doc)。在这种情况下,远程文件的mime类型不是application/hta而变为了application/msword。
在对其中一个Word样本进行研究时,研究者发现在系统显示CVE-2017-0199的系统提示之前,word会自动对下载文档转换格式。在这之后,word程序会自动暂停,并最终崩溃(如下图所示)。
图4:Word程序崩溃
Word程序的崩溃不是因CVE-2017-0199漏洞导致的,而是由于CVE-2012-0158漏洞。下图所示即MSComctlLib.ListViewCtrl.2 ActiveX的嵌入式指令,这就是典型的CVE-2012-0158漏洞。指令由一串ROP链开始,当漏洞被激活,指令就开始自动运行。在ROP链为包含其他指令的内存块设置正确的权限之后,漏洞指令的第一阶段就开始自动执行。
图5:CVE-2012-0158漏洞第一阶段的指令
CVE-2012-0158漏洞第一阶段的指令就是导致Word崩溃的罪魁祸首!但或许是因为攻击者技术方面仍存在短板,所以导致后续的漏洞运作出现问题。
该shellcode将调用数个API函数地址,通过暴力破解文件句柄号(handle number)来遍历所有文件。这一过程将从句柄号为0的文件开始,每次递增4个句柄号打开新的文件。如果句柄存在,shellcode将利用GetFileSize API函数检测文件大小。如果文件大小符合预期,shellcode将记录该文件,进行文件类型检测。
图6:检查文档大小和确定文档类型
漏洞指令的失误就在于,如果找到的是一个RTF文件,那么所有的条件就符合了,找到的这个RTF文件也将包含另一串指令。如果寻找到的文档类型和大小满足要求,那么下一个步骤就是读取该文档,以寻找下一串指令。但在我们的试验中,这一步就失败了,因为原始的CVE-2017-0199漏洞利用文件还储存在系统之中。这一文件满足之前提到过的几个条件。由于CVE-2017-0199漏洞利用文件先于CVE-2012-0158文件打开,CVE-2017-0199漏洞利用文件的句柄较小,这就导致他被首先读取。
图7:第一阶段指令开始搜索下一阶段指令标记