前言
本篇文章将给大家介绍下iOS越狱
的流程,以及OpenSSH
的原理,看看越狱后
如何使用OpenSSH
连接以及调试手机。
一、越狱
越狱(Jailbreak
):通过iOS系统安全启动链
漏洞,从而禁止掉信任链中负责验证
的组件,拿到iOS系统最大权限 👉🏻 root权限
。
1.1 安全启动链
那什么是安全启动链
呢?👇🏻
当启动一台iOS设备时,系统首先会从
只读
的ROM
中读取初始化指令,也就是系统的引导
程序(事实上所有的操作系统启动时都要经过这一步,只是过程略有不同)。这个
引导ROM
包含苹果官方权威认证的公钥
,他会验证底层启动加载器(LLB)
的签名,一旦通过验证后就启动系统。LLB
会做一些基础工作,然后验证第二级引导程序iBoot
。iBoot
启动后,设备就可以进入恢复模式或启动内核。在iBoot
验证完内核签名的合法性之后,整个启动程序开始步入正轨:加载驱动程序、检测设备、启动系统守护进程。这个信任链会确保所有的
系统组件
都由苹果官方
写入、签名、分发,不能来自第三方机构
。
以上整个流程如下图👇🏻
所以,越狱
的工作原理正是攻击这一信任链
。所有越狱工具的开发者,都需要找到这一信任链上的漏洞,从而禁止掉信任链中负责验证的组件。拿到iOS系统最大权限root权限
。
1.2 越狱类别
根据越狱的情况不同,可以分为如下两种越狱👇🏻
完美越狱
👉🏻 所谓完美越狱就是破解iOS系统漏洞之后,每次系统重启都能自动调用注入的恶意代码,达到破坏安全验证,再次获得root权限。非完美越狱
👉🏻 系统越狱之后,并没有完全破解安全链,有部分信息或功能应用不佳。例如:关机以后必须去连接越狱软件来引导开机,或者重启会导致越狱的失效。这样的越狱称为不完美越狱
。
1.3 越狱工具
目前比较靠谱的两种
越狱工具👇🏻
1.4 uncOver越狱演示
- 官网下载
ipa包
👇🏻
⚠️注意:官方给出的安装流程,过于繁琐,不建议使用。
更简单的方式 👉🏻重签名
将App安装到手机上。
- 使用
脚本
重签名 👉🏻 请参考10-应用重签名
⚠️注意:
不要
使用MonkeyDev
,会在越狱时出现奇怪的问题。
- 安装成功后,断开Xcode。
- 重新运行App,在
设置
中,勾选(Re)Install OpenSSH
,然后进行越狱。
⚠️注意:越狱过程中,手机会重启。重启之后,再次运行越狱工具,完成本次越狱。
uncOver中的设置项
title | 释义 |
---|---|
Dark Mode |
适配暗黑模式 |
Load Tweaks |
开启此功能,在越狱激活时,会让越狱顺便加载越狱环境,通常都是维持开启状态。那何时可以关闭呢?当发生装完新插件后,导致插件冲突造成安全模式,那在激活越狱时先将此功能关闭,再激活越狱,就可进入Cydia 来移除有冲突的插件 |
Refresh Icon Cache |
桌面上暂存的白色图示导致无法删除,通过此功能开启就可清除 |
Disable Auto Updates |
屏蔽自动升级,可以关闭iOS 内的OTA 升级提醒。这功能是no beta alert 插件来完成,有装描述档来防堵iOS 升级者,不需要删除或关闭,依旧都保持安装描述档和维持打开即可 |
Export TFP0 |
输出TFP0 (不安全)。Export TFP0 是iOS 一个漏洞,可以让所有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
,可清理越狱环境,删除所有插件并撤销越狱工具注入的文件 - 缺点 👉🏻 越狱成功后,如果
设备重启
过,需要重新
越狱
⚠️注意:在重新越狱过程中,如果
屡次失败
,可尝试勾选Reinstall Cydia
,再进行重新
越狱。
- 越狱成功后,在
Cydia
中,添加常用软件源👇🏻
二、OpenSSH
接下来,我们看看什么是OpenSSH
👇🏻
OpenSSH
是SSH(Secure SHell)
协议的免费开源实现。SSH
协议可以用来进行远程控制, 或在计算机之间传送文件。
-
OpenSSH
👉🏻 它是一款软件,应用非常广泛 -
SSH
👇🏻-
SSH
是一种网络协议,用于计算机之间的加密登录 - 1995年,芬兰学者
Tatu Ylonen
设计了SSH
协议,将登录信息全部加密,成为互联网安全的一个基本解决方案,迅速在全世界获得推广,目前已经成为Linux
系统的标准配置
-
2.1 SSH登录过程
Mac电脑
登录iPhone手机
的过程如下图所示 👇🏻
-
Mac
请求连接到iPhone
手机 - 手机将
公钥
发给Mac
电脑 -
Mac
电脑通过收到的公钥
加密登录密码
-
iPhone
手机利用私钥
解密登录密码
,是否允许登录
⚠️注意:手机将
公钥
发给Mac电脑的时机点 👉🏻 在首次登录
给出提示的时候
Mac端的公钥
Mac端存储的公钥
在什么位置呢?
- 进入ssh目录
cd ~/.ssh
- 打开
known_hosts
文件
vi known_hosts
这里就存储了所有的公钥。我们可以找到手机设备的IP地址
以及对应的公钥
👇🏻
- 尝试将其
删除
,然后再次登录
ssh root@172.26.104.24
-------------------------
The authenticity of host '172.26.104.24 (172.26.104.24)' can't be established.
RSA key fingerprint is SHA256:gVFSTQl82bEyY21NqHcrcH8PVIh18OZPkht9khvQXUA.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
上面的意思就是 👉🏻 客户端不存在
公钥,视为首次登录
。将手机公钥
发给Mac电脑
,同时还有一个RSA密钥
的SHA256指纹
,输入yes
,让后续流程继续。
2.2 中间人攻击
中间人:例如手机和电脑连接的黑客WiFi
,中间人攻击即Man-in-the-middle attack
,过程如下图👇🏻
- 第三方假冒服务器,将生成的
虚假公钥
发给客户端。那么它将获得客户端连接服务的信息,包括服务端下发给客户端的公钥
。 - 当手机发送给Mac电脑的
公钥
被中间人截获
,然后由中间人生成一对公钥和私钥
,将伪造的公钥
转发给Mac电脑
- Mac电脑会通过
伪造的公钥
加密登录密码
,然后返回给中间人
- 中间人利用自己的
私钥
将其解密,使用截获
的手机公钥
加密,再将其发送给手机
- 流程结束后,用户可以照常登录,但黑客已经截获了
登录密码
服务端保护
那如何预防中间人攻击呢?👇🏻
为了避免中间人攻击,SSH
在首次登录时,除了返回公钥
,还会给出密钥的SHA256指纹
。
指纹
的作用 👉🏻 服务器生成的有效指纹,会在网站上公布。用户首次登录时,可以人工核对该指纹的合法性。如果返回的指纹和公布的指纹不一致,可能出现中间人的伪造,立刻终止登录行为。
- 首次登录的合法性,需要依靠
人工核对
。服务器在第一次登录时,会让客户端保存IP地址和公钥
- 当再次登录时,客户端发现
相同IP地址
对应的公钥
发生变化,会给出疑似中间人攻击的警告,并阻止登录
公钥存储位置
- 之前说过Mac端的存储位置 👉🏻
~/.ssh
目录下的known_hosts
文件 - 手机端的存储位置 👉🏻
/etc/ssh
目录下的ssh_host_rsa_key.pub
文件
2.3 OpenSSH连接手机
- 需要手机
越狱成功
后,在Cydia
中安装OpenSSH
👇🏻
这样我们就可以在手机上开启SSH登录服务
。
- 安装后,可以在
Cydia
的已安装中查看👇🏻
- 使用WiFi连接手机
ssh 用户名@手机IP地址
ssh root@172.26.104.24
-------------------------
The authenticity of host '172.26.104.24 (172.26.104.24)' can't be established.
RSA key fingerprint is SHA256:gVFSTQl82bEyY21NqHcrcH8PVIh18OZPkht9khvQXUA.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
之前说过,首次登录就会出现上述提示。
- 此时输入
yes
,可能
会直接要求输入密码,也可能出现警告👇🏻
yes
-------------------------
Warning: Permanently added '172.26.104.24' (RSA) to the list of known hosts.
Connection closed by 172.26.104.24 port 22
如果未出现
密码输入的提示,直接无视警告
,尝试再次登录
ssh root@172.26.104.24
-------------------------
root@172.26.104.24's password:
输入默认密码alpine
alpine
-------------------------
iPhone8:~ root#
成功登录到手机设备上,并且处于设备的root
目录下。
iOS设备下,有两个用户 👉🏻
root
和mobile
- root用户:
最高权限
用户,可以访问任意文件
- mobile用户:
普通权限
用户,只能访问该用户/var/Mobile
目录下的文件
2.4 免密登录
接下来我们来看看免密登录
的流程。
免密登录
也称之为公钥登录
。起原理如下👇🏻
客户端将自己的公钥,储存在远程主机上。登录时,服务器会向客户端发送一段随机的字符串。客户端用自己的私钥加密后,再发回来。服务器用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录,不再要求密码。
- 客户端将自己的公钥存储在服务器上
- 登录的时候,服务器发送一个随机字符串
- Mac电脑通过私钥加密字符串
- iPhone手机利用客户端的公钥解字符串
操作演示
- 打开终端,输入指令:拷贝公钥给SSH服务器👇🏻
ssh-copy-id 用户名@服务器IP地址
ssh-copy-id root@172.26.104.24
-------------------------
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/Users/zang/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/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
root@172.26.104.24's password:
- 输入默认密码
alpine
alpine
-------------------------
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@172.26.104.24'"
and check to make sure that only the key(s) you wanted were added.
- 公钥拷贝成功后,再次登录手机
ssh root@172.26.104.24
-------------------------
Last login: Mon May 24 12:15:57 2021 from 10.165.192.78
此时就直接允许登录了,没有要求输入密码。
2.5 SSH取别名
作为逆向工程师,分别会使用完美越狱
和非完美越狱
两台手机。在更换设备
时,切换登录
的过程还是比较麻烦的,此时就需要给设备的SSH取别名
。
- 在~/.ssh目录下,创建一个config文件,该文件的目的 👉🏻 内部可以配置SSH登录的别名。
-
vi config
命令,配置config文件👇🏻
Host iphone8
Hostname 172.26.104.24
User root
Port 22
-
Host
:别名 -
Hostname
:IP地址 -
User
:用户名 -
Port
:端口号
- 配置成功后,就可以使用
别名
登录👇🏻
ssh iphone8
-------------------------
Last login: Mon May 24 15:55:27 2021 from 172.26.104.24
2.6 USB登录
之前,我们都是使用WiFi
,通过ip和端口号
登录的,其实也可以手机usb线连接Mac电脑,使用USB登录
,因为使用WiFi
连接手机,在使用一些指令时,会出现卡顿情况。
USB连接的原理
在Mac电脑上,默认是支持USB连接的。例如:在Xcode中使用的USB调试SSH登录,默认使用22
端口。
而USB连接,需要使用usbmuxd
服务 👉🏻 主要用于在USB协议
上,实现多路TCP连接
。usbmuxd
所在Mac电脑的位置👇🏻
/System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/Resources/usbmuxd
USB连接演示
- 首先准备python-client工具👇🏻(ps:需要的可以评论区发邮箱)
- 使用
Python
脚本,建立端口映射👇🏻
python tcprelay.py -t 22:12345
-------------------------
Forwarding local port 12345 to remote port 22
将本地12345
端口,映射到设备TCP
的22
端口上。这样就可以通过本地的12345
端口建立连接。
- 通过
USB
进行SSH
连接手机设备
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])?
SSH连接本地12345端口,由于进行了端口映射,所以会通过USB连接到设备的22端口。
- 对应
localhost
属于首次登录
,出现密钥指纹
的提示。输入yes
,继续登录👇🏻
ssh -p 12345 root@localhost
-------------------------
Last login: Mon May 24 16:44:58 2021 from 172.26.104.24
此时成功登录到手机设备上!🍺🍺🍺🍺🍺🍺
- 切换到
另一台
手机设备,使用USB连接
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.
上面出现警告⚠️,因为设备更换,服务器返回的公钥发生了变化,但连接的IP地址都是localhost
。当相同IP地址的公钥发生变化,客户端会给出疑似中间人
攻击的警告,并阻止登录。
怎么办呢?2种方式👇🏻
- 可以在
known_hosts
文件中,删除
之前保存的IP地址和公钥 - 使用
127.0.0.1
代替localhost
每次切换都去删除显然很麻烦,所以建议第2种。
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:
输入默认密码alpine
,设备登录成功。
2.7 Shell脚本登录
以上连接设备登录等操作,都需要手动一条条的输入指令完成,还是挺麻烦,为了省事,建议使用脚本。
- 创建端口映射脚本
usbConnect.sh
,建议就在用户目录
下👇🏻
python /Users/xxx/python-client/tcprelay.py -t 22:12345
- 创建USB连接手机设备的脚本
usb-iphone8.sh
👇🏻
ssh -p 12345 root@localhost
- 创建USB连接另一台手机的脚本
usb-iphoneXs.sh
👇🏻
ssh -p 12345 root@127.0.0.1
- 配置环境变量,方便
全局
使用。在./.zshrc
和./..bash_profile
中👇🏻
export USB_CONNECT="/Users/xxx/"
export PATH=$USB_CONNECT
- 使用,直接在终端中输入👇🏻
usbConnect.sh
-------------------------
Forwarding local port 12345 to remote port 22
usb-iphone8.sh
-------------------------
Last login: Mon May 24 17:25:52 2021 from 127.0.0.1
2.8 iproxy
USB连接设备,除了使用Python
脚本,还可以使用iproxy命令
。
- 使用
brew list
命令,查看libimobiledevice
工具是否已安装👇🏻
- 未安装的话,使用
brew install
命令,安装libimobiledevice
工具
brew install libimobiledevice
⚠️注意:如果是M1电脑,使用
arch -arm64 brew install libimobiledevice
- 使用iproxy命令,建立端口映射
iproxy 12345 22
-------------------------
Creating listening port 12345 for device port 22
waiting for connection
- 最后使用Shell脚本,快速连接设备
usb-iphone8.sh
-------------------------
Last login: Mon May 24 18:19:32 2021 from 127.0.0.1
USB连接成功!🍺🍺🍺🍺🍺🍺
2.9 清理越狱环境
当越狱设备出现问题,如果在设备的“通用-还原”中,选择“还原所有设置”,很容易出现白苹果。正确的做法是,先将设备清理越狱环境,然后进行设备平刷
使用uncOver
工具越狱,在设置中很容易清理越狱环境。但如果是老系统的设备,使用其他工具进行越狱,此时想清理越狱环境就很困难了
这种情况下清理越狱环境的方法:
- 准备清理越狱环境的脚本:unjailbreak.sh
- 将
unjailbreak.sh
拷贝到越狱手机的root
用户目录下 - 在手机上执行该脚本(设备会重启并且清理干净)
总结
-
越狱概述
- 通过破解iOS安全启动链的漏洞,拿到iOS的root权限
- 完美越狱:每次系统重新启动,都会再次进入越狱状态
- 非完美越狱:没有完全破解,一般重启后会失去越狱环境
-
OpenSSH
SSH是一种网络协议
OpenSSH是一款软件
-
SSH登录过程
◦ 远程主机(服务器)收到用户的登录请求,将自己的公钥发给客户端
◦ 客户端使用公钥,将自己登录的密码加密发送给服务器
◦ 远程主机(服务器)使用私钥解密登录密码,如果密码正确,就同意登录 中间人攻击
◦ 冒充服务器,将生产的虚拟公钥发送给客户端,它可以截获客户端连接服务器的密码服务器保护
◦ 一般SSH服务器会将自己的Hash值公布在网站上
◦ 服务器在第一次登录时,会让客户端保存IP地址和公钥存放在~/.ssh/known_hosts中-
免密登录
- 使用ssh-copy-id,将公钥拷贝到ssh服务器
- 原理
◦ 客户端将公钥存储到远程服务器
◦ 登录时,远程服务器会向客户端发送随机字符串
◦ 客户端用自己的私钥加密后,发送给服务器
◦ 服务器用事先存储的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录,不再要求密码
SSH取别名👉🏻
~/.ssh
目录中,有一个config
用来配置SSH
配置config文件
◦ Host:别名
◦ Hostname:IP地址
◦ User:用户名
◦ Port:端口号USB登录 👉🏻 需要进行端口映射
◦ Pythopn脚本
◦ iproxy