iOS逆向实战--028:越狱 & OpenSSH
越狱概述
越狱(
Jailbreak
):通过iOS
系统安全启动链漏洞,从而禁止掉信任链中负责验证的组件。拿到iOS
系统最大权限root
权限
安全启动链
当启动一台
iOS
设备时,系统首先会从只读的ROM
中读取初始化指令,也就是系统的引导程序(事实上所有的操作系统启动时都要经过这一步,只是过程略有不同)这个引导
ROM
包含苹果官方权威认证的公钥,他会验证底层启动加载器(LLB
)的签名,一旦通过验证后就启动系统
LLB
会做一些基础工作,然后验证第二级引导程序iBoot
。iBoot
启动后,设备就可以进入恢复模式或启动内核。在iBoot
验证完内核签名的合法性之后,整个启动程序开始步入正轨:加载驱动程序、检测设备、启动系统守护进程这个信任链会确保所有的系统组件都由苹果官方写入、签名、分发,不能来自第三方机构
iOS
系统安全启动链:
越狱的工作原理正是攻击这一信任链。所有越狱工具的开发者,都需要找到这一信任链上的漏洞,从而禁止掉信任链中负责验证的组件。拿到
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 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
,可清理越狱环境,删除所有插件并撤销越狱工具注入的文件越狱成功后,如果设备重启过,需要使用
uncOver
重新越狱在重新越狱过程中,如果屡次失败,可尝试勾选
Reinstall Cydia
,再进行重新越狱
使用
Odyssey
越狱,需要注意一点,在断开网络的情况下,开始执行越狱。在越狱过程中,按照提示链接网络。大致流程和uncOver
一样
越狱成功后,在
Cydia
中,添加常用软件源:
连接设备
通过
OpenSSH
插件可以连接手机,进行远程控制, 或者传送文件
如果在越狱时,未勾选
(Re)Install OpenSSH
,需要在越狱成功后,在Cydia
中安装OpenSSH
。目的是在设备上开启SSH
登录服务
安装后,可以在
Cydia
的已安装中查看
- 来自
apt.bingner.com
软件源
连接设备
通过插件,使用
WiFi
连接手机:ssh 用户名@手机IP地址
ssh root@10.165.45.19 ------------------------- The authenticity of host '10.165.45.19 (10.165.45.19)' 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 '10.165.45.19' (RSA) to the list of known hosts. Connection closed by 10.165.45.19 port 22
如果未出现密码输入的提示,直接无视警告,尝试再次登录
ssh root@10.165.45.19 ------------------------- root@10.165.45.19's password:
- 提示输入密码
输入默认密码:
alpine
alpine ------------------------- iPhone6P:~ root#
- 成功登录到手机设备上,并且处于设备的
root
目录下
iOS
设备下,有两个用户:root
和mobile
root
用户:最高权限用户,可以访问任意文件mobile
用户:普通用户,只能访问该用户/var/Mobile
目录下的文件
登录手机设备的
root
用户,可以查看很多隐私内容例如,查看手机上运行的进程
ps -A ------------------------- PID TTY TIME CMD 1 ?? 2:23.51 /sbin/launchd 219 ?? 0:27.75 /usr/libexec/substituted 456 ?? 0:04.24 /System/Library/PrivateFrameworks/AssistantServices.framework/assistantd 458 ?? 0:19.25 /usr/libexec/fseventsd 459 ?? 3:38.85 /usr/sbin/mediaserverd ...
筛选出指定
App
的进程ps -A | grep WeChat ------------------------- 3980 ?? 0:25.14 /var/containers/Bundle/Application/454EA887-EB3B-43B3-ABFD-B9B2CA006981/WeChat.app/WeChat
找到
MachO
文件拷贝出来
图形化界面
在完美越狱的手机上,可以安装
AFC 2
插件,可以使用图形化的界面访问手机设备的所有目录但在非完美越狱的手机上,使用
iFunBox
或其他助手软件,只能访问到设备的/var/mobile/Media
目录
修改登录密码
登录手机设备的默认密码为
alpine
,使用passwd
命令,可以对其进行修改
root
用户,可以修改所有用户的密码:passwd 用户名
passwd root ------------------------- Changing password for root. New password: Retype new password:
输入两次新密码,确认修改。因为是登录状态,所以不用输入原始密码
断开设备连接
使用
exit
命令,可以断开设备的连接exit ------------------------- logout Connection to 10.165.45.19 closed.
OpenSSH
OpenSSH
是SSH
(Secure SHell
) 协议的免费开源实现。SSH
协议可以用来进行远程控制, 或在计算机之间传送文件
OpenSSH
- 它是一款软件,应用非常广泛
SSH
SSH
是一种网络协议,用于计算机之间的加密登录1995
年,芬兰学者Tatu Ylonen
设计了SSH
协议,将登录信息全部加密,成为互联网安全的一个基本解决方案,迅速在全世界获得推广,目前已经成为Linux
系统的标准配置
SSH
登录过程使用
Mac
电脑登录iPhone
手机的过程
- 请求连接到
iPhone
手机- 手机将公钥发给
Mac
电脑Mac
电脑通过收到的公钥加密登录密码iPhone
手机利用私钥解密登录密码,是否允许登录
手机将公钥发给
Mac
电脑,就是在首次登录给出提示的时候将客户端存储的公钥删除
在
Mac
的终端,进入ssh
目录cd ~/.ssh
打开
known_hosts
文件vi known_hosts
找到手机设备的
IP
地址以及对应的公钥
将其删除,然后再次登录
ssh root@10.165.45.19 ------------------------- The authenticity of host '10.165.45.19 (10.165.45.19)' 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
,后续流程继续
中间人攻击
中间人攻击(
Man-in-the-middle attack
)
- 冒充服务器,将生成的虚假公钥发给客户端。那么它将获得客户端连接服务
中间人:例如手机和电脑连接的黑客
WiFi
当手机发送给
Mac
电脑的公钥被中间人截获,然后由中间人生成一对公钥和私钥,将伪造的公钥转发给Mac
电脑
Mac
电脑会通过伪造的公钥加密登录密码,然后返回给中间人中间人利用自己的私钥将其解密,使用截获的手机公钥加密,再将其发送给手机
流程结束后,用户可以照常登录,但黑客已经截获了登录密码
服务器保护
为了避免中间人攻击,
SSH
在首次登录时,除了返回公钥,还会给出密钥的SHA256
指纹指纹的作用:服务器生成的有效指纹,会在网站上公布。用户首次登录时,可以人工核对该指纹的合法性。如果返回的指纹和公布的指纹不一致,可能出现中间人的伪造,立刻终止登录行为
首次登录的合法性,需要依靠人工核对。服务器在第一次登录时,会让客户端保存
IP
地址和公钥当再次登录时,客户端发现相同
IP
地址对应的公钥发生变化,会给出疑似中间人攻击的警告,并阻止登录
公钥在客户端保存的位置:
~/.ssh
目录下的known_hosts
文件
公钥在手机中保存的位置:
/etc/ssh
目录下的ssh_host_rsa_key.pub
文件
免密登录
免密登录:也称之为“公钥登录”
原理:客户端将自己的公钥,储存在远程主机上。登录时,服务器会向客户端发送一段随机的字符串。客户端用自己的私钥加密后,再发回来。服务器用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录,不再要求密码
- 客户端将自己的公钥存储在服务器上
- 登录的时候,服务器发送一个随机字符串
Mac
电脑通过私钥加密字符串iPhone
手机利用客户端的公钥解字符串
拷贝公钥给
SSH
服务器:ssh-copy-id 用户名@服务器IP地址
ssh-copy-id root@10.165.45.19 ------------------------- /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@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.
公钥拷贝成功,再次登录手机
ssh root@10.165.45.19 ------------------------- Last login: Mon May 24 12:15:57 2021 from 10.165.192.78
直接允许登录,不再要求密码
公钥在客户端保存的位置:
/Users/zang/.ssh
目录下的id_rsa.pub
文件
公钥在手机中保存的位置:
~/.ssh
目录下的authorized_keys
文件
SSH取别名
作为逆向工程师,分别会使用完美越狱和非完美越狱两台手机。在更换设备时,切换登录的过程还是比较麻烦的
我们可以在
~/.ssh
目录下,创建一个config
文件。内部可以配置SSH
登录的别名使用
vi config
命令,配置config
文件Host 6p Hostname 10.165.45.19 User root Port 22
Host
:别名Hostname
:IP
地址User
:用户名Port
:端口号配置成功,使用别名登录
ssh 6p ------------------------- Last login: Mon May 24 15:55:27 2021 from 10.165.192.78
USB登录
使用
WiFi
连接手机,在使用一些指令时,会出现卡顿情况。但使用USB
连接,无论何种操作都会无比顺畅
USB
连接的原理在
Mac
电脑上,默认是支持USB
连接的。例如:在Xcode
中使用的USB
调试
SSH
登录,默认使用22
端口。而USB
连接,需要使用usbmuxd
服务。主要用于在USB
协议上,实现多路TCP
连接
/System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/Resources/usbmuxd
USB
连接过程让
usbmuxd
服务映射到本地端口,然后通过本地端口,建立USB
连接首先准备
python-client
工具
使用
Python
脚本,建立端口映射python tcprelay.py -t 22:12345 ------------------------- Forwarding local port 12345 to remote port 22
- 将本地
12345
端口,映射到设备TCP
的22
端口上。这样就可以通过本地的12345
端口建立连接通过
USB
进行SSH
连接6p
设备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 10.165.192.78
使用
USB
连接,成功登录到手机设备上
切换到另一台
5s
设备,使用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
地址的公钥发生变化,客户端会给出疑似中间人攻击的警告,并阻止登录在这种情况下,想要继续登录,必须在
known_hosts
文件中,删除之前保存的IP
地址和公钥更简单的方法,将
localhost
使用127.0.0.1
代替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
,设备登录成功
Shell脚本登录
封装
Shell
脚本,更方便的登录手机设备在
ZangShell
目录下,创建脚本创建端口映射脚本:
usbConnect.sh
python /Users/zang/Zang/Tools/python-client/tcprelay.py -t 22:12345
创建
USB
连接6p
的脚本:usb-6p.sh
ssh -p 12345 root@localhost
创建
USB
连接5s
的脚本:usb-5s.sh
ssh -p 12345 root@127.0.0.1
最后将
ZangShell
目录配置到环境变量中,对脚本添加可执行权限
在终端使用
Shell
脚本,可快速连接到不同的手机设备上usbConnect.sh ------------------------- Forwarding local port 12345 to remote port 22
usb-6p.sh ------------------------- Last login: Mon May 24 17:25:52 2021 from 127.0.0.1
iproxy
USB
连接设备,除了使用Python
脚本,还可以使用iproxy
命令使用
brew list
命令,查看libimobiledevice
工具是否已安装
未安装,使用
brew install
命令,安装libimobiledevice
工具brew install libimobiledevice
使用
iproxy
命令,建立端口映射iproxy 12345 22 ------------------------- Creating listening port 12345 for device port 22 waiting for connection
使用
Shell
脚本,快速连接设备usb-6p.sh ------------------------- Last login: Mon May 24 18:19:32 2021 from 127.0.0.1
USB
连接成功,使用iproxy
命令,同样可以将12345
端口映射到设备TCP
的22
端口上,效果和使用Python
脚本是一样的
清理越狱环境
当越狱设备出现问题,如果在设备的“通用-还原”中,选择“还原所有设置”,很容易出现白苹果。正确的做法是,先将设备清理越狱环境,然后进行设备平刷
使用
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