未越獄狀態下的ios插樁

看雪論壇原文鏈接:【翻譯】未越獄狀態下的 ios 插樁

譯者:rodster(看雪ID:leixyou)原文鏈接:t.cn/RVta1GJ 原文作者:Adrian Villa

微信公眾號:看雪iOS安全小組 我們的微博:weibo.com/pediyiosteam

我們的知乎:zhihu.com/people/pediyi

加入我們:看雪iOS安全小組成員募集中:iOS安全小組成員招募中

[看雪iOS安全小組]置頂嚮導集合貼: [新人請看][看雪iOS安全小組]置頂嚮導集合貼

本文描述了插入一個未越獄的ios應用的一個進程。由於在最新IOS版本無法越獄並且要求在最新的IOS版本上測試應用,在未越獄環境下找到評估IOS應用的方法很有必要。在本文中我們會展示配置我們所需要的環境的步驟,重簽名IPA文件是為了在環境被配置好並且插入二進位程序來跟蹤功能和修改設備的行為之後訪問應用信息。

注意:我們將使用的工具是基於MacOS的,因此在整個過程中要求一台Apple MacOS並且安裝好Xcode7。

配置環境

創建開發證書

第一步是在Xcode創建開發者證書。這將允許我們去生成signing identities和供應配置文件。因為Xcode7可以免費創建開發者配置文件。這樣做,首先打開Xcode設置窗口然後是如下所示的Accounts標籤:

圖1 截圖所示是我們需要在settings窗口的Accounts標籤的點擊按鈕

一旦我們添加了AppleID,接下去的是從」view details..」選項創建sign identities。本指南的目的僅僅是獲得IOS開發所需的signing identity。點擊」Create」按鈕,在identity創建之後。然後點擊」Done」按鈕完成操作。

創建授權文件和配置開發者配置文件

一旦開發者配置文件被創建,接下來的一步是生成授權文件和在IOS設備中配置它。一個授權文件在所有IOS應用中都是必須的,它使在運行前的每個應用所做的安全檢查都是可信的。例如,檢查用來簽名app的證書是合法的,檢查AppleOD,確認(允許)一個應用程序所請求的權利等等。

我們需要用我們的開發者配置文件生成授權文件,因為重簽名過程(見之後)將會用包含我們AppleID和證書的授權文件替代原來的文件。我們將會展示我們所開發的應用所在的設備,設備允許我們訪問應用容器、日誌等等

創建一個為空的IOS應用工程,修補授權文件問題(如下圖所示)並且在設備中配置它。

圖2 屏幕截圖展示授權文件問題

在配置授權後,轉到」General settings->Profile」並且接受開發者授權。

圖3 – 屏幕截圖所示設備內的開發者授權

為了在已創建的空工程中包含」 embedded.mobileprovision」文件,首先找到應用容器,然後從中提取文件。容器的位置能夠在Xcode生成的文件中的」 Identity and type」菜單可以找到。

圖4 截圖所示顯示文件路徑的Xcode部分

一旦被定位,就可以打開容器文件夾並且複製文件到一個安全的位置

圖5-屏幕截圖展示的是如何打開一個容器文件夾

圖6 – 截圖屏幕所示容器裡面的文件,包括授權文件

1 重簽名IPA文件

IOS支持載入app配置的過程強制用開發者證書籤名每一個應用。在應用被配置後,開發者可以訪問容器文件夾或者在未越獄的設備上看調試消息日誌。因此,為了正確地在未越獄設備上評估一個應用,在安裝應用前,有必要在我們的控制下用開發者證書重簽名。

重簽名的過程涉及幾個步驟:

1.重簽名應用的二進位程序和庫

2.插入一個新的授權文件

3.修改許可權和plist文件

為了加快這個過程,可以使用一個叫做node-applesign(GitHub - nowsecure/node-applesign: NodeJS module and commandline utility for re-signing iOS applications (IPA files).)的工具,有NowSecure的Sergi Alvarez (@pancake)開發。

在首次使用node-applesign之前,需要安裝node.js和它的依賴。在這之後,可以從repository複製或者下載並且最終我們執行」 ipa-resign.js」文件。使用這個工具重簽名一個應用,但這兒有一些要求:

-一個開發者identity hash-id;

-授權文件的路徑

-IPA文件的路徑

使用node-applesign工具能夠獲得Identity hash-id,指定-L選項,或者security

$ ./ipa-resign.js -L

$ security find-identity -v -p codesigning

在選擇正確的identity之後,使用這個工具重簽名IPA。接下來的命令重簽名一個IPA文件,替代原來的文件,以便允許我們更容易地在設備中找到我們的應用。

$ ./ipa-resign.js -r -i 23CE9621AA7324F4E89481C6630591603A2ACD5E -m

~/pentest/iOS/myprovision.mobileprovision ~/pentest/iOS/test.ipa

如果很成功地完成所有步驟,就可以使用Devidce Xcode或者使用更好的ios-deploy命令行工具配置應用了。

注意:如果過程中終端顯示」 Error: This IPA is encrypted」,就需要多做一步,要求使用越獄設備和像Clutch的app解密二進位程序。

2 二進位插樁

在這個知識點,在配置前可能需要修改IPA文件以便插入作為庫的新資源。因為目標站點Frida (Frida ? A world-class dynamic instrumentation framework)將被用來插入二進位程序性能中並且插入應用。

Frida,文檔描述它為「是一個動態代碼插樁套件。它讓你注入javascript代碼片段到Windows,Mac,Linux,IOS和android上的本地app。Frida也提供你一些基於Frida API的簡單工具。這些可以被用來幫助和調整你的需求,或者充當如何使用API的例子」。

Frida提供了一個叫做「FridaGadget.dylib」的動態庫,可以用來插入在未越獄設備上新的已開發的應用程序。要想做到這個的話,就必須插入一個庫作為這個應用的一個新工程的資源。額外地,這也可能是一個已經存在編譯過的應用使用這個庫,這是我們現在的方案,僅僅通過修改二進位程序和插入一個新的載入命令。

在繼續下去之前,有必要至少對IOS應用的二進位結構理解一點點。IOS應用使用了一個叫做Mach-O二進位格式,Match Object文件格式的簡稱,它是a.out(彙編輸出)的替代者。Mach-O被大部分基於Mach內核的系統所使用,像MacOS(先前已知地OSX)和IOS。

Mach-O(IOS二進位格式)二進位結構被劃分為幾個區域。Header包含關於二進位程序公共信息:byte order (magic number), CPU type, amount of load commands等等。Load commands部分就像一個二進位內容的表單:它描述了段的位置,symbols table, dynamic symbols table等等。每個load command包含了應用程序代碼和數據,像symbol tables, dynamic symbol tables等等

圖7 – 屏幕截圖展示了Match-O結構

插入一個新庫的過程涉及多個步驟:

1.插入一個庫到應用容器

2.在二進位的load commands區域插入load command

3.在頭部區域增大load command計數器

4.在頭部區域增大二進位數大小

再次為了加快和幫助這個過程,可以使用一個叫做insert_dylib(GitHub - Tyilo/insert_dylib: Command line utility for inserting a dylib load command into a Mach-O binary)的工具。首先,複製或克隆repository,用Xcode打開它並且編譯這個工具。現在這個環境和工具都已經準備並且配置好,可以開始二進位程序的插樁。

接下來的步驟需要完善一遍開始插樁:

1.解壓IPA文件然後複製應用容器(在二進位程序的同等級目錄)中的FridaGadget.dylib文件:

代碼:

$ cd Payload/Test.app/n$ curl -O https://build.frida.re/frida/ios/lib/FridaGadget.dylibn

2.修改二進位程序然後用insert_dylib工具插入load command。指定strip-codesign選項以確保之後重簽名過程運轉得很好:

代碼:

$ ./insert_dylib --strip-codesig --inplace @executable_path/FridaGadget.dylibnPayload/Test.app/Testn

3.重簽名IPA文件。這將要求解壓「payload」文件夾到一個IPA文件,然後使用ipa-resign工具。如之前所解釋的那樣。

4.由於ios-deploy工具的一個特徵,再次解壓IPA文件很有必要,另外,如果我們配置IPA文件,應用容器反而會跑出一個信號錯誤。

5.現在,可以在調試模式下使用ios-deploy配置應用程序。應用程序必須在調試模式下執行,因為我們沒有被蘋果簽名。

代碼:

$ ios-deploy --bundle Payload/Test.app --idn92c8551cb5486d13d35140a597318cb3a3926807 -dn

6.一旦應用程序開始運行,動態庫就啟動Frida服務。等待知道Frida服務開始在調試控制台顯示信息。

7.一旦Frida服務在設備上監聽,很有可能使用Frida工具箱開始相互影響進程。第一步就是確認gadget是否被正確地配置使用例如frida-ps。

代碼:

$ frida-ps -Uain

8.在本點FridaGadget在等待一個輸入,為插樁留出餘地。由於未越獄設備的一個問題,攻破一個新進程並且在新進程上應用插樁。而不是在原進程中應用它。在這個指南中,我們使用在frida-script (GitHub - as0ler/frida-scripts: Repository including some useful frida script for iOS Reversing)項目中可獲得的腳本,腳本允許我們跟蹤已知的功能。如果我們想,我們可以開發我們自己的腳本,插入具體的功能。

代碼:

$ python frida-scripts/hooker.py -S re.frida.Gadgetn

9.在這之後,應用程序的執行代碼將被重新開始。這樣做,需要使用frida命令,命令允許我們與Frida相互作用。

代碼:

$ frida -U -f re.frida.Gadgetn [USB::iPhone::[re.frida.Gadget]] -> %resume n

一旦所有的步驟完成,很有可能看見阿紫hooker.py輸出消息上,顯示調用了跟蹤API和發送給函數的參數。

我希望那你能喜歡這篇文章。我現在正工作與一個工具/腳本上,這會使整個過程變得容易。

我衷心的感謝Sergi Martinez (@zlowram)在技術上支持我激勵我。

Adrian Villa (@AdriVillaB)

Adrian.Villa@nccgroup.trust

Published date: 12 October 2016

Written by: Adrian Villa

推薦閱讀:

iPad 和 iPhone 擴充產品線,對蘋果來說是正確的決定嗎?
為什麼 iTools、PP 助手、快用助手、91 助手可以理直氣壯的標榜自己是正版?
iPhone無法連接電腦?電腦不識別iPhone的圖文解決方法
蘋果iPhone7 VS 三星Note7:生命真殘酷啊

TAG:苹果公司AppleInc | iPhone | 安全 |