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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

在執(zhí)行過程中,其會先后執(zhí)行內嵌母 DLL 的 dllmain 函數(shù)和 load 函數(shù):

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

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

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

之后會進行代碼解密操作,以 hackbrian 作為 key 執(zhí)行解密算法:

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

最后在該內嵌 dll 的字符串中發(fā)現(xiàn)有 "上線模塊.dll",猜測會在后續(xù)階段的由 C2 下發(fā)。

第二部分——md.exe
md.exe 也是由 rust 編寫,經過邏輯對比發(fā)現(xiàn)其與 zd.exe 一致, 代碼字節(jié)也是相同,故不再重復分析。


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

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


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

HASH
