目录
  1. 1. 0x00 前言
  2. 2. 0x01 漏洞影响范围
  3. 3. 0x02 漏洞环境搭建
  4. 4. 0x03 漏洞复现
  5. 5. 0x04 PoC实现流程
  6. 6. 0x05 漏洞原理
  7. 7. 0x06 总结
    1. 7.1. 参考:
CVE-2019-8647 iMessage远程无交互触发iOS漏洞复现

*郑重声明:本文展示的攻击过程是在模拟环境中进行的。文中涉及的漏洞原理和攻击方法,只为交流学习之用。如有人用于非法用途,产生的后果笔者不负任何责任。

由于本人水平有限,不足之处还请大家多多指正。

0x00 前言

在前段时间Google Project Zero的安全研究员Samuel Groß 和 Natalie Silvanovich公开了一系列iOS系统上的远程无交互漏洞PoC,其中的4个漏洞(CVE-2019-8641、CVE-2019-8647、CVE-2019-8660、CVE-2019-8662)可造成无交互的DoS或RCE,1个漏洞(CVE-2019-8646)可造成远程无交互的任意文件读取。

0x01 漏洞影响范围

iOS系统版本:iOS12.4之前的版本

机型:iPhone 5s and later, iPad Air and later, and iPod touch 6th generation and later

0x02 漏洞环境搭建

测试环境:

iOS12.4以下的系统,iPhone 5s and later,开启了接收iMessage消息

攻击环境:

1、macOS系统,需要关闭SIP(System Integrity Protection,系统完整性保护),方法是重启电脑并按住Commond+R进入recovery模式,在实用工具里打开终端,输入csrutil disable即可禁用SIP,然后重启电脑正常进入系统。

2、安装python3

brew install python3

3、安装Frida

pip3 install frida

0x03 漏洞复现

这里以CVE-2019-8647为例,其他几个漏洞的复现方式类似。

注意⚠️:复现会有Springboard无限重启导致系统无法正常使用的风险(什么?你问我怎么知道的?我拿自己的手机测试导致无法使用,我会乱说吗😅),可以开启过滤未知发件人的设置,且发件人不在设备通讯录中,这样只有打开短信app,点击不在通讯录的消息tab才会导致app崩溃,然后多发几条正常的消息,把带漏洞payload的短信冲到后面,然后在搜索栏输入关键字定位到有问题的短信,删除即可。

  • 下载PoC

  • 将sendMessage.py里的receiver替换成目标iMessage邮箱地址或手机号码:

    #receiver = "YOUR EMAIL"
    receiver = "test@gmail.com" or "+12345678"
  • 将 injectMessage.js 里的”PATH”替换成你本机的obj 文件的路径:

    //var d = ObjC.classes.NSData.dataWithContentsOfFile_("PATH");
    var d = ObjC.classes.NSData.dataWithContentsOfFile_("/Your/Path/pfarray/obj");
  • 最后执行sendMessage.py,执行成功后将会调起系统的Messages应用给目标发送iMessage消息。只要目标机器接收到iMessage消息即可触发漏洞,并不需要点击查看(前提是目标机器没有设置过滤未知发件人)。

    python3 sendMessage.py

触发漏洞的目标机器会使Springboard崩溃,导致DoS攻击。

0x04 PoC实现流程

  • 首先sendMessage.py使用frida把injectMessage.js注入到系统的imagent进程。
  • 然后调用apple script去启动Messages app,并使用一个字符串标识”REPLACEME”去填充消息内容。
  • 注入imagent进程的injectMessage.js通过hook JWEncodeDictionary把”REPLACEME”这条消息的Dictionary数据中的“bp”字段的值替换成obj文件中的payload,这个就是触发漏洞的payload。

大致调用流程就是这样,具体代码可以查看PoC里的实现,下面来看下这个漏洞的原理。

0x05 漏洞原理

  • 这是一个存在于苹果Core Data框架下的UAF漏洞。

  • 当使用initWithCoder来反序列化一个类时,这个类的子类由于没有重写父类的initWithCoder以及实现所有需要实例化的方法,因此这个类的子类也将被反序列化。

  • _PFArray就是这样的一个类,它是NSArray的子类,当_PFArray被反序列化,它使用 [NSArray initWithCoder:]反序列化方法,这个方法最终调用的是[_PFArray initWithObjects:count:]。而这个方法初始化数组使用NSKeyedUnarchiver提供的对象,但是却没有持有这些对象。因此,当NSKeyedUnarchiver被释放,这些在数组中的对象也将被释放,但是反序列化对象的使用者仍能使用它们,这就导致了UAF漏洞。

下面我们再来看下payload文件obj,这是一个二进制的plist文件:

$ file obj
obj: Apple binary property list

需要将它转换一下,转成一个plist文件方便我们查看文件里面的具体内容,使用如下命令对其进行转换:

$ plutil -convert xml1 - -o - <obj> converted.obj.plist

转换后的plist文件里面就有此漏洞的罪魁祸首_PFArray

plist文件

0x06 总结

虽然本文只复现了一个漏洞,但其他几个漏洞出问题的地方大多都是反序列化数据时导致的,这一类问题可以导致一系列的漏洞,并且都可以通过iMessage来远程无交互地触发。关于这个攻击面的漏洞挖掘思路,PJ0的 Natalie Silvanovich在blackhat做过相关分享,有兴趣的可以去看看:)https://i.blackhat.com/USA-19/Wednesday/us-19-Silvanovich-Look-No-Hands-The-Remote-Interactionless-Attack-Surface-Of-The-iPhone.pdf

参考:

https://bugs.chromium.org/p/project-zero/issues/detail?id=1873

https://support.apple.com/en-us/HT210346

https://blog.csdn.net/SysProgram/article/details/100012636

EOF

文章作者: Evi1024
文章链接: https://www.evi1024.com/2019/11/07/CVE-2019-8647-iMessage%E8%BF%9C%E7%A8%8B%E6%97%A0%E4%BA%A4%E4%BA%92%E8%A7%A6%E5%8F%91iOS%E6%BC%8F%E6%B4%9E%E5%A4%8D%E7%8E%B0/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Evi1024

评论