欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

CVE-2018-4990 Adobe Reader代码执行漏洞利用分析

来源:本站整理 作者:佚名 时间:2018-06-01 TAG: 我要投稿

2018年5月15日,ESET发布文章“A tale of two zero-days”,该文章披露了今年3月ESET在恶意软件扫描引擎(VirusTotal)上捕获了一个用于攻击测试的 PDF文档。该PDF文档样本包含两枚0-day漏洞(CVE-2018-4990,CVE-2018-8120)以实现针对Adobe Acrobat/Reader PDF阅读器的任意代码执行。其中CVE-2018-4990为Adobe PDF阅读器的代码执行漏洞,而CVE-2018-8120则是Windows操作系统Win32k的内核提权漏洞,在获取代码执行权限后通过内核提权漏洞绕过Adobe PDF阅读器的沙盒保护,实现任意代码执行。
漏洞利用回溯分析
360威胁情报中心分析确认披露的漏洞可被利用,在本文中我们试图通过公开的POC样本中针对Adobe Acrobat/Reader代码执行的漏洞(CVE-2018-4990)利用过程进行详细分析,并记录整个分析过程。如有分析不当之处敬请谅解。
分析环境
操作系统:Windows 7 SP1
AdobeReader DC:1700920044
样本MD5:bd23ad33accef14684d42c32769092a0
Payload功能解析
使用PDFStream打开漏洞样本,在尾部可以发现使用了JavaScript来触发利用漏洞:

通过分析可知,JavaScript中的前部分为PDF阅读器漏洞触发后加载运行的载荷,主要用于提权并执行恶意代码。而之后的JavaScript代码中则通过两个Array实例sprayarr及a1来实现内存Spray布局,这里需要注意的是a1对Array中奇数下标的element进行了释放,这是UAF类漏洞利用中常见的一种内存布局手法:

内存部署成功之后,接着在myfun1,myfun2中调用了两次触发double free的脚本,该脚本代码触发了double free,从而导致后来的代码执行,触发double free的脚本:
varf1 = this.getField("Button1");   
最后对array实例sprayarr2进行赋值,每个element为一个长度为0×20000-0×24的ArrayBuffer,接着遍历sprayarr可以发现其对应的某一个sprayarr的element长度被修改为了0×20000-0×24(默认的长度为0×10000-0×24),此时通过超长的sprayarr[i1]即可修改相邻的sprayarr[i1+1]对象的len长度属性,从脚本代码中可以看到长度被修改为了0×66666666,最终通过该超长的sprayarr[i1+1]即可实现全内存的读写:

为此攻击者编写了专门的利用超长sprayarr对象实现全内存读写的函数:

获取全内存读写能力后,POC中通过伪造bookmarkRoot的对象实现代码执行:

POC运行之后会导致崩溃:

崩溃的原因为objecscript地址为硬编码,其中0x23A59BA4-0×23800000的地址并不适配测试的Adobe Reader版本,从而导致崩溃:

通过对POC中的Payload功能解析,我们确定了POC中的几个需要分析的要点,这也是搞清楚整个漏洞利用的关键:
l sprayarr,a1在进行内存spray时的内存结构
l 触发double free的代码具体分析(var f1 = this.getField(“Button1″);)
l sprayarr2初始化时的内存状态,其初始每个element长度正好是sprayarr中超长element的长度,这不禁让我们怀疑sprayarr2和某个sprayarr重合了(或许是第二点中的代码将sprayarr中的某个element释放了?然后被sprayarr2重用?)
脚本分析及调试
带着Payload功能解析中得出了漏洞利用关键点我们开始逐一进行调试分析。
如何分析相关内存结构
样本中具体的漏洞触发/利用部分都是JavaScript脚本,因此调试的时候我们可以依赖对应的三角函数实现具体的中断。为了获取对应的内存结构,我们可以直接修改对应POC,比如在POC中创建一个Array的实例myContent,将该Array中第0个element赋值为0x1a2c3d4f,以便于内存搜索,之后分别将我们感兴趣的变量赋值到该Array中即可很方便的定位内存 进行分析:

通过上述的三角函数断下后,此时通过搜索0x1a2c3d4f即可找到对应的myContent结构,如下所示地址0x062035f8开始的数据则为对应的tag(标记为0x1a2c3d4f),之后的四字节值0xffffff81标记该element的type类型,再往后依次为我们赋值的element,由于都是Array,所以type均为0xffffff87:

[1] [2] [3] [4] [5]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载