iOS逆向实战--028:越狱 & OpenSSH

2021-05-25  本文已影响0人  帅驼驼
越狱概述

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

安全启动链

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

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

LLB会做一些基础工作,然后验证第二级引导程序iBootiBoot启动后,设备就可以进入恢复模式或启动内核。在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 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中,添加常用软件源:

连接设备

通过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设备下,有两个用户:rootmobile

  • 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

找到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

OpenSSHSSHSecure 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:别名
  • HostnameIP地址
  • 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端口,映射到设备TCP22端口上。这样就可以通过本地的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端口映射到设备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
上一篇下一篇

猜你喜欢

热点阅读