文章目录

  • 漏洞描述
  • 分析环境
  • 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)漏洞分析相关推荐

  1. 动手实验 CVE-2010-3333 Microsoft RTF栈溢出漏洞

    文章目录 一.漏洞信息 漏洞描述 分析环境 简单利用过程 二.漏洞分析 RTF文件格式 基于栈回溯的漏洞分析方法 三.漏洞利用 方法1:将返回地址覆盖为jmp esp 方法2:覆盖SEH结构体 通用s ...

  2. java栈溢出漏洞cve,TP-Link WR841N 栈溢出漏洞(CVE-2020-8423)分析

    简介 前段时间 TP-LINK TL-WR841N 设备爆出了一个认证后的栈溢出漏洞,借机复现了一下这个栈溢出漏洞,其中有一些在漏洞利用上的小技巧在此和大家分享一下. 漏洞信息如下: 漏洞编号:CVE ...

  3. CVE-2022-30190(follina):Microsoft诊断工具(MSDT)远程代码执行漏洞复现(超级详细)

    文章目录 免责声明 前言 一.漏洞简介 风险等级评判 二.影响版本 office版本 三.漏洞复现 复现环境 工具 使用方法 利用 第一种 第二种 防范避免 结尾 参考 免责声明 本文章仅供学习和研究 ...

  4. 绿盟科技网络安全威胁周报2017.19 关注Microsoft恶意软件防护引擎远程执行代码漏洞CVE-2017-0290...

    绿盟科技发布了本周安全通告,周报编号NSFOCUS-17-19,绿盟科技漏洞库本周新增75条,其中高危61条.本次周报建议大家关注 Microsoft恶意软件防护引擎远程执行代码漏洞 .目前,微软官方 ...

  5. 和远程ip_漏洞Microsoft Windows TCP/IP 远程执行代码漏洞威胁通告

    2020年10月14日,中测安华必达实验室技术团队依托监测平台第一时间发现微软公司(Microsoft)披露了Microsoft Windows TCP/IP 远程执行代码漏洞(CVE-2020-16 ...

  6. 服务器2008操作系统漏洞,【操作系统安全漏洞 】解决CVE-2017-11780:Microsoft Windows SMB Server远程代码执行漏洞...

    一.漏洞描述 2017年10月10日,微软漏洞补丁日修复了多个安全漏洞,其中一个为Microsoft WindowsSMB Server远程执行代码漏洞,根据官方描述该漏洞如果被成功利用,远程攻击者可 ...

  7. CVE-2022-21907 Microsoft Windows HTTP 协议栈远程代码执行漏洞复现

    目录 0x01 声明: 0x02 简介: 0x03 漏洞概述: 0x04 影响版本: 0x05 环境搭建: 下载: 开启IIS: 0x06 漏洞复现: 利用POC: 0x07 流量分析: 客户端: 0 ...

  8. php x24 x65 x6d x61,Jboss远程代码执行漏洞CVE:2013-4810获得system权限

    此方法成功的渗透至Windows系统并获得最高权限exp 此方法成功的渗透至Windows系统并获得最高权限 exp ?php/*Apache Tomcat/JBoss EJBInvokerServl ...

  9. MICROSOFT TEAMS MACOS版本本地权限提升漏洞

    Offensive Security安全研究人员在Microsoft Teams的XPC 服务中发现了一个安全漏洞,并将漏洞报告给了MSRC,微软确认了该漏洞但决定不立即修复. 漏洞根源分析 漏洞是两 ...

最新文章

  1. RedisJson 横空出世,性能碾压ES和Mongo!
  2. php下session入memcached
  3. python版本的服务器
  4. sql SERVER 模拟试题
  5. 让Eclipse启动时显示选择workspace的对话框
  6. Linux设置RSA密钥登录
  7. 常用API2 正则表达式
  8. 面向现代化应用,火山引擎云原生究竟提供了哪些能力?
  9. python邮件发送脚本
  10. Android EditText的常用技巧
  11. 打印机打印网页不清晰_是什么原因导致uv打印机喷头加热不升温
  12. 25张图让你读懂神经网络架构
  13. 基于javaEE的医院病历管理系统的设计与实现
  14. java poi excel模板变量_Java Web之POI操作Excel2016模板
  15. dellemc服务器的显示器连接,通过显示器实现合作-DellEMC.PDF
  16. C语言——输入两个正整数m和n,求其最大公约数和最小公倍数
  17. java怎么重新开始游戏_添加开始,停止,重置按钮到简单的Java游戏
  18. Linux下载HTTP文件
  19. 35岁的程序员何去何从?--记PMP考试感悟
  20. 获得屏幕的宽度和高度

热门文章

  1. 成功解决AttributeError: module 'torch.utils' has no attribute 'data'
  2. EL之Boosting之GB(DTR):利用梯度提升法解决回归(对多变量的数据集+实数值评分预测)问题
  3. EL之Bagging:利用Bagging算法实现回归预测(实数值评分预测)问题
  4. ML之K-means:基于K-means算法利用电影数据集实现对top 100 电影进行文档分类
  5. Hyperopt 入门指南
  6. c++中堆、栈内存分配
  7. [BZOJ1984] 月下“毛景树”
  8. 帮助你构建自适应布局的30款优秀 jQuery 插件(下篇)
  9. EOS 智能合约源代码解读 (1)总体说明
  10. EOS 核心功能 (2) nodeos