数周之前,安全研究员Parvez Anwar在其个人推特上贴出了大量的微软Office DLL劫持漏洞[1]。几周后,微软公布了MS15-132补丁,修复了相关漏洞,同时处理了被谷歌安全研究[2]以不同形式[3]公布出来的大量类似的bug。
这些已发现的漏洞被证实可以在不同版本的Windows上影响不同版本的Office,即恶意使用Windows可以通过Office文档加载嵌入的OLE对象(在其后,任何以CLSID注册的COM对象)的特点,借助.docx,.rtf以及.pptx文件触发漏洞。
如果你想了解这个漏洞更加详细的信息,可以参考Haifei Li和Bing Sun在今年BlackHat上演讲的那篇很牛的议题“Attacking Interoperability: An OLE Edition”[4]。此外,NCC Group的Dominic Wang也有一篇相关博客“Understanding Microsoft Word OLE Exploit Primitives: Exploiting CVE-2015-1642 Microsoft Office CTaskSymbol Use-After-Free Vulnerability”[5],主要是进一步说明微软Office是如何处理嵌入的ActiveX控件。
下面我们来概述一下这些漏洞是如何产生的。
当加载一个嵌入了OLE对象的文档,其中OLE对象是被CLSID或者ProgID指定,Windows将会在自己的注册表中搜索这些指定的ID,随后尝试加载与之先关的DLL,并调用相关代码创建这个对象请求的实例。 一旦这个DLL被加载到Office的地址空间中,Office会判断这个已加载的对象是否与该文档适配(或者,实际上根本就不是一个OLE对象)。 如果在指定的地址需要的DLL不存在,Windows将会在预先指定的地址处“寻找DLL”[6]。这个包括当前的目录。 在这个0day漏洞中,这些特定的CLSID(嵌入在Office文档中),将会导致这些DLL“elsext.dll, api-ms-win-core-winrt-l1-1-0.dll, OCIW32.DLL or oci.dll”从当前目录加载。如果攻击者在相同的目录下放置上述DLL其中之一,这样嵌入对象的文档也会从这个相同的目录中加载这个DLL,那么攻击者构造的代码将会被Office执行。
现在在已有的知识背景下,讨论一下这个漏洞。传统的DLL劫持漏洞要求用户从SMB或者WebDAV这类网络共享中来启动恶意文件。这是由于从远程共享中启动文件时,在文件启动时当前目录下的文档将会成为共享。攻击者很明显可以控制这个,因此可以轻易地在和文档相同的目录下植入恶意的DLL。本文我们所讨论的是攻击者如何在不需要借助SMB或者WebDAV的情况下,使用相关技巧在Office和Firefox中实现远程利用这些漏洞。
Office临时文件释放
为了能够远程利用该漏洞,我们采用了一些已有的解决问题的方法。第一个方法就是利用微软Office会释放临时文件的问题。这些问题已经被潜在利用,Haifei Li也发现了这个问题。该技巧非常好用,攻击者可以通过ActiveX控件包含很容易的把自己的payload嵌入到RTF文件中,而当这个RTF文件被打开时,攻击者的payload将会释放至用户的%TEMP%文件夹下,并保留其原始的名字(除非在%TEMP%文件夹下存在同名文件,这种情况下,文件的后缀将会追加一个数字,例如<文件名>(2).<后缀>)。
在我们的漏洞利用中,同样会借助微软的这个问题来嵌入我们的payload,oci.dll。这个很容易实现,只需将恶意的DLL植入漏洞文档,并将其保存为.rtf形式,然后重新打开这个文档,在当前用户的%TEMP%目录下就可以看到oci.dll文件已经被写进去了。
Firefox临时文件夹
第二个好用的技巧,当我们在Firefox的下载对话框中选择“open with”时,Mozilla Firefox会使用当前用户的%TEMP%目录作为其默认的下载目录。
当用户使用Firefox下载一个文件时,可以有两种选择(如下所示):“save as”和“open with”。
当选“open with”时,在使用指定的程序打开文件前,Firefox将文件下载至用户的%TEMP%目录下。此时,启动程序的当前工作目录变成了用户的%TEMP%目录,看下现在这些文件的位置。
我们可以利用浏览器的这个特性,构造一个包含嵌入的“package”ActiveX控件和一个存在漏洞的对象的RTF文件,其中“package”控件在前,漏洞对象在后。当用户通过Firefox浏览器(选择“open with”(Microsoft Word)选项)从攻击者的web服务器上下载该RTF文件时,有两件事将会发生:
首先,oci.dll将会释放至用户的%TEMP%文件夹下。 其次,这个存在漏洞的对象被加载,导致Word尝试从当前目录加载oci.dll文件。
由于现在的当前目录是%TEMP%,攻击者的payload就会通过Word被执行起来。
Demo
下面的demo视频显示如何借助上述方法通过Firefox实现远程代码执行。
微软Edge和谷歌Chrome
微软的Edge和谷歌的Chrome都是利用用户的“Downloads”目录来存储下载文件,并且在下载前不会提示。这个特点也有可能被攻击者利用,使用“auto-download”的攻击方法;除了构造的文档,攻击者还可以强制用户的浏览器下载攻击者提供的DLL。当打开这个文档时,DLL将会从“Downloads”目录被加载(DLL是使用“auto-download”方法下载到该目录下的)。
下面的例子将会显示是怎样通过<iframe src=”oci.dll”>方法强制下载DLL文件的。
<html> <script> var iframe = document.createElement('iframe'); iframe.src = 'oci.dll'; iframe.id = "dllframe"; iframe.width = 0;iframe.height = 0; iframe.style.visibility = "hidden"; document.body.appendChild(iframe); function dropDoc() { window.location = "exploit.docx"; } aaa = setTimeout(dropDoc, 3000); </script> </html>
这种技术Haifei Li最近记录下来了[8]。
注意,无论是Google Chrome还是Microsoft Edge,如果这个下载下来的文件(例如攻击者的DLL文件)存在风险,那么浏览器将会发出警告提示。而在Edge浏览器中,在接下来的文件被下载前,仅仅是显示警告信息但并不会阻止该文件下载。因此当打开上面的POC文件时,直到.docx文件被释放,浏览器才会简短发出警告提示。而此时提示信息将会被“open”对话框覆盖住。
图1 Chrome 警告
图2 Edge 警告
图3 Edge “open”对话框
措施
微软已经公布了MS15-132漏洞补丁,该补丁用于处理本文所述的DLL劫持漏洞。然而这个补丁不能解决目前已经披露出来的所有的问题。更重要的是,OLE所暴露出来的攻击特点,特别是针对此类漏洞的,我们可以预见将会有更多的漏洞会被发现甚至会被有心人利用。
事实上我们联系了Mozilla,希望能改变现有的做法修复这个%TEMP%文件共享,而他们的回复中称这是微软/Office的bug并不是Firefox的问题。
Google Chrome通过配置可以在下载文件之前提示,选择“Settings > Show Advanced > Ask where to save each file before downloading”。
参考资料
[1]https://twitter.com/ParvezGHH/status/672433593558396929
[2]https://code.google.com/p/google-security-research/issues/detail?id=556
[3]https://www.securify.nl/blog/SFY20151201/there_s_a_party_in_ole__and_you_are_invited.html
[4]https://www.blackhat.com/docs/us-15/materials/us-15-Li-Attacking-Interoperability-An-OLE-Edition.pdf
[5]https://www.nccgroup.trust/uk/our-research/understanding-microsoft-word-ole-exploit-primitives/
[6]https://msdn.microsoft.com/en-us/library/7d83bc18.aspx
[7]https://blogs.mcafee.com/mcafee-labs/dropping-files-temp-folder-raises-security-concerns/
[8]http://justhaifei1.blogspot.com/2015/10/watch-your-downloads-risk-of-auto.html
[9]https://technet.microsoft.com/en-us/library/security/ms15-132.aspx
* 参考来源:nccgroup.trust,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)