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

关于CVE-2018-4901的研究

来源: 作者: 时间:2019-02-24 19:29 点击: 我要投稿
广告位API接口通信错误,查看德得广告获取帮助

上个周末在 FreeBuf 上看到Adobe Acrobat Reader中存在远程代码执行漏洞 这篇文章后,决定自己尝试去复现一下这个漏洞,至少能弹个计算器吧,结果一些事情出乎意料,这里把自己的研究过程写下来。
1. POC构造
根据国外的一篇文章 talos 中介绍,漏洞原理是在 pdf 中 trailer 内部的ID字段如果过长,在执行JavaScript脚本this.docID的时候会触发漏洞,漏洞模块位于一个dll文件EScript.api中。那么,是应该先构造javaScript还是先构造trailer后面的ID呢?javaScript我是通过Acrobat Pro DC添加上去,如果先构造trailer,那么会被Acrobat Pro DC修复,所以先构造javaScript。另外,最初的文档怎么才能包含trailer呢?说实话之前并不熟悉pdf文件格式,在进行了很多尝试之后,发现使用wps将空白doc文档转化为pdf之后,文档很简洁,并且包含有trailer。那么流程就很清晰了:
1.1 生成包含trailer的pdf


1.2 javaScript的构造
使用Acrobat Pro DC编辑刚刚生成的文件,使用javaScript工具,在保存pdf文件的这个动作的时候添加javaScript命令this.docID即可。


1.3 trailer的构造
在保存上面的文档后,使用notepad打开文档,将trailer后面的ID改为 ,需要更改的地方有两处。


1.4 poc效果
注意前面构造的javaScript是在保存文档的时候触发,但是如果开启沙盒,保存文档时就总是弹出另存为进而无法触发漏洞,所以要先设置Adobe,ADOBE 保存PDF文件,总是弹出另存为的解决办法
测试:在文档中添加注释,然后点击保存,Adobe崩溃,模块为EScript.api


2. 调试分析
2.1 崩溃原因
使用OD载入AcroRd32.exe,并打开文档,之后就在模块中就可以看到EScript,根据TALOS的那篇文章,在其中搜索触发漏洞的代码。


这段代码简单的说就是,我们构造的样本中ID的字符串已经被转化为16进制数了,hexStr(“AAAAAA..”) -> hexArray(0xAA 0xAA….),而触发漏洞的这一块是将hexArray(0xAA 0xAA….)又转为hexStr(“AAAAAA..”) .

但是漏洞具体是如何触发的需要结合动态调试,在循环开始出下断点,和之前触发崩溃的方式进行相同的操作,程序会断在断点处,可以获得如下图所示的初始信息。

一开始,edx指向hexStr,edi指向hexArray,并且hexStr的首地址就在hexArray首地址上方0×100的地方。esi是循环的次数。
具体看看每一项的数据的情况:
hexStr是目的地,也就是它没过返回地址;
hexArray很奇怪,只有0×80个0xAA,我们传入了0×200个‘A’,那么理应由0×100个0xAA;
esi是循环次数,值为0×100,正好符合我们的预期。
假如没有啥保护机制,我们要淹没的返回地址是0x2Bc8c8处的0x693a3168

进一步观察,0×80个0xAA正好转化为0×100个‘A’,那么执行0×80次,就应该会到hexArray首地址之前了。这里下一个条件断点,让它执行0×80次

[1] [2]  下一页

上个周末在 FreeBuf 上看到Adobe Acrobat Reader中存在远程代码执行漏洞 这篇文章后,决定自己尝试去复现一下这个漏洞,至少能弹个计算器吧,结果一些事情出乎意料,这里把自己的研究过程写下来。
1. POC构造
根据国外的一篇文章 talos 中介绍,漏洞原理是在 pdf 中 trailer 内部的ID字段如果过长,在执行JavaScript脚本this.docID的时候会触发漏洞,漏洞模块位于一个dll文件EScript.api中。那么,是应该先构造javaScript还是先构造trailer后面的ID呢?javaScript我是通过Acrobat Pro DC添加上去,如果先构造trailer,那么会被Acrobat Pro DC修复,所以先构造javaScript。另外,最初的文档怎么才能包含trailer呢?说实话之前并不熟悉pdf文件格式,在进行了很多尝试之后,发现使用wps将空白doc文档转化为pdf之后,文档很简洁,并且包含有trailer。那么流程就很清晰了:
1.1 生成包含trailer的pdf

无奈人生安全网
1.2 javaScript的构造
使用Acrobat Pro DC编辑刚刚生成的文件,使用javaScript工具,在保存pdf文件的这个动作的时候添加javaScript命令this.docID即可。


1.3 trailer的构造
在保存上面的文档后,使用notepad打开文档,将trailer后面的ID改为 ,需要更改的地方有两处。


1.4 poc效果
注意前面构造的javaScript是在保存文档的时候触发,但是如果开启沙盒,保存文档时就总是弹出另存为进而无法触发漏洞,所以要先设置Adobe,ADOBE 保存PDF文件,总是弹出另存为的解决办法 内容来自无奈安全网
测试:在文档中添加注释,然后点击保存,Adobe崩溃,模块为EScript.api


2. 调试分析
2.1 崩溃原因
使用OD载入AcroRd32.exe,并打开文档,之后就在模块中就可以看到EScript,根据TALOS的那篇文章,在其中搜索触发漏洞的代码。


这段代码简单的说就是,我们构造的样本中ID的字符串已经被转化为16进制数了,hexStr(“AAAAAA..”) -> hexArray(0xAA 0xAA….),而触发漏洞的这一块是将hexArray(0xAA 0xAA….)又转为hexStr(“AAAAAA..”) . 本文来自无奈人生安全网

但是漏洞具体是如何触发的需要结合动态调试,在循环开始出下断点,和之前触发崩溃的方式进行相同的操作,程序会断在断点处,可以获得如下图所示的初始信息。

一开始,edx指向hexStr,edi指向hexArray,并且hexStr的首地址就在hexArray首地址上方0×100的地方。esi是循环的次数。
具体看看每一项的数据的情况:
hexStr是目的地,也就是它没过返回地址;
hexArray很奇怪,只有0×80个0xAA,我们传入了0×200个‘A’,那么理应由0×100个0xAA;
esi是循环次数,值为0×100,正好符合我们的预期。
假如没有啥保护机制,我们要淹没的返回地址是0x2Bc8c8处的0x693a3168
无奈人生安全网
进一步观察,0×80个0xAA正好转化为0×100个‘A’,那么执行0×80次,就应该会到hexArray首地址之前了。这里下一个条件断点,让它执行0×80次

本文来自无奈人生安全网

[1] [2]  下一页

www.wnhack.com

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