从本文开始,我们一起以iPhone越狱为起点,整理一下iOS逆向开发中使用到的各个技术及知识点。
关于越狱(jailBreak)
通过利用iOS系统的安全启动链中的漏洞,从而禁止掉信任链中负责验证的组件。拿到iOS系统最大权限ROOT权限。
iOS系统安全启动链
当我们启动一台安装iOS系统的设备时,iOS系统首先会从只读的ROM中读取到初始化指令,也就是系统的引导程序(事实上所有的操作系统启动时都要经过这一步,只是过程略有不同)。这个引导ROM包含苹果官方权威认证的公钥,他会验证底层启动加载器(LLB)的签名,一旦通过验证后就启动系统。LLB会做一些基础工作,然后验证第二级引导程序iBoot。iBoot启动后,设备就可以进入恢复模式或启动内核。在iBoot验证完内核签名的合法性之后,整个启动程序开始步入正轨:加载驱动程序、检测设备、启动系统守护进程。这个信任链会确保所有的系统组件都有苹果官方写入、签名、分发,不能来自第三方机构,越狱的工作原理正是攻击这一信任链。所有的越狱工具的作者都需要找到这一信任链上的漏洞,从而禁止掉信任链中负责验证的组件。拿到iOS系统最大权限ROOT权限.
完美越狱 or 非完美越狱
根据越狱的情况不同可以分为如下两种越狱:
-
完美越狱
所谓完美越狱就是破解iOS系统漏洞之后,每次系统重启都能自动调用注入的恶意代码,达到破坏安全验证,再次获得ROOT权限。 -
非完美越狱
所谓非完美越狱是指,越狱系统后,并没有完全破解安全链,有部分信息或功能应用不佳;比如;关机以后必须去连接越狱软件来引导开机;或者重启会导致越狱的失效;这样的越狱称为“不完美越狱”。
那么如何越狱呢?
我们比较常用的是,使用 unc0ver越狱 来越狱自己的手机。目前支持 iOS11-iOS14.8的系统。
- 通过上面的网站我们可以获取到
unc0ver
的ipa
安装包。 - 我们可以通过Xcode新建一个项目,将其运行到我们的手机上
- 接着,我们在项目根目录上新建一个名为
APP
的文件夹,将ipa
包 放在此文件夹下。 - 接着 来到这里 我们可以获取到 名为 appSign 的重签名脚本文件。
- 在Xcode项目配置中 -> Build Phases -> 添加 New Run Script Phase -> 内容是 ./appSign.sh。
- 再次运行项目,app启动后,停止调试,即可。这时,
unc0ver
就已经运行在我们的手机上了。 - 打开
unc0ver
,左上角设置,勾选上Install OpenSSH
,返回后,点击开始越狱(中间可能会卡住,多试几次就可以了)。
执行完上面几步,我们的手机就已经是越狱状态了。
接下来我们就可以通过Cydia来安装一些逆向开发中常用的软件。
安装常用软件
手机越狱之后,我们就可以将常用的源添加到Cydia,如 :
- 蜜蜂源 apt.cydiami.com
- 雷锋源 atp.abcydia.com
OpenSSH
OpenSSH 是 SSH (Secure SHell) 协议的免费开源实现。 SSH协议可以用来进行远程控制, 或在计算机之间传送文件。\
SSH
SSH是一种网络协议,用于计算机之间的加密登录。
1995年,芬兰学者Tatu Ylonen设计了SSH协议,将登录信息全部加密,成为互联网安全的一个基本解决方案,迅速在全世界获得推广,目前已经成为Linux系统的标准配置。
OpenSSH
它是一款软件,应用非常广泛。
越狱的过程中我们已经安装好了OpenSSH, 这时,我们就可以通过电脑的终端来连接手机。
- 打开手机的wifi,找到手机的IP
- 我们通过
ssh 用户名@手机IP地址
连接到手机 如: ssh [email protected] - 默认密码 alpine
iOS下有两个用户 root、mobile
- Root用户:最高权限用户,可以访问任意文件
- Mobile用户:普通用户,只能访问改用户目录下文件/var/Mobile
SSH的相关操作
- 删掉保存的服务器地址的key
- ssh-keygen –R 服务器IP地址(当SSH登录手机,手机就是服务器)
- know_hosts文件:用于保存SSH登录服务器所接受的key -在系统~/.ssh 目录中保存
- ssh_host_rsa_key.pub文件:作为SSH服务器发送给连接者的key
- 在系统/etc/ssh 目录中保存
- Config文件
- 在~/.ssh 目录下创建一个config文件。内部可以配置ssh登录的别名。
• Host 别名
• Hostname IP地址
• User 用户名
• Port 端口号\
免密码登录
免密码登录也称“公钥登录”,原理就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录 不再要求密码。
- 拷贝公钥给SSH服务器 $ssh-copy-id 用户名@服务器IP
USB登录
苹果有一个服务,叫 usbmuxd
,这个服务主要用于在 USB
协议上实现多路 TCP
连接.
Iproxy端口映射
- 安装libimobiledevice工具
$ brew install libimobiledevice
- 映射端口
- iproxy 12345 22
我们可以配置USB的端口映射,将 12345 端口 映射 到 22 端口; 这样 就可以使用 ssh -p 12345 [email protected]
连接到手机。
好了,今天就先到这里,今天我们只是一个开始,接下来,我们将使用越狱的手机,开始逆向的研究。