近期,火絨威脅情報系統監測到一款后門病毒正在快速傳播,被激活后會通過遠程服務器下載多個惡意文件并獲取遠端惡意代碼,隨后黑客可以進行截取受害者屏幕圖像、遠程控制受害者電腦等各種惡意操作。不僅如此,該病毒還使用多種手段來躲避安全軟件的查殺,隱蔽性極強。目前,火絨安全產品可對上述病毒進行攔截查殺,請用戶及時更新病毒庫以進行防御。

火絨查殺圖
該黑客團伙投遞的文件名大部分與用戶常用軟件有關, 火絨安全實驗室目前收集到其偽裝的部分文件名如下圖所示:

相關文件名
火絨工程師分析發現,該病毒使用了包括 VMProtect 殼保護、構造 ROP 鏈、DLL 內存加載、“白加黑” 、多層內存解密等多種技術來躲避安全軟件的查殺,因此,火絨安全提醒用戶不要輕易點擊來歷不明的文件,建議先查殺后再使用。
注:“ROP (返回導向編程) ” 是一種將棧上寫入的 shellcode 指令串聯起來,使其能作為函數被已加載指令調用的一種手段。
一
樣本分析
本次分析的病毒執行流程如下所示:

病毒執行流程
該病毒類型隨著時間線推進,分別使用了 UPX、VMP 等保護殼,而目前監測到最新的版本為無殼版本,可見作者仍在積極開發測試當中:

加殼情況
病毒首先在棧中開辟大塊區域寫入代碼,該代碼塊隨后作為 EnumFontsW 的回調函數被執行。這種通過記錄棧中的可執行流(ROP)的方式可以繞過數據執行保護(DEP),增強其隱蔽性。

棧中記錄代碼
獲取棧中展開的代碼后發現內嵌了一個 DLL 文件,該 DLL 在內存中自加載,并調用其唯一的導出函數 make,這種加載方式能使其無法通過 ProcessExplorer 等軟件檢測出加載的行為,進一步增強了免殺效果。

DLL 內存加載
在 make 函數的執行過程中,其會先判斷當前執行的文件名是否包含預定義數字,這些數字目前理解有兩個含義:回連標志和單獨執行標志。執行流程圖如下所示:

執行流程圖
1:第一個是回連標志,當包含特定的數字(回連標志)時,其會從 C2 下載相應的
jpg 文件并重命名為 md.jpg,分別存放在 "C:\Users\Public\" 和
"C:\Users\Public\Documents\" 目錄下以供后續使用。

下載指定 jpg 文件
每一個下載的 jpg 文件實際上都是一個 shellcode,不同的 jpg 文件在代碼層上都是統一的,但是在數據段中有著不同的回傳 IP 和 C2 域名,所以稱其為回連標志。(該類
shellcode 將在后面分析,每個 jpg 所含有的 IP 在附錄中可查)

jpg(shellcode) 文件解析
2:第二個是單獨執行標志,當程序不具備單獨執行標志(這里是"16116")時,其必須先擁有 md.jpg 文件,然后再下載其他惡意文件。這些病毒文件會分別存放到不同的位置中,包括
:
?"C:\Users\Public\Documents"
目錄下 ttd.exe、UnityPlayer.dll
?“C:\Users\Public\”
目錄下 zd.exe、md.exe、zd.jpg

其它文件下載
分類執行:
根據 make 函數中的執行邏輯可知,所下載的惡意文件分成 3 大部分:
第一部分:zd.exe (單獨線程執行,內存加載 zd.jpg)
第二部分:md.exe(單獨線程執行,內存加載 md.jpg(如果有的話))
第三部分:Documents 下的
ttd.exe、UnityPlayer.dll (設置隱藏屬性,暫時保留)

分別執行
第一部分——zd.exe:
zd.exe是一個由 Rust 編寫的惡意加載程序,用于將一同下載的 zd.jpg 作為 shellcode 加載并執行:

由 Rust 編寫
在 zd.exe 內部也存在著 PDB 路徑,許多調試符號,有意義的字符串等信息可以驗證分析:

字符串等驗證信息
zd.jpg 作為 shellcode 被加載執行,在代碼與數據之間,病毒作者以codemark 作為分界線。在數據區中,前面部分字節被賦予了特定的含義,有用作函數參數的,有用于作為執行條件的,稱其為標志位區。后面有可直接使用的域名信息,稱其為字符串區。最后是待解密使用的字符,稱其為解密數據區(在后面會使用)。

shellcode 加載
當定位到分隔符 "codemark",獲取特定標志位信息及域名字符串 yk.ggdy.com 后,便會對其發起連接請求。這里發送給 C2 的 "64" 猜測是要求回傳 64 位的代碼,由此也可進一步猜測有 32 位版本。

從 C2 下載惡意代碼
回傳代碼部分:
C2 對指令的響應可能在不同的時間有著不同的下發代碼,也可能還存在別的響應指令,這里僅討論本次下發的代碼內容。本次下發的惡意代碼進行了包括屏幕截圖,注冊表讀取,保持回連等操作。詳細分析如下:
本次接收的代碼依舊處于加密狀態,在解密運算中,從 E byte 位開始為待解密信息,解密計算從 0 偏移處開始算起,解密邏輯如下。

解密回傳代碼
然而,在解密后的代碼中發現里面還嵌套著兩個 DLL 文件,并且是遞歸嵌套,下圖并未展示嵌套關系:(在母 DLL 里面還嵌套著子 DLL 文件,但子 DLL 并未執行)。

DLL 嵌套
在執行過程中,其會先后執行內嵌母
DLL 的 dllmain 函數和 load 函數:

回傳代碼執行
雖然該 DLL 有 3 個導出函數,并且run 和 zidingyixiugaidaochuhanshu(喻指自定義修改導出函數)并未執行,但是它們所作的操作都圍繞著兩個點:
?第一個是獲取并修改前面 zd.jpg 待解密數據區中數據進行解密并與注冊表中 IP 數據相關聯。
這部分代碼將 shellcode 末尾加密數據的特定字符進行包括字符替換等解密方式后,得到一個類似于域名,時間,路由消息組成的以 "|" 分隔的關鍵字串,猜測是想創建并寫入注冊表 IpDate 中進行后續提取利用。

shellcode 末尾數據區解密
?第二個是開啟兩個后臺線程,一個是屏幕截圖,另一個是保持回連。
屏幕截圖所在的線程先會獲取系統目錄"C:\ProgramData",然后在該目錄下創建 quickScreenShot 文件夾,以當天日期創建分類文件夾,最后把拍攝的屏幕數據以 "日期時間" 的命名方式寫入并保存。

獲取屏幕截圖
在進行屏幕截圖的過程中,另一個保持回連的線程也會同步開啟,但該線程會先休眠整整60分鐘:

進程休眠
之后會進行代碼解密操作,以
hackbrian 作為 key 執行解密算法:

代碼解密
解密后的代碼與前面分析的 shellcode 同類,用于等待 C2 的下一步操作,可以執行包括遠程控制在內的各種操作。(這里 ttkk.youbi.co 域名是錯誤的,末尾少了個m,懷疑由作者的疏漏導致)。

內嵌加密 shellcode
最后在該內嵌 dll 的字符串中發現有 "上線模塊.dll",猜測會在后續階段的由 C2 下發。

上線字符串
第二部分——md.exe
md.exe也是由 rust 編寫,經過邏輯對比發現其與 zd.exe 一致, 代碼字節也是相同,故不再重復分析。

邏輯對比圖

代碼字節對比圖
第三部分——ttd.exe 和UnityPlayer.dll
ttd.exe在本次樣本分析屬于第三部分,并未被啟動運行,懷疑是在開發中或暫時保留以備后續操作的模塊,這里出于安全研究的目的繼續對其進行分析。
病毒作者在這里利用了白加黑手法,通過合法的 ttd.exe 加載攜帶惡意代碼的 UnityPlayer.dll 躲避查殺,該 dll 在被加載時也會 "變相" 執行 shellcode 中的代碼進行后續操作。
其先進行文件復制,把
"C:\Users\Public\Documents\md.jpg" 復制成 "C:\Users\8.jpg" :

文件復制
然后執行打開本地畫板程序 mspaint.exe,以進程注入的方式在其內存空間中開辟適當空間,并寫入
jpg 中的 shellcode 代碼,隨后調用 CreateRemoteThread 進行遠程線程執行。

進程注入

加載并寫入 shellcode
shellcode的后續執行部分在前面已詳細敘述,這里不再重復分析。
二
附錄
C&C

HASH

黑白之道
安全圈
安全圈
安全圈
安全圈
CNCERT國家工程研究中心
安全圈
安全圈
安全圈
安全牛
LemonSec