系統(tǒng)潛入后門分析
初始傳染手段 - Nuclear Pack
已經(jīng)有一些其他的文章介紹過Nuclear Pack破解工具包??赡芩€不像g10pack或者BlackHole這些工具那么流行,也沒有像CoolEK或者Phoenix工具有那么多的破解功能,但仍然可以看到它的價值。
Nuclear Pack因使用了重定向?qū)哟谓Y(jié)構(gòu)以及在傳遞惡意代碼前檢查用戶活動而被人所熟知。另外,眾所周知它被不同的犯罪分子用于分發(fā)各種惡意軟件,而其中大多數(shù)是犯罪軟件。在這篇文章里,我們詳細(xì)介紹了一個特殊的事件,在這個事件里一個客戶受到Nuclear Pack入侵系統(tǒng)的攻擊。
Nuclear Pack的工作原理如下:
1、受害者訪問Nuclear Pack入侵系統(tǒng)的初始登錄頁面,JavaScript程序檢測其鼠標(biāo)的移動;
2、受害者被重定向到JavaScript程序,由其決策哪個入侵系統(tǒng)對受害者進(jìn)行攻擊;
3、JavaScript程序重定向受害者到合適的入侵系統(tǒng),提供參數(shù)解碼URL供漏洞有效負(fù)載取回;
4、入侵軟件在受害者機器上運行,為有效負(fù)載解碼URL;
5、入侵軟件下載適合受害者系統(tǒng)的合適的程序,并執(zhí)行(在這個案例里是Initial Dropper)。
在下面的Previct的界面中,你可以看到檢測的結(jié)果信息:
事件的細(xì)節(jié)信息如下:
這個Java程序成功控制了受害者,就像在下圖所看到的,它立即下載了惡意的可執(zhí)行程序load2.exe(其MD5值是78cfa36112cd0797690327a9a07d5890 ,該程序即是上文中所提到的initial dropper)
不尋常的可執(zhí)行程序,詳細(xì)的分析
當(dāng)我們第一次看到load2.exe時,很快就覺得這是一種誤報。程序樣本看起來根本不像是惡意軟件。VirusTotal的快速檢查結(jié)果也沒有幫助我們做出決定;根據(jù)VT的結(jié)果,這種情況看起來也像是一個可能的誤報。
Dropper病毒
Initial Dropper是NullSoft的安裝程序,它首先放置6個文件到臨時目錄里:
正如你在下圖中所看到的,被安裝的可執(zhí)行程序有一個圖標(biāo),類似“設(shè)置”或“更新”符號;而被安裝的DLL中有一個的描述信息是“Google Chrome Patches”。
然后,它啟動可執(zhí)行程序文件wobiqacaxa.exe
The Second Stage
Second Stage可執(zhí)行程序(即wobiqacaxa.exe)會做一些數(shù)學(xué)計算,像下面的函數(shù)這樣:
從其它DLL中導(dǎo)入函數(shù):
并在main函數(shù)中調(diào)用它們:
它也會計算剩余的電池壽命,這就是可執(zhí)行程序的程度了。到目前為止還沒有什么可疑的地方。
讓我們看看這些DLL。首先,它們在體積上都非常的小,每一個有一個導(dǎo)出的函數(shù)。這些導(dǎo)出的函數(shù)看起來并不非??梢?。在對它們做了一些檢查之后,有人會想說“這些東西不是惡意軟件,我們這么做感覺像是在浪費時間”,并且你考慮就此停止。但接著,你提醒你自己截止目前已經(jīng)在安裝程序中發(fā)現(xiàn)了非常奇怪的行為,因此得繼續(xù)分析。
讓我們看看:
動態(tài)庫womajejunuc.dll輸出了函數(shù)Nalexavo
動態(tài)庫tapevacanop.dll輸出了函數(shù)Miqudigob
動態(tài)庫horikipusac.dll輸出了函數(shù)humolu
這似乎沒有一點像是惡意軟件。但某些東西在困擾著你,你不想就此停止挖掘其中的秘密。為什么會這樣?#p#
并置
這些代碼沒有任何意義,即使是對于一個合法的二進(jìn)制程序,也沒有什么意義去做如下的事情:
1. 調(diào)用一個數(shù)學(xué)函數(shù),諸如“y = 10 - cos(2x)”
2. 獲得本地貨幣格式,應(yīng)用它到串"-3.80",然后對它沒有再做任何事情
3. 計算剩余的電池時間
4. 遍歷驅(qū)動器列表
所有這些僅僅是一個合法程序可能會使用到的常用函數(shù),但不會一起并且不會以這種順序使用。在這個案例里,這些是欺騙性的功能,它們似乎有一個唯一目的,即混淆自動檢測系統(tǒng),反病毒軟件,或者那些甚至嘗試手工分析這些程序樣本的分析人員。
當(dāng)我們檢查了之前所說的二進(jìn)制數(shù)據(jù)文件(jepuculoguh.vat)后,所有的疑問消失了。
可以確定的是它的數(shù)據(jù)十分像是使用了一個短的密匙由序列加密法加密的模式。
解包
因此,除了之前所述的偽裝邏輯,這個惡意軟件會做如下事情:
(1) 計算一個解密密匙(由來自動態(tài)庫horikipusac.dll的humolu函數(shù)完成)
(1) 讀二進(jìn)制文件到內(nèi)存(由來自動態(tài)庫womajejunuc.dll的Nalexavo函數(shù)完成)
(2) 在內(nèi)存中解密數(shù)據(jù)(由來自動態(tài)庫tapevacanop.dll的Miqudigob函數(shù)完成)
現(xiàn)在看看最后一個DLL:
動態(tài)庫Qotowokami.dll導(dǎo)出函數(shù)Siwusonivin,它實現(xiàn)了相當(dāng)于標(biāo)準(zhǔn)的處理模式“注入解密的數(shù)據(jù)到新的進(jìn)程中”:
1、調(diào)用GetCommandLine和PathGetArgs去獲取初始安裝程序的路徑。這是可行的,因為安裝程序自己啟動被安裝的程序是作為在命令行上的一個參數(shù)
2、調(diào)用CreateProcessA去創(chuàng)建一個新的安裝程序的進(jìn)程實例,但其被掛起
3、調(diào)用ZwUnmapViewOfSection和VirtualAllocEx去釋放初始進(jìn)程的內(nèi)存,并在被創(chuàng)建的進(jìn)程里為解密數(shù)據(jù)分配內(nèi)存
4、調(diào)用WriteProcessMemory去拷貝解密的數(shù)據(jù)到進(jìn)程地址空間
5、調(diào)用GetThreadContext,SetThreadContext和ResumeThread去改變進(jìn)程中線程的入口點,然后使得它們繼續(xù)運行
但是,動態(tài)庫Qutowokami.dll本身并沒有包含任何函數(shù)名稱,函數(shù)Siwusonivin通過調(diào)用LoadLibrary和GetProcAddress動態(tài)地獲取所有的API函數(shù)。這些函數(shù)都位于解密的內(nèi)存中。因此,沒有解密數(shù)據(jù)是不可能看見這個DLL的實際運行內(nèi)容的。#p#
沙盒和免殺
這個惡意軟件編寫的方式使得如果這些組件被單獨地分析或如果任意一個組件丟失,都非常難去識別出這個程序樣本應(yīng)該要做什么,以及是否它是惡意軟件。
由于絕大多數(shù)的反病毒產(chǎn)品沒有真正的分析(未知格式的)二進(jìn)制文件,而僅僅是檢查整個文件的哈希值,而惡意軟件的作者越來越傾向在不可執(zhí)行的二進(jìn)制文件中保存加密的惡意內(nèi)容,然后使用一個單獨的文件抽取加密內(nèi)容,其中包含的是一個看起來并不讓人感到懷疑的加載/解密程序。我們已經(jīng)在之前的文章(http://www.lastline.com/an-analysis-of-plugx)中探討過類似的技術(shù)。
我們的分析平臺檢測到了一個隱藏入侵:這個程序樣本嘗試讀取注冊表鍵(HKLM\SYSTEM\CURRENTCONTROLSET\SERVICES\DISK\ENUM)的值,并比較它的值是否有以下子串:
(1) "vbox" (出現(xiàn)在VirtualBox虛擬機中)
(1) "qemu" (出現(xiàn)在QEMU虛擬機中)
(2) "vmwa" (出現(xiàn)在VMWare虛擬機中)
來檢查它是否工作在一個虛擬機環(huán)境中。
所以這里的解密數(shù)據(jù)還不是實際的內(nèi)容,而是另一種殼程序,它首先檢查其是否運行在沙盒中(像這樣的虛擬機隱藏入侵正在變得越來越常見)。
接著,這個殼程序解析API函數(shù)。需要說明的是包裝程序是通過哈希查找DLL的地址和API函數(shù)。惡意軟件的作者肯定不希望簡單地搜索可疑的字符串,比如可疑的API函數(shù)的名字,就能檢測到它。
殼程序最后會解密惡意代碼,然后,以一種有趣的方法,為它創(chuàng)建一個導(dǎo)入表:
對于它使用的每個API函數(shù),首先檢測它的第一條指令 如果指令是跳轉(zhuǎn)指令jump(0xEB或0xE9),包裝程序獲取其目標(biāo)地址,并遞歸地重復(fù)這個檢查過程 當(dāng)找到第一個非跳轉(zhuǎn)指令時,包裝程序拷貝這條指令到分配的內(nèi)存區(qū),并在這條指令之后添加到實際API函數(shù)的第二條指令的跳轉(zhuǎn)指令
使用這種技術(shù),惡意軟件可以逃避安全組件(比如:HIPS)的鉤子(hooks)。
下面是惡意軟件導(dǎo)出函數(shù)的一個樣例。需要說明的是導(dǎo)入使用的是跳轉(zhuǎn)指令jump(通常導(dǎo)入的構(gòu)成是調(diào)用指令call [x]或者jmp addr)
為了替換API函數(shù),使得jump跳轉(zhuǎn)指令按照上文所述特定地產(chǎn)生了如下代碼:
最后是沒加殼的代碼
惡意代碼是位置無關(guān)的,在經(jīng)過重新構(gòu)造后,它看起來像這樣:
這是一個典型的“后門程序”或者“綁定外殼程序”,它在一個端口上監(jiān)聽,然后執(zhí)行接收到的命令。并且因為所有的活動都是在隱藏進(jìn)行的,又是做過免殺的,所以這個連接是未加密的,且沒有采取任何驗證方法進(jìn)行保護(hù)。
結(jié)論
這個事件的簡要圖形摘要如下:
功能模塊與物理文件對應(yīng)關(guān)系如下:
Initial dropper 對應(yīng) load2.exe
second stage對應(yīng)wobiqacaxa.exe
key calculator對應(yīng)horikipusac.dll
encrypted binary data 對應(yīng)jepuculoguh.vat
reader 對應(yīng)womajejunuc.dll
decryptor 對應(yīng)tapevacanop.dll
injector 對應(yīng)Qotowokami.dll
Initial Dropper之后惡意軟件的運行過程如上圖所示:
1、運行wobiqacaxa.exe,其首先做一些數(shù)學(xué)計算
2、接著從安裝的DLL中導(dǎo)入函數(shù)
3、獲取安裝的設(shè)備和計算密匙(代碼位于horikipusac.dll)
4、檢查電源狀態(tài)和電池壽命
5、打開加密文件,讀入它到內(nèi)存中。做貨幣計算(代碼位于womajejunuc.dll)
6、解密文件到內(nèi)存中(代碼位于tapevacanop.dll)
7、獲取Initial Dropper程序的路徑,創(chuàng)建一個新的掛起的進(jìn)程(代碼位于Qotowokami.dll)
8、釋放當(dāng)前進(jìn)程內(nèi)存,并在新進(jìn)程空間中分配新的內(nèi)存
9、注入解密的數(shù)據(jù)到新分配的內(nèi)存中
10、改變?nèi)肟邳c,然后繼續(xù)運行線程
11、從這里開始進(jìn)入解密后的代碼中運行
12、檢查是否運行在虛擬機環(huán)境中
13、如果不是,則再次執(zhí)行解密,并為進(jìn)程創(chuàng)建函數(shù)導(dǎo)入表
14、安裝自己作為一個服務(wù),名為SunJavaUpdateSched
15、打開TCP套接字,在端口8000上監(jiān)聽,當(dāng)有連接請求到來時,啟動cmd.exe,其I/O重定向到了socket上
所有這些努力都是為了保護(hù)一個簡單的TCP綁定外殼程序,使其不被檢測到嗎?為什么一個攻擊者會利用一個部署在Internet上的,位于受害機器的網(wǎng)絡(luò)之外的控制入侵軟件?這樣做,他可能無法進(jìn)入到缺乏抵抗力的主機。受害機器的IP處于RFC1918所規(guī)定的地址空間,攻擊者是無法通過Internet到達(dá)的。
一個可能的解釋是攻擊者來自于某個家庭網(wǎng)絡(luò)。在這樣一個網(wǎng)絡(luò)中的攻擊者可能不太關(guān)注對到本地網(wǎng)絡(luò)中的其它機器上的連接進(jìn)行加密,而更關(guān)心的是可以在網(wǎng)絡(luò)中傳遞數(shù)據(jù)。
這似乎是攻擊者在受害者機器的網(wǎng)絡(luò)中建立了一個前沿陣地后,想要訪問網(wǎng)絡(luò)中其它機器時,進(jìn)行橫向入侵的技術(shù)。使用從第一臺機器上搜集的信息,他們可以制造一個可信的消息(一種釣魚法),在潛在的受害者因為某種不可抗拒的原因訪問了一個包含在其中的URL時,采取如文章開始時所描述的方法,對受害者進(jìn)行入侵控制。
*本文來自于美國安全公司LASTLINE,由IDF志愿者周耀平翻譯,章典校驗。