iOS逆向(10)-越獄!越獄!遠程鏈接登陸手機

以前的九篇文章講述的是在不越獄的狀況下,詳細的講解了對APP重簽名的原理,如何動態庫注入,以及以後的各類調試技巧。這些功能其實已經很強大了,可以幫助我們在絕大多數狀況下去分析而且更改對方的APP了。這對付一些在開發過程當中沒有安全意識的APP其實已經足以。可是但凡對方有對APP進行防禦,那麼重簽名就顯得有些弱雞了。
好比:
一、登陸微信後,次日會受到他們的警告。
二、重簽名優酷後能夠看到他們有相似非法APP的Log
...html

那麼這個時候就須要我們對APP,甚至的操做系統擁有更大的掌控權,而這一切的基礎就是越獄!python

hackers老是想象若是本身是開發者會怎麼寫,而後才能找到入手點。同理,開發者們也要想象本身是hackers會怎麼作,才能採起相應的防護措施。而後,就是一場遞歸的博弈。
拿越獄檢測這件事來講,起初你們只需判斷有無安裝Cydia就行了,hackers們說好,那我就不安裝Cydia也能夠動手腳。開發者們又說,那你必定得用的上MobileSubstrate,bash,ssh吧,我去檢測手機有沒有安裝這些工具。但是又有什麼用呢?你判斷什麼我繞過去什麼。
當class-dump大肆流行,函數符號都被暴露,開發者想盡辦法藏起本身的敏感函數代碼。hackers們也知道class-dump的死穴在哪裏,因而新的檢索辦法油然而生。也就說,當一個防護手段成爲流行,它就不會再是個讓hackers大罵「真特麼費勁」的防護手段了。好比以前介紹的一個小技巧:內存數據擦除 ,hackers知道開發者都去擦數據了,那我hook memset在你擦以前去讀就行了。開發者說:我直接寫硬盤上而後刪除!hackers說:難道你沒據說過文件恢復?
git

Come on

以上來自大佬念茜的自言自語。github

因此說,這是一個全新的篇章,從這開始纔是真的逆向的起點,讓咱們一塊兒來享受在iOS世界中安全攻防的其樂窮窮吧。vim

1、什麼是越獄

要了解越獄,就必要要先了解iOS系統的啓動過程。
iOS啓動引導分爲三種模式:安全

  • 正常引導
  • 恢復引導
  • 固件更新引導

這裏咱們只對「正常模式」進行介紹,其餘兩種模式能夠本身猜一猜。bash

一、圖解啓動鏈

iOS安全啓動鏈.png

二、詳解啓動鏈

Step 一、按下電源

額,這個就不談了。服務器

Step 二、Boot ROM

全部iOS設備在處理器內都集成有一段名爲Boot Room的代碼,此代碼被燒製處處理器內的一塊存儲上,而且只讀,因此它的完整性的獲得保障的。但這也一樣會有問題,萬一Boot Room自己存在安全漏洞,那麼就沒法經過更新進行修復。
而Boot Room的功能主要是負責初始化設備,而且引導加載底層引導加載器LLB(Low Level Bootloader)。在這一過程當中,Boot Room會使用Apple Root CA Public證書對LLB進行驗證,若是驗證成功則加載iBoot,不成功則啓動失敗。
Boot Room在啓動的過程當中的地位相當重要,因爲Boot Room只讀特性,保證了iPhone上不能安裝Android系統。同理,在除了iPhone其餘的設備上沒有Boot Room,也就沒法安裝iOS系統。微信

Step 三、Low Level Bootloader

LLB(Low Level Bootloader)不一樣於Boot ROM,它不是被內嵌在設備上的,而是在iOS系統中,同其餘文件同樣,是一種被加密的IMG3格式文件,會隨着iOS系統更新而更新。 LLB負責啓動更高層次的Bootloader,一樣這一步也須要進行驗證。驗證不成啓動失敗,成功則繼續。網絡

Step 四、iBoot

iBoot 纔是引導過程當中的主加載器,它負責加載操做系統內核。一樣這一步也須要進行驗證。驗證不成啓動失敗,成功則繼續。

iBoot在內存中被加載至地址0x5FF00000處。它有一個內建的HFS+驅動,能夠直接訪問iOS的文件系統,並支持多線程。iBoot一般會派生出兩個線程:
一個main線程,負責顯示啓動時的蘋果logo,並根據auto-bootboot-command環境變量的設置(正常引導模式下boot-command被設爲fsboot)進行系統引導,引導過程能夠根據bootdelay環境變量延遲進行;
一個是uart reader線程,蘋果可能將這個線程用於調試,其基本處於閒置狀態。正常引導模式中,iBoot調用fsboot()函數掛載iOS系統分區,定位內核,準備設備數並引導系統,若是引導失敗,則進入恢復模式引導。

以上三個步驟只要其中任何一個步驟驗證失敗,則啓動失敗。

Step 五、launchd && 守護程序和代理程序 && SpringBoard

以前最主要的幾部完成以後就剩下啓動相關程序了,先啓動第一個程序launchd,再由由launchd啓動守護程序和代理程序,以後是桌面應用SpringBoard,系統啓動完成。

三、越獄是什麼?

Windows下最高權限用戶是AdminAdmin能夠對電腦操做任何事情,哪怕是刪掉本身。 Linux下最高權限用戶是RootAndroid下早年就有Root的說法,其實就是取得Root權限。 而iOS衍生與Unix,其與Linux基本類似,因此我們這說的越獄其實就是取得Root權限。

結合上文所說的安全啓動鏈的驗證過程,越獄要作的事情也就是找到那三個驗證的步驟中的漏洞,而且繞過其驗證,從而禁止掉信任鏈中負責驗證的組件,最終取得Root權限。

目前狀況下越獄分兩種:

  • 完美越獄:破解iOS系統漏洞以後,每次系統重啓都能自動調用注入的惡意代碼,達到破壞安全驗證,再次得到ROOT權限。
  • 非完美越獄:越獄系統後,並無徹底破解安全鏈,有部分信息或功能應用不佳;好比;關機之後必須去鏈接越獄軟件來引導開機;或者重啓會致使越獄的失效;這樣的越獄稱爲「不完美越獄」。

目前完美越獄只支持iOS10一下的設備,因此若是你們須要玩,建議入手一臺iOS9的iPhone5s(鹹魚300塊以內能包郵到家哦),

2、如何越獄

自從盤古聯合PP助手發佈了國內首批越獄工具後,越獄就變得極其簡單。一鍵操做,無痛無煩惱。
筆者利用「愛思助手」助手越獄。

愛思助手

而後根據本身的手機系統選擇對應版本的越獄工具便可。
根據提示有對應的簡單操做,而後等待自動重啓,重啓後能打開Cydia即表明越獄成功。固然也有可能越獄失敗,重複以上越獄的步驟就行了。

Cydia

Tips: 筆者在手機機身溫度比較高的時候常常越獄失敗,因此若是有一樣狀況的同窗,等待機身溫度下降以後再次嘗試,應該就能夠成功了。

3、推薦插件(必裝)

首先在Cyida中添加幾個經常使用的源:
一、PP助手:apt.25pp.com
二、雷鋒源:apt.abcydia.com
三、Frida:build.frida.re

  • Apple File Conduit "2":獲取訪問手機根目錄權限

    Apple File Conduit

  • AppSync Unified 關閉簽名:繞過簽名檢測

    AppSync Unified 關閉簽名

  • adv-cmds:命令行

    adv-cmds

  • OpenSSH:SSH (Secure SHell) 協議的免費開源實現。SSH協議族能夠用來進行遠程控制, 或在計算機之間傳送文件。

    OpenSSH

  • Frida:以後製做砸殼工具須要用到

    Frida

4、遠程鏈接登陸手機

一、Wifi鏈接

在上一步已經安裝完OpenSSH插件以後,Wifi登陸就變得很簡單。
先確保手機和電腦通處於一個Wifi環境,在手機的網絡設置裏面找到當前的IP地址,如:172.20.122.108 打開終端

// ssh 用戶名@手機IP地址
$ssh root@172.20.122.108
複製代碼

第一次登陸會有相似這樣的提示:

iPhone公鑰保存

直接yes就能夠了,他會將對應IP生成祕鑰保存在目錄/.ssh/known_hosts

known_hosts

若是將其中對應的IP刪掉,下次又會有一樣的提示了。

而後就須要填入用戶密碼,root用戶的默認密碼爲:alpine。 若是你對手機安全性有要求,建議改掉此密碼,而且牢記。不然就不要改了,要否則忘記了的話就只能刷機了(刷機有風險)。

出現相似以下圖就表明等成功

登陸成功

二、Wifi取別名

每次都是用ssh root@1172.20.122.108有點麻煩,並且也不利於記憶。因此咱們能夠給一個對應的IP取一個對應的名字,好比咱們給172.20.122.108的root用戶取名5s(假設個人越獄手機就是5s),那麼咱們下次就能夠直接使用如下命令來鏈接:

$ssh 5s
複製代碼

方法: 在上面提到的known_hosts同級目錄下新建一個名爲config的文件(建議使用Vim命令建立,由於有權限問題)。

config
其中加入以下內容:

Host 5s
    HostName 172.20.122.108       
    User root                      
    Port 22                      
複製代碼

假設有另一臺手機連了另一個IP,則須要多個Host,依次類推:

Host 5s
    HostName 172.20.122.108       
    User root                      
    Port 22                      

Host 6s  
    Hostname 172.20.122.163 
    User root
    Port  22
複製代碼

別名登陸

三、USB鏈接

上文已經瞭解到,如何用wifi登陸手機,要了解USB鏈接以前要知道一個前提:
本機的迴環地址默認爲127.0.0.1。 本機地址也能夠用localhost表示。而USB默認的端口號爲22
因此在USB端口號開放的前提下,咱們只要鏈接端口22便可。

點擊sukimashita官網或者個人Github下載usbmuxd

咱們只須要用到其中的python-client文件夾下的tcprelay.pyusbmux.py兩個文件。

usbmuxd

終端cd進入該目錄,開放22端口而且映射到12345端口上(能夠是任意端口,前提是此端口沒有被佔用),使用以下命令:

python tcprelay.py -t 22:12345  
複製代碼

端口映射

而後新建一個終端窗口
鏈接此本地IP下的12345端口便可:

ssh root@127.0.0.1 -p 12345
複製代碼

區別於上面的wifi地址,127.0.0.1 又是一個新的ip全部又會出現一次新的公鑰保存提示,一樣的yes,再輸入密碼:

USB鏈接成功

四、USB腳本鏈接

命令雖然簡單,可是每次都要進入tcprelay.py對應的目錄會很麻煩,因此仍是老規矩,先設置環境變量,再寫對應腳本,便可實如今任意目錄使用USB鏈接了。

一、設置環境變量

若是以前有跟筆者以前的文章作過,這一步可跳過。
在用戶的根目錄下新建文件夾FYSHELL,專門存放全部的自定義腳本文件。FYSHELL也能夠隨意存放,只是該目錄的位置在下面要使用到。
在用戶的根目錄下找到文件.bash_profile,新增長FYSHELL的環境變量(找不到.bash_profile文件?那就新建一個,推薦使用vim新建,避免權限問題)。 以下圖,筆者此時擁有兩個環境變量FYSHELLCY

環境變量.png

二、USB端口腳本

先將以前的python-client文件夾拷貝到FYSHELL中。
新建usbConnect.sh文件,輸入內容:

python /Users/用戶名/FYShell/python-client/tcprelay.py -t 22:12345
複製代碼

usbConnect.sh

三、登陸手機腳本

新建loginUsb_5s.sh文件,輸入內容:

ssh root@127.0.0.1 -p 12345 
複製代碼

loginUsb_5s.sh

以後直接使用這兩個腳本就能完成USB登陸手機的任務了!

sh usbConnect.sh
複製代碼

usbConnect.sh

// 新建端口後在執行如下命令
sh loginUsb_5s.sh
複製代碼

loginUsb_5s.sh

5、SSH登陸原理

如下內容因爲筆者的5s不在身旁,因此換了臺iPhone6的手機繼續。。。

SSH登陸本職上仍是調RSA加密的運用:

  • 遠程服務器(iPhone)上生成一堆公私鑰
  • 將公鑰發給客戶(Mac)
  • Mac每次登陸iPhone的時候使用本地保存的公鑰加密密碼,發送給iPhone,iPhone使用私鑰解密,密碼一直則登陸成功。

一、公鑰保存

在上文中的公鑰保存其實就是這裏所說的第一步。

iPhone公鑰保存

二、驗證

使用終端查看驗證

  • 查看iPhone自己的公鑰
cat ssh_host_rsa_key.pub
複製代碼

iPhone自己的公鑰

  • 查看Mac上保存的公鑰
cat known_hosts
複製代碼

Mac上保存的公鑰

兩個地方的公鑰是相同的,得以驗證。

三、中間人攻擊

中間人攻擊其實就是在SSH登陸的時候,驗證失敗的結果。
將本地保存的RSA公鑰隨意改一個字母筆者將最後一個字母f改爲了e
再次嘗試登陸手機,便可出現中間人攻擊提示。

竄改公鑰
中間人攻擊

驗證完以後仍是將其改回來吧。

6、免密登陸

免密碼登陸也稱「公鑰登陸」,原理就是用戶將本身的公鑰儲存在遠程主機上。登陸的時候,遠程主機會向用戶發送一段隨機字符串,用戶用本身的私鑰加密後,再發回來。遠程主機用事先儲存的公鑰進行解密,若是成功,就證實用戶是可信的,直接容許登陸 再也不要求密碼。

一、本地(MAC)生成RSA公私鑰

先查看本地(MAC)以前是否已經生成過RSA公私鑰,直接進入目錄.ssh下查看,若是其中有id_rsaid_rsa.pub即表明已有,無需從新生成。若是強行生成新的,則會致使以前使用這對祕鑰的地方失效。

.ssh

若是沒有,直接使用以下命令生成新的

ssh-keygen
複製代碼

接着會出現一些問題,所有留空,直接回車便可。以後就能夠發現目錄.ssh下有了id_rsaid_rsa.pub了。

二、將本地(MAC)的公鑰發送給服務器(iPhone)

ssh-copy-id root@localhost -p 12345
複製代碼

期間會須要輸入一次iPhone用戶的密碼(默認alpine)。

ssh-copy-id

接着,再次嘗試登陸,就會發現不用在輸入密碼就能夠登陸了。

免密登陸成功

相似上一步的驗證SSH原理,查看兩個端的用公鑰。

手機上的公鑰
Mac上的公鑰

一樣得以驗證。

7、總結

若是說越獄是逆向的開始,那麼Mac遠程登陸手機就是逆向的大門,只有進入其中,才能一探究竟。後續的全部操做,好比:砸殼,動態分析,動態調試,動態庫注入都離不開這個步驟,全部若是能夠,但願你們可以跟着這片文章作一遍。有可能會有坑,可是這樣才記憶深入!

下一篇文章將會講述在登陸手機後如何對APP進行砸殼。

引用

相關文章
相關標籤/搜索