近期习科黑板报可能涉及到很多相关内容,故给大家恶补一下苹果操作系统rootkit的知识。 

 本文献由习科小编翻译,原文发表于两年前。翻译不妥的地方希望大家海涵。

 

本文原作者:Eric Monti

任职于:Trustwave公司,蜘蛛安全实验室 搞基安全研究员

简介:从系统安全到软件安全,从业15年,主要集中在漏洞研究和逆向工程,近几年关注移动设备安全

格言:I am not a iPhone Jailbreak team member - Just an avid fan


目录

- 文献梗概

I.了解越狱

- iOS系统的安全防护和面临的挑战

- 参考越狱团队的攻击模式

- 一些有趣的逆向

II. 同样的rootkit技术被黑帽子利用

- “恶意”成分

- Rootikit (不要“真正”的root我的iphone)

III. 没有0day,表演开始

- 从老的bug开始研究

- 并不是从我发现开始的

- 越狱团队叼爆了

- 过程介绍和演示

IV. 继续向后期开发和APP逆向努力

 

###silic.org

==================================

iPhone/iOS的安全概述

梗概一下iOS系统的安全防护有以下几个方面:

1, 引导加载程序认证

2, 签名的固件认证

3, 内核签名认证

4, 从APP Store安装签名的应用程序

5, 苹果公司签名的所有玩意

除非出现执行上的问题,否则这套安全防护是非常牛逼无懈可击的!

 

手机体系结构梗概

应用处理器:高通ARM(版本为6或7,取决于苹果设备的版本),XNU架构体系(类似于ARM),从引导程序下执行内核和应用程序的签名。

基带调制解调器:处理GSM连接的另一个ARM,但是从应用处理器分离,拥有自己的内存和固件,这是大多数运营商解锁人关心的,不过现在还不是我的rootkit关心的。

硬件加密:在NAND存储中低层次的数据加密(简单说其实就是删掉密钥让FS不能读取)。

一个傻逼功能:远程擦除我的iphone和“Find My Iphone”两个功能可以被远程SIM设备禁用。

 

OS环境

两个分区组成的文件系统:

从根路径/开始的ROOT分区,其中包括内核,操作系统和核心API,出厂后只读

从/private/var开始的用户分区,其中包括用户数据、所有的APP

两个用户完成一切操作:

root用户:系统服务和内核

mobile用户:APP程序和数据的执行,也就是手机使用者的用户

 

应用程序安全

代码签名:所有从APP Store来的程序必须由苹果签名,签名储存在mach-o的头部,系统调用一个加强型的exec()函数执行对内核的检查。

沙盒:应用程序以mobile用户运行,Chroot机制下的沙盒让应用程序限制在自己的数据下运行,以防止读取OS或者其他APP的数据,权限也做了一定的限制,除了开发中的调试以外。

 

现实情况

iOS最大的安全功能可能就是app的授权过程了,私自创建API是可以的,但是当应用程序使用的时候通常会被拒绝,所以大部分功能只是因为没有被授权而没有实现。

那就意味着在签名过的app或者越狱的设备上可以执行很多有意思的事情,这个系统是一个基于XNU非常完整的达尔文平台,意味着我们在上面的可扩展性非常高。

苹果审核商店中的每一个app,他们不会错过bug嘛?

 

###

================================== 

越狱纵深

客户端机器的远程破解是寥寥无几,但是都非常具有价值。显然在恶意攻击行为上更具有潜力,当然了,也很有科研价值。大部分的越狱漏洞利用是通过USB来恢复或更新固件实现的,不过互联网上有很多技术细节可以查阅,尤其是有一些越狱团队会在维基上面发很多屌爆了的消息,虽然不是很及时。

其实越狱无非就是使用iphone的数据连接和内置的safari浏览器,没有哪个iphone是安全的。

第一个以web为基础的漏洞是Tavis Ormandy发现的,是libtiff的漏洞,进而有很多人进行类似的安全分析和进一步利用,而第二个漏洞利用则是jailbreakme.com发布的,这一年很淫荡,访问一个网站就可以解锁,类似于下面这样。

*提示:完成所有的提示可以进行隐形越狱

 

关于PDF的代码执行漏洞

这其实是一个非常经典的堆栈溢出漏洞,当BoF在处理CoreGraphics压缩字体格式中的长字符串时不幸将$pc变量覆盖(ARM上的EIP),实际上这个时候代码的执行仍然是在mobile这个用户权限下。

但是这个时候如果结合IOSurface (IOKit)的沙盒逃离和权限提升的bug话,就可以直接root了。

这里顺便说一句关于IOKit的沙盒逃离漏洞,当内核处理IOSurface的属性时会发生整数型溢出。Safari调用setuid(0)之后所有运行的代码都将以root权限执行,后面一系列的动作势如破竹,所有的安全机制形同虚设。

这种越狱方式大致分几个阶段,首先将设置以内核权限执行代码,其次安装越狱补丁后下载基本文件管理系统Cydia,擦完屁股最后以装逼性质的setuid(501)回到mobile用户权限。

 

###

==================================

攻击性

首先作者蛋疼的逆向了一下破解程序的原始代码。。为何蛋疼呢?一开始越狱团队并没有发布破解程序源代码,也不知道COMEX是否会发布源代码,我表示很伤心,于是开始逆向越狱团队早前发布的二进制代码,犹如洋葱剥皮和剥丝抽茧,蛋疼的进行hex-dumps逆向。

逆向了installui.dylib和wad.bin两个文件后,我发现要将越狱攻击化只需要。。。

首先PDF中的installui.dylib里面的代码要确保是从jailbreakme.com下载执行(中间小编翻译不出来,省略啦),最后制备含有rootkit的特制wad.bin文件,我打算将这个rootkit首先是进行实际越狱,进而悄悄从我控制的服务器下载和安装程序。

其实按照惯例,这里妥妥的不是蛋疼的高潮。当作者蛋疼的写出了第一个rootkit测试PoC以后的一周里,COMEX居然将越狱利用代码进行了开源,直接就给哭了。

我为后门和kit编写了自定义的第三方代码,第一次的PoC体积过于庞大,根本无法完成“隐形”的特征,我的代码包含了大部分越狱所使用的代码,不过没有包含Cydia或者其他文件系统的下载,因为我认为MobileSubstrate更好一些。测试一下:

越狱后,我们浏览一下iphone文件系统中一些有意思的地方

Emails
 /var/mobile/Library/Mail/
 “Protected Index” (SQLite for message metadata)
 “Envelope Index” (SQLite for email folders metadata)
 IMAP @ xx.com @ imap.xx.com (mailbox for your IMAP accounts)
 ExchangeActiveSyncXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/ (mailbox for victim’s exchange GUID XX…)
Voicemails
 /var/mobile/Library/Voicemail/
 voicemail.db (SQLite for message metadata)
 /var/mobile/Library/Voicemail/*.amr (Audio – Download and open in Quicktime)
SMS Messages
 /var/mobile/Library/SMS/
 sms.db (SQLite for message metadata)
 Parts/ (TXT msg’s and msg parts for MMS)

好吧,下一步我们特制一个录音APP作为iOS下rootkit的“hello world”之旅吧。

接下来是通过硬件定位,CoreLocation这个接口不错,但是需要经过用户的授权才行。

办法大概有那么几个,例如劫持已有的定位授权,或者到API层面一下进行强制授权,或者来个破解补丁。

我需要考虑一下,屌丝的做法通常是。。。转储位置缓存文件中最近的LAT/LONG(经纬度)进行读取。读取的位置在:/var/root/Library/Caches/locationd/cache.plist,例如我的:

WifiLoca9
 Altitude=0;
 HorizontalAccuracy=80;
 Latitude="41.882041";
 Lifespan=144;
 Longitude="-87.628489";
 Timestamp="304907008.940135";
 Type=4;
 Ver9calAccuracy="-1";
};
这就是刚才那几个有意思的文件的作用了。不过后面问题又来了,那就是转储处理数据。先来看几个苹果中有意思的进程执行,以处理Email连接的dataaccessd为例子。
iPhone:/var/mobile root# ps -hax |grep dataaccessd
38 ?? 0:05.33 /System/Library/PrivateFrameworks/DataAccess.framework/Support/dataaccessd
...
iPhone:var/mobile root# gdb --quiet --pid=38
Attaching to process 38.
Reading symbols for shared libraries . done
Reading symbols for shared libraries .............................................. done
0x3404c658 in mach_msg_trap ()
(gdb) info mach-regions
Region from 0x0 to 0x1000 (---, max ---; copy, private, not-reserved)
... from 0x1000 to 0x2000 (r-x, max r-x; copy, private, not-reserved)
... from 0x2000 to 0x3000 (rw-, max rw-; copy, private, not-reserved)
...
... from 0xfe000 to 0xff000 (r--, max rwx; share, private, reserved)
... from 0x100000 to 0x400000 (rw-, max rwx; copy, private, not-reserved) (3 sub-regions)
...
(gdb) dump memory dump_100000.bin 0x100000 0x400000
...

$ strings dump_100000.bin |grep -B6 -A2 'Authorization: Basic'
POST /Microsoft-Server-ActiveSync?User=emonti&DeviceId=ApplnnnnNP&DeviceType=iPhone&Cmd=Ping HTTP/1.1
Host: owa.mycompany.com
Content-Length: 0
Ms-Asprotocolversion: 12.1
User-Agent: Apple-iPhone2C1/801.306
X-Ms-Policykey: 550504473
Authorization: Basic bXljb21wYW55LmNvbVxlbW9udGk6bm90ZnVja2luZ2xpa2VseSE=
Accept: */*
Accept-Language: en-us
我们主要看line15和line27,rw的内存区域设置的更像是程序数据,在这种情况下0x100000区域显得更有意思一些。


好了,我们现在从APP Store中挑一个有趣的目标,例如我选择了Square这个程序,好吧,我承认我很屌丝,因为这个程序是免费的。

首先要做的是逆向解密二进制。更为首先的是要找到iDevice中的二进制app文件。

# find /var/mobile/Applications –name SomeApp.app
/var/mobile/Applications/0578A160-_/SomeApp.app
接下来看一下加密的代码/数据的大小
# otool –l _/0578A_/SomeApp.app/SomeApp |grep –A4 LC_ENCRYPTION_INFO
cmd LC_ENCRYPTION_INFO
cmdsize 20
cryptoff 4096
cryptsize 4096
cryptid 1
第三步加载可执行调试器(下面的gdb是cydia的一个安装包)
# gdb _/SomeApp.app/SomeApp

第四步看一下加密前:

(gdb) x/3i 0x2000
0x2000: addge r4, r7, r4, asr r11
0x2004: bl 0xfe147a48
0x2008: ldrbcc r5, [r4, #3476]
第五步设置解密后的BP,然后让iOS自行为我们解密
(gdb) break *0x2000
Breakpoint 1 at 0x2000
(gdb) r
...
Breakpoint 1, 0x00002000 in ?? ()
(gdb) x/3i 0x2000
0x2000: ldr r0, [sp]
0x2004: add r1, sp, #4 ; 0x4
0x2008: add r4, r0, #1 ; 0x1

在第二步cryptsize基础上转储解密后的文件

(gdb) dump memory decrypted.bin 0x2000 (0x2000 + 4096)

使用合手的HEX编辑器将decrypted.bin合并回刚才的app(加密数据的相对文件偏移量将会从mach头部远离0x1000)。

最后不要忘记禁用cryptid,不然类转储或者其他工具将会同样在我们固定的二进制中工作,将Cryptid改为0。

*提示:发现LC_ENCRYPTION_INFO(0x21)通过使用 otool-l 输出32-bit的十六进制尾部并搜索来执行命令

cmd LC_ENCRYPTION_INFO (21000000h)
cmdsize 20 (14000000h)
cryptoff 4096 (00100000h)
cryptsize 4096 (00100000h)
cryptid 1 (00000000h)

 

不过我还是好奇苹果的二进制加密机制,应该是开源的XNU代码。

 

 

代码负责解析加载Mach或者FAT二进制文件的Mach头部。

 

 

还有,代码还要继续看下去

 

不知道你怎么想,其实文本加密对于初学者来说也是OS X的一个功能。

MySnowLeopardMac$ nm /mach_kernel |grep text_crypter
ffffff8000623410 D _text_crypter_create
ffffff800027cdac T _text_crypter_create_hook_set

我们是否(后面作者扯一堆,就让我们记住:DBADB=Dont be a D-bag,译者注)

 

 

###

==================================

后面通过检查准备好的二进制继续来看:Objective-C Method Hooking

还记得刚才提到过的 类转储 吗?

 

Objective-C Method Hook实例,让"swizzle" [NSObject -init]

 

通常我们都会使用DYLD_INSERT_LIBRARIES()或者LD_PRELOAD注入到我们的libs当中,但是MobileSubstrate更屌一些。可以通过它将我们的dylib注入到单个关联的目标中。

Filter = {
 Bundles = {com.apple.apringboard};
 };
或者是多个目标也可以


Filter = {
 Bundles = {com.apple.UIKit};
 };

但是要避免MSHook*在库中使用其他注射技术。其实一些其他的注入技术,例如我们可以这样。。。

找到系统中的/System/Library/LaunchDaemons/*.plist并添加。。。

<key>EnvironmentVariables</key>
 <dict>
 <key>DYLD_FORCE_FLAT_NAMESPACE</key>
 <string>1</string>
 <key>DYLD_INSERT_LIBRARIES</key>
 <string>/path/to/your.dylib</string>
</dict>

捆绑注入同样适用于iOS。

 

 

###

==================================

蛋疼了半天,最终作者得出结论:

Objective-C在后门和rootkit的应用是非常成熟的,同样可以移植到iphone上面去,另外Mach内核在OS X上面的功能非常耐人寻味,最后结论就是你想操iOS同时要擅长草OS X。

按照传统观念,越是越狱的机器越容易受到攻击,我想附加几条,越狱你的iphone之前也许有人会提前帮你越了,一旦越狱了,你就要对他想其他普通电脑一样:打补丁,优化服务,监控系统变化-时刻准备着校验MD5。

对于安全防护吧啦吧啦吧啦。。。

 

###

==================================

EXP二进制逆向的终极版

对于pdf的一点点分析

这是一个标准格式的pdf文件,浏览器打开后是一个空白页面,然后会对比iphone设备的PDF的版本等,一个单一的zlib压缩字体部分是唯一的区别。

压缩的这部分在某个地方是用一个字符串表示一个MACH-O dylib的整体,写入一个快速文件分割extract_payload并寻找CFF Font egg、Macho_1、Macho_2三个部分。

 

异常的Times-Roman CFF字体

 

 

Payload的结尾从dylib块中提取编译的代码执行,即macho_2或者one.dylib

 

 

由于IOKit整数溢出得到的XML产物

 

 

最后是位于installui.dylib文件的 类转储,又称macho_1

 

 

最最后是wad.bin的伪代码结构示意。

 

我们来思考一下:到底是什么被下载并安装到了iOS设备上?

如果耐心从头看到尾,就会发现其实前面杂乱无章的陈述的很多了,这是一个完整剥离出来的Unix目录结构和CLI程序,例如bash等,越狱的cydia.app可以被下载,更多的app同样也可以,不管是将rootkit直接按照unix系统的格式还是放入app的方式,都是非常容易的。

最后译者注:文章虽老,思路不老。