iOS滲透測試工具,第2篇:Cycript
本文是該系列文章的第2篇(第一篇請點選此處),我們將繼續為讀者介紹最有用的iOS應用程式滲透測試工具。在本文中,我們要介紹的工具為“Cycript”,這是一個執行時處理工具,主要用於動態分析和探索目標應用程式的執行流程。
對於這個系列文章來說,我們假設使用者使用Electra進行越獄。就我而言,使用的系統是iOS11.1.2,但是本系列中的大多數工具都可以在任何版本的iOS11上使用。
安裝Cycript
對於iOS 11來說,cycript是隨bfinject一起安裝的,關於bfinject的安裝方法,我們在第1篇中已經安裝好了。也就是說,我們已經在iPhone上安裝了Cycript,不過,我們還需要在計算機上安裝該軟體。
您可以從http://www.cycript.org/下載該軟體。
下載後,請將.zip解壓到您喜歡的任何位置,然後,通過cd命令切換至該目錄中。
將Cycript注入到應用程式中
現在,我們要在目標應用程式上執行Cycript,具體步驟如下所示:
通過SSH連線手機,並執行下列命令:
bash bfinject -P AppName -L cycript
這時候,會看到如下內容:
接下來,我們需要在計算機上啟動Cycript程式。然後,在新的終端視窗中,執行如下所示的命令:
cycript -r XX.X.X.XXX:1337
其中xx.x.x.xxx是該裝置的IP地址。
當您看到Cycript提示符出現時,說明連線成功:
cy#
注意:對於執行Mojave/High Sierra的使用者來說,在執行Cycript時可能會遇到過如下所示的錯誤:
dyld: Library not loaded: /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/libruby.2.0.0.dylib Referenced from: /Users/me/Downloads/cycript/Cycript.lib/cycript-apl Reason: image not found Abort trap: 6
如果出現這種情況,說明您機器上的Ruby的版本/路徑有問題,這時最簡單的解決方法是執行下列命令:
brew install <a href="/cdn-cgi/l/email-protection" data-cfemail="532126312a13617d63">[email protected]</a>
然後,手動將libruby.2.0.0.dylib檔案移動到cycript主目錄中。
探索執行時的世界
現在,我們已經為分析工作做好準備了!
下面,我們執行的第一個、也是最基本的命令,就是去確定當前檢視,具體操作如下所示:
cy# UIApp.keyWindow.rootViewController
這樣的話,軟體就會返回當前檢視控制器的名稱。當使用更復雜的導航控制器或製表符欄控制器時,為了確定當前檢視的到底是哪個檢視,需要為"root viewcontroller"新增“visible viewcontroller”、“selected viewcontroller”或“presented viewcontroller”。
接下來,您可能想要瀏覽儲存在記憶體中的當前物件。在第1篇文章中,我們考察了一個應用程式轉儲的標頭檔案,並注意到了一些有趣的類/屬性/方法。現在,我們看到的當前檢視名為“WelcomeViewController”。我們可以轉至轉儲的標頭檔案,並搜尋“WelcomeViewController”,可以看到,它有一個屬性“loggedinuser”。
現在,我們可以藉助cycript工具來檢視這些屬性了。
cy# UIApp.keyWindow.rootViewController.loggedInUser "<User: 0x104924e00>"
現在,我們看到LoggedInUser屬性是名為“User”的類例項的引用。此外,我們也可以將物件存為變數,以便於進一步的考察:
cy# currentUser = UIApp.keyWindow.rootViewController.loggedInUser
現在,我們可以返回類轉儲檔案,檢視LoggedInUser等類中是否含有我們感興趣的屬性。此外,我們還可以呼叫方法!例如,假設loggedInUser類有一個方法:
- (_Bool)isEmailVerified;
我們可以使用cycript呼叫此方法,並檢視其返回結果:
cy# [currentUser isEmailVerified] true
我們還對該方法進行操縱,使其返回我們想要的內容:
cy# User.prototype.isEmailVerified = function () { return true; }
同時,我們也可以操縱屬性:
cy# user.isLoggedIn = true
另一個非常有用的命令是“choose”——當您知道要檢查的類例項,卻不知道它在哪裡時,該命令就派上用場了。這個函式將返回一個數組,其中包含找到的例項,通常來說,陣列中的第一個物件,就是我們的要找的物件。例如,假設我要考察一個名為“NetworkHandler”的類的例項:
cy# choose(NetworkHandler)[0] "<NetworkHandler: 0x103524e00>"
現在,我可以將該例項儲存在一個變數中,並進行進一步的考察。
當然,這只是cycript豐富功能中的一個例子而已,若要更加深入的瞭解該軟體的功能,推薦閱讀這篇文件。本文到此結束,感謝閱讀!