越狱概述

越狱(Jailbreak):通过iOS系统安全启动链漏洞,从而禁止掉信任链中负责验证的组件。拿到iOS系统最大权限root权限

安全启动链

当启动一台iOS设备时,系统首先会从只读的ROM中读取初始化指令,也就是系统的引导程序(事实上所有的操作系统启动时都要经过这一步,只是过程略有不同)

这个引导ROM包含苹果官方权威认证的公钥,他会验证底层启动加载器(LLB)的签名,一旦通过验证后就启动系统

LLB会做一些基础工作,然后验证第二级引导程序iBootiBoot启动后,设备就可以进入恢复模式或启动内核。在iBoot验证完内核签名的合法性之后,整个启动程序开始步入正轨:加载驱动程序、检测设备、启动系统守护进程

这个信任链会确保所有的系统组件都由苹果官方写入、签名、分发,不能来自第三方机构

iOS系统安全启动链:
iOS逆向实战--028:越狱-%26-OpenSSH - 图1

越狱的工作原理正是攻击这一信任链。所有越狱工具的开发者,都需要找到这一信任链上的漏洞,从而禁止掉信任链中负责验证的组件。拿到iOS系统最大权限root权限

根据越狱的情况不同,可以分为如下两种越狱:

  • 完美越狱:所谓完美越狱就是破解iOS系统漏洞之后,每次系统重启都能自动调用注入的恶意代码,达到破坏安全验证,再次获得root权限
  • 非完美越狱:系统越狱之后,并没有完全破解安全链,有部分信息或功能应用不佳。例如:关机以后必须去连接越狱软件来引导开机,或者重启会导致越狱的失效。这样的越狱称为“不完美越狱”

目前比较靠谱的两种越狱工具:

越狱流程,以uncOver为例:

官网下载ipa

官方给出的安装流程,过于繁琐,不建议使用

更简单的方式:使用重签名技术,将App安装到设备上

使用脚本重签名,不要使用MokeyDev。使用后者,会在越狱时出现奇怪的问题

安装成功后,断开Xcode

重新运行App,在设置中,勾选(Re)Install OpenSSH,然后进行越狱

越狱过程中,会重启设备

重启之后,再次运行越狱工具,完成本次越狱

uncOver中的设置项:

  • Dark Mode:适配暗黑模式
  • Load Tweaks:开启此功能,在越狱激活时,会让越狱顺便加载越狱环境,通常都是维持开启状态。那何时可以关闭呢?当发生装完新插件后,导致插件冲突造成安全模式,那在激活越狱时先将此功能关闭,再激活越狱,就可进入Cydia来移除有冲突的插件
  • Refresh Icon Cache:桌面上暂存的白色图示导致无法删除,通过此功能开启就可清除
  • Disable Auto Updates:屏蔽自动升级,可以关闭iOS内的OTA升级提醒。这功能是no beta alert插件来完成,有装描述档来防堵iOS升级者,不需要删除或关闭,依旧都保持安装描述档和维持打开即可
  • Export TFP0:输出TFP0(不安全)。Export TFP0iOS一个漏洞,可以让所有App利用此漏洞来获取root权限,因此开发者也特别用括号提醒不安全,没事时候请勿开启
  • Restore RootFs:清理越狱,清除所有插件并且撤销越狱工具注入的文件
  • (Re)Install OpenSSh:重装OpenSSh。有了OpenSSh,可以用来远程连接设备
  • Reinstall Cydia:重装Cydia。如发生激活越狱环境后,造成Cydia闪退或是Cydia消失,可以打开此功能重装Cydia
  • Hide Log Windows:隐藏Log讯息。如果将此功能开启,会导致越狱时,无法看见黑色讯息内的Log信息
  • Share OS Crash Logs:共享操作系统崩溃日志

使用uncOver越狱的好处:在设置中,选择Restore RootFS,可清理越狱环境,删除所有插件并撤销越狱工具注入的文件

越狱成功后,如果设备重启过,需要使用uncOver重新越狱

在重新越狱过程中,如果屡次失败,可尝试勾选Reinstall Cydia,再进行重新越狱

使用Odyssey越狱,需要注意一点,在断开网络的情况下,开始执行越狱。在越狱过程中,按照提示链接网络。大致流程和uncOver一样

越狱成功后,在Cydia中,添加常用软件源:
iOS逆向实战--028:越狱-%26-OpenSSH - 图2

连接设备

通过OpenSSH插件可以连接手机,进行远程控制, 或者传送文件

如果在越狱时,未勾选(Re)Install OpenSSH,需要在越狱成功后,在Cydia中安装OpenSSH。目的是在设备上开启SSH登录服务
iOS逆向实战--028:越狱-%26-OpenSSH - 图3

安装后,可以在Cydia的已安装中查看
iOS逆向实战--028:越狱-%26-OpenSSH - 图4

  • 来自apt.bingner.com软件源

连接设备

通过插件,使用WiFi连接手机:ssh 用户名@手机IP地址

  1. ssh root@10.165.45.19
  2. -------------------------
  3. The authenticity of host '10.165.45.19 (10.165.45.19)' can't be established.
  4. RSA key fingerprint is SHA256:gVFSTQl82bEyY21NqHcrcH8PVIh18OZPkht9khvQXUA.
  5. Are you sure you want to continue connecting (yes/no/[fingerprint])?
  • 首次登录,会出现上述提示

此时输入yes,可能会直接要求输入密码,也可能出现警告

  1. yes
  2. -------------------------
  3. Warning: Permanently added '10.165.45.19' (RSA) to the list of known hosts.
  4. Connection closed by 10.165.45.19 port 22

如果未出现密码输入的提示,直接无视警告,尝试再次登录

  1. ssh root@10.165.45.19
  2. -------------------------
  3. root@10.165.45.19's password:
  • 提示输入密码

输入默认密码:alpine

  1. alpine
  2. -------------------------
  3. iPhone6P:~ root#
  • 成功登录到手机设备上,并且处于设备的root目录下

iOS设备下,有两个用户:rootmobile

  • root用户:最高权限用户,可以访问任意文件
  • mobile用户:普通用户,只能访问该用户/var/Mobile目录下的文件

登录手机设备的root用户,可以查看很多隐私内容

例如,查看手机上运行的进程

  1. ps -A
  2. -------------------------
  3. PID TTY TIME CMD
  4. 1 ?? 2:23.51 /sbin/launchd
  5. 219 ?? 0:27.75 /usr/libexec/substituted
  6. 456 ?? 0:04.24 /System/Library/PrivateFrameworks/AssistantServices.framework/assistantd
  7. 458 ?? 0:19.25 /usr/libexec/fseventsd
  8. 459 ?? 3:38.85 /usr/sbin/mediaserverd
  9. ...

筛选出指定App的进程

  1. ps -A | grep WeChat
  2. -------------------------
  3. 3980 ?? 0:25.14 /var/containers/Bundle/Application/454EA887-EB3B-43B3-ABFD-B9B2CA006981/WeChat.app/WeChat

找到WeChat的沙盒路径,可以将MachO文件拷贝出来

图形化界面

在完美越狱的手机上,可以安装AFC 2插件,可以使用图形化的界面访问手机设备的所有目录

但在非完美越狱的手机上,使用iFunBox或其他助手软件,只能访问到设备的/var/mobile/Media目录
iOS逆向实战--028:越狱-%26-OpenSSH - 图5

修改登录密码

登录手机设备的默认密码为alpine,使用passwd命令,可以对其进行修改

root用户,可以修改所有用户的密码:passwd 用户名

  1. passwd root
  2. -------------------------
  3. Changing password for root.
  4. New password:
  5. Retype new password:

输入两次新密码,确认修改。因为是登录状态,所以不用输入原始密码

断开设备连接

使用exit命令,可以断开设备的连接

  1. exit
  2. -------------------------
  3. logout
  4. Connection to 10.165.45.19 closed.
OpenSSH

OpenSSHSSHSecure SHell) 协议的免费开源实现。SSH协议可以用来进行远程控制, 或在计算机之间传送文件

OpenSSH

  • 它是一款软件,应用非常广泛

SSH

  • SSH是一种网络协议,用于计算机之间的加密登录
  • 1995年,芬兰学者Tatu Ylonen设计了SSH协议,将登录信息全部加密,成为互联网安全的一个基本解决方案,迅速在全世界获得推广,目前已经成为Linux系统的标准配置

SSH登录过程

使用Mac电脑登录iPhone手机的过程
iOS逆向实战--028:越狱-%26-OpenSSH - 图6

  • 请求连接到iPhone手机
  • 手机将公钥发给Mac电脑
  • Mac电脑通过收到的公钥加密登录密码
  • iPhone手机利用私钥解密登录密码,是否允许登录

手机将公钥发给Mac电脑,就是在首次登录给出提示的时候

将客户端存储的公钥删除

Mac的终端,进入ssh目录

  1. cd ~/.ssh

打开known_hosts文件

  1. vi known_hosts

找到手机设备的IP地址以及对应的公钥
iOS逆向实战--028:越狱-%26-OpenSSH - 图7

将其删除,然后再次登录

  1. ssh root@10.165.45.19
  2. -------------------------
  3. The authenticity of host '10.165.45.19 (10.165.45.19)' can't be established.
  4. RSA key fingerprint is SHA256:gVFSTQl82bEyY21NqHcrcH8PVIh18OZPkht9khvQXUA.
  5. Are you sure you want to continue connecting (yes/no/[fingerprint])?

客户端不存在公钥,视为首次登录。将手机公钥发给Mac电脑,同时还有一个RSA密钥的SHA256指纹,输入yes,后续流程继续

中间人攻击

中间人攻击(Man-in-the-middle attack
iOS逆向实战--028:越狱-%26-OpenSSH - 图8

  • 冒充服务器,将生成的虚假公钥发给客户端。那么它将获得客户端连接服务

中间人:例如手机和电脑连接的黑客WiFi

当手机发送给Mac电脑的公钥被中间人截获,然后由中间人生成一对公钥和私钥,将伪造的公钥转发给Mac电脑

Mac电脑会通过伪造的公钥加密登录密码,然后返回给中间人

中间人利用自己的私钥将其解密,使用截获的手机公钥加密,再将其发送给手机

流程结束后,用户可以照常登录,但黑客已经截获了登录密码

服务器保护

为了避免中间人攻击,SSH在首次登录时,除了返回公钥,还会给出密钥的SHA256指纹

指纹的作用:服务器生成的有效指纹,会在网站上公布。用户首次登录时,可以人工核对该指纹的合法性。如果返回的指纹和公布的指纹不一致,可能出现中间人的伪造,立刻终止登录行为

首次登录的合法性,需要依靠人工核对。服务器在第一次登录时,会让客户端保存IP地址和公钥

当再次登录时,客户端发现相同IP地址对应的公钥发生变化,会给出疑似中间人攻击的警告,并阻止登录

公钥在客户端保存的位置:~/.ssh目录下的known_hosts文件
iOS逆向实战--028:越狱-%26-OpenSSH - 图9

公钥在手机中保存的位置:/etc/ssh目录下的ssh_host_rsa_key.pub文件
iOS逆向实战--028:越狱-%26-OpenSSH - 图10

免密登录

免密登录:也称之为“公钥登录”

原理:客户端将自己的公钥,储存在远程主机上。登录时,服务器会向客户端发送一段随机的字符串。客户端用自己的私钥加密后,再发回来。服务器用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录,不再要求密码

iOS逆向实战--028:越狱-%26-OpenSSH - 图11

  • 客户端将自己的公钥存储在服务器上
  • 登录的时候,服务器发送一个随机字符串
  • Mac电脑通过私钥加密字符串
  • iPhone手机利用客户端的公钥解字符串

拷贝公钥给SSH服务器:ssh-copy-id 用户名@服务器IP地址

  1. ssh-copy-id root@10.165.45.19
  2. -------------------------
  3. /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/Users/zang/.ssh/id_rsa.pub"
  4. /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
  5. /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
  6. root@10.165.45.19's password:

输入默认密码:alpine

```

alpine

Number of key(s) added: 1

Now try logging into the machine, with: “ssh ‘root@10.165.45.19’” and check to make sure that only the key(s) you wanted were added.

  1. > 公钥拷贝成功,再次登录手机
  2. >

ssh root@10.165.45.19

Last login: Mon May 24 12:15:57 2021 from 10.165.192.78

  1. > 直接允许登录,不再要求密码
  2. > 公钥在客户端保存的位置:`/Users/zang/.ssh`目录下的`id_rsa.pub`文件<br />
  3. ![](https://upload-images.jianshu.io/upload_images/9297953-aa7ebb1394b77783.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240#alt=)
  4. > 公钥在手机中保存的位置:`~/.ssh`目录下的`authorized_keys`文件<br />
  5. ![](https://upload-images.jianshu.io/upload_images/9297953-05d169ac8a070af5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240#alt=)
  6. #####SSH取别名
  7. > 作为逆向工程师,分别会使用完美越狱和非完美越狱两台手机。在更换设备时,切换登录的过程还是比较麻烦的
  8. > 我们可以在`~/.ssh`目录下,创建一个`config`文件。内部可以配置`SSH`登录的别名
  9. > 使用`vi config`命令,配置`config`文件
  10. >

Host 6p Hostname 10.165.45.19 User root Port 22

  1. > - `Host`:别名
  2. > - `Hostname``IP`地址
  3. > - `User`:用户名
  4. > - `Port`:端口号
  5. > 配置成功,使用别名登录
  6. >

ssh 6p

Last login: Mon May 24 15:55:27 2021 from 10.165.192.78

  1. #####USB登录
  2. > 使用`WiFi`连接手机,在使用一些指令时,会出现卡顿情况。但使用`USB`连接,无论何种操作都会无比顺畅
  3. > `USB`连接的原理
  4. > `Mac`电脑上,默认是支持`USB`连接的。例如:在`Xcode`中使用的`USB`调试
  5. > `SSH`登录,默认使用`22`端口。而`USB`连接,需要使用`usbmuxd`服务。主要用于在`USB`协议上,实现多路`TCP`连接
  6. > `/System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/Resources/usbmuxd`<br />
  7. ![](https://upload-images.jianshu.io/upload_images/9297953-0580a1ae40c8bb43.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240#alt=)
  8. > `USB`连接过程
  9. > `usbmuxd`服务映射到本地端口,然后通过本地端口,建立`USB`连接
  10. > 首先准备`python-client`工具<br />
  11. ![](https://upload-images.jianshu.io/upload_images/9297953-deb4948f5a337e74.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240#alt=)
  12. > 使用`Python`脚本,建立端口映射
  13. >

python tcprelay.py -t 22:12345

Forwarding local port 12345 to remote port 22

  1. > - 将本地`12345`端口,映射到设备`TCP``22`端口上。这样就可以通过本地的`12345`端口建立连接
  2. > 通过`USB`进行`SSH`连接`6p`设备
  3. >

ssh -p 12345 root@localhost

The authenticity of host ‘[localhost]:12345 ([127.0.0.1]:12345)’ can’t be established. RSA key fingerprint is SHA256:gVFSTQl82bEyY21NqHcrcH8PVIh18OZPkht9khvQXUA. Are you sure you want to continue connecting (yes/no/[fingerprint])?

  1. > - `SSH`连接本地`12345`端口,由于进行了端口映射,所以会通过`USB`连接到设备的`22`端口
  2. > 对应`localhost`属于首次登录,出现密钥指纹的提示。输入`yes`,继续登录
  3. >

ssh -p 12345 root@localhost

Last login: Mon May 24 16:44:58 2021 from 10.165.192.78

  1. > 使用`USB`连接,成功登录到手机设备上
  2. > 切换到另一台`5s`设备,使用`USB`连接
  3. >

ssh -p 12345 root@localhost

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerprint for the RSA key sent by the remote host is SHA256:TjRKqJ/x87z4LizFQTK6iLhPcOO1PAaFdl4rVI2gHfI. Please contact your system administrator. Add correct host key in /Users/zang/.ssh/known_hosts to get rid of this message. Offending RSA key in /Users/zang/.ssh/known_hosts:9 RSA host key for [localhost]:12345 has changed and you have requested strict checking. Host key verification failed.

  1. > 由于设备更换,服务器返回的公钥发生了变化,但连接的`IP`地址都是`localhost`。当相同`IP`地址的公钥发生变化,客户端会给出疑似中间人攻击的警告,并阻止登录
  2. > 在这种情况下,想要继续登录,必须在`known_hosts`文件中,删除之前保存的`IP`地址和公钥
  3. > 更简单的方法,将`localhost`使用`127.0.0.1`代替
  4. >

ssh -p 12345 root@127.0.0.1

The authenticity of host ‘[127.0.0.1]:12345 ([127.0.0.1]:12345)’ can’t be established. RSA key fingerprint is SHA256:TjRKqJ/x87z4LizFQTK6iLhPcOO1PAaFdl4rVI2gHfI. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added ‘[127.0.0.1]:12345’ (RSA) to the list of known hosts. root@127.0.0.1’s password:

  1. > 输入默认密码:`alpine`,设备登录成功
  2. #####Shell脚本登录
  3. > 封装`Shell`脚本,更方便的登录手机设备
  4. > `ZangShell`目录下,创建脚本
  5. > 创建端口映射脚本:`usbConnect.sh`
  6. >

python /Users/zang/Zang/Tools/python-client/tcprelay.py -t 22:12345

  1. > 创建`USB`连接`6p`的脚本:`usb-6p.sh`
  2. >

ssh -p 12345 root@localhost

  1. > 创建`USB`连接`5s`的脚本:`usb-5s.sh`
  2. >

ssh -p 12345 root@127.0.0.1

  1. > 最后将`ZangShell`目录配置到环境变量中,对脚本添加可执行权限
  2. > 在终端使用`Shell`脚本,可快速连接到不同的手机设备上
  3. >

usbConnect.sh

Forwarding local port 12345 to remote port 22

  1. >

usb-6p.sh

Last login: Mon May 24 17:25:52 2021 from 127.0.0.1

  1. #####iproxy
  2. > `USB`连接设备,除了使用`Python`脚本,还可以使用`iproxy`命令
  3. > 使用`brew list`命令,查看`libimobiledevice`工具是否已安装<br />
  4. ![](https://upload-images.jianshu.io/upload_images/9297953-1786b6f70a3c52ed.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240#alt=)
  5. > 未安装,使用`brew install`命令,安装`libimobiledevice`工具
  6. >

brew install libimobiledevice

  1. > 使用`iproxy`命令,建立端口映射
  2. >

iproxy 12345 22

Creating listening port 12345 for device port 22 waiting for connection

  1. > 使用`Shell`脚本,快速连接设备
  2. >

usb-6p.sh

Last login: Mon May 24 18:19:32 2021 from 127.0.0.1 ```

USB连接成功,使用iproxy命令,同样可以将12345端口映射到设备TCP22端口上,效果和使用Python脚本是一样的

清理越狱环境

当越狱设备出现问题,如果在设备的“通用-还原”中,选择“还原所有设置”,很容易出现白苹果。正确的做法是,先将设备清理越狱环境,然后进行设备平刷

使用uncOver工具越狱,在设置中很容易清理越狱环境。但如果是老系统的设备,使用其他工具进行越狱,此时想清理越狱环境就很困难了

这种情况下清理越狱环境的方法:

  • 准备清理越狱环境的脚本:unjailbreak.sh
  • unjailbreak.sh拷贝到越狱手机的root用户目录下
  • 在手机上执行该脚本(设备会重启并且清理干净)
总结

越狱概述

  • 通过破解iOS安全启动链的漏洞,拿到iOSroot权限
  • 完美越狱:每次系统重新启动,都会再次进入越狱状态
  • 非完美越狱:没有完全破解,一般重启后会失去越狱环境

OpenSSH

  • SSH是一种网络协议
  • OpenSSH是一款软件

SSH登录过程

  • 远程主机(服务器)收到用户的登录请求,将自己的公钥发给客户端
  • 客户端使用公钥,将自己登录的密码加密发送给服务器
  • 远程主机(服务器)使用私钥解密登录密码,如果密码正确,就同意登录

中间人攻击

  • 冒充服务器,将生产的虚拟公钥发送给客户端,它可以截获客户端连接服务器的密码

服务器保护

  • 一般SSH服务器会将自己的Hash值公布在网站上
  • 服务器在第一次登录时,会让客户端保存IP地址和公钥
  • 存放在~/.ssh/known_hosts

免密登录

  • 使用ssh-copy-id,将公钥拷贝到ssh服务器
  • 原理
    ◦ 客户端将公钥存储到远程服务器
    ◦ 登录时,远程服务器会向客户端发送随机字符串
    ◦ 客户端用自己的私钥加密后,发送给服务器
    ◦ 服务器用事先存储的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录,不再要求密码

SSH取别名

  • ~/.ssh目录中,有一个config用来配置SSH
  • 配置config文件
    Host:别名
    HostnameIP地址
    User:用户名
    Port:端口号

USB登录

  • 需要进行端口映射
    Pythopn脚本
    iproxy