# Hacking Team Android Browser Exploit代码分析

Author: 乌云历史资料库 (@wooyun_archive)
Published: 2015-07-10T09:48:00Z
Canonical: https://wepostx.com/topics/892

> 乌云历史资料归档
>
> **原始作者：** 腾讯安全中心
> **原始编号：** superkieran-wooyundrops:632
> **原始发布时间：** 2015-07-10 17:48
> **声明：内容仅用于技术研究和个人使用，版权归 wooyun.org。**

---

# 0x00 前言

Hacking Team 415G泄露资料的vector-exploit-master\src\ht-webkit-Android4-src目录中，包含一份Android Browser exploit代码。用户在浏览器中点击攻击者的链接，便会执行恶意代码。恶意代码利用漏洞获取root权限，并静默安装木马apk。影响Android4.0-4.3版本。

# 00x1 漏洞利用的艺术

Exploit代码利用了三个已知的libxslt漏洞，获得对内存地址的完整控制能力。

- information leak ([CVE-2011-1202](https://code.google.com/p/chromium/issues/detail?id=73716))。

- Arbitrary memory read ([CVE-2012-2825](https://code.google.com/p/chromium/issues/detail?id=127417))

- Heap-buffer-overflow ([CVE-2012-2871](https://code.google.com/p/chromium/issues/detail?id=138673))
关键流程：

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

# 00x2 利用分析

1 申请330块1M大小的内存，并给每一块内存区域打上标记（0x70747468，‘HTTP’）。

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

2 进行内存搜索，利用CVE-2012-2825可以检查任意内存地址是否为0x70747468（’HTTP’）的能力，找出第一步的标记内存，得到标记内存所在的地址。这里查找内存的时候涉及一个技术细节。

```text
When parsing a XSLT stylesheet containing a DTD, a structure of type xmlEntity is accessed as another type. The value of cur->ns->href is then compared with a string(“http://www.w3.org/1999/XSL/Transform"). If not equal, return null.
```

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

将ns->href和ns->prefix的值改为addr，然后利用二分法在[0x7a703030, 0x79303030]这块内存空间遍历addr，如果找到"http://www.w3.org/1999/XSL/Transform"，会返回一个正确的documentElement。

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

由于这块地址在第一步中已经申请。这块内存我们知道地址并可以随意使用，这一步很关键。可控制的内存约4MB，称为ZoneX。
3 精心修改ZoneX，利用CVE-2011-1202泄漏堆对象的地址和CVE-2012-2871写特定内存地址为特定值的能力，把ZoneX标记为已释放，但JS仍然有读写的能力。

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

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

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

这一过程相当复杂，暂且跳过。
4 立即申请大量新的ArrayBuffer覆盖ZoneX，由于JS仍然有读写ZoneX的能力，可以马上修改一块符合条件的ArrayBuffer的起始地址为0x00000000，结束地址为0xFFFFFFFF，即整个内存区域。

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

5 利用BufferMemoryObject对象，封装对内存地址的操作，至此JS已经得到整个RING3内存的完整读写能力。

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

6 下载小马module.so

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

7 结合CVE-2011-1202信息泄漏漏洞，获得libwebcore.so的基址进而获得libc.so的基址。

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

然后在libc和libwebcore中搜索可用的gadget。

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

8 操作内存，覆盖JS对象的虚表，构造假的vtable完成两个gadget的拼接。并使用ROP攻击手法，通过mprotect给堆上的shellcode代码执行的权限，并将执行流程跳转到真正的shellcode。

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

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

9 shellcode中激活已经下载好的小马module.so；

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

10 接下来小马下载ROOT提权程序（exploit，ELF）获取ROOT权限；并留下一个shell /system/bin/rilcap，过程和rcs完全一致。

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

用IDA打开小马，发现其使用了Obfuscator-clang对代码进行了混淆。

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

所涉及的两种root方法，第一种是put_user，另一种是towel。
11 随后，小马在ROOT权限下静默安装黑客指定的木马程序。ALL DONE。

# 00x4 总结

从三个POC到一套完整的远程代码执行exploit，是一个复杂而艰难的过程。Hacking Team 的exploit演绎相当之精彩，不得不说是漏洞利用的艺术。从远程代码执行，到下载rcs远程控制客户端，Hacking Team构建了一条完整的黑色链条。看完之后，各位看官会不会和小编一样，背后吓出了一身冷汗。Android Browser Exploit仅仅是Hacking Team泄漏资料中的一个项目，其中的技术点便相当复杂。其所泄漏的项目，不仅包括源代码，还包括大量工程化的工具以及技术文档。仅需简单地配置和修改即可自动化生成黑客工具，很容易被不法分子利用。可想而知，这将大大降低黑产的技术门槛。黑产水平将在短时间内显著提升。守护用户安全之路将任重而道远。

## Replies
