之前的九篇文章講述的是在不越獄的情況下,詳細(xì)的講解了對(duì)APP重簽名的原理,如何動(dòng)態(tài)庫(kù)注入,以及之后的各種調(diào)試技巧。這些功能其實(shí)已經(jīng)很強(qiáng)大了,能夠幫助咱們?cè)诮^大多數(shù)情況下去分析并且更改對(duì)方的APP了。這對(duì)付一些在開(kāi)發(fā)過(guò)程中沒(méi)有安全意識(shí)的APP其實(shí)已經(jīng)足以。但是但凡對(duì)方有對(duì)APP進(jìn)行防護(hù),那么重簽名就顯得有些弱雞了。
比如:
1、登錄微信后,第二天會(huì)受到他們的警告。
2、重簽名優(yōu)酷后可以看到他們有類(lèi)似非法APP的Log
...
那么這個(gè)時(shí)候就需要咱們對(duì)APP,甚至的操作系統(tǒng)擁有更大的掌控權(quán),而這一切的基礎(chǔ)就是越獄!
hackers總是想象如果自己是開(kāi)發(fā)者會(huì)怎么寫(xiě),然后才能找到入手點(diǎn)。同理,開(kāi)發(fā)者們也要想象自己是hackers會(huì)怎么做,才能采取相應(yīng)的防御措施。然后,就是一場(chǎng)遞歸的博弈。
拿越獄檢測(cè)這件事來(lái)說(shuō),起初大家只需判斷有無(wú)安裝Cydia就好了,hackers們說(shuō)好,那我就不安裝Cydia也可以動(dòng)手腳。開(kāi)發(fā)者們又說(shuō),那你一定得用的上MobileSubstrate,bash,ssh吧,我去檢測(cè)手機(jī)有沒(méi)有安裝這些工具。可是又有什么用呢?你判斷什么我繞過(guò)去什么。
當(dāng)class-dump大肆流行,函數(shù)符號(hào)都被暴露,開(kāi)發(fā)者想盡辦法藏起自己的敏感函數(shù)代碼。hackers們也知道class-dump的死穴在哪里,于是新的檢索辦法油然而生。也就說(shuō),當(dāng)一個(gè)防御手段成為流行,它就不會(huì)再是個(gè)讓hackers大罵“真特么費(fèi)勁”的防御手段了。比如之前介紹的一個(gè)小技巧:內(nèi)存數(shù)據(jù)擦除 ,hackers知道開(kāi)發(fā)者都去擦數(shù)據(jù)了,那我hook memset在你擦之前去讀就好了。開(kāi)發(fā)者說(shuō):我直接寫(xiě)硬盤(pán)上然后刪除!hackers說(shuō):難道你沒(méi)聽(tīng)說(shuō)過(guò)文件恢復(fù)?
以上來(lái)自大佬念茜的自言自語(yǔ)。
所以說(shuō),這是一個(gè)全新的篇章,從這開(kāi)始才是真的逆向的起點(diǎn),讓我們一起來(lái)享受在iOS世界中安全攻防的其樂(lè)窮窮吧。
一、什么是越獄
要了解越獄,就必要要先了解iOS系統(tǒng)的啟動(dòng)過(guò)程。
iOS啟動(dòng)引導(dǎo)分為三種模式:
- 正常引導(dǎo)
- 恢復(fù)引導(dǎo)
- 固件更新引導(dǎo)
這里我們只對(duì)「正常模式」進(jìn)行介紹,其他兩種模式可以自己猜一猜。
1、圖解啟動(dòng)鏈
2、詳解啟動(dòng)鏈
Step 1、按下電源
額,這個(gè)就不談了。
Step 2、Boot ROM
所有iOS設(shè)備在處理器內(nèi)都集成有一段名為Boot Room的代碼,此代碼被燒制到處理器內(nèi)的一塊存儲(chǔ)上,并且只讀,所以它的完整性的得到保障的。但這也同樣會(huì)有問(wèn)題,萬(wàn)一Boot Room本身存在安全漏洞,那么就無(wú)法通過(guò)更新進(jìn)行修復(fù)。
而B(niǎo)oot Room的功能主要是負(fù)責(zé)初始化設(shè)備,并且引導(dǎo)加載底層引導(dǎo)加載器LLB(Low Level Bootloader)。在這一過(guò)程中,Boot Room會(huì)使用Apple Root CA Public證書(shū)對(duì)LLB進(jìn)行驗(yàn)證,如果驗(yàn)證成功則加載iBoot,不成功則啟動(dòng)失敗。
Boot Room在啟動(dòng)的過(guò)程中的地位至關(guān)重要,由于Boot Room只讀特性,保證了iPhone上不能安裝Android系統(tǒng)。同理,在除了iPhone其他的設(shè)備上沒(méi)有Boot Room,也就無(wú)法安裝iOS系統(tǒng)。
Step 3、Low Level Bootloader
LLB(Low Level Bootloader)不同于Boot ROM,它不是被內(nèi)嵌在設(shè)備上的,而是在iOS系統(tǒng)中,同其他文件一樣,是一種被加密的IMG3格式文件,會(huì)隨著iOS系統(tǒng)更新而更新。
LLB負(fù)責(zé)啟動(dòng)更高層次的Bootloader,同樣這一步也需要進(jìn)行驗(yàn)證。驗(yàn)證不成啟動(dòng)失敗,成功則繼續(xù)。
Step 4、iBoot
iBoot 才是引導(dǎo)過(guò)程中的主加載器,它負(fù)責(zé)加載操作系統(tǒng)內(nèi)核。同樣這一步也需要進(jìn)行驗(yàn)證。驗(yàn)證不成啟動(dòng)失敗,成功則繼續(xù)。
iBoot
在內(nèi)存中被加載至地址0x5FF00000
處。它有一個(gè)內(nèi)建的HFS+驅(qū)動(dòng),可以直接訪問(wèn)iOS的文件系統(tǒng),并支持多線程。iBoot通常會(huì)派生出兩個(gè)線程:
一個(gè)main
線程,負(fù)責(zé)顯示啟動(dòng)時(shí)的蘋(píng)果logo,并根據(jù)auto-boot
和boot-command
環(huán)境變量的設(shè)置(正常引導(dǎo)模式下boot-command
被設(shè)為fsboot
)進(jìn)行系統(tǒng)引導(dǎo),引導(dǎo)過(guò)程可以根據(jù)bootdelay
環(huán)境變量延遲進(jìn)行;
一個(gè)是uart reader
線程,蘋(píng)果可能將這個(gè)線程用于調(diào)試,其基本處于閑置狀態(tài)。正常引導(dǎo)模式中,iBoot
調(diào)用fsboot()
函數(shù)掛載iOS系統(tǒng)分區(qū),定位內(nèi)核,準(zhǔn)備設(shè)備數(shù)并引導(dǎo)系統(tǒng),如果引導(dǎo)失敗,則進(jìn)入恢復(fù)模式引導(dǎo)。
以上三個(gè)步驟只要其中任何一個(gè)步驟驗(yàn)證失敗,則啟動(dòng)失敗。
Step 5、launchd && 守護(hù)程序和代理程序 && SpringBoard
之前最主要的幾部完成之后就剩下啟動(dòng)相關(guān)程序了,先啟動(dòng)第一個(gè)程序launchd
,再由由launchd
啟動(dòng)守護(hù)程序和代理程序,之后是桌面應(yīng)用SpringBoard
,系統(tǒng)啟動(dòng)完成。
3、越獄是什么?
Windows
下最高權(quán)限用戶(hù)是Admin
,Admin
可以對(duì)電腦操作任何事情,哪怕是刪掉自己。
Linux
下最高權(quán)限用戶(hù)是Root
,Android
下早年就有Root
的說(shuō)法,其實(shí)就是取得Root
權(quán)限。
而iOS
衍生與Unix
,其與Linux
基本相似,所以咱們這說(shuō)的越獄其實(shí)就是取得Root
權(quán)限。
結(jié)合上文所說(shuō)的安全啟動(dòng)鏈的驗(yàn)證過(guò)程,越獄要做的事情也就是找到那三個(gè)驗(yàn)證的步驟中的漏洞,并且繞過(guò)其驗(yàn)證,從而禁止掉信任鏈中負(fù)責(zé)驗(yàn)證的組件,最終取得Root
權(quán)限。
目前情況下越獄分兩種:
- 完美越獄:破解iOS系統(tǒng)漏洞之后,每次系統(tǒng)重啟都能自動(dòng)調(diào)用注入的惡意代碼,達(dá)到破壞安全驗(yàn)證,再次獲得ROOT權(quán)限。
- 非完美越獄:越獄系統(tǒng)后,并沒(méi)有完全破解安全鏈,有部分信息或功能應(yīng)用不佳;比如;關(guān)機(jī)以后必須去連接越獄軟件來(lái)引導(dǎo)開(kāi)機(jī);或者重啟會(huì)導(dǎo)致越獄的失效;這樣的越獄稱(chēng)為“不完美越獄”。
目前完美越獄只支持iOS10一下的設(shè)備,所以如果大家需要玩,建議入手一臺(tái)iOS9的iPhone5s(咸魚(yú)300塊之內(nèi)能包郵到家哦),
二、如何越獄
自從盤(pán)古聯(lián)合PP助手發(fā)布了國(guó)內(nèi)首批越獄工具后,越獄就變得極其簡(jiǎn)單。一鍵操作,無(wú)痛無(wú)煩惱。
筆者利用「愛(ài)思助手」助手越獄。
然后根據(jù)自己的手機(jī)系統(tǒng)選擇對(duì)應(yīng)版本的越獄工具即可。
根據(jù)提示有對(duì)應(yīng)的簡(jiǎn)單操作,然后等待自動(dòng)重啟,重啟后能打開(kāi)Cydia即代表越獄成功。當(dāng)然也有可能越獄失敗,重復(fù)以上越獄的步驟就好了。
Tips: 筆者在手機(jī)機(jī)身溫度比較高的時(shí)候經(jīng)常越獄失敗,所以如果有同樣情況的同學(xué),等待機(jī)身溫度降低之后再次嘗試,應(yīng)該就可以成功了。
三、推薦插件(必裝)
首先在Cyida中添加幾個(gè)常用的源:
1、PP助手:apt.25pp.com
2、雷鋒源:apt.abcydia.com
3、Frida:https://build.frida.re
-
Apple File Conduit "2":獲取訪問(wèn)手機(jī)根目錄權(quán)限
Apple File Conduit "2" -
AppSync Unified 關(guān)閉簽名:繞過(guò)簽名檢測(cè)
AppSync Unified 關(guān)閉簽名 -
adv-cmds:命令行
adv-cmds -
OpenSSH:SSH (Secure SHell) 協(xié)議的免費(fèi)開(kāi)源實(shí)現(xiàn)。SSH協(xié)議族可以用來(lái)進(jìn)行遠(yuǎn)程控制, 或在計(jì)算機(jī)之間傳送文件。
OpenSSH -
Frida:之后制作砸殼工具需要用到
Frida
四、遠(yuǎn)程連接登錄手機(jī)
1、Wifi連接
在上一步已經(jīng)安裝完OpenSSH
插件之后,Wifi登錄就變得很簡(jiǎn)單。
先確保手機(jī)和電腦通處于一個(gè)Wifi環(huán)境,在手機(jī)的網(wǎng)絡(luò)設(shè)置里面找到當(dāng)前的IP地址,如:172.20.122.108
打開(kāi)終端
// ssh 用戶(hù)名@手機(jī)IP地址
$ssh root@172.20.122.108
第一次登錄會(huì)有類(lèi)似這樣的提示:
直接yes就可以了,他會(huì)將對(duì)應(yīng)IP生成秘鑰保存在目錄/.ssh/known_hosts
中
如果將其中對(duì)應(yīng)的IP刪掉,下次又會(huì)有同樣的提示了。
然后就需要填入用戶(hù)密碼,root用戶(hù)的默認(rèn)密碼為:alpine。
如果你對(duì)手機(jī)安全性有要求,建議改掉此密碼,并且牢記。否則就不要改了,要不然忘記了的話就只能刷機(jī)了(刷機(jī)有風(fēng)險(xiǎn))。
出現(xiàn)類(lèi)似如下圖就代表等成功
2、Wifi取別名
每次都是用ssh root@1172.20.122.108
有點(diǎn)麻煩,而且也不利于記憶。所以我們可以給一個(gè)對(duì)應(yīng)的IP取一個(gè)對(duì)應(yīng)的名字,比如我們給172.20.122.108
的root用戶(hù)取名5s(假設(shè)我的越獄手機(jī)就是5s),那么我們下次就可以直接使用以下命令來(lái)連接:
$ssh 5s
方法:
在上面提到的known_hosts
同級(jí)目錄下新建一個(gè)名為config
的文件(建議使用Vim命令創(chuàng)建,因?yàn)橛袡?quán)限問(wèn)題)。
其中加入如下內(nèi)容:
Host 5s
HostName 172.20.122.108
User root
Port 22
假設(shè)有另外一臺(tái)手機(jī)連了另外一個(gè)IP,則需要多個(gè)Host,依次類(lèi)推:
Host 5s
HostName 172.20.122.108
User root
Port 22
Host 6s
Hostname 172.20.122.163
User root
Port 22
3、USB連接
上文已經(jīng)了解到,如何用wifi登錄手機(jī),要了解USB連接之前要知道一個(gè)前提:
本機(jī)的回環(huán)地址默認(rèn)為127.0.0.1
。 本機(jī)地址也可以用localhost
表示。而USB默認(rèn)的端口號(hào)為22
所以在USB端口號(hào)開(kāi)放的前提下,我們只要連接端口22即可。
點(diǎn)擊sukimashita官網(wǎng)或者我的Github下載usbmuxd。
我們只需要用到其中的python-client
文件夾下的tcprelay.py
和usbmux.py
兩個(gè)文件。
終端cd進(jìn)入該目錄,開(kāi)放22端口并且映射到12345端口上(可以是任意端口,前提是此端口沒(méi)有被占用),使用如下命令:
python tcprelay.py -t 22:12345
然后新建一個(gè)終端窗口
連接此本地IP下的12345端口即可:
ssh root@127.0.0.1 -p 12345
區(qū)別于上面的wifi地址,127.0.0.1 又是一個(gè)新的ip所有又會(huì)出現(xiàn)一次新的公鑰保存提示,同樣的yes,再輸入密碼:
4、USB腳本連接
命令雖然簡(jiǎn)單,但是每次都要進(jìn)入tcprelay.py
對(duì)應(yīng)的目錄會(huì)很麻煩,所以還是老規(guī)矩,先設(shè)置環(huán)境變量,再寫(xiě)對(duì)應(yīng)腳本,即可實(shí)現(xiàn)在任意目錄使用USB連接了。
1、設(shè)置環(huán)境變量
如果之前有跟筆者之前的文章做過(guò),這一步可跳過(guò)。
在用戶(hù)的根目錄下新建文件夾FYSHELL
,專(zhuān)門(mén)存放所有的自定義腳本文件。FYSHELL
也可以隨意存放,只是該目錄的位置在下面要使用到。
在用戶(hù)的根目錄下找到文件.bash_profile
,新增加FYSHELL
的環(huán)境變量(找不到.bash_profile
文件?那就新建一個(gè),推薦使用vim新建,避免權(quán)限問(wèn)題)。
如下圖,筆者此時(shí)擁有兩個(gè)環(huán)境變量FYSHELL
和CY
2、USB端口腳本
先將之前的python-client
文件夾拷貝到FYSHELL
中。
新建usbConnect.sh
文件,輸入內(nèi)容:
python /Users/用戶(hù)名/FYShell/python-client/tcprelay.py -t 22:12345
3、登錄手機(jī)腳本
新建loginUsb_5s.sh
文件,輸入內(nèi)容:
ssh root@127.0.0.1 -p 12345
之后直接使用這兩個(gè)腳本就能完成USB登錄手機(jī)的任務(wù)了!
sh usbConnect.sh
// 新建端口后在執(zhí)行以下命令
sh loginUsb_5s.sh
五、SSH登錄原理
以下內(nèi)容由于筆者的5s不在身旁,所以換了臺(tái)iPhone6的手機(jī)繼續(xù)。。。
SSH登錄本職上還是調(diào)RSA加密的運(yùn)用:
- 遠(yuǎn)程服務(wù)器(iPhone)上生成一堆公私鑰
- 將公鑰發(fā)給客戶(hù)(Mac)
- Mac每次登錄iPhone的時(shí)候使用本地保存的公鑰加密密碼,發(fā)送給iPhone,iPhone使用私鑰解密,密碼一直則登錄成功。
1、公鑰保存
在上文中的公鑰保存其實(shí)就是這里所說(shuō)的第一步。
2、驗(yàn)證
使用終端查看驗(yàn)證
- 查看iPhone本身的公鑰
cat ssh_host_rsa_key.pub
- 查看Mac上保存的公鑰
cat known_hosts
兩個(gè)地方的公鑰是相同的,得以驗(yàn)證。
3、中間人攻擊
中間人攻擊其實(shí)就是在SSH登錄的時(shí)候,驗(yàn)證失敗的結(jié)果。
將本地保存的RSA公鑰隨意改一個(gè)字母筆者將最后一個(gè)字母f
改成了e
再次嘗試登錄手機(jī),即可出現(xiàn)中間人攻擊提示。
驗(yàn)證完之后還是將其改回來(lái)吧。
六、免密登錄
免密碼登錄也稱(chēng)“公鑰登錄”,原理就是用戶(hù)將自己的公鑰儲(chǔ)存在遠(yuǎn)程主機(jī)上。登錄的時(shí)候,遠(yuǎn)程主機(jī)會(huì)向用戶(hù)發(fā)送一段隨機(jī)字符串,用戶(hù)用自己的私鑰加密后,再發(fā)回來(lái)。遠(yuǎn)程主機(jī)用事先儲(chǔ)存的公鑰進(jìn)行解密,如果成功,就證明用戶(hù)是可信的,直接允許登錄 不再要求密碼。
1、本地(MAC)生成RSA公私鑰
先查看本地(MAC)之前是否已經(jīng)生成過(guò)RSA公私鑰,直接進(jìn)入目錄.ssh
下查看,如果其中有id_rsa
和id_rsa.pub
即代表已有,無(wú)需重新生成。如果強(qiáng)行生成新的,則會(huì)導(dǎo)致之前使用這對(duì)秘鑰的地方失效。
如果沒(méi)有,直接使用如下命令生成新的
ssh-keygen
接著會(huì)出現(xiàn)一些問(wèn)題,全部留空,直接回車(chē)即可。之后就可以發(fā)現(xiàn)目錄.ssh
下有了id_rsa
和id_rsa.pub
了。
2、將本地(MAC)的公鑰發(fā)送給服務(wù)器(iPhone)
ssh-copy-id root@localhost -p 12345
期間會(huì)需要輸入一次iPhone用戶(hù)的密碼(默認(rèn)alpine)。
接著,再次嘗試登錄,就會(huì)發(fā)現(xiàn)不用在輸入密碼就可以登錄了。
類(lèi)似上一步的驗(yàn)證SSH原理,查看兩個(gè)端的用公鑰。
同樣得以驗(yàn)證。
七、總結(jié)
如果說(shuō)越獄是逆向的開(kāi)始,那么Mac遠(yuǎn)程登錄手機(jī)就是逆向的大門(mén),只有進(jìn)入其中,才能一探究竟。后續(xù)的所有操作,比如:砸殼,動(dòng)態(tài)分析,動(dòng)態(tài)調(diào)試,動(dòng)態(tài)庫(kù)注入都離不開(kāi)這個(gè)步驟,所有如果可以,希望大家能夠跟著這片文章做一遍。有可能會(huì)有坑,但是這樣才記憶深刻!
下一篇文章將會(huì)講述,在登錄手機(jī)后如何對(duì)APP進(jìn)行砸殼。