之前的九篇文章講述的是在不越獄的情況下,詳細的講解了對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說:難道你沒聽說過檔案恢復?
以上來自大佬念茜的自言自語。
所以說,這是一個全新的篇章,從這開始才是真的逆向的起點,讓我們一起來享受在iOS世界中安全攻防的其樂窮窮吧。
一、什麼是越獄
要了解越獄,就必要要先了解iOS系統的啟動過程。
iOS啟動引導分為三種模式:
- 正常引導
- 恢復引導
- 韌體更新引導
這裡我們只對「正常模式」進行介紹,其他兩種模式可以自己猜一猜。
1、圖解啟動鏈
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-boot
和boot-command
環境變數的設定(正常引導模式下boot-command
被設為fsboot
)進行系統引導,引導過程可以根據bootdelay
環境變數延遲進行;
一個是uart reader
執行緒,蘋果可能將這個執行緒用於除錯,其基本處於閒置狀態。正常引導模式中,iBoot
呼叫fsboot()
函式掛載iOS系統分割槽,定位核心,準備裝置數並引導系統,如果引導失敗,則進入恢復模式引導。
以上三個步驟只要其中任何一個步驟驗證失敗,則啟動失敗。
Step 5、launchd && 守護程式和代理程式 && SpringBoard
之前最主要的幾部完成之後就剩下啟動相關程式了,先啟動第一個程式launchd
,再由由launchd
啟動守護程式和代理程式,之後是桌面應用SpringBoard
,系統啟動完成。
3、越獄是什麼?
Windows
下最高許可權使用者是Admin
,Admin
可以對電腦操作任何事情,哪怕是刪掉自己。
Linux
下最高許可權使用者是Root
,Android
下早年就有Root
的說法,其實就是取得Root
許可權。
而iOS
衍生與Unix
,其與Linux
基本相似,所以我們們這說的越獄其實就是取得Root
許可權。
結合上文所說的安全啟動鏈的驗證過程,越獄要做的事情也就是找到那三個驗證的步驟中的漏洞,並且繞過其驗證,從而禁止掉信任鏈中負責驗證的元件,最終取得Root
許可權。
目前情況下越獄分兩種:
- 完美越獄:破解iOS系統漏洞之後,每次系統重啟都能自動呼叫注入的惡意程式碼,達到破壞安全驗證,再次獲得ROOT許可權。
- 非完美越獄:越獄系統後,並沒有完全破解安全鏈,有部分資訊或功能應用不佳;比如;關機以後必須去連線越獄軟體來引導開機;或者重啟會導致越獄的失效;這樣的越獄稱為“不完美越獄”。
目前完美越獄只支援iOS10一下的裝置,所以如果大家需要玩,建議入手一臺iOS9的iPhone5s(鹹魚300塊之內能包郵到家哦),
二、如何越獄
自從盤古聯合PP助手釋出了國內首批越獄工具後,越獄就變得極其簡單。一鍵操作,無痛無煩惱。
筆者利用「愛思助手」助手越獄。
然後根據自己的手機系統選擇對應版本的越獄工具即可。
根據提示有對應的簡單操作,然後等待自動重啟,重啟後能開啟Cydia即代表越獄成功。當然也有可能越獄失敗,重複以上越獄的步驟就好了。
Tips: 筆者在手機機身溫度比較高的時候經常越獄失敗,所以如果有同樣情況的同學,等待機身溫度降低之後再次嘗試,應該就可以成功了。
三、推薦外掛(必裝)
首先在Cyida中新增幾個常用的源:
1、PP助手:apt.25pp.com
2、雷鋒源:apt.abcydia.com
3、Frida:build.frida.re
-
Apple File Conduit "2":獲取訪問手機根目錄許可權
-
AppSync Unified 關閉簽名:繞過簽名檢測
-
adv-cmds:命令列
-
OpenSSH:SSH (Secure SHell) 協議的免費開源實現。SSH協議族可以用來進行遠端控制, 或在計算機之間傳送檔案。
-
Frida:之後製作砸殼工具需要用到
四、遠端連線登入手機
1、Wifi連線
在上一步已經安裝完OpenSSH
外掛之後,Wifi登入就變得很簡單。
先確保手機和電腦通處於一個Wifi環境,在手機的網路設定裡面找到當前的IP地址,如:172.20.122.108
開啟終端
// ssh 使用者名稱@手機IP地址
$ssh root@172.20.122.108
複製程式碼
第一次登入會有類似這樣的提示:
直接yes就可以了,他會將對應IP生成祕鑰儲存在目錄/.ssh/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命令建立,因為有許可權問題)。
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.py
和usbmux.py
兩個檔案。
終端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,再輸入密碼:
4、USB指令碼連線
命令雖然簡單,但是每次都要進入tcprelay.py
對應的目錄會很麻煩,所以還是老規矩,先設定環境變數,再寫對應指令碼,即可實現在任意目錄使用USB連線了。
1、設定環境變數
如果之前有跟筆者之前的文章做過,這一步可跳過。
在使用者的根目錄下新建資料夾FYSHELL
,專門存放所有的自定義指令碼檔案。FYSHELL
也可以隨意存放,只是該目錄的位置在下面要使用到。
在使用者的根目錄下找到檔案.bash_profile
,新增加FYSHELL
的環境變數(找不到.bash_profile
檔案?那就新建一個,推薦使用vim新建,避免許可權問題)。
如下圖,筆者此時擁有兩個環境變數FYSHELL
和CY
2、USB埠指令碼
先將之前的python-client
資料夾拷貝到FYSHELL
中。
新建usbConnect.sh
檔案,輸入內容:
python /Users/使用者名稱/FYShell/python-client/tcprelay.py -t 22:12345
複製程式碼
3、登入手機指令碼
新建loginUsb_5s.sh
檔案,輸入內容:
ssh root@127.0.0.1 -p 12345
複製程式碼
之後直接使用這兩個指令碼就能完成USB登入手機的任務了!
sh usbConnect.sh
複製程式碼
// 新建埠後在執行以下命令
sh loginUsb_5s.sh
複製程式碼
五、SSH登入原理
以下內容由於筆者的5s不在身旁,所以換了臺iPhone6的手機繼續。。。
SSH登入本職上還是調RSA加密的運用:
- 遠端伺服器(iPhone)上生成一堆公私鑰
- 將公鑰發給客戶(Mac)
- Mac每次登入iPhone的時候使用本地儲存的公鑰加密密碼,傳送給iPhone,iPhone使用私鑰解密,密碼一直則登入成功。
1、公鑰儲存
在上文中的公鑰儲存其實就是這裡所說的第一步。
2、驗證
使用終端檢視驗證
- 檢視iPhone本身的公鑰
cat ssh_host_rsa_key.pub
複製程式碼
- 檢視Mac上儲存的公鑰
cat known_hosts
複製程式碼
兩個地方的公鑰是相同的,得以驗證。
3、中間人攻擊
中間人攻擊其實就是在SSH登入的時候,驗證失敗的結果。
將本地儲存的RSA公鑰隨意改一個字母筆者將最後一個字母f
改成了e
再次嘗試登入手機,即可出現中間人攻擊提示。
驗證完之後還是將其改回來吧。
六、免密登入
免密碼登入也稱“公鑰登入”,原理就是使用者將自己的公鑰儲存在遠端主機上。登入的時候,遠端主機會向使用者傳送一段隨機字串,使用者用自己的私鑰加密後,再發回來。遠端主機用事先儲存的公鑰進行解密,如果成功,就證明使用者是可信的,直接允許登入 不再要求密碼。
1、本地(MAC)生成RSA公私鑰
先檢視本地(MAC)之前是否已經生成過RSA公私鑰,直接進入目錄.ssh
下檢視,如果其中有id_rsa
和id_rsa.pub
即代表已有,無需重新生成。如果強行生成新的,則會導致之前使用這對祕鑰的地方失效。
如果沒有,直接使用如下命令生成新的
ssh-keygen
複製程式碼
接著會出現一些問題,全部留空,直接回車即可。之後就可以發現目錄.ssh
下有了id_rsa
和id_rsa.pub
了。
2、將本地(MAC)的公鑰傳送給伺服器(iPhone)
ssh-copy-id root@localhost -p 12345
複製程式碼
期間會需要輸入一次iPhone使用者的密碼(預設alpine)。
接著,再次嘗試登入,就會發現不用在輸入密碼就可以登入了。
類似上一步的驗證SSH原理,檢視兩個端的用公鑰。
同樣得以驗證。
七、總結
如果說越獄是逆向的開始,那麼Mac遠端登入手機就是逆向的大門,只有進入其中,才能一探究竟。後續的所有操作,比如:砸殼,動態分析,動態除錯,動態庫注入都離不開這個步驟,所有如果可以,希望大家能夠跟著這片文章做一遍。有可能會有坑,但是這樣才記憶深刻!
下一篇文章將會講述在登入手機後如何對APP進行砸殼。