22-越狱 & OpenSSH

前言

本篇文章将给大家介绍下iOS越狱的流程,以及OpenSSH的原理,看看越狱后如何使用OpenSSH连接以及调试手机。

一、越狱

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

1.1 安全启动链

那什么是安全启动链呢?👇🏻

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

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

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

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

以上整个流程如下图👇🏻

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

1.2 越狱类别

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

  1. 完美越狱 👉🏻 所谓完美越狱就是破解iOS系统漏洞之后,每次系统重启都能自动调用注入的恶意代码,达到破坏安全验证,再次获得root权限。

  2. 非完美越狱 👉🏻 系统越狱之后,并没有完全破解安全链,有部分信息或功能应用不佳。例如:关机以后必须去连接越狱软件来引导开机,或者重启会导致越狱的失效。这样的越狱称为不完美越狱

1.3 越狱工具

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

1.4 uncOver越狱演示

  1. 官网下载ipa包👇🏻

⚠️注意:官方给出的安装流程,过于繁琐,不建议使用。
更简单的方式 👉🏻 重签名将App安装到手机上。

  1. 使用脚本重签名 👉🏻 请参考10-应用重签名

⚠️注意:不要使用MonkeyDev,会在越狱时出现奇怪的问题。

  1. 安装成功后,断开Xcode。
  2. 重新运行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 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,可清理越狱环境,删除所有插件并撤销越狱工具注入的文件
  • 缺点 👉🏻 越狱成功后,如果设备重启过,需要重新越狱

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

  1. 越狱成功后,在Cydia中,添加常用软件源👇🏻

二、OpenSSH

接下来,我们看看什么是OpenSSH👇🏻
OpenSSHSSH(Secure SHell) 协议的免费开源实现。SSH协议可以用来进行远程控制, 或在计算机之间传送文件。

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

2.1 SSH登录过程

Mac电脑登录iPhone手机的过程如下图所示 👇🏻

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

⚠️注意:手机将公钥发给Mac电脑的时机点 👉🏻 在首次登录给出提示的时候

Mac端的公钥

Mac端存储的公钥在什么位置呢?

  1. 进入ssh目录
cd ~/.ssh
  1. 打开known_hosts文件
vi known_hosts

这里就存储了所有的公钥。我们可以找到手机设备的IP地址以及对应的公钥👇🏻

  1. 尝试将其删除,然后再次登录
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,过程如下图👇🏻

  1. 第三方假冒服务器,将生成的虚假公钥发给客户端。那么它将获得客户端连接服务的信息,包括服务端下发给客户端的公钥
  2. 当手机发送给Mac电脑的公钥被中间人截获,然后由中间人生成一对公钥和私钥,将伪造的公钥转发给Mac电脑
  3. Mac电脑会通过伪造的公钥加密登录密码,然后返回给中间人
  4. 中间人利用自己的私钥将其解密,使用截获手机公钥加密,再将其发送给手机
  5. 流程结束后,用户可以照常登录,但黑客已经截获了登录密码

服务端保护

那如何预防中间人攻击呢?👇🏻
为了避免中间人攻击,SSH在首次登录时,除了返回公钥,还会给出密钥的SHA256指纹

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

  • 首次登录的合法性,需要依靠人工核对。服务器在第一次登录时,会让客户端保存IP地址和公钥
  • 当再次登录时,客户端发现相同IP地址对应的公钥发生变化,会给出疑似中间人攻击的警告,并阻止登录
公钥存储位置
  1. 之前说过Mac端的存储位置 👉🏻 ~/.ssh目录下的known_hosts文件
  2. 手机端的存储位置 👉🏻 /etc/ssh目录下的ssh_host_rsa_key.pub文件

2.3 OpenSSH连接手机

  1. 需要手机越狱成功后,在Cydia中安装OpenSSH👇🏻

这样我们就可以在手机上开启SSH登录服务

  1. 安装后,可以在Cydia的已安装中查看👇🏻
  1. 使用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])?

之前说过,首次登录就会出现上述提示。

  1. 此时输入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设备下,有两个用户 👉🏻 rootmobile

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

2.4 免密登录

接下来我们来看看免密登录的流程。
免密登录也称之为公钥登录。起原理如下👇🏻

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

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

操作演示

  1. 打开终端,输入指令:拷贝公钥给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:
  1. 输入默认密码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.
  1. 公钥拷贝成功后,再次登录手机
ssh root@172.26.104.24
-------------------------
Last login: Mon May 24 12:15:57 2021 from 10.165.192.78

此时就直接允许登录了,没有要求输入密码。

2.5 SSH取别名

作为逆向工程师,分别会使用完美越狱非完美越狱两台手机。在更换设备时,切换登录的过程还是比较麻烦的,此时就需要给设备的SSH取别名

  1. 在~/.ssh目录下,创建一个config文件,该文件的目的 👉🏻 内部可以配置SSH登录的别名。
  2. vi config命令,配置config文件👇🏻
Host iphone8
Hostname 172.26.104.24
User root
Port 22
  • Host:别名
  • Hostname:IP地址
  • User:用户名
  • Port:端口号
  1. 配置成功后,就可以使用别名登录👇🏻
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连接演示
  1. 首先准备python-client工具👇🏻(ps:需要的可以评论区发邮箱)
  1. 使用Python脚本,建立端口映射👇🏻
python tcprelay.py -t 22:12345
-------------------------
Forwarding local port 12345 to remote port 22

将本地12345端口,映射到设备TCP22端口上。这样就可以通过本地的12345端口建立连接。

  1. 通过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端口。

  1. 对应localhost属于首次登录,出现密钥指纹的提示。输入yes,继续登录👇🏻
ssh -p 12345 root@localhost
-------------------------
Last login: Mon May 24 16:44:58 2021 from 172.26.104.24

此时成功登录到手机设备上!🍺🍺🍺🍺🍺🍺

  1. 切换到另一台手机设备,使用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种方式👇🏻

  1. 可以在known_hosts文件中,删除之前保存的IP地址和公钥
  2. 使用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脚本登录

以上连接设备登录等操作,都需要手动一条条的输入指令完成,还是挺麻烦,为了省事,建议使用脚本。

  1. 创建端口映射脚本usbConnect.sh,建议就在用户目录下👇🏻
python /Users/xxx/python-client/tcprelay.py -t 22:12345
  1. 创建USB连接手机设备的脚本usb-iphone8.sh👇🏻
ssh -p 12345 root@localhost
  1. 创建USB连接另一台手机的脚本usb-iphoneXs.sh👇🏻
ssh -p 12345 root@127.0.0.1
  1. 配置环境变量,方便全局使用。在./.zshrc./..bash_profile中👇🏻
export USB_CONNECT="/Users/xxx/"
export PATH=$USB_CONNECT
  1. 使用,直接在终端中输入👇🏻
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命令

  1. 使用brew list命令,查看libimobiledevice工具是否已安装👇🏻
  1. 未安装的话,使用brew install命令,安装libimobiledevice工具
brew install libimobiledevice

⚠️注意:如果是M1电脑,使用arch -arm64 brew install libimobiledevice

  1. 使用iproxy命令,建立端口映射
iproxy 12345 22
-------------------------
Creating listening port 12345 for device port 22
waiting for connection
  1. 最后使用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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,165评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,720评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,849评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,245评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,596评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,747评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,977评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,708评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,448评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,657评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,141评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,493评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,153评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,890评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,799评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,685评论 2 272

推荐阅读更多精彩内容