美文网首页
iOS逆向实战--028:越狱 & OpenSSH

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

作者: 帅驼驼 | 来源:发表于2021-05-25 12:16 被阅读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

    相关文章

      网友评论

          本文标题:iOS逆向实战--028:越狱 & OpenSSH

          本文链接:https://www.haomeiwen.com/subject/ivnwjltx.html