以前的九篇文章講述的是在不越獄的狀況下,詳細的講解了對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![]()
以上來自大佬念茜的自言自語。github
因此說,這是一個全新的篇章,從這開始纔是真的逆向的起點,讓咱們一塊兒來享受在iOS世界中安全攻防的其樂窮窮吧。vim
要了解越獄,就必要要先了解iOS系統的啓動過程。
iOS啓動引導分爲三種模式:安全
這裏咱們只對「正常模式」進行介紹,其餘兩種模式能夠本身猜一猜。bash
額,這個就不談了。服務器
全部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系統。微信
LLB(Low Level Bootloader)不一樣於Boot ROM,它不是被內嵌在設備上的,而是在iOS系統中,同其餘文件同樣,是一種被加密的IMG3格式文件,會隨着iOS系統更新而更新。 LLB負責啓動更高層次的Bootloader,一樣這一步也須要進行驗證。驗證不成啓動失敗,成功則繼續。網絡
iBoot 纔是引導過程當中的主加載器,它負責加載操做系統內核。一樣這一步也須要進行驗證。驗證不成啓動失敗,成功則繼續。
iBoot
在內存中被加載至地址0x5FF00000
處。它有一個內建的HFS+驅動,能夠直接訪問iOS的文件系統,並支持多線程。iBoot一般會派生出兩個線程:
一個main
線程,負責顯示啓動時的蘋果logo,並根據auto-boot
和boot-command
環境變量的設置(正常引導模式下boot-command
被設爲fsboot
)進行系統引導,引導過程能夠根據bootdelay
環境變量延遲進行;
一個是uart reader
線程,蘋果可能將這個線程用於調試,其基本處於閒置狀態。正常引導模式中,iBoot
調用fsboot()
函數掛載iOS系統分區,定位內核,準備設備數並引導系統,若是引導失敗,則進入恢復模式引導。
以上三個步驟只要其中任何一個步驟驗證失敗,則啓動失敗。
以前最主要的幾部完成以後就剩下啓動相關程序了,先啓動第一個程序launchd
,再由由launchd
啓動守護程序和代理程序,以後是桌面應用SpringBoard
,系統啓動完成。
Windows
下最高權限用戶是Admin
,Admin
能夠對電腦操做任何事情,哪怕是刪掉本身。 Linux
下最高權限用戶是Root
,Android
下早年就有Root
的說法,其實就是取得Root
權限。 而iOS
衍生與Unix
,其與Linux
基本類似,因此我們這說的越獄其實就是取得Root
權限。
結合上文所說的安全啓動鏈的驗證過程,越獄要作的事情也就是找到那三個驗證的步驟中的漏洞,而且繞過其驗證,從而禁止掉信任鏈中負責驗證的組件,最終取得Root
權限。
目前狀況下越獄分兩種:
目前完美越獄只支持iOS10一下的設備,因此若是你們須要玩,建議入手一臺iOS9的iPhone5s(鹹魚300塊以內能包郵到家哦),
自從盤古聯合PP助手發佈了國內首批越獄工具後,越獄就變得極其簡單。一鍵操做,無痛無煩惱。
筆者利用「愛思助手」助手越獄。
而後根據本身的手機系統選擇對應版本的越獄工具便可。
根據提示有對應的簡單操做,而後等待自動重啓,重啓後能打開Cydia即表明越獄成功。固然也有可能越獄失敗,重複以上越獄的步驟就行了。
Tips: 筆者在手機機身溫度比較高的時候常常越獄失敗,因此若是有一樣狀況的同窗,等待機身溫度下降以後再次嘗試,應該就能夠成功了。
首先在Cyida中添加幾個經常使用的源:
一、PP助手:apt.25pp.com
二、雷鋒源:apt.abcydia.com
三、Frida:build.frida.re
Apple File Conduit "2":獲取訪問手機根目錄權限
AppSync Unified 關閉簽名:繞過簽名檢測
adv-cmds:命令行
OpenSSH:SSH (Secure SHell) 協議的免費開源實現。SSH協議族能夠用來進行遠程控制, 或在計算機之間傳送文件。
Frida:以後製做砸殼工具須要用到
在上一步已經安裝完OpenSSH
插件以後,Wifi登陸就變得很簡單。
先確保手機和電腦通處於一個Wifi環境,在手機的網絡設置裏面找到當前的IP地址,如:172.20.122.108 打開終端
// ssh 用戶名@手機IP地址
$ssh root@172.20.122.108
複製代碼
第一次登陸會有相似這樣的提示:
直接yes就能夠了,他會將對應IP生成祕鑰保存在目錄/.ssh/known_hosts
中
若是將其中對應的IP刪掉,下次又會有一樣的提示了。
而後就須要填入用戶密碼,root用戶的默認密碼爲:alpine。 若是你對手機安全性有要求,建議改掉此密碼,而且牢記。不然就不要改了,要否則忘記了的話就只能刷機了(刷機有風險)。
出現相似以下圖就表明等成功
每次都是用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
複製代碼
上文已經瞭解到,如何用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,再輸入密碼:
命令雖然簡單,可是每次都要進入tcprelay.py
對應的目錄會很麻煩,因此仍是老規矩,先設置環境變量,再寫對應腳本,便可實如今任意目錄使用USB鏈接了。
若是以前有跟筆者以前的文章作過,這一步可跳過。
在用戶的根目錄下新建文件夾FYSHELL
,專門存放全部的自定義腳本文件。FYSHELL
也能夠隨意存放,只是該目錄的位置在下面要使用到。
在用戶的根目錄下找到文件.bash_profile
,新增長FYSHELL
的環境變量(找不到.bash_profile
文件?那就新建一個,推薦使用vim新建,避免權限問題)。 以下圖,筆者此時擁有兩個環境變量FYSHELL
和CY
先將以前的python-client
文件夾拷貝到FYSHELL
中。
新建usbConnect.sh
文件,輸入內容:
python /Users/用戶名/FYShell/python-client/tcprelay.py -t 22:12345
複製代碼
新建loginUsb_5s.sh
文件,輸入內容:
ssh root@127.0.0.1 -p 12345
複製代碼
以後直接使用這兩個腳本就能完成USB登陸手機的任務了!
sh usbConnect.sh
複製代碼
// 新建端口後在執行如下命令
sh loginUsb_5s.sh
複製代碼
如下內容因爲筆者的5s不在身旁,因此換了臺iPhone6的手機繼續。。。
SSH登陸本職上仍是調RSA加密的運用:
在上文中的公鑰保存其實就是這裏所說的第一步。
使用終端查看驗證
cat ssh_host_rsa_key.pub
複製代碼
cat known_hosts
複製代碼
兩個地方的公鑰是相同的,得以驗證。
中間人攻擊其實就是在SSH登陸的時候,驗證失敗的結果。
將本地保存的RSA公鑰隨意改一個字母筆者將最後一個字母f
改爲了e
再次嘗試登陸手機,便可出現中間人攻擊提示。
驗證完以後仍是將其改回來吧。
免密碼登陸也稱「公鑰登陸」,原理就是用戶將本身的公鑰儲存在遠程主機上。登陸的時候,遠程主機會向用戶發送一段隨機字符串,用戶用本身的私鑰加密後,再發回來。遠程主機用事先儲存的公鑰進行解密,若是成功,就證實用戶是可信的,直接容許登陸 再也不要求密碼。
先查看本地(MAC)以前是否已經生成過RSA公私鑰,直接進入目錄.ssh
下查看,若是其中有id_rsa
和id_rsa.pub
即表明已有,無需從新生成。若是強行生成新的,則會致使以前使用這對祕鑰的地方失效。
若是沒有,直接使用以下命令生成新的
ssh-keygen
複製代碼
接着會出現一些問題,所有留空,直接回車便可。以後就能夠發現目錄.ssh
下有了id_rsa
和id_rsa.pub
了。
ssh-copy-id root@localhost -p 12345
複製代碼
期間會須要輸入一次iPhone用戶的密碼(默認alpine)。
接着,再次嘗試登陸,就會發現不用在輸入密碼就能夠登陸了。
相似上一步的驗證SSH原理,查看兩個端的用公鑰。
一樣得以驗證。
若是說越獄是逆向的開始,那麼Mac遠程登陸手機就是逆向的大門,只有進入其中,才能一探究竟。後續的全部操做,好比:砸殼,動態分析,動態調試,動態庫注入都離不開這個步驟,全部若是能夠,但願你們可以跟着這片文章作一遍。有可能會有坑,可是這樣才記憶深入!
下一篇文章將會講述在登陸手機後如何對APP進行砸殼。