移動應用程序逆向工程意味著拆解Android或iOS二進制程序,了解其構成。具備這種洞察力能夠更容易地以開發(fā)者最初沒有想到的方式操縱應用程序。作為一名移動滲透測試員,安全分析師及研究人員,了解如何對移動應用程序進行逆向工程可以提高分析的質(zhì)量和深度,有助于移動應用程序安全測試工作。
然而,安全分析師和研究人員不是唯一經(jīng)常對移動二進制文件進行逆向工程的人。攻擊者也為自己的惡意意圖逆向工程二進制文件。了解安全從業(yè)者和攻擊者對移動應用程序進行逆向工程的技術,可以確保在安全開發(fā)過程中不會錯過這一重點領域。
安全分析師或攻擊者使用移動應用程序進行逆向工程技術有幾個原因。其一,試圖對移動應用程序進行逆向工程的人可能希望獲取有關后端服務和服務器的信息,以便對這些實體發(fā)起攻擊。其二,可能會嘗試逆向工程策略,來獲取靜態(tài)加密值,并識別應用程序運行時中使用的特定密碼。其三,可能會利用逆向移動應用程序,來更好地了解其整體邏輯,確定后續(xù)代碼修改的方式,甚至竊取知識產(chǎn)權。
無論意圖如何,每次成功的逆向工程嘗試都應該識別應用程序通信的服務,找到可能允許訪問敏感數(shù)據(jù)的硬編碼加密值,確定繞過特定深度防御或防篡改技術所需的工作量,或發(fā)現(xiàn)未報告的應用功能。
逆向移動應用程序最常見的方法之一是使用反編譯器或反匯編器。但是,您不需要這些工具來對移動應用程序進行逆向工程。您可以通過命令行界面(CLI)、自定義工具或Frida腳本執(zhí)行逆向工程。本文涵蓋了沒有反編譯器或反匯編器的逆向工程方法。
通過命令行對移動應用程序進行逆向工程
Android Package Kit(APK)或iOS app store package(IPA)可以使用簡單的命令行界面(CLI)進行逆向工程。以下兩個示例使用iTerm2終端,該終端僅適用于Mac設備。為其他機器使用替代CLI。
驗證是否存在內(nèi)存損壞內(nèi)置安全保護
在調(diào)查IPA時,您可能希望快速確定該應用程序是否在其本地庫或框架中使用了免費的內(nèi)存損壞內(nèi)置安全保護措施。通常,在二進制文件開發(fā)期間,堆棧粉碎保護和自動引用計數(shù)等免費安全功能可能會被禁用。一般來說,啟用這些內(nèi)置功能沒有不妥,因為它們有助于二進制文件緩解潛在的緩沖區(qū)溢出和內(nèi)存管理攻擊。
如果無法訪問IPA的源代碼,可以簡單地對二進制進行逆向工程來自行解答。為此,請將終端上的二進制文件解壓縮到IPA文件夾和后續(xù)的.app文件夾,然后使用grep命令。要搜索IPA以查找堆棧粉碎保護的實例,只需輸入grep -iER“stack_chk”。此CLI命令將遞歸地搜索整個二進制文件,以查找堆棧粉碎保護標志的實例,忽略單詞大小寫。如果出現(xiàn)實例,我們知道堆棧粉碎保護已啟用。如果沒有發(fā)現(xiàn)實例,我們可以進行進一步分析,看看二進制文件是否容易受到緩沖區(qū)溢出攻擊。您還可以使用如下所示的方法通過grep -IER“objc_release”命令檢查ARC保護。使用可從GitHub下載的iOS Damn Vulnerable iOS應用程序(DVIA)應用程序,我們輸入了上述命令來手動驗證二進制文件是否啟用了堆棧粉碎保護。
監(jiān)控設備日志中的敏感數(shù)據(jù)輸入
在調(diào)查Android二進制程序時,您可能會好奇在使用應用程序時,設備日志中是否會暴露任何敏感數(shù)據(jù)。您可以使用adb logcat命令通過CLI對二進制文件進行逆向工程。要讓該命令在終端上運行,必須先在Android設備上啟用USB調(diào)試。然后,輸入該命令,你會看到許多日志條目。啟動應用程序后,您就可以在日志條目中搜索特定應用程序的條目。在下面的示例中,我們安裝了 InsecureShop Android 二進制程序。在應用程序啟動和隨后的登錄流程中使用 adb logcat,您可以看到設備記錄了此條目。該條目包括敏感信息,如設備的用戶名和密碼。
逆向工程IPA或APK的另一種方法需要定制工具。例如,用于安卓和iOS逆向工程的Objection 工具。Objection是一款運行時移動探索工具,可在越獄/獲得超級權限和非越獄設備上運行。Frida為Objection提供支持,因此你需要先安裝Frida才能使用該工具包。
要運行Objection,請輸入"objection -gadget [應用程序軟件包名稱] explore"。
在應用程序運行期間監(jiān)控加密功能
在探索移動應用程序如何實時運行時,Objection經(jīng)常會派上用場。你想了解一個應用程序在運行時使用了哪些加密函數(shù)嗎?Objection可以幫到你。啟動Objection,進入iOS monitor crypto。當你瀏覽應用程序時,Objection會顯示在每個動作或活動中使用了哪些加密函數(shù)。如果想知道移動應用程序是否在關鍵的安全操作中使用了較弱的加密算法,Objection可以幫助你回答這個問題。
我們使用Ojection來確定DVIA iOS應用程序中的密碼加密函數(shù)("objection_rules")。在運行iOS監(jiān)控加密用例并提交密碼后,我們可以看到該過程中的加密函數(shù)。密碼顯示為 "dataIn",密碼的加密形式顯示為 "dataOut"。我們看到 KCCPBKDF2和KCCAlgorithmAES128 是該流程的主要加密算法。
如果我們使用 CCCCryptorCreate操作中的 "alg"、"key "和 "iv "值以及 "dataOut "值,就可以驗證AES算法用于加密密碼。有了這些知識,我們可以推測AES算法也可用于解密密文。使用CyberChef這樣的簡單網(wǎng)站可以幫助我們快速完成這項工作。
Hook和啟動Android活動,揭示敏感數(shù)據(jù)
Objection可以幫助逆向工程的另一個例子是在你想啟動一個Android應用程序的敏感活動時。某些活動在啟動時可能會泄露敏感數(shù)據(jù)。你可以使用Objection的安卓hook功能來列出應用程序的活動、服務和接收。如果應用程序的源代碼無法去偽,那么hook功能就顯得尤為有用。使用Damn Insecure and Vulnerable App (DIVA),您可以使用android hooking list activities列出AndroidManifest.xml指定的所有活動。如果你想快速確定是否有活動會被濫用或泄露敏感數(shù)據(jù),這可能會派上用場。運行該命令后,我們立即發(fā)現(xiàn)一個活動(".APICredsActivity")似乎很有希望。
現(xiàn)在,我們可以使用后續(xù)的Objection命令,即android intent launch_activity,創(chuàng)建一個新的Intent,并將其作為參數(shù)運行startActivity()來啟動特定的活動類。啟動.APICredsActivity 并運行intent會在應用程序的用戶界面中顯示敏感的供應商API憑據(jù)。
雖然Objection是逆向工程的強大工具,但使用Frida腳本可以帶來更多機會。Frida是一個專門用于逆向工程的動態(tài)工具包。您可以使用Frida將自己的自定義腳本注入應用程序的進程,也可以使用他人創(chuàng)建的公共可用腳本。
繞過安卓生物識別身份驗證
在測試 Android 應用程序時,您經(jīng)常會遇到具有指紋ID功能的應用程序。通常,大多數(shù)應用程序都需要用戶名和密碼才能登錄。其他應用程序可能會使用 PIN、OTP 或生物識別等形式的多因素身份驗證。根據(jù)應用程序的不同,生物識別配置可能設置得不安全,允許攻擊者完全繞過指紋驗證。在這種情況下,獲得設備物理訪問權限的攻擊者即使無法訪問原始用戶的指紋,也可以逆向生物識別身份驗證流程,從而登錄應用程序。
在這種情況下,F(xiàn)rida腳本就能提供幫助。例如,如果應用程序沒有正確使用BiometricPrompt.CryptoObject,F(xiàn)-SECURE研究人員公開的Frida腳本就可以完全繞過安卓生物識別身份驗證。通常,正確使用該對象需要將用戶的生物識別身份驗證對象存儲在安卓密鑰庫中,以防止在沒有特定指紋的情況下解鎖設備。但是,如果 BiometricPrompt.CryptoObject 為空值,那么該對象就不會存儲在密鑰庫中,也就不需要有效指紋,從而設置了繞過。這個腳本很有用,因為很多應用程序都容易受到上述腳本的影響。不過要注意的是,只有當用戶已經(jīng)為應用程序設置了初始指紋 ID 時,這個腳本才會起作用。
繞過網(wǎng)絡深度防御的運行時控制
用于逆向工程的Frida腳本可讓您繞過某些可能會干擾中間人(MiTM)攻擊的網(wǎng)絡深度防御控制。雖然沒有明確建議,但如果實施得當,證書鎖定可以通過僅接受特定證書的client-server連接來減輕對中間人(MiTM)攻擊的影響。Frida 腳本可以幫助逆向應用程序,以發(fā)現(xiàn)證書鎖定所使用的方法,然后hook到該進程,在運行期間禁用或繞過該機制。在下面的示例中,一個iOS Flutter應用程序最初由于證書鎖定而阻止了網(wǎng)絡攔截。然而,在運行一個公開可用的Frida 腳本后,我們可以hook SecTrusteva luate、SecTrustGetResult和SecTrusteva luateWithError()方法。hook這些方法可確保信任管理證書對象被認為是受信任的,從而使我們能夠使用攔截代理攔截流量。您可以在Frida Codeshare上找到用于其他逆向工程的其他 Frida 腳本。
結論
逆向工程是移動應用滲透測試的必要環(huán)節(jié)。本文向你展示了三種無需反編譯器或反匯編器即可使用的逆向工程策略。
參考鏈接:
https://www.nowsecure.com/blog/2023/04/19/reverse-engineering-techniques-for-mobile-app-pen-testing/