【Office 公式编辑器】CVE-2017-11882 漏洞分析

标签: 漏洞分析

0x00 概况

poc来自github
https://github.com/embedi/CVE-2017-11882

功能:弹出计算器

测试环境

windows xp sp3
Office 2003
API Monitor
ImmDbg
IDA 6.8
OLETools
Offvis

漏洞原理

公式编辑器EQNEDT32.EXE进程在读入包含MathType的ole数据时,拷贝公式字体名称数据时没有对名称长度进行校验,从而造成栈缓冲区溢出。函数给Font Name 数据分配的大小为0x24字节。此漏洞已存在17年之久,影响现阶段所有Office版本。

EQNEDT32.EXE

0x01 漏洞分析

测试

直接打开Poc,弹出计算器
XP SP3+Office 2003
Calc
Win7 x86+Office 2007
Win7

创建进程常用的API:

CreateProcessA/W
ShellExecuteA/W/ExA/ExW
WinExec

用ImmDbg附加word进程调试,在这些API下断点并没有断下;
使用API Moitor监控
Process
EQNEDT32.EXE
可知漏洞出在EQNEDT32.EXE进程,通过WinExecAPI调用计算器
这个进程怎么调用的暂时不能确定,可通过添加注册表映像劫持方式来调试;
设置注册表项:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\EQNEDT32.EXE
reg
当程序被调用时会自动调用调试器进行调试;

动态调试

WinExec下断,成功断下,返回地址为0x430C18,栈地址0x12F250
WinExec
调用位置为0x430C12,位于函数0x430C00内,
但设置断点并未断下,应该是栈中直接调用
WinExec1

通过栈回溯分析,找到最近的返回地址0x411837,调用函数为0x411832
411837
函数0x411832下断,断下后发现返回地址已被覆盖,此函数位于0x41160F
0x41160F调用了两次,第二次在0x411658位置覆盖函数返回地址0x4115D8,调用WinExec,原始返回地址位于函数0x4115A7
vul

静态分析

函数0x4115A7
4115A7

上层回溯到函数0x421774,发现字体相关操作
421774

函数0x41160F,实际拷贝字节数0x30
41160F

缓冲区var_28大小只有0x24
var_28

调用此处的WinExec
WinExec

0x02 POC分析

这里需要补充一部分前置知识;

RTF文件结构

富文本格式(Rtf, rich text format)是微软的文本和图像信息交换制定的格式。Rtf文件可以划分为文件头文档区两个部分组成。

文件头和文档区由文本控制字控制符组成,同时利用{...}来表明层级关系。

Rtf文件内容 控制字     解释
文件头     \rtfN       版本号
            \fonttbl    字体表
            \filetbl    文件表
            \listtable  编目表
文档区     \info       信息组
            \pict       图片
            \object     对象
            \sv         绘图对象值
            \sn         绘图对象名称
            \objupdate  自动更新机制。很重要,攻击样本中经常使用,确保OLE对象自动加载、更新

控制字是Rtf用来标记文档信息的格式命令。常见控制字如上,由一个反斜线\跟随单个非字母字符组成。例如,\~代表一个不换行空格。控制符常被用来作为文件混淆的一种方式。
组由包括在{}中的文本、控制字或控制符组成。左扩符{表示组的开始,右扩符}表示组的结束。控制符内部同样可以嵌套其他组。

OLE格式

Rtf恶意文档是通过嵌入文件触发的攻击。\object控制字表示Rtf中嵌入了其他格式文件。Rtf文件格式的嵌入涉及到了OLE(Object linking and embedding)技术。

OLE(Object linking and embedding)是一种基于组件对象模型(COM)的对象链接与嵌入技术。OLE对象使用一系列关键字进行存储,{\object … {\objdata …}},对象数据通过使用OLESaveToStream格式被序列化成字节字符串,字符串通过objdata编码成16进制数据。


exploit.rtf 分析

OLE对象结构

Control word Meaning
objemb 嵌入图片、文档、音频等
objupdate 自动更新
objclass 对象类名
objw 对象宽度
objh 对象高度
objdata 采用特定格式表示的对象数据

OLE

通过oletools中的rtfobj提取ole对象,
能够识别出CVE-2017-11882
rtfobj
通过Offvis分析提取出的文件,找到Shellcode,返回地址覆盖为0x00430C12
调用WinExec,执行cmd.exe /c calc.exe
shellcode

数据结构

根据相关资料,在公式编辑器3.x,使用了 MTEF v.3 的二进制 格式进行存储,漏洞触发数据位于所提取OLE 对象的 Equation Native流中,整个Equation Native的数据构成为:
Equation Native Stream Data = EQNOLEFILEHDR + MTEFData
其中MTEFData = MTEF header + MTEF Byte Stream

  • EQNOLEFILEHDR
struct EQNOLEFILEHDR {
 WORD cbHdr;      // length of header, sizeof(EQNOLEFILEHDR) = 28 bytes
 DWORD version;   // hiword = 2, loword = 0
 WORD cf;         // clipboard format ("MathType EF")
 DWORD cbObject;  // length of MTEF data following this header in bytes
 DWORD reserved1; // not used
 DWORD reserved2; // not used
 DWORD reserved3; // not used
 DWORD reserved4; // not used
};
  • MTEF header
byte description value
0 MTEF version 3
1 generating platform 0 for Macintosh, 1 for Windows
2 generating product 0 for MathType, 1 for Equation Editor
3 product version 3
4 product subversion 0
  • MTEF Byte Stream
value symbol description
0 END end of MTEF, pile, line, embellishment list, or template
1 LINE line (slot) record
2 CHAR character record
3 TMPL template record
4 PILE pile (vertical stack of lines) record
5 MATRIX matrix record
6 EMBELL character embellishment (e.g. hat, prime) record
7 RULER ruler (tab-stop location) record
8 FONT font name record
9 SIZE general size record
10 FULL full size record
11 SUB subscript size record
12 SUB2 sub-subscript size record
13 SYM symbol size record
14 SUBSYM sub-symbol size record

文件中结构为:
exploit
正常字体名称应不超过0x24字节,
在此造成溢出
font

0x03 修复

禁用模块

不需要此功能的用户可直接禁用
通过cmd执行下列命令

x86系统

reg add  “HKLM\SOFTWARE\Microsoft\Office\Common\COM     Compatibility\{0002CE02-0000-0000-C000-000000000046} ” /v         “Compatibility  Flags”             /t  REG_DWORD /d                 0x400    

x64系统

reg add  “HKLM\SOFTWARE\Wow6432Node\Microsoft\Office\Common\COM     Compatibility\{0002CE02-0000-0000-C000-000000000046} ” /v         “Compatibility  Flags”             /t  REG_DWORD /d                 0x400 

安装更新

下载最新补丁,使用新版公式编辑器
https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2017-11882

new

微软修复方法

repai
通过汇编指令手动修复,在拷贝前增加长度校验,
当ecx大于或等于0x21时,将ecx设为0x20,
确保复制到缓冲区的内容不超过0x20字节,
同时其他部分函数内也增加了类似的长度校验;
repai

0x04 相关参考

《漏洞战争:软件漏洞分析精要》
CVE-2017-11882漏洞分析、利用及动态检测
微软如何手工修复Office Equation内存破坏漏洞(CVE-2017-11882)
http://rtf2latex2e.sourceforge.net/MTEF3.html

End

版权声明:本文为D_K_01原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/D_K_01/article/details/81117912