首页
社区
课程
招聘
[转帖]iOS冰与火之歌(番外篇) – 基于PEGASUS(Trident三叉戟)的OS X 10.11.6本地提权
发表于: 2016-9-27 13:55 5230

[转帖]iOS冰与火之歌(番外篇) – 基于PEGASUS(Trident三叉戟)的OS X 10.11.6本地提权

2016-9-27 13:55
5230

原文链接:51bK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3c8J5L8%4m8K6i4K6u0W2N6$3W2C8K9g2)9J5c8X3W2F1k6r3g2^5i4K6u0W2M7r3S2H3i4K6u0r3x3U0l9I4y4W2)9J5c8U0l9&6i4K6u0r3x3U0N6Q4x3V1k6A6L8%4y4Q4x3V1j5`.
PDF版本:
iOS冰与火之歌(番外篇) – 基于PEGASUS(Trident三叉戟)的OS X 10.11.part1.rar
iOS冰与火之歌(番外篇) – 基于PEGASUS(Trident三叉戟)的OS X 10.11.part2.rar
iOS冰与火之歌(番外篇) – 基于PEGASUS(Trident三叉戟)的OS X 10.11.part3.rar

Author:蒸米@阿里移动安全

0x00 序

这段时间最火的漏洞当属阿联酋的人权活动人士被apt攻击所使用的iOS PEGASUS(又称Trident三叉戟)0day漏洞了。为了修复该漏洞,苹果专门发布了一个iOS 9.3.5版本。这个漏洞的厉害之处在于可以直接从沙盒内对内核进行攻击(无需沙盒逃逸),并且同时影响iOS(9.3.4)和OS X (10.11.6)。因此,本篇文章将会从PEGASUS漏洞形成的原因开始分析,然后一步一步教大家写出OS X上利用PEGASUS提权的攻击代码。

《iOS冰与火之歌》这一系列文章的目录如下:

Objective-C Pwn and iOS arm64 ROP
在非越狱的iOS上进行App Hook(番外篇)
App Hook答疑以及iOS 9砸壳(番外篇)
利用XPC过App沙盒
UAF and Kernel PWN
基于PEGASUS(三叉戟)的OS X 10.11.6本地提权 (番外篇)
另外文中涉及代码可在我的github下载: fbfK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6*7K9r3g2F1k6$3#2A6L8U0p5&6z5o6W2Q4x3V1k6A6e0#2y4Q4y4h3k6u0b7@1g2Q4y4h3k6m8e0V1c8Q4y4h3k6r3d9g2u0q4

0x01 漏洞分析

PEGASUS(三叉戟)实际上是由三个漏洞组成,分别是:

CVE-2016-4657:Safari的Webkit内核上的内存破坏漏洞。

CVE-2016-4655:内核信息泄露漏洞,可用于绕过KASLR。

CVE-2016-4656:内核UAF漏洞,可用于控制内核并执行任意代码。

关于CVE-2016-4657目前还没有公开的资料,但Stefan Esser和Pangu分别爆出了另外两个漏洞CVE-2016-4655和CVE-2016-4656的细节。利用已经曝光的这两个漏洞,其实已经可以做到iOS非完美越狱和OS X本地提权了。下面我们就来讲解一下这两个漏洞形成的原因以及如何利用。

0x02 CVE-2016-4655 内核信息泄露

CVE-2016-4655这个漏洞形成的原因是内核在序列化和反序列化OSNumber的时候没有验证长度的正确性。因此,如果我们将number的长度设置的非常长,并用io_registry_entry_get_property()去获取number数据的话,就会造成内核的信息泄露。

001.jpeg

我们知道内核栈中会保存函数的返回地址,因此我们可以利用这个返回地址去计算出内核的kslide,从而攻破kaslr的保护。

那么如何编写利用代码呢?我们先创建一个序列化后的dictionary。对内核来说,这个dictionary应该是这样的:

<dict>

<key>min</key>

<number>0x4141414141414141</number>

</dict>

但是我们对OSNumber的长度进行了修改,变成了0x200:

uint32_t data[] = {

0x000000d3,

0x81000001,

0x08000004, 0x006e696d,

0x84000200,    //change the length of OSNumber

0x41414141, 0x41414141

};

发送这个给内核后,内核在反序列化的时候就会出现错误。随后我们使用io_registry_entry_get_property_bytes()这个用户态函数就可以获取到内核返回的数据了。

002

因为我们修改了OS number的长度,所以返回的数据不光有我们发送给内核number,还有栈上数据,比如函数ret时候的返回地址-0xFFFFFF80003934BF。

003

通过这个地址我们就可以计算出来kslide了。

0x03 CVE-2016-4656 内核代码执行

CVE-2016-4656这个漏洞其实有两种触发UAF的方法,我们这里先讲比较简单的那一种(两种方法在Stefan Esser的文章中都有介绍)。简单UAF漏洞形成的原因是OSUnserializeBinary支持用OSString和OSSymbol来作为key,并且支持用OSObject去引用之前的key。但是OSString和OSSymbol不一样的地方在于,OSString key转换为OSSymbol的过程中OSString已经被free掉了,但这个OSString却被加入了对象列表里。

004

因此当我们OSObject类型去引用一个已经被释放了的OSString的时候,就会产生UAF崩溃:005

通过汇编崩溃的位置我们可以找到源码对应的位置是在341行创建OSObject对象的时候:

006

因此,如果我们能够在OSString被free的时候,立刻申请一段和OSString一样大小的内存并且构造好对应的vtable数据,当程序执行到OSObject创建的时候,内核就能成功的被我们控制。

那么如何编写利用代码呢?我们还是先创建一个序列化后的dictionary。对内核来说,这个dictionary应该是这样的:

<dict>

<string>A</string>

<bool>true</bool>

<key>B</key>

<data>vtable data…</data>

<object>1</object>

</dict>

内核随后会解析这个dictionary,正如我们之前分析的,OSString-”A”在创建完后就被free掉了,这时候,我们立刻创建OSSymbol-”B”以及和OSString-”A”大小相同的OSData,就可以在OSString-”A” free后重新控制这块内存,随后当内核使用OSObject引用OSString-”A”,并调用retain()函数的时候,其实就是在调用我们已经控制的vtable了。

0x04 利用ROP提权

首先我们先申请一块内存来放vtable和ROP chain,在OS X上有一种取巧的方法,如果我们是32位的程序的话,可以使用NULL page。因此,我们先用vm_allocate()申请到NULL Page,然后将vtable和ROP chain都保存在NULL page里:

007

随后在OS X上用rop提权的代码我们可以直接使用tpwn的:首先获得当前进程的ucred,然后将cr_svuid设置为0,最后用thread_exception_return退出进程。

008

0x05 测试EXP

编写完代码后,我们来尝试执行一下我们的exp。

首先说一下测试环境:Mac OS X EI Capitan 10.11.6 (15G31),在没有安装2016-01的security update的情况下(这时候内核相当于iOS 9.3.4,如果安装完2016-01 update就相当于iOS 9.3.5)。

009

接下来我们编译一下我们的exp:

clang -framework IOKit -framework Foundation -framework CoreFoundation -m32 -Wl,-pagezero_size,0 -O3 exp.m lsym.m -o exp
然后运行:

010

可以看到我们已经成功的获取了root权限。

0x06 总结

这篇文章介绍了如何利用PEGASUS(Trident三叉戟)做到内核信息泄露以及内核代码执行,然后利用rop获取root权限。另外,因为PEGASUS(Trident三叉戟)同时存在于iOS和OS X,有兴趣的同学可以在我们发布的攻击代码的基础上,尝试一下iOS攻击代码的编写。

基于PEGASUS(Trident三叉戟)的OS X 10.11.6本地提权exp的下载地址:

db6K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6*7K9r3g2F1k6$3#2A6L8U0p5&6z5o6W2Q4x3V1k6a6f1#2)9J5k6q4S2Q4x3X3b7I4x3q4)9J5k6e0p5I4i4K6u0W2y4W2)9J5k6p5g2^5M7q4)9J5k6s2k6A6j5g2)9J5k6q4m8q4c8@1q4e0g2g2x3`.

0x07 参考资料

e13K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0D9L8$3N6Q4x3X3g2H3j5h3&6Y4N6g2)9J5k6h3W2G2i4K6u0r3j5%4k6W2i4K6u0V1x3U0l9I4y4W2)9J5k6o6b7$3y4e0g2Q4x3V1j5`.
d92K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6K6k6h3E0@1K9h3!0F1k6h3W2F1M7#2)9J5k6h3c8W2i4K6u0r3k6h3&6Q4x3V1k6T1L8r3!0Y4i4K6u0r3x3e0k6Q4x3X3b7H3z5g2)9J5k6o6l9J5i4K6u0V1M7r3g2Y4j5i4y4#2M7#2)9J5k6r3W2G2M7#2)9J5k6r3E0W2M7X3&6W2L8q4)9J5k6s2k6#2L8r3&6W2M7X3q4T1K9h3I4A6N6s2W2Q4x3X3c8W2P5s2m8D9j5h3W2F1k6h3c8Q4x3X3g2Z5N6r3#2D9
694K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6T1j5i4A6S2k6q4)9J5k6h3N6A6N6r3S2#2j5W2)9J5k6h3W2G2i4K6u0r3x3U0l9I4y4W2)9J5c8U0l9#2i4K6u0r3L8h3q4U0i4K6u0V1L8%4y4Q4x3X3c8^5i4K6u0V1N6i4y4W2i4K6u0V1j5h3k6@1k6i4u0Q4x3X3c8X3M7X3g2W2i4K6u0r3
523K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6C8M7s2N6F1i4K6u0r3N6s2m8%4L8R3`.`.


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 3
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回