◈ 渗透任务
OLE 对象嵌入攻击验证
任务中
你的身份
「暗影安全公司」渗透测试工程师
目标网站
ArchivePro 企业归档系统 (archive.archivepro.example.com)
委托方
ArchivePro 处理的文档可能包含恶意 OLE 对象,CVE-2017-11882 仍需关注
任务目标
构造嵌入恶意 OLE 对象的 Word 文档
- 理解 OLE 对象在 .docx 中的结构
- 构造可触发代码执行的 OLE 嵌入
OLE 对象嵌入攻击
什么是 OLE?
OLE(Object Linking and Embedding)是 Microsoft 的复合文档技术,允许在文档中嵌入其他应用程序创建的对象。在 OOXML 中,OLE 对象通过 <o:OLEObject> 标签引用。
核心原理:OOXML 文档通过
ProgID 指定嵌入对象的 COM 组件类型。当文档打开时,Office 加载对应的 COM 组件来渲染对象。如果 COM 组件存在漏洞(如 EQNEDT32.EXE),就可以被利用执行任意代码。
OOXML 中的 OLE 对象结构
<!-- document.xml -->
<w:object>
<!-- VML 形状定义(显示占位符) -->
<v:shape id="_x0000_i1025" style="width:152pt;height:38pt">
<v:imagedata r:id="rId4" o:title=""/>
</v:shape>
<!-- OLE 对象声明 -->
<o:OLEObject
Type="Embed"
ProgID="Equation.3"
ShapeID="_x0000_i1025"
DrawAspect="Content"
ObjectID="_1517315276"
r:id="rId5"/>
</w:object>
关系文件 (document.xml.rels)
<!-- word/_rels/document.xml.rels -->
<Relationship
Id="rId5"
Type="http://schemas.openxmlformats.org/officeDocument/
2006/relationships/oleObject"
Target="oleObject1.bin"/>
rId5 指向 oleObject1.bin,这是一个 OLE 复合二进制文件。
CVE-2017-11882 详解
漏洞组件:EQNEDT32.EXE (Microsoft Equation Editor)
版本:3.0 (Office 2000 时代的组件,未启用 ASLR/DEP)
漏洞类型:栈缓冲区溢出
漏洞位置:字体名称解析
[MTSM Record]
Font name buffer: 22 bytes (含 null 终止符)
实际写入:可超过 22 bytes
溢出目标:覆盖栈上的返回地址
攻击效果:
1. 构造超长字体名 (>22 bytes)
2. 覆盖返回地址为 shellcode 地址
3. EQNEDT32.EXE 执行 shellcode
4. 由于无 ASLR/DEP,利用非常稳定
常见 ProgID 攻击向量
| ProgID | 组件 | 攻击方式 |
|---|---|---|
Equation.3 |
公式编辑器 | CVE-2017-11882 栈溢出 |
Package |
打包对象 | 嵌入可执行文件 |
htafile |
HTA 应用 | HTML Application 执行脚本 |
WScript.Shell |
脚本宿主 | 执行系统命令 |
Shell.Application |
Shell 自动化 | 执行文件操作 |
oleObject1.bin 内部结构
OLE Compound Binary File
├── Root Entry
│ ├── Equation Native (Equation 数据流)
│ │ ├── Header (MTSM): [版本][字体信息...]
│ │ └── Equation data
│ ├── OLE Package (Package 对象)
│ │ ├── \x01Ole10Native (嵌入数据)
│ │ └── \x03ObjInfo
│ └── CompObj (组件信息)
└── \x05DocumentSummaryInformation
◆ 练习:OLE 对象嵌入
目标:构造一个包含恶意 OLE 对象的 OOXML 文档。修改
ProgID 选择目标组件,理解 CVE-2017-11882 的触发机制。
标准 OLE 嵌入 XML 结构:
<w:object w:dxaOrig="1905" w:dyaOrig="480">
<v:shape id="_x0000_i1025" type="#_x0000_t75"
style="width:152.4pt;height:38.4pt" o:ole="">
<v:imagedata r:id="rId4" o:title=""/>
</v:shape>
<o:OLEObject Type="Embed" ProgID="Equation.3"
ShapeID="_x0000_i1025" DrawAspect="Content"
ObjectID="_1517315276" r:id="rId5"/>
</w:object>
◆ OLE 安全状态:
ProgID验证 -- 未执行- OLE 二进制内容扫描 -- 未执行
- EQNEDT32.EXE 禁用状态 -- 未检查
- 嵌入对象类型白名单 -- 未配置
◆ 查看漏洞源码 (OOXML OLE 结构)
<!-- document.xml 中的 OLE 对象嵌入 -->
<w:object w:dxaOrig="1905" w:dyaOrig="480">
<v:shape id="_x0000_i1025" type="#_x0000_t75"
style="width:152.4pt;height:38.4pt"
o:ole="">
<v:imagedata r:id="rId4" o:title=""/>
</v:shape>
<o:OLEObject Type="Embed" ProgID="Equation.3"
ShapeID="_x0000_i1025" DrawAspect="Content"
ObjectID="_1517315276" r:id="rId5"/>
</w:object>
<!-- word/_rels/document.xml.rels 中的关系定义 -->
<Relationship Id="rId5"
Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject"
Target="oleObject1.bin"/>
<!-- oleObject1.bin 二进制内容(简化表示) -->
[OLE Compound Binary]
Equation Native Stream:
- MTSM (MathType Style)
- Equation data with OVERFLOW in font name field</code>