當前位置: 華文世界 > 數碼

成熟後門在野外「泛濫」,載入 Rootkit 對抗殺軟

2024-03-21數碼

近期,火絨收到使用者反饋稱自己電腦執行異常,火絨安全工程師第一時間為使用者提供技術支持。在溯源的過程中發現,使用者是在搜尋 todesk 應用程式時點選了非官網連結(hxxps://aaa.csdunlun.cn/tdk/index.html 現已失效)進行下載,該網址隨即跳轉到 123 盤中下載被惡意分享的病毒檔。

溯源截圖

火絨安全實驗室對樣本進行提取分析後發現其為一個成熟的遠控型後門,並在後續會聯合其它模組進行擴充套件操作,包括下載挖礦病毒進行挖礦,透過 Rootkit進行殺軟對抗等,危害極大。此外,樣本中涉及的驅動檔均帶有微軟合法簽名認證,據火絨威脅情報系統監測顯示,目前該類惡意驅動在野數量達到2000多個。

微軟合法簽名

目前,火絨安全產品已支持對該類病毒進行攔截和查殺,請廣大使用者及時更新病毒庫以提高防禦能力。

火絨查殺圖

在此,火絨工程師建議大家在下載軟件時,盡量選擇官方網站或正規可信的市集,同時安裝可靠的保安軟件保護器材免受惡意軟件和病毒的侵害。目前,火絨市集已獨立上線,提供軟件下載、程式升級、解除安裝管理等功能,省時、省力、更省心,歡迎大家到火絨官網下載體驗。

樣本執行流程如下:

一、樣本分析

虛假 todesk 安裝包

源頭來自於一個虛假官網上的虛假安裝包 tod1sk_18.exe,其為一個 downloader,用於下載 C2 上的檔並執行:

其在執行過程中逐步解密出對應數據和相關程式碼,連線遠端 c2:206.238.115.152 的 7800埠開啟下載:

下載的多個檔 L - 7、1、2、3、4 用於載入執行及下一階段操作。其中 L- 7 用於載入執行,1 和 2 重新命名為隨機但同名的 cDA34i7Jn.exe 和 cDA34i7Jn.dat;3 和 4 分別重新命名為固定的 edge.xml、edge.jpg:

第一個模組:遠控模組

虛假安裝包完成下載任務後會啟動 cDA34i7Jn.exe 行程,該行程會載入與自己同名的 cDA34i7Jn.bat,後者是一個包含 lua 指令碼的壓縮包 :

cDA34i7Jn.exe 會載入壓縮包內的 lua 指令碼進行解析,然後開辟對應執行緒,讀取同目錄下的 edge.xml,解密其檔頭成一個 dll 檔並記憶體載入執行:

edge.xml 解密的 dll 分析

由 xml 解密而來的 dll 大體流程可以劃分為三個階段:前期準備、後門開啟、潛伏的備份後門。

第一階段:

首先開啟一個執行緒執行關閉 UAC,關閉 360 視窗,建立計劃任務等操作:

建立的計劃任務是透過 com 機制呼叫計劃任務相關 API ,在執行目錄下釋放 exe 和 dat 檔的副本並設立好相關計劃任務內容:

釋放的 dat 和 exe 檔與原始檔相同,只是最後兩字節用了隨機數代替,並沒有實際影響:

第二階段:

載入同目錄下 edge.jpg 檔並解密成 dll,然後呼叫唯一的匯出函數 Edge,該 dll 是專門的遠控程式:

edge.jpg 解密的 dll 分析:

由 edge.jpg 解密的 dll 是專門的後門模組,其會檢測一些檔的建立時間等資訊用於標識後門在該主機上建立的時間,所以會先刪除已存在的沖突檔。並且在執行過程中還會檢測已存在的視窗的標題,遇到逆向分析工具或其它檢測工具時會終止執行:

該後門模組根據多個標誌位執行不同的操作:

這些標誌包括禁用微軟內建的防毒軟件,從C2下載新的檔並執行,鍵盤竊密等,部份標誌解析列舉如下:

Disable_sleep_flag 用於禁用休眠,檢測 360 行程並建立標誌檔 xxxx.ini,keylog_flag 標誌用於進行鍵盤記錄:

connect_flag 標誌用於測試埠的連線,ip_flag 標誌用於確認是否根據 ip.txt 內容替換 C2 地址:

還有非持久化標誌,該後門模組會根據是否設立非持久化標誌來決定是直接執行遠控操作還是駐留執行,非持久化標誌下又細分 autorun 和 service 標誌來具體化駐留的方式:

第三階段:

若前面連線中斷並結束迴圈,則還有備用選項 Software\Microsoft\MMSNG,用於在 7 天後開啟新的後門:

備用後門中字串 「REPLACE ME TO BACKDOOR URL」 表明該後門工具的分發化和成熟化,與前面的後門一樣,使用同一套解密演算法並呼叫相同的匯出函數:

第二個模組:對抗模組

對抗模組推測是在前面後門建立之後進行投放的,主要目的是進行殺軟對抗操作,前期流程無異,投放的包括 mLIM186a.exe、mLIM186a.dat、syncstatus.png,由 mLIM186a.exe 引導執行:

mLIM186a.exe 讀取 dat 中的 lua 指令碼開啟執行緒後,繼續讀取同目錄下 syncstatus.png 並解密出 dll,然後記憶體載入匯出函數 PluginMe:

syncstatus.png 解密的 dll 分析

該 dll 會將相關字串進行拆分,並使用異或運算操作來動態生成字串:

在執行初期,其會檢視 TokenElevation 內容值確認許可權並嘗試關閉 UAC:

然後開始遍歷相關行程,行程名是以對應的 hash 來代表的,使用的演算法修改自 FNV hash,依據特定行程的存在情況來決定執行跳轉邏輯:

邏輯跳轉分析:

跳轉邏輯依據國內外殺軟的存在情況決定,當指定的國外殺軟存在時就直接返回0,不進行任何操作。當指定的國外殺軟不存在時,會判斷是否存在國內殺軟從而執行不同的邏輯分支:

  • 當指定的國內殺軟存在時,會開辟新執行緒用於在內核層和使用者層進行對抗。
  • 當指定的國內殺軟不存在時,會下載挖礦病毒進行挖礦操作。
  • 檢測到指定的國內殺軟存在時

    當檢測到指定的國內殺軟存在時,對抗模組會獲取前面後門模組釋放的 c:\xxxx.ini 的建立時間與系統時間進行比較,當系統時間比該檔的建立時間大2592000000毫秒(30天)時,才會執行殺軟對抗操作及開展後續的行為,也就是會潛伏整整30天:

    當時間條件滿足時,樣本會解密並釋放驅動檔 hwperf.sys,並寫入到計劃任務當中:

    隨後開啟多個執行緒,分別用於執行驅動對抗,遍歷並終止殺軟行程,清除日誌,用 powershell 添加保護路徑等操作:

    檢測到指定的國內殺軟不存在或已被終止時:

    其會從指定網址中下載 webkit.531.36.png 解密並執行,解密後經分析發現是常規的挖礦病毒,執行過程中建立的互斥體:

    驅動分析:

    「hwperf.sys」是一個使用OLLVM編譯的驅動檔,使用OLLVM編譯的檔能有效的增加軟件的逆向工程難度防止被分析,常見於商業軟件與病毒程式上。「hwperf.sys」 會解密前面模組中保存在登錄檔內的數據,此數據是AES_ECB加密的,解密後仍是一個驅動程式,在解密完後會在內核層申請記憶體並載入此驅動:

    hwperf.sys分析:

    樣本會透過ZwQuerySystemInformation(SystemModuleInformation)獲取當前系統驅動列表如下圖所示:

    樣本會透過HASH動態獲取系統內核函數地址如下圖所示:

    HASH演算法如下圖所示:

    透過」 ZwQueryValueKey」獲取登錄檔裏保存的數據如下圖所示:

    在讀取保存在登錄檔裏的數據後會透過cng.sys!BCryptDecrypt進行解密如下圖所示:

    AES_ECB_KEY在「hwperf.sys」記憶體裏,AES_ECB_KEY的解密演算法如下圖所示:

    此key長度為16,具體程式碼如下圖所示:

    完整解密流程C語言程式碼如下圖所示:

    AES解密後得到一個異或加密後的PE檔,AES解密後的檔內容如下圖所示:

    透過使用PE頭0x4d 異或 0xB2得出0xff, 同樣使用0x5a 異或 a5 得出0xff.由此判斷此檔使用了0xff進行異或。並且發現0值沒被異或,由此得出異或解密演算法如下圖所示:

    解密完成後hwperf.sys會把解密後的驅動放到內核地址裏,修復完匯入表跟重定位後執行入口,執行完入口後會幫助抹除目標驅動的前0x1000字節

    修復匯入表如下圖所示:

    執行入口點以及抹除前0x1000字節如下圖所示:

    Kplugin.sys 分析:

    解密後的驅動檔能發現PDB名為: kplugin.pdb,故此文件後續把解密後的驅動檔叫作kplugin.sys

    kplugin.sys是個rootkit,會檢測電腦內各種關鍵通知回呼,有行程回呼(CreateProcessNotify)、執行緒回呼(CreateThreadNotify)、模組回呼(LoadImageNotify)、行程執行緒控制代碼操作回呼(ObRegisterCallbacks)、登錄檔操作回呼(CmRegisterCallback)、檔過濾器(miniflter)以及刪除檔和結束行程。

    kplugin.sys在入口處開啟了一個執行緒常駐於系統內,程式碼如下圖所示:

    執行緒啟動後會先透過各種回呼的驅動名HASH判斷是否需要執行移除回呼、刪除檔、結束行程等操作,最後每迴圈15次就會執行一次結束行程和刪除檔的操作,每迴圈25次會執行讀取登錄檔數據進行刪除回呼,刪除檔,結束行程等操作,程式碼如下圖所示:

    kplugin.sys會獲取行程回呼(CreateProcessNotify)、執行緒回呼(CreateThreadNotify)、模組回呼(LoadImageNotify)的列表,然後根據列表內的區段名字算HASH進行比較,檢測到是安全防護類軟件的驅動程式會進行移除。

    獲取回呼列表程式碼如下圖所示:

    移除回呼程式碼如下圖所示:

    判斷回呼是否為安全防護類軟件驅動程式程式碼如下圖所示:

    由於該HASH演算法不可逆,透過把部份安全防護類軟件驅動程式進行同樣 HASH計算來碰撞,結果如下圖所示:

    kplugin.sys移除行程執行緒控制代碼操作回呼(ObRegisterCallbacks)程式碼如下圖所示:

    kplugin.sys會透過PsProcessType和PsThreadType獲取回呼列表,然後判斷回呼,最後進行移除,具體程式碼如下圖所示:

    kplugin.sys透過CmUnRegisterCallback函數找到登錄檔操作回呼(CmRegisterCallback)列表,具體程式碼如下圖所示:

    最後檢測登錄檔回呼操作是否為HASH列表內的驅動,最後進行移除,具體程式碼如下圖所示:

    kplugin.sys會透過FltEnumerateFilters找到檔過濾器(miniflter)列表,程式碼如下圖所示:

    最後檢測檔過濾器是否為HASH列表內的驅動,然後進行移除,具體程式碼如下圖所示:

    kplugin.sys會檢測行程名,檢測到後會結束相關行程。具體程式碼如下圖所示:

    一部份行程列表如下圖所示:

    kplugin.sys會檢測行程名,檢測到後會刪除檔,具體程式碼如下圖所示:

    以下檔會被刪除:

    kplugin.sys會讀取登錄檔裏的數據來進行一些操作。程式碼如下圖所示:

    讀取的數據是加密過的,解密程式碼如下圖所示:

    最後根據登錄檔內的數據執行移除各種回呼,結束行程,刪除檔等操作,程式碼如下圖所示:

    二、附錄

    C&C:

    HASH: