Local privilege escalation for OS X 10.11.6 via PEGASUS

0x00 Introduction

Because of the PEGASUS apt issue on iOS, Trident exploit is very hot recently. From Lookout’s report, there are three vulnerabilities in the Trident exploit:

CVE-2016-4657: Visiting a maliciously crafted website may lead to arbitrary code execution.

CVE-2016-4655: An application may be able to disclose kernel memory.

CVE-2016-4656: An application may be able to execute arbitrary code with kernel privileges.

 

Although Lookout didn’t release the malware, Stefan Esser and Pangu still found the vulnerabilities of CVE-2016-4655 and CVE-2016-4656. Therefore, we can use these two vulnerabilities to achieve local privilege escalation for OS X 10.11.6 and jailbreak for iOS 9.3.4.

 

0x01 CVE-2016-4655 kernel info leak

Because XNU kernel doesn’t check the length of serialized OSNumber in the OSUnserializeBinary() function, we can create an OSNumber with a very long length:

    uint32_t data[] = {

    0x000000d3,                        

    0x81000001,                        

    0x08000004, 0x006e696d,

    0x84000200,    //change the length of OSNumber

    0x41414141, 0x41414141

  };

After sending the serialized OSNumber to the kernel, we can use io_registry_entry_get_property_bytes() to get the data back from the kernel:

Because we can control the length of returned data, we can get extra data from the kernel stack. Some useful information like function return address can help us to calculate the kernel slide and break the kalsr protection.

 

0x02 CVE-2016-4656 kernel UAF

For CVE-2016-4656, Stefan Esser introduced two ways to trigger the UAF vulnerability. We will use the sample way to exploit the kernel in this article.

 

We know that OSUnserializeBinary() supports OSString and OSSymbol as the keys for the dictionary and we can use an OSObject to point to an old key. However, the OSString key will be freed when it convents into an OSSymbol. Therefore, if we create an OSObject and point it to a freed OSString, it will trigger UAF in the kernel. Here is the crash point when the system wants to retain an OSObject that points to a freed OSString:

Therefore, we can create a crafted dictionary:

<dict>

<string>A</string>

<bool>true</bool>

<key>B</key>

<data>vtable data...</data>

<object>1</object>

</dict>

 

Then we send this crafted dictionary to the kernel, RIP will be set to the vtable entry at index 4 while RAX points to the start of the vtable.

For the ROP part, we can reuse the code of tpwn and rootsh to achieve local privilege escalation on OS X.

0x03 Running the Exploit

Here is the test environment: OS X EI Capitan 10.11.6 (15G31).

Note that if you want to test this exp, you should not install Security Update 2016-001 (like iOS 9.3.5 patch for PEGASUS). And I hardcoded a kernel address to calculate the kslide, it may be different on your mac.

Then we compile the exploit and run it:

clang -framework IOKit -framework Foundation -framework CoreFoundation -m32 -Wl,-pagezero_size,0 -O3 exp.m lsym.m -o exp

As you can see, our exploit got the root privilege successfully.

0x04 Summary

In this article, we introduced how to use CVE-2016-4655 and CVE-2016-4656 to achieve local privilege escalation on OS X 10.11.6.

Last but not least, the exploit source code can be downloaded at:https://github.com/zhengmin1989/OS-X-10.11.6-Exp-via-PEGASUS

 

0x05 Reference

1. http://blog.pangu.io/cve-2016-4655/

2. https://sektioneins.de/en/blog/16-09-02-pegasus-ios-kernel-vulnerability-explained.html

3. https://bazad.github.io/2016/05/mac-os-x-use-after-free/

4. https://github.com/kpwn/tpwn

时间: 2024-11-10 00:22:12

Local privilege escalation for OS X 10.11.6 via PEGASUS的相关文章

Local Privilege Escalation for macOS 10.12.2 and XNU port Feng Shui

0x00 Introduction From yalu 10.2, we could learn lots of new exploit techniques especially the XNU port feng shui and kpp bypass. In this article, we discuss the technique detail about XNU port feng shui and transform this technique to macOS to gain

CocoaPods的安装(图文并茂)OS X 10.11 系统

先给一个挺不错的关于CocoaPods的安装和使用的简书博客(点击图片就能跳转网页): 这篇博文在CocoaPods的安装使用方面还是很全面的,不过还是有是有欠缺的地方,这个欠缺的地方主要原因就是苹果系统的更新,更新到EI Capitan,相关的目录换了 这里主要的就是旧版本的系统的/usr/bin安装目录,现在变成了/usr/local/bin.而默认通过终端的install目录是下载相关文件到/usr/bin.所以 <CocoaPods的安装使用和常见问题>中有一个步骤需要注意,这个注意也

OS X 10.11怎么样

  刚刚结束的WWDC15上,苹果正式将OS X Yosemite升级到OS X 10.11,而新的10.11系统以OS X El Capitan命名. 从苹果正式开发Mac升级OS X 10.10 Yosemite到现在已经有7个多月的时间了,而最新的OS X 10.11 EI Capitan公布后,开发者将在今天WWDC结束后陆续收到这版产品的测试版.而这款产品的公共测试版将在今年7月推出,而大众消费者将在今年秋季获得正式版的更新推送. 一如既往 雕琢的细节体验 苹果是一个注重体验的公司,而

WatchOS 2和OS X 10.11第四个测试版怎么样

  除了iOS9 beta4之外,苹果今天还面向开发者发布了OS X 10.11 ElCapitan和watchOS 2第四个测试版. 距离第三个测试版发布相隔两周,苹果今天向开发者发布了watchOS 2和OS X 10.11 ElCapitan第四个测试版.苹果在今年6月举行的WWDC上首次发布watchOS 2和OS X El Capitan. watchOS 2第四个测试版编译号为13S5305d,watchOS 2需要iOS9,并可以通过iPhone上的Apple Watch应用完成更

OS X 10.11.2 beta4怎么样

  OS X El Capitan已经推出了4个测试版本了,正式版相信很快就会出来. 想必今天凌晨有不少果粉都坐在电脑前期盼着iOS9.2系统的又一次更新,作为目前优化得比较完善的一个版本,iOS9.2受到了许多人的喜爱.不过这次苹果没有按照之前更新频率放出新的iOS测试版,而是推出了OS X El Capitan 10.11.2 beta4. 在升级了第四个测试版后,OS X El Capitan新build为15C47a.对于那些想要升级体验的用户,不管你是开发者测试版,或者是公共测试版,现

OS X 10.11.5值得升级吗?

  苹果昨天将OS X El Capitan升级到了10.11.5版本,从官方更新日志来看,本次更新并没有带来什么新功能,苹果只注明修复漏洞以及提升系统稳定性.安全机构LANDESK旗下产品经理Stephen Brown在其体验报告中表示,最新发布的OS X 10.11.5一共修复了67个系统漏洞. Brown 表示,本次更新最具意义的其中一点就是 QuickTime 漏洞的修复.因为在没有修复漏洞之前,用户很容易在浏览社交网站时被一些很有诱惑力的标题所引诱,然后点击网站上的不明视频文件,最终就

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

iOS冰与火之歌(番外篇)  基于PEGASUS(Trident三叉戟)的OS X 10.11.6本地提权 蒸米@阿里移动安全 0x00 序 这段时间最火的漏洞当属阿联酋的人权活动人士被apt攻击所使用的iOS PEGASUS(又称Trident三叉戟)0day漏洞了.为了修复该漏洞,苹果专门发布了一个iOS 9.3.5版本.这个漏洞的厉害之处在于可以直接从沙盒内对内核进行攻击(无需沙盒逃逸),并且同时影响iOS(9.3.4)和OS X (10.11.6).因此,本篇文章将会从PEGASUS漏洞

CocoaPods的使用(图文并茂)OS X 10.11 系统

要使用CocoaPods,那么就需要先安装哦,你安装了么?如果没安装那就请阅读我的前篇<OS X 10.11 CocoaPods的安装(图文并茂)>. 如果安装好了,那么就接着阅读这篇博文吧. 1.新建一个Xcode工程,然后进入工程根目录: 2.然后如果要使用CocoaPods向这个工程添加需要的框架类库,比如我要添加Facebook开源的Pop动画框架,首先 最好事先关掉已经打开的XCode工程,虽然没有什么大碍,总之先关掉比较好,因为后面要重新打开. 3.然后在这个根目录下,新建一个空文

OS X 10.11 中的安全删除文件

在 OS X 10.11 中安全倾倒垃圾桶这个功能已经被取消了.是因为 SSD 闪存硬盘的原因 . 安全删除操作并不能安全清除. 所以就直接取消了. 但是其实其实还是可以在系统内使用安全删除功能的. 保证删除的文件安全,减少被数据恢复的风险. 需要使用 srm 这个命令. srm -v 是安全删除文件 srm -rv 是安全删除目录 然后打开终端然后输入命令后 空格, 将要安全删除的文件或者目录拖拽到终端窗口再确认即可.