實(shí)例講解基于Volatility的內(nèi)存分析技術(shù)Part 1
歡迎各位閱讀基于Volatility的內(nèi)存分析系列文章。為了順利閱讀本系列文章,讀者最好具備Windows內(nèi)部運(yùn)行機(jī)制方面的基礎(chǔ)知識(shí)。準(zhǔn)確來說,讀者需要了解內(nèi)存在Windows中運(yùn)行機(jī)制方面的基礎(chǔ)知識(shí),為此,我們將給出詳盡的介紹。除此之外,不管你有什么不懂的知識(shí),都不會(huì)影響您理解本文的內(nèi)容!
閱讀清單:
- 內(nèi)核模式
- 用戶模式
- 虛擬內(nèi)存
- Windows進(jìn)程
一點(diǎn)背景知識(shí):
內(nèi)存取證(有時(shí)稱為內(nèi)存分析)是指對(duì)計(jì)算機(jī)內(nèi)存轉(zhuǎn)儲(chǔ)中易失性數(shù)據(jù)進(jìn)行的一種分析。信息安全專業(yè)人員可以通過內(nèi)存取證,來調(diào)查和識(shí)別那些不會(huì)在硬盤驅(qū)動(dòng)器數(shù)據(jù)中留下痕跡的攻擊或惡意行為。
通過內(nèi)存取證,安全人員可以了解運(yùn)行時(shí)的各種系統(tǒng)活動(dòng),例如開放的網(wǎng)絡(luò)連接或最近執(zhí)行的命令和進(jìn)程等。
程序在計(jì)算機(jī)上運(yùn)行之前,首先需要被加載到內(nèi)存中,這使得內(nèi)存取證變得非常重要——這意味著所有被創(chuàng)建、檢查或刪除的程序或數(shù)據(jù)都將被保存到RAM中。這其中包括圖像、所有Web瀏覽活動(dòng)、加密密鑰、網(wǎng)絡(luò)連接或注入的代碼片段。在許多情況下,某些證據(jù)只能在RAM中找到,例如在崩潰期間存在的開放網(wǎng)絡(luò)連接。由于攻擊者可以開發(fā)只駐留在內(nèi)存中而不在硬盤落地的惡意軟件,從而使標(biāo)準(zhǔn)的計(jì)算機(jī)取證方法幾乎看不到它。這使得內(nèi)存取證工具變得愈發(fā)重要。
Volatility是一個(gè)先進(jìn)的內(nèi)存取證框架。它為調(diào)查人員提供了許多自動(dòng)工具,人們可以利用其先進(jìn)的內(nèi)存分析技術(shù)揭示主機(jī)上的惡意活動(dòng)。需要指出的是,該框架是用python實(shí)現(xiàn)的,而且是開源的。該框架的下載地址為https://github.com/volatilityfoundation/volatility,相關(guān)的文檔地址為https://github.com/volatilityfoundation/volatility/wiki/Command-Reference-Mal。
在這個(gè)系列文章中,我們將以Coreflood木馬為例,來介紹相關(guān)的內(nèi)存取證方法。
Coreflood是由一群俄羅斯黑客創(chuàng)建并在2010年發(fā)布的木馬和僵尸網(wǎng)絡(luò)。FBI已經(jīng)將“大約17個(gè)州或地方政府機(jī)構(gòu),包括1個(gè)警察局;3個(gè)機(jī)場(chǎng);2個(gè)國防承包商;5個(gè)銀行或金融機(jī)構(gòu);大約30個(gè)學(xué)院或大學(xué);大約20個(gè)醫(yī)院或醫(yī)療公司;以及數(shù)百家企業(yè)”[1]列入受感染系統(tǒng)的名單中。截至2011年5月。它已經(jīng)感染了世界各地230多萬臺(tái)計(jì)算機(jī);到目前為止,它仍然是一個(gè)巨大的威脅。——維基百科
對(duì)于該樣本軟件,可以通過下面的地址進(jìn)行下載(.vmem文件):
https://github.com/mgoffin/malwarecookbook/blob/master/16/6/coreflood.vmem.zip
這個(gè)文章系列的目標(biāo)是借助于volatility來了解這個(gè)惡意軟件的行為,以及相應(yīng)的內(nèi)存取證方法。我將嘗試發(fā)掘所有關(guān)于Coreflood的取證工具,以了解這個(gè)惡意軟件背后的動(dòng)機(jī)到底是什么。我希望能從這次取證分析中學(xué)到一些新的東西,并教給大家一些新的東西!
為了開始調(diào)查,我想先搞清楚主機(jī)上運(yùn)行的進(jìn)程。為此,我們只需借助于pslist命令,就能查看是否有明顯可疑的進(jìn)程在運(yùn)行。
Windows使用一個(gè)循環(huán)的雙鏈接列表_EPROCESS結(jié)構(gòu)體來跟蹤所有的活動(dòng)進(jìn)程;并且,這個(gè)列表位于內(nèi)核中。而Volatility就是利用了這個(gè)事實(shí):首先,它會(huì)尋找PsActiveProcessHead指針,因?yàn)樵撝羔樦赶騼?nèi)核的_EPROCESS結(jié)構(gòu)體列表的起始位置;之后,Volatility會(huì)遍歷這個(gè)列表,從而找出正在運(yùn)行的所有進(jìn)程。
主機(jī)上正在運(yùn)行的所有進(jìn)程:volatility -f coreflood.exe pslist命令的輸出結(jié)果
我們可以看到,似乎一切都很正常,不過有幾件事引起了我們的注意。當(dāng)前,IE瀏覽器在運(yùn)行,同時(shí)cmd也在運(yùn)行,看來正確的做法是檢查出站連接,因?yàn)閻阂廛浖赡軅窝b成Internet Explorer瀏覽器,以隱藏自己與C&C的通信流量。
此外,我們也可以檢查一下cmd在那邊做什么,這一點(diǎn)將在后面討論。
一個(gè)最簡(jiǎn)單的操作就是查看出站連接。如果IE出站連接沒有找到可疑之處,我們就需要從其他地方尋找惡意活動(dòng)的蹤跡。
下面,我們將使用connscan命令來檢查之前終止的和當(dāng)前活動(dòng)的連接:
“要想使用池標(biāo)簽掃描功能查找_TCPT_OBJECT結(jié)構(gòu)體,請(qǐng)使用connscan命令。這樣做的好處是,我們不僅可以從活動(dòng)的連接中查找證據(jù),還可以從之前被終止的連接中搜索證據(jù)。”——摘自Volatility的官方文檔
實(shí)際上,這種工作方式就是先通過掃描物理內(nèi)存,找到4個(gè)字節(jié)的簽名0x54455054(“TCPT”),然后,解析出接下來的28個(gè)字節(jié),并將其作為完整的_TCPT_OBJECT結(jié)構(gòu)體。

volatility -f coreflood.vmem connscan命令的輸出結(jié)果
從上面的輸出結(jié)果來看,主機(jī)好像正在進(jìn)行正常的通信,所有的通信都是由pid 2044進(jìn)程(IEXPLORE.EXE)創(chuàng)建的。我查了一下這些IP的地理位置,它們都是注冊(cè)在一些大公司的名下,比如微軟、AT&T等公司。當(dāng)然,關(guān)于這些IP的數(shù)據(jù)可能已經(jīng)改變了,因?yàn)楫?dāng)前考察的vmem文件已經(jīng)有些陳舊了;此外,這些也可能是黑客為了欺騙調(diào)查人員而對(duì)這些IP地址數(shù)據(jù)做了手腳。
為了確保的確沒有惡意通信,我們應(yīng)該檢查入站連接是否安全。為此,我們可以使用sockscan命令,該命令將掃描內(nèi)存中的_ADDRESS_OBJECT結(jié)構(gòu)體。通過掃描內(nèi)存中的這個(gè)內(nèi)存結(jié)構(gòu),我們可以深入了解以前打開的套接字和當(dāng)前打開的套接字。
volatility -f coreflood.vmem sockscan命令的輸出結(jié)果
正如我們所看到的,進(jìn)程pid 2044(即IEXPLORE.EXE)中有一些非常奇怪的入站連接。這看起來非??梢桑?,是時(shí)候拿出我們的內(nèi)存取證神器Volatility,檢查一下該進(jìn)程中是否隱藏著惡意軟件了。
我們之所以說Volatility是一個(gè)內(nèi)存取證神器,是因?yàn)樗峁┝嗽S多功能強(qiáng)大的惡意軟件分析工具。
我們經(jīng)常用到的第一個(gè)分析工具就是malfind命令。這個(gè)命令可用于尋找進(jìn)程內(nèi)存中的注入代碼。它是通過尋找已分配內(nèi)存的段(通過查看VAD樹數(shù)據(jù)結(jié)構(gòu)),并檢查它們是否有未映射到磁盤上任何文件的可執(zhí)行代碼的線索來實(shí)現(xiàn)這一點(diǎn)的。
“VAD節(jié)點(diǎn)還引用了一些其他的內(nèi)核結(jié)構(gòu)體,這些結(jié)構(gòu)體可能對(duì)調(diào)查人員非常有用……因此,如果該內(nèi)存區(qū)被用于已映射的文件(如加載的DLL),則可以引用相應(yīng)的_FILE_OBJECT結(jié)構(gòu)體,并提取文件的名稱。這可以為調(diào)查人員提供一種替代的方法來列出進(jìn)程加載的模塊,然后可以與其他方法找到的模塊進(jìn)行比較,從而找到庫注入和隱藏模塊的相關(guān)證據(jù)。”——Science Direct
用于檢查一段內(nèi)存是否包含注入代碼的方法是檢查VAD的頁面權(quán)限,例如EXECUTE權(quán)限等。如果內(nèi)存中的某一段具有執(zhí)行權(quán)限,并且它沒有映射到磁盤上的任何可執(zhí)行文件的話,就說明這里很可能存在注入的代碼。
volatility -f coreflood.vmem malfind命令的輸出結(jié)果,這里似乎存在誤報(bào)
正如我們?cè)谏蠄D中看到的,該命令的輸出結(jié)果好像并沒有帶來太多真正有價(jià)值的信息。
這可能是該惡意軟件沒有加載任何顯式PE(可移植可執(zhí)行文件)代碼到內(nèi)存中,而只是注入了一些shellcode所致,又或者映像的頭部被分頁了所致。此外,還有一種可能——惡意軟件通過調(diào)用注入的DLL的ImageBase上的VirtualFree,從內(nèi)存中清除PE的頭部,以避免檢測(cè)到。當(dāng)然,也可能是由于某些原因,這部分內(nèi)存被分頁或無法訪問。無論如何,我們還不能確定這里存在惡意活動(dòng),因?yàn)槲覀儧]有找到確切的證據(jù)。
接下來我們可以使用的命令是apihooks。
“它可以用來查找IAT、EAT、Inline式hook,以及幾種特殊類型的hook。對(duì)于Inline hook,它可以檢測(cè)直接和間接位置的CALL和JMP指令……以及對(duì)內(nèi)核內(nèi)存中未知代碼頁的調(diào)用。”——Volatility官方文檔
為了理解這里到底發(fā)生了什么,我們需要快速回顧一下IAT和EAT。
當(dāng)可執(zhí)行文件第一次被加載時(shí),Windows加載器將負(fù)責(zé)讀取文件的PE結(jié)構(gòu),并將可執(zhí)行文件的映像加載到內(nèi)存中。其中一步,就是加載應(yīng)用程序使用的所有dll,并將它們映射到進(jìn)程地址空間。
此外,可執(zhí)行文件還會(huì)指出在每個(gè)dll中需要的所有函數(shù)。不過,由于函數(shù)地址不是靜態(tài)的,所以,我們必須開發(fā)一種機(jī)制,以允許修改這些變量,這樣就不必在運(yùn)行時(shí)修改所有已編譯的代碼了。
這一點(diǎn)是通過導(dǎo)入地址表(IAT)實(shí)現(xiàn)的;而IAT,實(shí)際上就是由windows加載器在加載dll時(shí)所填寫的函數(shù)指針表。
EAT的工作方式和IAT基本一致,只不過它是供代碼庫用于將函數(shù)導(dǎo)出到映像可執(zhí)行文件中的,以便供程序從其中將函數(shù)地址導(dǎo)入到IAT中(具體細(xì)節(jié)我就不多說了)。
惡意軟件可以通過操縱這兩個(gè)內(nèi)存結(jié)構(gòu)體,使得可執(zhí)行文件調(diào)用其他函數(shù),而非原本要調(diào)用的函數(shù)。
我之所以要在IEXPLORE.EXE上使用apihooks參數(shù),是因?yàn)楦鶕?jù)sockscan的輸出結(jié)果,我已經(jīng)懷疑它可能被篡改了。

我們將使用apihooks參數(shù)并將輸出結(jié)果保存在一個(gè)文本文件中
難以置信! Internet Explorer已經(jīng)被鉤取了十幾次以調(diào)用同一個(gè)函數(shù)。

上圖內(nèi)容摘自保存apihooks命令輸出結(jié)果的文本文件。實(shí)際上,這只是十幾個(gè)不同函數(shù)的hook中的一個(gè)而已;它們都調(diào)用同一個(gè)地址0x7ff82a6e。
我們可以看到,在這個(gè)例子中,惡意軟件在WINHTTP.dll中“掛鉤”了LoadLibrary。
LoadLibrary可用于將庫模塊加載到進(jìn)程的地址空間中,并返回一個(gè)句柄,該句柄可用于GetProcAddress以獲取DLL函數(shù)的地址。因此,LoadLibrary是一個(gè)非常顯而易見的鉤取對(duì)象,因?yàn)槲覀冎篮芏郟E都會(huì)使用其他dll,并導(dǎo)入這些庫中的相關(guān)函數(shù)。
我們需要搞清楚惡意軟件在這里試圖達(dá)到什么目的。為了做到這一點(diǎn),我們需要嘗試深入到惡意軟件試圖執(zhí)行的那段代碼中。因此,我們要使用Volatility的volshell工具。Volshell是一個(gè)非常強(qiáng)大的工具,可以用來瀏覽內(nèi)存的內(nèi)容。我們可以跳轉(zhuǎn)到內(nèi)存的各個(gè)部分,之后,我們不僅可以查看其中的內(nèi)容,還可以反匯編或讀取其中的內(nèi)容。
輸入volshell命令,然后按照流程操作即可。
在輸入volshell命令后,我使用cc(

上面高亮顯示的文字(從上到下)向我們展示了被鉤住的地址,在它的下面,還高亮顯示了惡意軟件希望我們的代碼要跳轉(zhuǎn)到的地址。
如上圖所示,為了弄清楚該惡意軟件的意圖,我們需要反匯編相關(guān)的地址。為此,我將這個(gè)地址作為參數(shù)復(fù)制到volshell命令dis(
我們最終得到的輸出結(jié)果,就是惡意注入的代碼。
關(guān)于這個(gè)惡意代碼的作用,我們將在后面的文章中加以介紹。心急的讀者,也可以自己動(dòng)手嘗試一下。
在本文中,我們?yōu)樽x者介紹了如何使用volatility在主機(jī)運(yùn)行的進(jìn)程中查找潛在的惡意代碼。為此,我們首先介紹了一些基本的操作,比如確保沒有任何可疑的東西,這樣,一旦出現(xiàn)可疑的進(jìn)程或不常見的IP地址相關(guān)的流量,我們就能立即察覺。最后,我們通過volatility考察了惡意軟件樣本是否通過向無辜的進(jìn)程注入代碼來實(shí)現(xiàn)隱身,并發(fā)現(xiàn)了一些有趣的代碼。在下一篇文章中,我們將深入研究這些代碼,看看這個(gè)惡意軟件到底想達(dá)到什么目的。
祝閱讀愉快,我們下篇見。
本文翻譯自:https://medium.com/bugbountywriteup/memory-analysis-for-beginners-with-volatility-coreflood-trojan-part-1-89981433eeb6如若轉(zhuǎn)載,請(qǐng)注明原文地址。