# CVE-2015-5090漏洞利用

Author: 乌云历史资料库 (@wooyun_archive)
Published: 2015-07-22T05:59:00Z
Canonical: https://wepostx.com/topics/914

> 乌云历史资料归档
>
> **原始作者：** mssp299
> **原始编号：** superkieran-wooyundrops:652
> **原始发布时间：** 2015-07-22 13:59
> **声明：内容仅用于技术研究和个人使用，版权归 wooyun.org。**

---

原文地址：http://h30499.www3.hp.com/t5/HP-Security-Research-Blog/Adobe-s-CVE-2015-5090-Updating-the-Updater-to-become-the-bossman/ba-p/6765412

# 0x01 前言

2015年7月，Adobe修补了多个漏洞，其中CVE-2015-5090格外显眼，值得深究。但是，Adobe对于这些漏洞只是根据威胁程度进行了排名，并没有给出详情。事实上，攻击者可以利用这个bug以系统权限用来执行代码，即攻击者能够完全接管目标机器。因为这个漏洞影响的是Adobe的更新服务，也就是说，该漏洞同时存在于Adobe Reader和Acrobat Pro软件中。这两个程序都会安装ARMSvc服务（更新程序），并且都把 AdobeARM.exe/AdobeARMHelper.exe存放在c:\progra~1\common~1\Adobe\ARM\1.0目录下面。
我们这里的漏洞利用方法是针对acrobat.exe的，不过，稍作修改也是可以用于Reader的。下面的视频，为大家演示了这个漏洞的利用过程。

# 0x02 Bug信息

ARMSvc.exe支持多个由IDA中的HandlerProc函数定义的用户控件：

![原文图片](/media/2016/06/9fb46d220210e1e693064af39fbeee33)

图1 Handler函数
UserControls的内部代码：

![原文图片](/media/2016/06/35dba5552554c2082c67ae646bfc26ef)

图2 控件
对于该漏洞利用来说，我们主要感兴趣的地方在于：
170——创建一段共享内存。
179——执行ELEVATE，而ELEVATE又会使用共享内存中的参数来执行AdobeARMHelper.exe。
用户控件170的问题在于它创建了一个带有弱权限的共享内存段。 由于任何用户都能读写该共享内存段，这就意味着，攻击者能够控制传递给AdobeARMHelper.exe程序的参数。
通过观察AdobeARMHelper.exe，我们发现了例程sub_42A260，这个例程可用来寻找给定目录下面的第一个文件。之后，它会检查该文件是否带有Adobe的签名，如果是的话，sub_42A260就会把这个文件复制到AdobeARM.exe程序所在的目录下面。

![原文图片](/media/2016/06/806cb35898d290370f4d57de27f6b9d7)

图3 签名校验
如果签名校验失败，该例程将退出：

![原文图片](/media/2016/06/c96fc235db99a9ce396d0b41f2adb43c)

图4 签名校验失败
如果通过了签名校验，该例程就会拷贝该文件：

![原文图片](/media/2016/06/8a506b1cf2e2d3ff41613e026a7460ec)

图5 签名校验成功
该函数没有考虑到以下几点：

- 没有对存放被复制的文件的目录路径进行检查。这样，攻击者就能提供自己的路径，即把这个文件复制到攻击者指定的路径下面。

- 找到第一个文件的时候，没有检查文件名。

- 第一个文件被发现时，没有检查文件的扩展名。
函数DOES会进行下列检查：

- 在指定文件夹下面找到的第一个文件是否带有Adobe的签名。利用方法：
我们能够做什么：

- 控制SM传递给AdobeARMHelper/AdobeARM的参数。

- 在需要的时候以系统权限来执行AdobeARM.exe。

- 利用任何具有Adobe 签名的文件来覆盖AdobeARM.exe。
我们需要做什么：

- 让无Adobe签名的代码也能执行。
策略：
为了利用这个bug，我们可以用具有Adobe签名的代码来覆盖AdobeARM.exe，并通过这些代码做一些有趣的事情。
例如，arh.exe是Adobe AIR的安装包装器。理论上，我们可以用arh.exe覆盖AdobeARM.exe，这是完全允许的，因为它也有Adobe的签名。之后，我们就可以通过arh.exe安装任意的AIR应用程序了。这个策略唯一的问题在于，arh.exe不允许向其传递参数，所以，我们无法直接通过SM向其传递参数。
最好的策略是，利用某个可以向其传递额外参数的、带有签名的二进制代码来覆盖AdobeARM.exe。利用方法：
如果我们仔细考察Acrobat Pro就会注意到，它含有一个名为AcrobatLauncher.exe的二进制程序，该程序允许通过指定的PDF文件来启动Acrobat.exe。AcrobatLauncher.exe是个好东西，因为它只会忽略额外的参数，并且既不支声，也不会退出。 具体的命令行参数为 AcrobatLauncher.exe -open PDF_FILE。

# 0x03 攻击链

- 触发SM。

- 给SM写参数。

- 触发用户控件ELEVATE，把AcrobatLauncher.exe（作为AdobeARM.exe）复制到c:\progra~1\common~1\Adobe\ARM\1.0\AdobeARM.exe。这基本上把更新程序覆盖掉了。

- 运行新的adobearm.exe，它将通过我们的PDF漏洞利用代码来执行acrobat.exe程序。这一步是由ELEVATE控件自动完成的。

- PDF漏洞利用代码会把32.dll转储到c:\progra~1\common~1\Adobe\ARM\1.0目录下。这是通过我们的一种JavaScript旁路技术完成的。

- 清除临时文件夹，这样再次调用ELEVATE时，adobearmhelper.exe就不会从临时文件夹中复制到任何东西了。

- 重写SM，这样，它就会执行我们的新AdobeARM.exe，而不会做任何的修改了。

- 再次执行ELEVATE，这样就会只用“-open”一个选项来执行AdobeARM.exe，以加载secur32.dll，并以SYSTEM身份弹出计算器。
从中可以看出，CVE-2015-5090为攻击者提供了一种非常可靠的方法使其可以系统权限运行代码。所以，如果你正在使用Adobe Reader 或Acrobat Pro的话，务必给这个漏洞打上补丁。此外，如果你想了解第5步中的JavaScript旁路技术的更多详情的话，请关注我们即将到来的Defcon演讲。我们拉斯维加斯见！

## Replies
