CVE-2013-3346:十全九美的 Adobe Reader ToolButton UAF 漏洞
0x01 “Epic Turla” 网络间谍行动
- 在 2014 年 8 月,被誉为 “世界十大最危险的网络攻击行动” 之一的 “Epic Turla”,当时这起 APT 网络间谍行动影响的国家超过 45 个,且攻击目标为政府部门、大使馆、军事组织、研究、教育组织等。据可要靠消息这起攻击事件可能与俄罗斯政府有关
- 此次攻击在当时利用了两个 0day 漏洞,一个用于 Adobe Reader 沙箱提权,另一个是 CVE-2013-3346 UAF 漏洞,此漏洞的原理和一般的 UAF 漏洞并无两样,同样是利用了释放对象后的悬挂指针。但倘若想研究透彻,还需深入逆向研究 Adobe Reader 对象创建和释放机制,还是需要花费很大的功夫的
- 分析环境:Windows 7(开启ASLR)
- 漏洞软件:Adobe Reader 9(提取码:yc76)
- 调试和分析工具:IDA + Windbg + PdfStreamDumper(恶意 PDF 文档分析工具)
- 恶意样本:能够触发异常的 PDF 样本文件(提取码:ztok)
0x02 分析恶意样本
- 要想了解此漏洞对象释放过程,首先要从创建对象的 JS 代码分析起,此次分析的样本是 PDF 类型文件,且样本没有经过加密,使用 PdfStreamDumper 就可以轻松的了解 PDF 文件格式和提取 PDF 中的 JS 代码。如下图所示,将恶意文档拖入后,可以发现 JS 代码(由于时间关系就不分析 PDF 对象格式了,直接寻找到 JS 代码)
- 创建一个 .js 的新文件,将恶意文档中的 JS 代码复制到新文件中,并且用 Sublime Text 打开,这一步的操作纯粹是为了代码的好看而已,五颜六色的便于分析
- 有一定的 JS 环境堆漏洞利用分析经验的,看这个 JS 代码可以很快的分析出各个功能之间的关系,比如 ROP 绕过、堆喷射等。首先是堆喷射的利用,主要作用是将 ROP + ShellCode 代码喷射到固定的地址,方便释放过后的悬挂指针调用这个地址,从而执行恶意代码
- 有了堆喷射之后就需要构造 ROP + ShellCode 代码,这个的主要目的就是执行恶意代码,下载病毒做进一步渗透的准备。如下图所示:
注:通过使用 scdbg(ShellCode 分析工具)可以分析出 ShellCode 的执行 API 的步骤(将 Shellcode 复制出来之后改为 .sc 文件即可分析)
根据 scdbg 的显示结果,可以看出 ShellCode 通过Socket 连接了远程服务器,端口是 4444,之后使用 recv 传输数据,但这个 ShellCode 不全,缺少了执行木马的操作,这个不影响后面的分析
- 继续往下分析,这一段代码的作用根据不同的 Adobe Reader 版本构造不同的返回地址和 ROP + ShellCode,主要是为了实现多版本的通杀性
- 最后就是触发漏洞的代码,前面这一段作用是构造与释放对象相同大小的内存,为的是能够覆盖之前释放对象的内存空间
- 之后主要是看这一段代码,从下往上,首先创建了一个 evil 对象,之后创建了一个子对象 xxx,创建子对象之后,在创建一个孙对象用于销毁 evil 对象和精确覆盖销毁对象的内存地址,用于悬挂指针的引用,标准的 UAF 漏洞实现原理
0x03 调试分析漏洞触发点
- 知道了用于触发漏洞的代码,下面使用 Windbg 多线程调试看看,使用 Windbg 打开 Adobe Reader 软件后拖入恶意 PDF 样本后断在了如下图所示的地方:
注:使用 Windbg 开启 hpa + htc 便于捕捉内存异常
- 查看异常点的栈空间
- 之后跟踪 0x06e024dc 地址的代码,ecx 表示的是对象的地址,由 esi 传入 ecx,eax 表示虚表指针,最后调用虚表偏移 268h 地址的虚函数
- 查询对象的内存信息,也就是 esi 所指向的内存地址,发现已经全部被覆盖成了 f0f0f0f0,包括虚表指针也是一样,最后调用虚表偏移 268h 的地址也就是 f0f0f414
This exception may be expected and handled.
eax=f0f0f0f0 ebx=00000000 ecx=1b3fae54 edx=1b3f37b0 esi=1b3fae54 edi=00000001
eip=06e02841 esp=0018d810 ebp=0018d830 iopl=0 nv up ei pl zr ac pe cy
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00210257
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\Program Files (x86)\Adobe\Reader 9.0\Reader\AcroRd32.dll -
AcroRd32!AVAcroALM_IsFeatureEnabled+0xd89c:
06e02841 ff9024030000 call dword ptr [eax+324h] ds:002b:f0f0f414=????????
0:000> kv
ChildEBP RetAddr Args to Child
WARNING: Stack unwind information not available. Following frames may be wrong.
0018d830 06e024dc 00000000 1b3fae54 0018d89c AcroRd32!AVAcroALM_IsFeatureEnabled+0xd89c
00000000 00000000 00000000 00000000 00000000 AcroRd32!AVAcroALM_IsFeatureEnabled+0xd537
0:000> ub 06e024dc
AcroRd32!AVAcroALM_IsFeatureEnabled+0xd519:
06e024be 89442414 mov dword ptr [esp+14h],eax
06e024c2 8b06 mov eax,dword ptr [esi]
06e024c4 57 push edi
06e024c5 0fb7be88020000 movzx edi,word ptr [esi+288h]
06e024cc ff9048020000 call dword ptr [eax+248h]
06e024d2 8b06 mov eax,dword ptr [esi]
06e024d4 8bce mov ecx,esi
06e024d6 ff9068020000 call dword ptr [eax+268h]
0:000> dd eax
f0f0f0f0 ???????? ???????? ???????? ????????
f0f0f100 ???????? ???????? ???????? ????????
f0f0f110 ???????? ???????? ???????? ????????
f0f0f120 ???????? ???????? ???????? ????????
f0f0f130 ???????? ???????? ???????? ????????
f0f0f140 ???????? ???????? ???????? ????????
f0f0f150 ???????? ???????? ???????? ????????
f0f0f160 ???????? ???????? ???????? ????????
0:000> dd eax+268
f0f0f358 ???????? ???????? ???????? ????????
f0f0f368 ???????? ???????? ???????? ????????
f0f0f378 ???????? ???????? ???????? ????????
f0f0f388 ???????? ???????? ???????? ????????
f0f0f398 ???????? ???????? ???????? ????????
f0f0f3a8 ???????? ???????? ???????? ????????
f0f0f3b8 ???????? ???????? ???????? ????????
f0f0f3c8 ???????? ???????? ???????? ????????
0:000> dd esi
1b3fae54 f0f0f0f0 f0f0f0f0 f0f0f0f0 f0f0f0f0
1b3fae64 f0f0f0f0 f0f0f0f0 f0f0f0f0 f0f0f0f0
1b3fae74 f0f0f0f0 f0f0f0f0 f0f0f0f0 f0f0f0f0
1b3fae84 f0f0f0f0 f0f0f0f0 f0f0f0f0 f0f0f0f0
1b3fae94 f0f0f0f0 f0f0f0f0 f0f0f0f0 f0f0f0f0
1b3faea4 f0f0f0f0 f0f0f0f0 f0f0f0f0 f0f0f0f0
1b3faeb4 f0f0f0f0 f0f0f0f0 f0f0f0f0 f0f0f0f0
- 查询 esi 中对象的内存信息,可以看到动态申请的对象的堆空间的大小为 380h,这个堆空间就是申请名为 evil 的 ToolButton 对象时的堆空间,由于这时堆空间已经被释放,故触发异常
0:000> !heap -p -a esi
address 1b3fae54 found in
_HEAP @ 6da0000
HEAP_ENTRY Size Prev Flags UserPtr UserSize - state
1b3fae10 0071 0000 [00] 1b3fae18 00380 - (free)
0x04 总结
- 通过分析恶意 PDF 文档中的 JS 代码,和调试异常触发点可以发现漏洞触发的原因和过程,首先创建了一个 ToolButton 对象 evil,之后创建了一个子对象 xxx,然后创建了一个孙对象用于销毁 evil 对象,并且覆盖被销毁对象 evil 的内存空间, 唯一的美中不足的是该恶意样本覆盖释放后的内存空间是并没有覆盖的精确,所以虚表指针覆盖的值为 f0f0f0f0,和导致使用堆喷射的 ROP + ShellCode 代码连接不上,无法执行任意代码,所以要么修改 PDF 恶意脚本使之精确覆盖释放后对象的内存地址,要么使用堆喷射将 ROP + ShellCode 代码喷射到 f0f0f0f0 处,由于更改 PDF 中的 JS 代码比较复杂,超出了 UAF 漏洞讨论范围,所以之后有时间在研究
CVE-2013-3346 的分析到此结束,如有错误,欢迎指正
参考资料:0day安全:软件漏洞分析技术 + 漏洞战争
CVE-2013-3346:十全九美的 Adobe Reader ToolButton UAF 漏洞的更多相关文章
- Ubuntu 12.04安装Adobe Reader
原本从Adobe 官方网站下载了 Adobe Reader, 是个rpm包,先用agt-get 装了rpm(sudo apt-get install rpm), 一安装(rpm -ivh AdobeR ...
- Adobe Reader/Acrobat修改页面底色为豆沙绿
Adobe Acrobat_Pro_8修改PDF页面底色为豆沙绿保护视力(同样适用于Adobe Reader) http://jingyan.baidu.com/article/9989c746189 ...
- 给Adobe Reader添加书签功能
Adobe Acrobat Professional和Adobe Reader都是Adobe公司的产品.前者用来编辑制作PDF文档,后者只能用来阅读PDF.令人郁闷的是Adobe Reader中虽然有 ...
- 在Adobe Reader中保存PDF表单数据的方法
通常,Adobe Reader 用户填写表单后,是无法保存所填表单的副本的.但是,对于 Reader 8 和更高版本的用户,您可以扩展其权限,使他们可以完成此操作.如果您使用的是 Acrobat Pr ...
- adobe reader安装完成之前被中断,错误代码150210解决方法
adobe reader安装完成之前被中断,错误代码150210解决方法出现这种情况是因为之前安装过adobe reader但是没有卸载删除干净进而导致重新安装时无法安装.为什么卸载不了大多数是因为3 ...
- Ubuntu安装Adobe Reader
到 这里依次选择最新版本的Adobe Reader,我选择目前最新的 9.5.5版本的,下载下来后,双击选择dep包,启动软件中心进行安装,中间会提示软件包欠佳,选择" ...
- Ubuntu下安装PDF 文档阅读器Adobe Reader 9.5.5
由于没有PPA所以我们必须在Adobe的官方FTP上下载安装,下面的方法同时适用于32位和64位系统: wget ftp://ftp.adobe.com/pub/adobe/reader/unix/9 ...
- JS检测浏览器Adobe Reader插件
Web应用中当我们希望向用户显示pdf文档时候,如果用户安装了Adobe Reader之类的pdf阅读器,就可以直接打开文档在浏览器中显示, 但是,当用户没有安装这类软件的时候,自然是打不开的,为了系 ...
- Adobe® Reader®.插件开发
Thank you for your interest in developing a plug-in for Adobe® Reader®. To build an Adobe Reader plu ...
随机推荐
- 九. SpringCloud Stream消息驱动
1. 消息驱动概述 1.1 是什么 在实际应用中有很多消息中间件,比如现在企业里常用的有ActiveMQ.RabbitMQ.RocketMQ.Kafka等,学习所有这些消息中间件无疑需要大量时间经历成 ...
- JAVA多线程与锁机制
JAVA多线程与锁机制 1 关于Synchronized和lock synchronized是Java的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码 ...
- Linux下找出吃内存的方法总结
Linux下查询进程占用的内存方法总结,假设现在有一个「php-cgi」的进程 ,进程id为「25282」. 现在想要查询该进程占用的内存大小.linux命令行下有很多的工具进行查看,现总结常见的几种 ...
- 微服务分布式事务之LCN、TCC
在亿级流量架构之分布式事务解决方案对比中, 已经简单阐明了从本机事务到分布式事务的演变过程, 文章的最后简单说明了TCC事务, 这儿将会深入了解TCC事务是原理, 以及理论支持, 最后会用Demo举例 ...
- 开源的 Switch 模拟器——GitHub 热点速览 v.21.12
作者:HelloGitHub-小鱼干 脸滚键盘操作选手小鱼干这里要推荐一个超酷 Switch 模拟器,不能埋没你的游戏天赋.Ryujinx 是一个 C# 写的 Switch 模拟器,1700+ 游戏可 ...
- [图论]最优布线问题:kruskal
最优布线问题 目录 最优布线问题 Description Input Output Sample Input Sample Output Hint 解析 代码 Description 学校有n台计算机 ...
- [Fundamental of Power Electronics]-PART I-6.变换器电路-6.4 变换器评估与设计/6.5 重点与小结
6.4 变换器评估与设计 没有完美适用于所有可能应用场合的统一变换器.对于给定的应用和规格,应该进行折中设计来选择变换器的拓扑.应该考虑几种符合规格的拓扑,对于每种拓扑方法,对比较重要的量进行计算,比 ...
- 这样介绍Ribbon,从此任何问题也难不住你
Springcloud的核心组件之Ribbon 上篇文章详细介绍了springcloud的注册中心Eureka,那么这篇文章则会介绍springcloud的另外一个组件Spring Cloud Rib ...
- H5 端 rem 适配方案与 viewport 适配
H5 端 rem 适配方案与 viewport 适配 rem rem 是 CSS3 新增的一个相对单位(root em,根 em) 只根据当前页面 HTML 页面的 font-size 设置,如果根目 ...
- 前端面试回顾(1)---javascript的面向对象
前言 前一阵面试,过程中发现问到一些很基础的问题时候,自己并不能很流畅的回答出来.或者遇到一些基础知识的应用,由于对这些点理解的不是很深入,拿着笔居然什么都写不出来,于是有了回顾一下这些基础知识的想法 ...