Microsoft RTF栈溢出漏洞(CVE-2010-3333)漏洞分析
文章目录
- 漏洞描述
- 分析环境
- RTF文件格式
- 基于栈回溯的漏洞分析方法
- 漏洞利用
- Office 2003与Office 2007 Exploit通用性研究
漏洞描述
Microsoft Office XP SP3,Office2003SP3,Office2007 SP2,Office 2010等多个版本的Office软件中,Open XML文件格式转换器存在栈溢出漏洞,主要是在处理RTF中的pFragments属性时存在栈溢出,导致远程攻击者可以借助特制的RTF数据执行任意代码,因此该漏洞又名RTF栈溢出漏洞
分析环境
环境 | |
---|---|
操作系统 | Windows XP SP3 |
虚拟机 | VMware |
调试器 | windbg |
反汇编器 | IDA Pro |
漏洞软件 | Office 2003 SP3与2007 SP0中文版 |
RTF文件格式
RTF格式是Microsoft公司为进行文本和图像信息格式的交换而制定的一种文件格式,它适用于不同的设备 操作系统和操作环境。RTF的基本元素是正文(Text) 控制字(Control Word) 控制符号(Control Symbol)和群组(Group)
控制字是RTF用来标记打印控制符和文档信息的一种特殊格式的命令,RTF用它作为正文格式的控制代码,每个控制字均以一个反斜杠开头,由a-z小写字母组成,通常应该不包含任何大写字母,而分隔符标志着控制字名称的结束。它的使用格式为:\字母序列<分隔符>
控制符号由一个反斜杠跟一个单独的非字母的字符,表示一个特定的符号
群组由包含在大括号中的文本 控制字或控制符组成。左括号表示组的开始,右括号表示组的结束。每个组包括文本和文本的不同属性。RTF文件也能同时包括字体 格式 屏幕颜色 图形 脚注 注释 文件头和文件尾 摘要信息 域和书签的组合,以及文档区段 段落和字符的格式属性
一个完整的RTF文件包括文件头<header>
和文档区<document>
两大部分,可以用下列的语法表示
<File>{<header><document>}
通过微软官方文档的目录,我们大体可以了解到文件头和文档区各自所包含的数据,如下所示:
Content of an RTF fileHeaderRTF VersionCharacter SetUnicode RTFFont TableColor TableStyle SheetList TableTrack Changes(Revision Marks)Document AreaInformation GroupDocument Formatting PropertiesSection TextParagraph TextCharacter TextDocument VariablesBookmarksPicturesObjectsDrawing ObjectsWord 97-2000 RTF for Drawing Object(Shapes)FootnotesComments(Annotations)FieldsForm FieldsIndex EntriesBidrectional language Support
我们回头看下CVE-2010-3333(cve-2010-3333_exploit.doc)的部分数据,如图所示
[外链图片转存失败(img-HytgrTLN-1564825057651)(E:\博客\漏洞分析\Microsoft RTF栈溢出漏洞(CVE-2010-3333)]漏洞分析\assets\1560046133473.png)
样本数据分析如下:
\rtf1——RTF版本
\ansi——支持ANSI字符集
\shp——绘图对象
\*\shpinst———图片引用
\sp——绘图对象属性定义
\sn pFragments——定义属性名称,pFragments段是图形的附加部分 属于数组结构。它允许图形包含多个路径和分段,该属性值列出图形的各个碎片
\sv——定义属性值
RTF分析器正是在解析pFragments属性值时,没有正确计算属性值所占的空间大小,导致栈溢出漏洞的发生
基于栈回溯的漏洞分析方法
首先打开winword.exe,接着用windbg附加进程,输入g命令直接运行。接着打开poc.rtf,此时触发异常,如下图:
查看一下堆栈
此时当前栈已经被样本生成的垃圾数据覆盖,接着用lmm命令查看mso模块的详细信息
0:000:x86> lmm mso v
start end module name
30c90000 31837000 MSO (export symbols) MSO.DLLLoaded symbol image file: MSO.DLLImage path: MSO.DLLImage name: MSO.DLLTimestamp: Fri Aug 08 15:10:06 2003 (3F334CCE)CheckSum: 00BA7175ImageSize: 00BA7000File version: 11.0.5606.0Product version: 11.0.5606.0File flags: 0 (Mask 3F)File OS: 40004 NT Win32File type: 2.0 DllFile date: 00000000.00000000Translations: 0000.04e4CompanyName: Microsoft CorporationProductName: Microsoft Office 2003InternalName: MSOOriginalFilename: MSO.DLLProductVersion: 11.0.5606FileVersion: 11.0.5606FileDescription: Microsoft Office 2003 componentLegalCopyright: Copyright © 1983-2003 Microsoft Corporation. All rights reserved.
这是mso.dll上的一处栈溢出漏洞,由于在循环赋值到栈空间时,未检测复制的内存大小,导致edi开始的不可写页面,触发指令的地址位于0x30e9eb88位于sub_30ED4406中,我们暂且标记为CrashFun函数
此时我们重新运行windbg,在0x30e9eb88下断点,运行后让程序断下
断下后,查看调用堆栈,以定位到是哪个函数奔溃的
由上可知,CrashFun函数是在0x30f4cc5d函数中被调用的。重新加载windbg,并在0x30f4cc5d下断点,让程序断在0x30f4cc5d处。
按F10单步跟踪
这里开辟了0x14个字节大小的栈空间,我们继续跟踪下去
当运行到0x30f4cc93时,就调用到了CrashFun函数进行内存数据复制。接着按F8跟进CrashFun函数,然后一直单步
可以发现用rep movs指令复制内存时,ecx的值为c8ac,即复制数据的大小,由于的操作dword字节,所以需要再除以4,回头看下poc.rtf样本数据
可以发现上面的0xc8ac其实是源于样本数据的,它位于pFragements属性值的第三个字段,而0xc8ac后面的数据正是实际内存复制的数据,复制的内存源地址esi刚好指向这里
复制内存的目标地址edi刚好偏移栈底ebp共0x10字节,加上ebp本身占用的4个字节,刚好是0x14字节,再覆盖下去就是函数的返回地址了
由于poc.rtf中复制的内存数据比较大,导致复制的过程中覆盖到不可写的内存地址而触发异常,因此没有去执行覆盖到的返回地址或者SEH异常处理函数
**总结:**总结上面的分析过程,由于Word中的rtf分析器在解析pFragments属性值时,没有正确计算属性值所占用的空间大小,只要复制的数据大小超过0x14即可覆盖返回地址,若继续覆盖下去还可以覆盖SEH结构,进而控制程序的执行流程,用于执行任意代码
漏洞利用
将漏洞成因分析清楚之后,利用该漏洞相对还是比较容易的。我们只需要将返回地址用jmp esp指令覆盖,也就是复制数据大小的值之后再偏移0x14字节,即可覆盖返回地址;然后将ShellCode放置在后面,即可执行任意代码。由于在漏洞函数的结尾处,它在返回时会弹出0x14大小的栈空间,因此我们在jmp esp中填充一些垃圾指令以填充这一空缺
某实际样本的分析情况如上图,当漏洞函数返回后,会先从栈顶弹出0x14字节空间,然后执行0x7d1f5fb7处的jmp esp指令,进而跳入shellcode起始地址,导致执行任意代码
Office 2003与Office 2007 Exploit通用性研究
上例样本中0x7d1f5fb7指令地址并不是很稳定,这种硬编码地址可能受软件及系统版本影响,较难实现通用性。为了实现Office 2003与Office 2007的通用,我们可以在返回地址上用0x0026762F覆盖,它在Office 2003上相当于call esp指令
0:000> u 0x0026762f l1<br>0026762f ffd4 call esp
该地址适用于Office 2003 SP0和SP3等各个子版本,属于稳定的跳转地址。对于Office 2007,0x0026762F已不再是call/jmp esp等类似指令,当我们用0x0026762F这个地址覆盖掉Office 2007上的返回地址,只要能够让它触发异常,就可能执行SEH结构。这样的话,我们只需加大内存拷贝的大小,使其覆盖到最近的SEH结构就可以劫持EIP。也就是说,我们需要同时覆盖返回地址和SEH结构。
我们构造的数据如下:
111111111111111111111111111111111111111111111111111111111111112f762600111111111111111111111111111111111111111111111111111111111111aaaaaaaaffffffff
关于SEH结构地址的定位,可以使用MSF上的两个工具:pattern_create和pattern_offset定位偏移量
Microsoft RTF栈溢出漏洞(CVE-2010-3333)漏洞分析相关推荐
- 动手实验 CVE-2010-3333 Microsoft RTF栈溢出漏洞
文章目录 一.漏洞信息 漏洞描述 分析环境 简单利用过程 二.漏洞分析 RTF文件格式 基于栈回溯的漏洞分析方法 三.漏洞利用 方法1:将返回地址覆盖为jmp esp 方法2:覆盖SEH结构体 通用s ...
- java栈溢出漏洞cve,TP-Link WR841N 栈溢出漏洞(CVE-2020-8423)分析
简介 前段时间 TP-LINK TL-WR841N 设备爆出了一个认证后的栈溢出漏洞,借机复现了一下这个栈溢出漏洞,其中有一些在漏洞利用上的小技巧在此和大家分享一下. 漏洞信息如下: 漏洞编号:CVE ...
- CVE-2022-30190(follina):Microsoft诊断工具(MSDT)远程代码执行漏洞复现(超级详细)
文章目录 免责声明 前言 一.漏洞简介 风险等级评判 二.影响版本 office版本 三.漏洞复现 复现环境 工具 使用方法 利用 第一种 第二种 防范避免 结尾 参考 免责声明 本文章仅供学习和研究 ...
- 绿盟科技网络安全威胁周报2017.19 关注Microsoft恶意软件防护引擎远程执行代码漏洞CVE-2017-0290...
绿盟科技发布了本周安全通告,周报编号NSFOCUS-17-19,绿盟科技漏洞库本周新增75条,其中高危61条.本次周报建议大家关注 Microsoft恶意软件防护引擎远程执行代码漏洞 .目前,微软官方 ...
- 和远程ip_漏洞Microsoft Windows TCP/IP 远程执行代码漏洞威胁通告
2020年10月14日,中测安华必达实验室技术团队依托监测平台第一时间发现微软公司(Microsoft)披露了Microsoft Windows TCP/IP 远程执行代码漏洞(CVE-2020-16 ...
- 服务器2008操作系统漏洞,【操作系统安全漏洞 】解决CVE-2017-11780:Microsoft Windows SMB Server远程代码执行漏洞...
一.漏洞描述 2017年10月10日,微软漏洞补丁日修复了多个安全漏洞,其中一个为Microsoft WindowsSMB Server远程执行代码漏洞,根据官方描述该漏洞如果被成功利用,远程攻击者可 ...
- CVE-2022-21907 Microsoft Windows HTTP 协议栈远程代码执行漏洞复现
目录 0x01 声明: 0x02 简介: 0x03 漏洞概述: 0x04 影响版本: 0x05 环境搭建: 下载: 开启IIS: 0x06 漏洞复现: 利用POC: 0x07 流量分析: 客户端: 0 ...
- php x24 x65 x6d x61,Jboss远程代码执行漏洞CVE:2013-4810获得system权限
此方法成功的渗透至Windows系统并获得最高权限exp 此方法成功的渗透至Windows系统并获得最高权限 exp ?php/*Apache Tomcat/JBoss EJBInvokerServl ...
- MICROSOFT TEAMS MACOS版本本地权限提升漏洞
Offensive Security安全研究人员在Microsoft Teams的XPC 服务中发现了一个安全漏洞,并将漏洞报告给了MSRC,微软确认了该漏洞但决定不立即修复. 漏洞根源分析 漏洞是两 ...
最新文章
- RedisJson 横空出世,性能碾压ES和Mongo!
- php下session入memcached
- python版本的服务器
- sql SERVER 模拟试题
- 让Eclipse启动时显示选择workspace的对话框
- Linux设置RSA密钥登录
- 常用API2 正则表达式
- 面向现代化应用,火山引擎云原生究竟提供了哪些能力?
- python邮件发送脚本
- Android EditText的常用技巧
- 打印机打印网页不清晰_是什么原因导致uv打印机喷头加热不升温
- 25张图让你读懂神经网络架构
- 基于javaEE的医院病历管理系统的设计与实现
- java poi excel模板变量_Java Web之POI操作Excel2016模板
- dellemc服务器的显示器连接,通过显示器实现合作-DellEMC.PDF
- C语言——输入两个正整数m和n,求其最大公约数和最小公倍数
- java怎么重新开始游戏_添加开始,停止,重置按钮到简单的Java游戏
- Linux下载HTTP文件
- 35岁的程序员何去何从?--记PMP考试感悟
- 获得屏幕的宽度和高度
热门文章
- 成功解决AttributeError: module 'torch.utils' has no attribute 'data'
- EL之Boosting之GB(DTR):利用梯度提升法解决回归(对多变量的数据集+实数值评分预测)问题
- EL之Bagging:利用Bagging算法实现回归预测(实数值评分预测)问题
- ML之K-means:基于K-means算法利用电影数据集实现对top 100 电影进行文档分类
- Hyperopt 入门指南
- c++中堆、栈内存分配
- [BZOJ1984] 月下“毛景树”
- 帮助你构建自适应布局的30款优秀 jQuery 插件(下篇)
- EOS 智能合约源代码解读 (1)总体说明
- EOS 核心功能 (2) nodeos