在Android APK中嵌入Meterpreter
當今世界,行動電話無處不在。我們日常生活中的許多應用程式正在遷移到雲部署,從而使前端技術重新回到瘦客戶端的時代。我們的瘦客戶端可以是任何東西,從JavaScript瀏覽器框架到支援移動裝置的前端,例如Apple iOS上的Objective-C,或基於Android的Java。
Apple繼續維持範例,審查所有進入iOS應用程式商店的應用程式。即便如此,仍然存在惡意軟體蔓延的情況。與Apple不同,Android市場是一種開放的方式,允許任何人為遊戲商店做出貢獻,而且佔據了移動市場份額的大部分江山。此外,還有各種第三方網站可以直接下載Android應用程式包檔案(APK)。
Metasploit專案允許測試人員使用功能非常強大的meterpreter命令生成Android有效載荷,該meterpreter可以載入到Android裝置上。通常,通過Android偵錯程式“adb”側面載入APK。從測試者的角度來看,有趣的事情是將合法(可能有趣)的應用程式與Meterpreter相結合,並將該應用程式側載入到Android裝置上。當然,您可能會考慮將該裝置作為禮物或類似的社會工程方法傳送給“朋友”。
Android應用程式是用Java編寫的,它編譯成Dalvik可執行格式DEX。應用程式的編譯版本是DEX位元組碼檔案的ZIP檔案。 Android上的Dalvik虛擬機器最近被Android RunTime(ART)取代,後者執行額外的優化並將DEX位元組碼編譯為本機彙編程式碼。Dalvik VM主要執行大部分位元組碼的即時(JIT)解釋。ART比Dalvik虛擬機器具有更高的效能,Dalvik虛擬機器僅優化應用程式頻繁執行的位元組碼部分。
Smali /baksmali是Android DEX位元組碼的彙編程式/反彙編程式。一個名為apktool的Android工具可以將壓縮的DEX(APK檔案)反彙編成smali檔案,並將smali檔案重新組合回DEX,然後重新組合為壓縮的APK格式。我們可以使用此工具來反彙編和修改現有的APK檔案。在此情形之下,我們可以使用該工具進行反彙編,並在初始Android Activity的smali程式碼中新增一個額外的靜態入口點,以啟動我們的Meterpreter。
總的來說,將Meterpreter嵌入現有APK檔案的步驟如下:
1.在apkmonk.com或類似的映象站點上找到有吸引力的APK應用程式。
2.生成Metasploit APK檔案。
3.使用apktool反彙編Metasploit APK檔案以及打算修改的APK檔案。
4.將所有Meterpreter smali程式碼複製到新的APK smali目錄。
5.通過查詢下面的intent-filter,在APK應用程式的AndroidManifest.xml檔案中找到程式碼的入口點:
<action android:name="android.intent.action.MAIN"/>
6.包含此intent-filter的行為名稱就是要搜尋的入口點。
7.修改活動.smali檔案以包含啟動Meterpreter階段。
8.將Meterpreter AndroidManifest.xml中的所有Meterpreter許可權複製到修改後的APK的AndroidManifest.xml中。
9.重新組成DEX壓縮格式。
10.使用jarsigner為新建立的APK檔案簽名,然後將其載入到目標Android裝置上。
用一個具體的例子來理解上述步驟要容易得多。為了說明這一點,我從apkmonk.com下載了一個名為Cowboy Shooting Game的APK檔案。
生成惡意軟體APK
使用msfvenom命令生成Metasploit APK,如下所示。
反彙編APK檔案
然後使用apktool對這兩個檔案進行反彙編(baksmaling !!!),如下所示:
將惡意軟體程式碼複製到牛仔工具遊戲中
一個簡單的方法是將目錄更改為Metasploit APK目錄,然後將smali目錄下的所有檔案複製到“com.CowboyShootingGames_2018-09-22”目錄中。我從系統管理員那裡學到的使用“tar”命令備份整個目錄樹的一個老技巧很方便,可以將tar的輸出傳輸到第二個命令,該命令改變目錄並解壓縮生成的檔案。
找到Activity EntryPoint
可以看到entry activity被列為“com.CowboyShootingGames.MainActivity”。我們知道這一點,因為XML中包含一個帶有“android.intent.action.MAIN”的intent-filter。
修改Activity EntryPoint Smali檔案
從上面可以看出,檔案將被命名為MainActivity.smali,並且將根據完全限定類路徑中的句點(“.”)位於com / CowboyShootingGames目錄中。
在MainActivity.smali檔案中,我們正在尋找onCreate()方法。
我們需要在onCreate()方法呼叫的正下方新增一行smali程式碼來呼叫Meterpreter。
invoke-static {p0}, Lcom/metasploit/stage/Payload;->start(Landroid/content/Context;)V
請注意,以上是一行程式碼。可以使用與“com/metasploit/stage/Payload”不同的路徑名來進行模糊處理,但是如果這樣做,則必須修改“Payload”中包含的所有“smali”檔案中對路徑的所有引用,並更改目錄名稱本身。這可以手動完成,但容易出錯。在沒有任何混淆的情況下可以繼續進行,修改後的最終結果如下面的螢幕截圖所示。
為修改的APK“AndroidManifest.xml”檔案新增許可權
下一步,使用grep搜尋Metasploit AndroidManfest.xml檔案中所有包含字串uses-permission和uses-feature的行到修改後的APK的AndroidManiest.xml檔案中。
需要使用編輯器在新的AndroidManifest.xml檔案中的適當位置插入許可權。搜尋現有的“use-permission”行作為插入文字位置的指導。
最終可能會獲得一些重複的許可權。可以選擇刪除它們,但確實無關緊要。
構建新的APK包檔案
現在再次使用apktool重新組合生成APK包檔案。將最終結果寫入APK目錄的dist目錄中。
重新簽名生成的包檔案
對於簽名來說,一種簡單的方法是使用安裝Android studio時構建的Android除錯金鑰庫。除錯金鑰庫包含在UN * X系統上主目錄中的“.android”隱藏目錄中。
另一種方法是使用Java“keytool”生成自己的自簽名金鑰庫,並使用jarsigner工具對其進行簽名,如下面的螢幕截圖所示。
此時,final.apk檔案已準備好使用adb載入到Android系統上。
在此特定情況之下,執行GenyMotion的副本,這是一個基於x86的模擬器,它使用VirtualBox可以進行非常高效能的Android模擬。可能會遇到的挑戰之一是x86模擬本身不支援ARM處理器。為了應對這一挑戰,可以線上獲得一些ARM翻譯庫。搜尋“Genymotion-ARM-Translation_v1.1.zip”,然後將ZIP檔案拖到正在執行的GenyMotion Android系統上。不幸的是,這不是100%可靠,並且可能會導致一些應用程式崩潰。
確保ARM APK檔案在裝置上執行的一種方法是使用硬體裝置本身。我發現Nexus 6系列裝置非常適合使用,因為“rooting”套件相當可靠,並且通過USB電纜連線進行測試並不是太麻煩。
最後一步當然是嘗試新感染的牛仔射擊遊戲。我們很快發現,在啟動遊戲的那一刻,我們在KALI系統上獲得了一個Meterpreter Shell,感覺非常好。
我真的不認為我會花時間玩這個遊戲,坦率的說這只是在apkmonk.com的隨機選擇。
如此多的複雜步驟……每一步都可能出錯……
因此,在執行了上述所有必要步驟後,我立即感到沮喪。有這麼多步驟,錯誤的可能性非常高。可能還有其他工具可供使用,但我決定使用快速的Python指令碼來自動執行此過程。我稱它為android_embedit.py,我現在會警告你,這絕對是一項快速而惡劣的努力,無需花費太多精力來加強邏輯,就可以完成工作。
android_embedit.py的想法是,提供Metasploit生成的APK檔案、要修改的原始APK和金鑰庫,它將以自動方式執行所有步驟並生成結果。
以下是執行該工具的示例。所有臨時檔案和輸出都將儲存在“〜/ .ae”目錄中。
該工具還將刪除metasploit目錄名,並自動使用隨機字串目錄名對其進行混淆處理。可以在下面的螢幕截圖中看到此結果,其中列出了APK “smali/com”目錄的內容。名為dbarpubw的目錄實際上包含Metasploit stager程式碼。