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版本。
直接打开Poc,弹出计算器
XP SP3+Office 2003
Win7 x86+Office 2007
创建进程常用的API:
CreateProcessA/W
ShellExecuteA/W/ExA/ExW
WinExec
用ImmDbg附加word进程调试,在这些API下断点并没有断下;
使用API Moitor监控
可知漏洞出在EQNEDT32.EXE
进程,通过WinExec
API调用计算器
这个进程怎么调用的暂时不能确定,可通过添加注册表映像劫持
方式来调试;
设置注册表项:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\EQNEDT32.EXE
当程序被调用时会自动调用调试器进行调试;
WinExec
下断,成功断下,返回地址为0x430C18
,栈地址0x12F250
调用位置为0x430C12
,位于函数0x430C00
内,
但设置断点并未断下,应该是栈中直接调用
通过栈回溯分析,找到最近的返回地址0x411837
,调用函数为0x411832
函数0x411832
下断,断下后发现返回地址已被覆盖,此函数位于0x41160F
内
0x41160F
调用了两次,第二次在0x411658
位置覆盖函数返回地址0x4115D8
,调用WinExec
,原始返回地址位于函数0x4115A7
内
这里需要补充一部分前置知识;
富文本格式(Rtf, rich text format)是微软的文本和图像信息交换制定的格式。Rtf文件可以划分为文件头
和文档区
两个部分组成。
文件头和文档区由文本
、控制字
和控制符
组成,同时利用{...}
来表明层级关系。
Rtf文件内容 控制字 解释
文件头 \rtfN 版本号
\fonttbl 字体表
\filetbl 文件表
\listtable 编目表
文档区 \info 信息组
\pict 图片
\object 对象
\sv 绘图对象值
\sn 绘图对象名称
\objupdate 自动更新机制。很重要,攻击样本中经常使用,确保OLE对象自动加载、更新
控制字是Rtf用来标记文档信息的格式命令。常见控制字如上,由一个反斜线\跟随单个非字母字符组成。例如,\~
代表一个不换行空格。控制符常被用来作为文件混淆的一种方式。
组由包括在{}
中的文本、控制字或控制符组成。左扩符{
表示组的开始,右扩符}
表示组的结束。控制符内部同样可以嵌套其他组。
Rtf恶意文档是通过嵌入文件触发的攻击。\object
控制字表示Rtf中嵌入了其他格式文件。Rtf文件格式的嵌入涉及到了OLE
(Object linking and embedding)技术。
OLE(Object linking and embedding)是一种基于组件对象模型(COM
)的对象链接与嵌入技术。OLE对象使用一系列关键字进行存储,{\object … {\objdata …}}
,对象数据通过使用OLESaveToStream
格式被序列化成字节字符串,字符串通过objdata
编码成16进制数据。
OLE对象结构
Control word | Meaning |
---|---|
objemb | 嵌入图片、文档、音频等 |
objupdate | 自动更新 |
objclass | 对象类名 |
objw | 对象宽度 |
objh | 对象高度 |
objdata | 采用特定格式表示的对象数据 |
通过oletools中的rtfobj提取ole对象,
能够识别出CVE-2017-11882
通过Offvis分析提取出的文件,找到Shellcode,返回地址覆盖为0x00430C12
,
调用WinExec
,执行cmd.exe /c calc.exe
根据相关资料,在公式编辑器3.x,使用了 MTEF v.3 的二进制 格式进行存储,漏洞触发数据位于所提取OLE 对象的 Equation Native
流中,整个Equation Native
的数据构成为:
Equation Native Stream Data = EQNOLEFILEHDR + MTEFData
,
其中MTEFData = MTEF header + MTEF Byte Stream
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
};
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 |
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 |
文件中结构为:
正常字体名称应不超过0x24字节,
在此造成溢出
不需要此功能的用户可直接禁用
通过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
通过汇编指令手动修复,在拷贝前增加长度校验,
当ecx大于或等于0x21
时,将ecx设为0x20
,
确保复制到缓冲区的内容不超过0x20字节,
同时其他部分函数内也增加了类似的长度校验;
《漏洞战争:软件漏洞分析精要》
CVE-2017-11882漏洞分析、利用及动态检测
微软如何手工修复Office Equation内存破坏漏洞(CVE-2017-11882)
http://rtf2latex2e.sourceforge.net/MTEF3.html