Jump to content
  • Entries

    16114
  • Comments

    7952
  • Views

    86384925

Contributors to this blog

  • HireHackking 16114

About this blog

Hacking techniques include penetration testing, network security, reverse cracking, malware analysis, vulnerability exploitation, encryption cracking, social engineering, etc., used to identify and fix security flaws in systems.

想要輕鬆掌握Android 惡意軟件的逆轉技術嗎? Incinerator 將是你在這場網絡攻防戰中的得力夥伴,無論是資深專家還是初出茅廬的新手,都能在這款工具中找到自己的舞台。

大家好!在這篇文章裡,我們將探索Incinerator 的強大功能、豐富特性以及它所帶來的種種優勢。這款Android 逆向工程工具集的靈感來自於廣受好評的Shambles項目。

1.png

我們的目標非常明確:打造一款能夠輕鬆應對Android 應用,尤其是惡意軟件的高級逆向工具。我們需要的是一個集反編譯、解密、動態調試和漏洞檢測於一體的全能工具。而且,這款工具還得能夠快速、準確地揪出那些常見和隱蔽的威脅跡象(IOCs)。

正是基於這些目標,我們推出了Incinerator!簡單來說,它是一個功能全面、操作簡便的逆向工程生態系統。不論你是經驗豐富的逆向工程專家,還是剛踏入惡意軟件分析領域的新手,Incinerator 都能滿足你的需求。

Incinerator 應用內置了多種強大功能,讓你可以輕鬆反編譯Android 應用,自動解密內容,取消反射API 調用,獲取清晰的反混淆代碼,並在真實設備上進行實時調試分析。這對於那些想要深入了解、分析和逆轉Android 惡意軟件的人來說,是一個完美的選擇,即使你沒有太多經驗也沒關係。

Incinerator 在後台進行的分析工作包括組件分析、安全漏洞檢測、靜態和動態代碼分析、漏洞挖掘以及惡意代碼分析。通過全面的檢查,Incinerator 能夠有效地幫助用戶識別和解決安全風險和漏洞。

在更高層次上,Incinerator 將解密任務放在雲端處理,其內部的漏洞分析引擎沙箱會實時更新漏洞庫,能夠精確到代碼的具體行來定位惡意代碼或漏洞。

多年前,Incinerator 與JEB 或GDA 進行了性能對比測試,並展現出了卓越的性能。如果你想看完整的對比報告,可以點擊這裡查看。

此外,我們還對比了多個威脅情報中心和在線沙箱的惡意代碼檢測與分析能力,以此來衡量Incinerator 的性能。結果同樣令人滿意,相關報告也可供大家參考。

2.png

3.png

現在,讓我們來認識一下Incinerator 背後的團隊。這款工具由Lian Security的一支約12 人的工程師團隊開發,歷時約兩年。他們也是SHAMBLES、INCINERATOR和FLEGIAS等產品的開發者,這些產品覆蓋了從軟件、基礎設施、硬件到基本操作和維護、產品UI 設計等多個領域。

4.png

Incinerator 可以在Windows、MacOS和Linux系統上運行。它支持分析APK 和DEX 文件。 APK 文件包含了編譯後的代碼文件(.dex 文件)、資源文件、證書和清單文件。 DEX 文件是Android 系統的可執行文件,包含了應用程序的所有操作指令和運行時數據。

分析文件的途徑有兩種,一種是通過Incinerator 的桌面應用程序界面,如下圖所示。

5.png

另一種是通過雲端的網絡門戶進行。

6.png

選擇哪一種方式,全憑個人喜好。我個人習慣於通過桌面應用程序上傳和打開APK。上傳後,你可以登錄到雲端門戶,在https://incinerator.cloud/#/main/task/list查看上傳的樣本。

7.png

從網絡門戶,你可以查看和處理生成的基於網絡的報告。這些報告可以分享給其他人進行APK 分析。這種訪問權限需要在你的UCENTER賬戶中進行配置,默認情況下是不公開的。

8.png

如果你想要深入了解報告,或者跟隨我們的分析步驟,請點擊這裡,你將看到如下的報告內容。

9.png

Incinerator 使用的ML 模型具有非常高的準確性。 Incinerator 的一些功能實際上是開源的,可以在Lian Security 的Github上找到。特別是用於處理和生成報告數據的兩個模型已經公開。

android-malware-detection

apk-obfucation-detection

在Base Info和Behavior Info面板以及Static Analysis、Dynamic Analysis和APK Risk側邊面板中,包含了大量的信息。我們的目標是提供一個材料清單(BOM),它從包管理器、二進製文件、源代碼和容器圖片中派生。

讓我們看看我個人特別喜歡的一些功能。你可以下載APK 的網絡流量,並將其導入到Wireshark 中進行分析。

10.png

例如,應用程序權限(Application Permissions)等許多面板,都是基於androidmanifest.xml文件的分析結果得出的,還有更多信息等待你去發掘。

11.png

快速瀏覽一下報告中的軟件組成分析(SCA)部分,你會發現這些信息大部分都是非常有價值的。

12.png

我邀請你自己去探索這份報告。我不會再次回到這個網絡門戶,因為在網絡上看到的所有內容都已經融入到了主應用程序中。

一旦樣本被雲端引擎完全分析,我們就可以開始在Incinerator 應用程序中對其進行分析。當你第一次加載樣本時,APK 報告會加載出來,它和網絡門戶報告中的內容非常相似。

13.png

如前所述,Incinerator 是一個沙箱工具,用於記錄應用程序的整個執行過程,以調用棧的形式展示。當用戶在本地打開相應的樣本時,我們可以提供類似動態調試的體驗。這使得用戶能夠理解樣本在動態執行後是如何被觸發的。

14.png

工具界面主要分為兩個部分:Base Info和Behavior info。每個部分提供的信息和主要差異如下,這些是你在使用時通常會看到的內容,但請注意,這裡列出的並不是全部信息。

15.png

在右側,我們有四個面板:Android Monitor、Set Debug Device、Static Analysis和Dynamic Analysis,我們將在後面的內容中詳細探討這些面板。

16.jpg

這是Incinerator 用戶界面的基本佈局。

17.png

讓我們開始逆轉一些惡意軟件吧!以FakeCalls 為例。逆轉惡意軟件的主要目標之一是識別攻擊者用來竊取和外洩數據的C2 和CC 通信渠道。 Incinerator 在識別這些通信渠道方面表現得非常出色。

18.png

正如上圖所示,我們知道這款惡意軟件使用了死信箱解析器(T1102.001)。這是一種將惡意內容存儲在合法網絡服務上,然後通過調用將其安裝到受害者設備上的技術。這些服務常常用來代理和掩蓋與真實CC 服務器之間的通信,通過額外的域名和IP 地址實現。

讓我們通過checkpoint 報告中檢索到的curl 信息,手動在Incinerator 中逆轉這種行為。 Incinerator 引擎識別出了執行請求到C2 服務器daebak222.com/huhu/admin.txt的代碼,如下圖所示。

19.png

如果我們對端點執行curl 命令,將會得到以下輸出。

$ curl https://www.daebak222.com/huhu/admin.txt

{

'a01': 'eWVlYWIrPj5mZmY_dXB0c3B6IyMjP3J-fA==',

'b05': 'Y2ViYWIrPj4gICI_IyAjPykpPyAlKSspIiMjPn14Z3Q=',

'a07': 'eWVlYWIrPj4gKSM_ICc_JSM_ICkrJCEkJD55ZHlkPnB1fHh_P2VpZQ=='

}

我們的目標是理解惡意軟件為何要獲取這些信息,以及它的用途。結果發現,這些信息被用來更新它的C2 通信渠道。這次檢測的整個調用棧指向了ServerInfoService.java,它調用了Service和Binder Android類,這些類通常在你需要通過HTTP 請求獲取服務器信息的服務中使用。它還提供了其他組件訪問這些信息的方法。

ServerInfo類包含了有關服務器的信息。

a01 (eWVlYWIrPj5mZmY_dXB0c3B6IyMjP3J-fA==),

b05 (Y2ViYWIrPj4gICI_IyAjPykpPyAlKSspIiMjPn14Z3Q=),

a07 (eWVlYWIrPj4gKSM_ICc_JSM_ICkrJCEkJD55ZHlkPnB1fHh_P2VpZQ==)

它代表了我們期望從服務器獲取的各種屬性。

20.png

其中,serverInfo.a01代表新服務器,serverInfo.b05代表備用服務器,serverInfo.a07代表從哪個服務器獲取信息。 fetch()和fetchFromAlternative()方法用來啟動HTTP 請求,以獲取服務器信息。

21.png

如果我們在Incinerator 控制台中按下tab鍵進入fetch()方法,我們可以看到Android 應用程序字節碼的中間語言,也就是所謂的'smali' 代碼。在這裡我們可以清楚地看到eWVlYWIrPj5mZmY_dXB0c3B6IyMjP3J-fD55ZHlkPnB1fHh_P2VpZQ==實際上是daebak222.com/huhu/admin.txt。就在下面,我們有onData方法,如果成功獲取服務器信息,則記錄成功消息。然後,它會檢查ServerInfo對象的字段(a01、b05、a07)是否有空。如果任何一個字段為空,它會記錄一個警告消息,指示服務器信息無效。否則,它將調用ServerInfoService類的updateServerInfo方法,傳遞接收到的ServerInfo對象,以更新服務器信息。

22.png

太棒了!有了Incinerator,這一切都變得非常簡單。接下來,讓我們看看Incinerator 的檢測能力。 Incinerator 識別出惡意軟件能夠捕獲設備接收的SMS 消息,發送短信,並根據C2 服務器的指令撥打電話。

23.png

讓我們驗證一下這款惡意軟件是否真的具備在受感染設備上捕獲電話通話、短信等信息的能力。首先,我們需要確認惡意軟件是否已經獲取或為自己分配了獲取這些信息的權限。從下面的圖中可以看出,它確實擁有大量權限。

24.png

那麼,惡意軟件是如何獲得這些權限的呢?我們可以雙擊調用棧中的任何參數,打開相應的代碼進行查看。特別值得注意的是Add New Device Administrator的事件。

25.png

惡意軟件會檢查設備管理員是否活躍,如果不是,它會通過發送一個Intent 來請求設備管理員權限,這個Intent的動作是android.app.action.ADD_DEVICE_ADMIN。只要用戶不答應,它就會不斷地通過循環窗口請求權限。

26.png

27.png

一旦用戶授予了權限,根據我的經驗,唯一手動停用它的方法是在Settings - Security - Device Management中操作,但到那時可能已經太晚了。

下面列出的是應用程序請求或已經獲取的權限,但這個列表並不全面:

permissionNames.add('READ CONTACTS');

permissionNames.add('WRITE CONTACTS');

permissionNames.add('READ SMS');

permissionNames.add('RECEIVE SMS');

permissionNames.add('SEND SMS');

permissionNames.add('RECORD AUDIO');

permissionNames.add('READ PHONE STATE');

permissionNames.add('WRITE EXTERNAL STORAGE');

permissionNames.add('READ EXTERNAL STORAGE');

permissionNames.add('CHANGE WIFI STATE');

permissionNames.add('INTERNET');

permissionNames.add('ACCESS WIFI STATE');

permissionNames.add('GET ACCOUNTS');

permissionNames.add('READ LOGS');

permissionNames.add('PROCESS OUTGOING CALLS');

permissionNames.add('CALL PHONE');

permissionNames.add('RECEIVE BOOT COMPLETED');

permissionNames.add('DISABLE KEYGUARD');

permissionNames.add('INSTALL SHORTCUT');

permissionNames.add('UNINSTALL SHORTCUT');

permissionNames.add('WAKE LOCK');

permissionNames.add('CHANGE WIFI STATE');

permissionNames.add('INTERNET');

permissionNames.add('ACCESS WIFI STATE');

permissionNames.add('GET ACCOUNTS');

permissionNames.add('READ LOGS');

permissionNames.add('PROCESS OUTGOING CALLS');

permissionNames.a