解析超過 80 萬人受害的 Geost 銀行木馬程式

Android銀行木馬Geost最先是從 Stratosphere Laboratory 的 Sebastian García、Maria Jose Erquiaga和 Anna Shirokova的研究披露出來。他們在監視 HtBot惡意代理網路時偵測到這隻木馬程式。此僵屍網路以俄羅斯銀行為目標,在該研究去年發表在 Virus Bulletin時,受害者數量已經超過了 80 萬。

該研究披露了 Geost(趨勢科技偵測為AndroidOS_Fobus.AXM)從受害者竊取的資訊類型及僵屍網路背後團隊的活動,包括操作策略和管理者間的通訊以及僵屍網路編碼器。

因為這有意思的發現,我們決定逆向工程惡意軟體樣本來深入挖掘 Geost 的行為。這隻木馬程式加了好幾層的混淆、加密、反射技術以及注入非功能性的程式碼,使得逆向工程變得更加困難。為了研究程式碼並分析其演算法,我們開發了Python腳本來解密字串。

初始分析

Geost躲在惡意應用程式內,會隨機產生伺服器主機名稱來製作非官方網頁進行散播。受害者會因為尋找在Google Play上沒有的應用程式或當自己無法連上官方應用商店而去找到這些惡意版本。他們會在某些網頁伺服器上找到該應用程式的連結並下載到手機上啟動。應用程式接著就會要求權限,一旦受害者允許就會導致惡意軟體感染。

我們分析的Geost樣本出現在名為 “установка”(俄文)的惡意應用程式中,它的意思是設定。該應用程式會顯示Google Play標誌作為自己的圖示,啟動後就不會出現在手機螢幕上。

圖1. 惡意應用程式установка的圖示

啟動應用程式時會要求裝置管理員權限。這很不正常,一般應用程式不太會這樣做,因為這基本上可以讓應用程式擁有對行動裝置的完全權限。

使用者可能在不知不覺下授予的重要權限還有存取簡訊,這包括來自銀行應用程式的確認訊息。這些訊息讓惡意軟體取得受害者的姓名、餘額和其他銀行帳戶詳細資料。只需點幾下,攻擊者就可以從受害者的銀行帳戶將錢轉走。

圖2. 要求裝置管理員權限的畫面

圖3. 要求的應用程式權限

確認所需的權限後,應用程式的可見部分會關閉,應用程式圖示會消失,讓受害者以為應用程式已被刪除。測試裝置一開始沒有出現有問題的惡意活動跡象,但惡意軟體在背景活動,攻擊者已經取得該裝置的存取權限,使得他們可以監視收發的訊息,包括銀行應用程式的確認訊息。

為了在重開機後依舊繼續活動,它會註冊BOOT_COMPLETED和QUICKBOOT_POWERON廣播。

圖4. 將服務註冊到開機廣播(某些程式碼經過混淆化)

階段一

就跟許多惡意軟體一樣,Geost分成多個階段運行。第一個階段很簡單,會下載和解密執行更加複雜的下一階段。

Geost樣本的APK檔將編譯過的Java程式碼儲存在classes.dex檔內。它還包含了AndroidManifest.xml和資源檔,這些是APK檔的常見內容。它還有一個大小為125k的”.cache”檔案。

為了反編譯解開的classes.dex檔需要使用數個Java反編譯器(包括dex2jar、jadx、jd-core/jd-gui和Ghidra),因為沒有單一的反編譯器能夠反編譯所有的Smali程式碼。

圖5. 反編譯的Java原始碼

乍一看,反編譯程式碼似乎部分編碼在一串字串內;不過字元頻率分析顯示使用了隨機字元。

進一步地分析顯示惡意軟體中包含一些無用的程式碼,除了會拖慢執行速度外對應用程式行為本身沒有影響。這讓逆向工程變得更加困難,因為惡意軟體將有用的程式碼切成多個部分並不斷更改執行路徑。採用哪個分支通常取決帶有未知值的變數。”switch”、”if”和”try/catch”命令區塊也是如此。無意義的程式碼函式讓想全面性了解惡意軟體運作變得更加困難。

圖6. 帶有case switch條件判斷的程式碼

逐步移除無用的程式碼後可以找出被使用的第一個解密演算法。階段一的所有字串都經過 RC4加密,使用了一種演算法來切成多個函式來避免被認出使用了RC4。所以下一步就是找出RC4解密金鑰。

圖 7. 反解譯的Java原始碼,這是RC4演算法的一部分

圖 8. 清理出來的部分RC4程式碼

圖 9. RC4金鑰

RC4 是一種流加密演算法,內部狀態會隨著每個解密的symbol而改變。要解密多個加密字串時,通常解密動作必須按加密時的順序進行。幸運的是,此樣本並非如此。程式碼作者簡化了RC4而沒有在解密動作間保持內部狀態,因為RC4加密程式碼始終複製狀態陣列S[]。

圖 10. RC4加密始終複製狀態陣列S[]

之後開始搜尋常用程式庫。找到了Android.support.v4程式庫和ReflectASM Java Reflection程式庫。

圖 11. 帶有加密字串的程式碼

圖 12. 帶有解密後字串和去混淆化symbol的程式碼

此時階段一的程式碼變得可以理解:它利用反射程式碼來隱藏特定class和method不被注意。基本上,階段一使用相同的RC4演算法和金鑰解密階段二的檔案。

圖13. 反射method調用的例子

前面提到的”.cache”檔被重新命名為.localsinfotimestamp1494987116,在解密後儲存為ydxwlab.jar,可以載入和啟動.dex檔。

圖14. 解密和儲存階段二

程式碼作者插入了一個假旗標HttpURLConnection及其網址,看似會連到命令和控制(C&C)伺服器。但是此 http連線永遠不會執行。

圖 15. 假旗標

階段一載入階段二的class,研究人員將其命名為”MaliciousClass”。

圖16. 啟動階段二

階段二

查看了classes.dex,很明顯地階段二再度使用了模糊化和加密。但這次symbol名稱被 1到2個字元的字串進行部分替換,而不是跟之前一樣的6到12個字元的字串。此外,字串加密演算法也被改成不同於前一階段所用的演算法。使用了不同的工具。此外,解密演算法的參數會根據各class加以修改。

所有的Java反編譯器因為if區塊出現goto命令而在反編譯解密演算法時遇到問題。只有Jeb desers可以處理好此結構。

圖17. 解密演算法的Smali

圖18. 解密演算法的Java程式碼

每個class的解密方法包含不同的參數順序和不同的常數;讓撰寫Python解密腳本變得更加困難。這代表解密腳本必須偵測Smali碼內的演算法設置並自我調整,或是在解密每個class前先在腳本內手動設置參數。

圖 19. 加密字串的例子

字串解密後可以偵測到使用的程式庫。包括:

  • AES加密引擎
  • Base64編碼
  • 模擬器偵測器
  • 檔案下載服務
  • IExtendedNetworkService
  • USSD api程式庫
  • Zip4jUtil

初始化階段

從階段一調用的MaliciousClass成為研究人員稱為”CoNtext”實例化類別(instantiated class)的信封(envelope)。

圖 20. Context Class

Context class 會先啟動模擬器偵測器服務。接著啟動另外兩個服務:AdminService和LPService,然後才做主要要做的事情。

圖 21. 主要的初始化動作

模擬器偵測器

模擬器偵測器會檢查是否在模擬環境內執行的跡象。此樣本會偵測Nox、Andy、Geny、Bluestack和Qemu Android模擬器。

圖 22. 模擬環境追蹤

AdminService

此服務負責對應用程式授予管理員權限。這是個關鍵部分,因為這讓它能夠存取敏感性資料並且可以啟動特權操作。

圖 23. AdminService的關鍵部分

LPService

此服務負責保持應用程式執行並連接C&C伺服器。它使用了WakeLock和WifiLock acquie()呼叫來做到這點。副作用是會讓電量消耗變高,但大多數受害者通常都會忽略掉。

圖 24. 鎖定CPU和WiFi資源

接著LPService會建立LPServiceRunnable執行緒,每五秒喚醒一次並負責監視和重新啟動以下服務:

  • MainService
  • AdminService
  • SmsKitkatService

此服務還會收集執行中程序和工作的資訊。還會定期啟動WebViewActivity(用來開啟瀏覽器視窗到任意網址或啟動惡意程式碼)。此樣本未實作WebViewActivity程式碼。

MainService

MainService首先連接AlarmManager來排程工作,接著註冊兩個廣播接收器:MainServiceReceiver1和MainServiceReceiver2。在初始化階段結束時,它會啟動MainServiceRunnable執行緒。當樣本執行重載的onDestroy() method時,它會再次重新啟動MainService。

圖 25. 重載onDestroy以重新啟動MainService

MainService的一個重要method是processApiResponse(),它處理從C&C伺服器接收來的JSON字串格式命令。

圖 26. 處理C&C伺服器命令

ClearService

此服務調用ClearServiceRunnable執行緒,該執行緒負責鎖定/解鎖命令(封鎖/取消封鎖使用者活動),好讓僵屍網路操作者可以在沒有使用者干預的情況下執行遠端任務。如果有人試圖終止ClearService,它也會重啟自己。

圖 27. CleanService class

圖 28. ClearServiceRunnable

SmsKitkatService

此服務可以讓攻擊者用自己的簡訊應用程式來替換標準簡訊應用程式。在此樣本中,它使用預設版本。

圖 29. 更換預設簡訊應用程式的程式碼

命令

在下表和螢幕截圖可以看到此惡意軟體可識別的命令列表(按程式碼內定義的順序排列):

命令 描述
#conversations 從content://sms/conversations/、content://sms/inbox和content://sms/sent所有的簡訊收集地址、內文、日期和類型欄並送到C&C伺服器
#contacts 從content://com.android.contacts/data/phones收集連絡人列表並送到C&C伺服器
#calls 從content://call_log/calls收集所有通話紀錄並送到C&C伺服器
#apps 收集已安裝套件名稱和標籤列表並送到C&C伺服器
#bhist 此樣本忽略此命令
#interval {set:number} 設定從C&C伺服器取得命令的時間間隔
#intercept 設定要攔截簡訊的號碼(”全部”或號碼列表)
#send id:, to:, body: 傳送簡訊
#ussd {to:address, tel:number} 透過USSD框架撥打號碼
#send_contacts 向電話簿內的所有連絡人傳送簡訊
#server 設定要執行的排程時間
#check_apps {path:url_to_server} 將執行中應用程式列表送到C&C伺服器,從參數內定義的路徑下載archive.zip檔案然後儲存成error.zip並解壓縮。Zip壓縮檔使用密碼”encryptedz1p”。預設伺服器名稱為hxxp://fwg23tt23qwef.ru/
#send_mass {messages: {to:address, body:text}, delay:ms} 向不同地址發送多個簡訊,每次發送間會有延遲
#lock 從ClearServiceRunnable啟動RLA服務來攔截自按鍵AKEYCODE_HOME、AKEYCODE_CAMERA和AKEYCODE_FOCUS的事件。它還會攔截 BackBackPressed() Activity method,靜音鈴聲,清除所有簡訊通知,停止自身和使手機無回應
#unlock 停用#lock命令下的操作,並透過停止ClearServiceRunnable解鎖手機
#makecall {number:tel_number} 使用標準android.intent.action.CALL API撥打號碼
#openurl {filesDir=j:url} 開啟網頁網址
#hooksms {number:tel_number} 設定號碼 – 將所有傳入的簡訊轉發到參數中的號碼
#selfdelete 將工作時間設成無法解析的字串值來停止自身排程的工作

圖 30. C&C伺服器命令列表

ApiRequest、ApiResponse、ApiInterfaceimpl

ApiRequest、ApiResponse 和 ApiInterfaceImpl class支援與C&C伺服器間的通訊。在連接參數初始化裡,replaceOfRandomStr變數值設為true,並且不會在程式碼中更改。

圖 31. 建立C&C伺服器連接字串

圖 32. 連接參數初始化

使用一個演算法來產生C&C伺服器網址用的隨機字串。接著初始化API連線並設定C&C伺服器的主機名稱。

圖 33. 為C&C伺服器網址建立隨機字串

圖 34. API連線初始化

圖 35. 設置C&C伺服器主機名稱

一個C&C伺服器API使用例子是C&C伺服器命令”#contacts”的實作。最終,命令參數會以 JSON格式加入並轉換為字串。

圖 36. C&C伺服器API呼叫的例子

最佳實作和趨勢科技解決方案

趨勢科技在2020年資安預測裡預測了行動惡意軟體家族將持續地增加,就像針對網路銀行和支付系統的Geost。行動用戶在這充滿危險的環境進行探索時,應該要遵循行動裝置防護最佳實作來保護自己。其中一個作法就是避免從官方應用程式商店以外下載。

不過遺憾的是惡意份子總會設法去透過合法應用程式商店散播惡意應用程式。除了靠這些網路商店持續移除有問題的應用程式,使用者也可以在下載前先仔細檢查應用程式評論及其他資訊來避免遇到有問題的應用程式。

應用程式使用者在授權給應用程式前應該要先仔細檢查所要求的權限。之後使用者也要注意其對裝置是否造成不好的影響,如效能下降或電池使用時間變短,這可能代表了遭到惡意軟體感染。此時使用者應該要立即移除新安裝的應用程式。使用者還應該定期檢查來移除未使用的應用程式。

為了進一步抵禦行動威脅,使用者可以安裝提供多層次防護的行動安全解決方案,如趨勢科技行動安全防護,能夠保護行動裝置抵禦惡意應用程式及其他行動威脅的攻擊。

入侵指標

SHA 256 偵測名稱
92394e82d9cf5de5cb9c7c7ac072e77496bd1c7e294683837d30b18880c1810 AndroidOS_Fobus.AXM

@原文出處:Dissecting Geost: Exposing the Anatomy of the Android Trojan Targeting Russian Banks 作者:Vit Sembera(威脅分析師)