TrickGate最初於2016年7月被發現,這種基於外殼代碼(shellcode)的打包器(packer)作為一項服務來提供,用於隱藏惡意軟件以免被端點檢測和響應(EDR)以及殺毒軟件發現。
在過去六年間,TrickGate 被用來部署最臭名昭著的惡意軟件,比如Cerber、Trickbot、Maze、Emotet、REvil、Cobalt Strike、AZORult、Formbook和AgentTesla 等。
由於定期會改頭換面,TrickGate多年來一直沒有被人注意。這個特徵導致研究界通過眾多屬性和名稱來識別其身份。
雖然該打包器的包裝程序會不斷變化,但TrickGate外殼代碼中的主要構建模塊至今仍在使用中。
Check Point 的威脅模擬(Threat Emulation)解決方案成功檢測並阻止了TrickGate打包器。
介紹網絡犯罪分子日益依賴打包器來執行惡意活動。該打包器在黑客論壇上又叫Crypter(加密器)和FUD,使殺毒軟件更難檢測到惡意代碼。通過使用打包器,惡意分子可以更輕鬆地傳播惡意軟件,而影響更小。商業打包器即服務的主要特徵之一是,它不關心攻擊載荷是什麼,這意味著它可以用來打包許多不同的惡意樣本。該打包器的另一個重要特徵是它能改頭換面——該打包器的包裝程序會定期改變,因此不被安全產品發現。
TrickGate是一種典型的功能強大且有彈性的打包器即服務,多年來沒有被網絡安全產品所發現,並以不同的方式不斷改進自己。我們設法追查到了TrickGate的下落,儘管它會迅速改變外層的包裝程序。
TrickGate堪稱偽裝高手,因不同的屬性而被賦予了許多名稱。名稱包括TrickGate、Emotet的打包器、新的加載器、Loncom和基於NSIS的加密器等。我們聯繫了之前的研究成果,基本上確定這起活動似乎是作為一項服務來提供的。
TrickGate歷年來的活動我們首次觀察到TrickGate是在2016年底。當時,它被用來傳播Cerber勒索軟件。從那時起,我們一直在觀察TrickGate,發現它被用來傳播所有類型的惡意軟件工具,比如勒索軟件、RAT、信息竊取器、銀行木馬和挖幣軟件。我們注意到,許多高級持續性威脅(APT)組織和威脅分子經常使用TrickGate來包裝惡意代碼,以免被安全產品檢測出來。 TrickGate參與了包裝一些最臭名昭著的惡意軟件家族的活動,比如Cerber、Trickbot、Maze、Emotet、REvil、CoinMiner、Cobalt Strike、DarkVNC、BuerLoader、HawkEye、NetWire、AZORult、Formbook、Remcos、Lokibot和AgentTesla等。
圖1. TrickGate歷年來的活動
TrickGate的分佈在過去兩年裡,我們每週監測到40次到650次攻擊。據我們的遙測數據顯示,使用TrickGate的威脅分子主要攻擊製造業,但也攻擊教育設施、醫療保健、金融和商業企業。 這些攻擊遍布全球各地,越來越集中在中國台灣和土耳其。近兩個月使用TrickGate的最盛行的惡意軟件家族是Formbook,佔跟踪分佈總量的42%。
圖2. 2022年10月至11月期間的TrickGate統計數據
攻擊流程下面概述了涉及TrickGate的攻擊中常見的攻擊流程。
初始訪問打包器用戶進行的初始訪問可能會有很大差異。我們監測的打包樣本主要通過帶有惡意附件的網絡釣魚電子郵件來傳播,但也通過惡意鏈接來傳播。
初始文件第一階段主要以壓縮可執行文件的形式出現,但我們監測後發現了導致相同外殼代碼的許多文件類型和傳播手段。我們在第一階段觀察到以下文件類型:
壓縮文件:7Z、ACE、ARJ、BZ、BZ2、CAB、GZ、IMG、ISO、IZH、LHA、LZ、LZH、R00、RAR、TAR、TGZ、UU、 UUE、XZ、Z、ZIP、ZIPX、ZST。
可執行文件:BAT、CMD、COM、EXE、LNK、PIF、SCR。
文檔:DOC、DOCX、PDF、XLL、XLS、XLSX、RTF。
外殼代碼加載器第二階段是外殼代碼加載器,它負責解密和運行外殼代碼。
我們注意到三種不同類型的代碼語言用於外殼代碼加載器。 NSIS腳本、AutoIT腳本和C都實現了類似的功能。
外殼代碼外殼代碼是打包器的核心。它負責解密攻擊載荷,並將載荷悄悄注入到新進程中。
攻擊載荷攻擊載荷是實際的惡意代碼,負責執行預期的惡意活動。攻擊載荷因使用打包器的威脅分子而異。
圖3. 攻擊流程
我們在過去一年觀察到的不同攻擊流程的示例:
2022年2月24日
圖4. LNK攻擊流程
RAR:3f5758da2f4469810958714faed747b2309142ae
LNK:bba7c7e6b4cb113b8f8652d67ce3592901b18a74
URL:jardinaix[.]fr/w.exe
EXE:63205c7b5c84296478f1ad7d335aa06b8b7da536
2022年3月10日
圖5. PDF攻擊流程
PDF:08a9cf364796b483327fb76335f166fe4bf7c581
XLSX:36b7140f0b5673d03c059a35c10e96e0ef3d429a
URL:192.227.196[.]211/t.wirr/XLD.exe
EXE:386e4686dd27b82e4cabca7a099fef08b000de81
2022年10月3日
圖6. SFX攻擊流程
7Z:fac7a9d4c7d74eea7ed87d2ac5fedad08cf1d50a
EXE:3437ea9b7592a4a05077028d54ef8ad194b45d2f
2022年11月15日
圖7. AutoIT攻擊流程
R11:755ee43ae80421c80abfab5481d44615784e76da
EXE:666c5b23521c1491adeeee26716a1794b09080ec
外殼代碼加載器外殼代碼加載器通常含有一個函數,負責解密外殼代碼並將其加載到內存中。以下是基本步驟:
1. 讀取經過加密的外殼代碼。經過加密的外殼代碼可以存儲在光盤上的文件中、“.rdata”部分或存儲成資源。
2. 為外殼代碼分配內存,常通過調用VirtualAlloc來分配。
3. 解密外殼代碼。
4. 觸發外殼代碼。正如我們在下面解釋的那樣,這可以通過使用直接調用或回調函數來完成。
圖8. 外殼代碼加載器——去混淆處理的AutoIT版本
圖9. 外殼代碼加載器C版本
在較新版本的TrickGate中,外殼代碼加載器濫用“回調函數”機制。加載器利用許多原生API調用,這些調用將內存地址作為回調函數的參數。加載器傳遞的不是回調函數,而是新分配的內存(內有外殼代碼)的地址。當Windows到達註冊事件點時,DriverCallback 執行外殼代碼。這種技術通過讓Windows操作系統在未知時間運行外殼代碼來中斷我們所監測的行為流。在上面的外殼代碼加載器中,您可以在上面底部一行標有“EnumTimeFormatsA”和“EnumSystemCodePagesW”的配圖中看到這兩個示例。
外殼代碼相似性和TrickGate暫停當我們發現不相關的惡意軟件家族在代碼上存在相似性時,威脅分子通常更有可能從共享資源複製或共享某些片段的代碼。我們在很長一段時間內註意到一種獨特的注入技術,它結合使用直接內核系統調用的方法,但我們沒有意識到其重要性,以為它可能是共享代碼的片段。 我們在攻擊活動中看到了偶爾的“暫停”,這使我們懷疑這種獨特的注入技術可能完全由一個威脅團伙控制,畢竟幾個不同的團伙同時偃旗息鼓的可能性很小。最近一次暫停長達3個多月(從2022年6月13日到2022年9月26日),這讓我們有機會證實自己的猜疑,並深入研究外殼代碼。
圖10. 過去兩年的TrickGate
為了驗證猜疑,我們開始分析不同時間段的樣本。
我們通過將新樣本與舊樣本進行比較來開始分析。針對這一測試,我們使用2022-12_Remcos:a1f73365b88872de170e69ed2150c6df7adcdc9c與2017-10_CoinMiner:1a455baf4ce680d74af964ea6f5253bbeeacb3de作了比較。
我們分析行為後知道了外殼代碼存在相似性,於是運行樣本,直到外殼代碼在內存中被解密,然後我們將外殼代碼轉儲到磁盤上。接下來,我們使用歸谷歌所有的Zynamics BinDiff工具,以檢查兩個外殼代碼的相似性。結果顯示,測試的外殼代碼存在50%的相似性。沒料到在很長一段時間內(超過五年)對於相當大的外殼代碼(~5kb)而言存在50%的相似性。這自然讓人懷疑這可能是由人維護的外殼代碼,但我們需要進一步的證據表明在較短的時間內存在相似性,看看它是否逐漸變化。
圖11. 從2022-12_Remcos:a1f73365b88872de170e69ed2150c6df7adcdc9c和2017-10_CoinMiner:1a455baf4ce680d74af964ea6f5253bbeeacb3de提取的外殼代碼的BinDiff結果比較
為了進一步分析,我們抽取了過去六年的隨機樣本。針對每個樣本,我們轉儲了外殼代碼,並檢查一段時間內結果的相似性。正如你在下圖中所看到,結果表明逐漸出現的變化很小。在左側,我們看到從2016年到2020年的樣本顯示存在大約90%的相似性。在右側,我們看到分叉版本本身存在很高的相似性,但左側原始版本的相似性較低。
圖12. 提取的外殼代碼的Bindiff結果
然後我們深入研究外殼代碼之間的差異,看看以下方面帶來的影響:
不同的編譯器
混淆
規避模塊
持久性模塊(在下次登錄時運行載荷)
函數順序
局部變量和結構
我們隨後得到了打包器的核心功能。編寫者不斷維護外殼代碼,但使用下一節中描述的“構建模塊”。
圖13. 控制流程圖—關於主注入函數。比較2016-07_ Cerber:24aa45280c7821e0c9e404f6ce846f1ce00b9823與2022-12_Remcos:a1f73365b88872de170e69ed2150c6df7adcdc9c的差異
圖14.比較NtWriteVirtualMemory 2022-12_Remcos: a1f73365b88872de170e69ed2150c6df7adcdc9c與2016-07_Cerber: 24aa45280c7821e0c9e404f6ce846f1ce00b9823的NtWriteVirtualMemory內核直接調用差異
TrickGate外殼代碼的構建模塊如上所述,外殼代碼一直在不斷更新,但自2016年以來主要功能出現在了所有樣本上。外殼代碼的構建模塊概述如下:
API哈希解析。
加載到內存中,並解密攻擊載荷。
使用內核直接調用進行注入。
手動映射ntdll 的新副本。
動態檢索內核系統調用編號。
調用所需的系統調用。
注入並運行攻擊載荷。
API哈希解析我們分析TrickGate代碼時,並沒有發現常量字符串。很多時候,TrickGate有意添加干淨的代碼和調試字符串以規避任何分析。為了隱藏所需的字符串及其意圖,TrickGate使用了一種名為API哈希的常用技術,即所有需要的Windows API都使用哈希數來隱藏。在2021年1月之前,TrickGate一直使用CRC32對外殼代碼字符串進行哈希處理。在新版本中,TrickGate開始使用自定義哈希函數。
過去兩年使用的等效Python哈希函數:
defhash_str_ror1(str):h=8998forcinstr:h+=ord(c)+(((h1)0xffffffff)|((h7)0xffffffff))returnh0xffffffffdefhash_str21(str):h=8998forcinstr:h=ord(c)+(0x21*h)returnh0xffffffff
以下Kernel32 API名稱已在TrickGate樣本中進行了哈希處理:
圖15. API哈希
加載到內存,並解密攻擊載荷。
TrickGate總是改變解密攻擊載荷的方式。大多數樣本使用自定義解密方法,但在較老的樣本中我們也看到了已知的加密器(比如RC4實現)或使用Windows API進行加密。
使用內核直接調用的注入:
在解密攻擊載荷之後,外殼代碼隨後將載荷注入到新創建的進程中。在使用create_suspended標誌創建進程之後,通過對內核的一系列直接調用來完成注入。針對這每一個ntdll API調用:
NtCreateSection
NtMapViewOfSection
NtUnmapViewOfSection
NtWriteVirtualMemory
NtResumeThread
執行如下操作:
從磁盤手動映射ntdll的新副本。
解析新映射的ntdll中某個特定哈希的地址。
動態提取所請求的系統服務號(SSN)。
使用SSN直接調用內核。
Windows 64位:使用Heaven’s Gate技術和SYSCALL SSN切換到64位模式
Windows 32位:調用SYSENTER SSN
圖16. 函數調用圖:來自手動映射的DLL的SYSCALL ID
TrickGate調用直接系統調用的方式很有意思,因為它使用了類似Hell’s Gate的技術。 Hell’s Gate是2020年公開提出的一種技術,這種方法動態檢索和執行直接系統調用號。在這裡,你可以找到可追溯到2016年的樣本,它們設法完成了檢索和執行直接系統調用的等效操作,不需要維護系統服務描述符表(SSDT)。
圖17. SSN動態提取2016-07_Cerber: 24aa45280c7821e0c9e404f6ce846f1ce00b9823
注入模塊是多年來最穩定不變的部分,自2016年以來一直出現在所有的TrickGate外殼代碼中。
結語我們創建了將過去六年裡最臭名昭著的惡意軟件與一個名為TrickGate的打包器即服務相關的字符串,TrickGate能夠改頭換面,因而難以識別和追踪它。了解該打包器的構建模塊對於檢測這種威脅至關重要,因為阻止打包器就可以在早期階段趁攻擊載荷還沒開始運行及時防范威脅。
由於研究人員往往將注意力集中在實際的惡意軟件上,打包器通常不太受關注。然而,現在可以將已識別身份的打包器用來檢測新的或未知惡意軟件。