iOS逆向(10)-越獄!越獄!遠端連線登入手機

一縷清風揚萬里發表於2019-05-13

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

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

hackers總是想象如果自己是開發者會怎麼寫,然後才能找到入手點。同理,開發者們也要想象自己是hackers會怎麼做,才能採取相應的防禦措施。然後,就是一場遞迴的博弈。
拿越獄檢測這件事來說,起初大家只需判斷有無安裝Cydia就好了,hackers們說好,那我就不安裝Cydia也可以動手腳。開發者們又說,那你一定得用的上MobileSubstrate,bash,ssh吧,我去檢測手機有沒有安裝這些工具。可是又有什麼用呢?你判斷什麼我繞過去什麼。
當class-dump大肆流行,函式符號都被暴露,開發者想盡辦法藏起自己的敏感函式程式碼。hackers們也知道class-dump的死穴在哪裡,於是新的檢索辦法油然而生。也就說,當一個防禦手段成為流行,它就不會再是個讓hackers大罵“真特麼費勁”的防禦手段了。比如之前介紹的一個小技巧:記憶體資料擦除 ,hackers知道開發者都去擦資料了,那我hook memset在你擦之前去讀就好了。開發者說:我直接寫硬碟上然後刪除!hackers說:難道你沒聽說過檔案恢復?

Come on

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

所以說,這是一個全新的篇章,從這開始才是真的逆向的起點,讓我們一起來享受在iOS世界中安全攻防的其樂窮窮吧。

一、什麼是越獄

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

  • 正常引導
  • 恢復引導
  • 韌體更新引導

這裡我們只對「正常模式」進行介紹,其他兩種模式可以自己猜一猜。

1、圖解啟動鏈

iOS安全啟動鏈.png

2、詳解啟動鏈

Step 1、按下電源

額,這個就不談了。

Step 2、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 3、Low Level Bootloader

LLB(Low Level Bootloader)不同於Boot ROM,它不是被內嵌在裝置上的,而是在iOS系統中,同其他檔案一樣,是一種被加密的IMG3格式檔案,會隨著iOS系統更新而更新。 LLB負責啟動更高層次的Bootloader,同樣這一步也需要進行驗證。驗證不成啟動失敗,成功則繼續。

Step 4、iBoot

iBoot 才是引導過程中的主載入器,它負責載入作業系統核心。同樣這一步也需要進行驗證。驗證不成啟動失敗,成功則繼續。

iBoot在記憶體中被載入至地址0x5FF00000處。它有一個內建的HFS+驅動,可以直接訪問iOS的檔案系統,並支援多執行緒。iBoot通常會派生出兩個執行緒:
一個main執行緒,負責顯示啟動時的蘋果logo,並根據auto-bootboot-command環境變數的設定(正常引導模式下boot-command被設為fsboot)進行系統引導,引導過程可以根據bootdelay環境變數延遲進行;
一個是uart reader執行緒,蘋果可能將這個執行緒用於除錯,其基本處於閒置狀態。正常引導模式中,iBoot呼叫fsboot()函式掛載iOS系統分割槽,定位核心,準備裝置數並引導系統,如果引導失敗,則進入恢復模式引導。

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

Step 5、launchd && 守護程式和代理程式 && SpringBoard

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

3、越獄是什麼?

Windows下最高許可權使用者是AdminAdmin可以對電腦操作任何事情,哪怕是刪掉自己。 Linux下最高許可權使用者是RootAndroid下早年就有Root的說法,其實就是取得Root許可權。 而iOS衍生與Unix,其與Linux基本相似,所以我們們這說的越獄其實就是取得Root許可權。

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

目前情況下越獄分兩種:

  • 完美越獄:破解iOS系統漏洞之後,每次系統重啟都能自動呼叫注入的惡意程式碼,達到破壞安全驗證,再次獲得ROOT許可權。
  • 非完美越獄:越獄系統後,並沒有完全破解安全鏈,有部分資訊或功能應用不佳;比如;關機以後必須去連線越獄軟體來引導開機;或者重啟會導致越獄的失效;這樣的越獄稱為“不完美越獄”。

目前完美越獄只支援iOS10一下的裝置,所以如果大家需要玩,建議入手一臺iOS9的iPhone5s(鹹魚300塊之內能包郵到家哦),

二、如何越獄

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

愛思助手

然後根據自己的手機系統選擇對應版本的越獄工具即可。
根據提示有對應的簡單操作,然後等待自動重啟,重啟後能開啟Cydia即代表越獄成功。當然也有可能越獄失敗,重複以上越獄的步驟就好了。

Cydia

Tips: 筆者在手機機身溫度比較高的時候經常越獄失敗,所以如果有同樣情況的同學,等待機身溫度降低之後再次嘗試,應該就可以成功了。

三、推薦外掛(必裝)

首先在Cyida中新增幾個常用的源:
1、PP助手:apt.25pp.com
2、雷鋒源:apt.abcydia.com
3、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

四、遠端連線登入手機

1、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。 如果你對手機安全性有要求,建議改掉此密碼,並且牢記。否則就不要改了,要不然忘記了的話就只能刷機了(刷機有風險)。

出現類似如下圖就代表等成功

登入成功

2、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
複製程式碼

別名登入

3、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連線成功

4、USB指令碼連線

命令雖然簡單,但是每次都要進入tcprelay.py對應的目錄會很麻煩,所以還是老規矩,先設定環境變數,再寫對應指令碼,即可實現在任意目錄使用USB連線了。

1、設定環境變數

如果之前有跟筆者之前的文章做過,這一步可跳過。
在使用者的根目錄下新建資料夾FYSHELL,專門存放所有的自定義指令碼檔案。FYSHELL也可以隨意存放,只是該目錄的位置在下面要使用到。
在使用者的根目錄下找到檔案.bash_profile,新增加FYSHELL的環境變數(找不到.bash_profile檔案?那就新建一個,推薦使用vim新建,避免許可權問題)。 如下圖,筆者此時擁有兩個環境變數FYSHELLCY

環境變數.png

2、USB埠指令碼

先將之前的python-client資料夾拷貝到FYSHELL中。
新建usbConnect.sh檔案,輸入內容:

python /Users/使用者名稱/FYShell/python-client/tcprelay.py -t 22:12345
複製程式碼

usbConnect.sh

3、登入手機指令碼

新建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

五、SSH登入原理

以下內容由於筆者的5s不在身旁,所以換了臺iPhone6的手機繼續。。。

SSH登入本職上還是調RSA加密的運用:

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

1、公鑰儲存

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

iPhone公鑰儲存

2、驗證

使用終端檢視驗證

  • 檢視iPhone本身的公鑰
cat ssh_host_rsa_key.pub
複製程式碼

iPhone本身的公鑰

  • 檢視Mac上儲存的公鑰
cat known_hosts
複製程式碼

Mac上儲存的公鑰

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

3、中間人攻擊

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

竄改公鑰
中間人攻擊

驗證完之後還是將其改回來吧。

六、免密登入

免密碼登入也稱“公鑰登入”,原理就是使用者將自己的公鑰儲存在遠端主機上。登入的時候,遠端主機會向使用者傳送一段隨機字串,使用者用自己的私鑰加密後,再發回來。遠端主機用事先儲存的公鑰進行解密,如果成功,就證明使用者是可信的,直接允許登入 不再要求密碼。

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

先檢視本地(MAC)之前是否已經生成過RSA公私鑰,直接進入目錄.ssh下檢視,如果其中有id_rsaid_rsa.pub即代表已有,無需重新生成。如果強行生成新的,則會導致之前使用這對祕鑰的地方失效。

.ssh

如果沒有,直接使用如下命令生成新的

ssh-keygen
複製程式碼

接著會出現一些問題,全部留空,直接回車即可。之後就可以發現目錄.ssh下有了id_rsaid_rsa.pub了。

2、將本地(MAC)的公鑰傳送給伺服器(iPhone)

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

期間會需要輸入一次iPhone使用者的密碼(預設alpine)。

ssh-copy-id

接著,再次嘗試登入,就會發現不用在輸入密碼就可以登入了。

免密登入成功

類似上一步的驗證SSH原理,檢視兩個端的用公鑰。

手機上的公鑰
Mac上的公鑰

同樣得以驗證。

七、總結

如果說越獄是逆向的開始,那麼Mac遠端登入手機就是逆向的大門,只有進入其中,才能一探究竟。後續的所有操作,比如:砸殼,動態分析,動態除錯,動態庫注入都離不開這個步驟,所有如果可以,希望大家能夠跟著這片文章做一遍。有可能會有坑,但是這樣才記憶深刻!

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

引用

相關文章