反取證技術(shù):內(nèi)核模式下的進(jìn)程隱蔽
本文是介紹惡意軟件的持久性及傳播性技術(shù)這一系列的第一次迭代,這些技術(shù)中大部分是研究人員幾年前發(fā)現(xiàn)并披露的,在此介紹的目的是建立這些技術(shù)和取證方面的知識(shí)框架。
用于證明概念的代碼可以在 CERT的GitHub 上查看。由于CERT分析師Devoteam在這個(gè)領(lǐng)域的經(jīng)驗(yàn),知識(shí)框架會(huì)不斷完善。
第一篇文章將討論DKOM(分布式組件對(duì)象模式)進(jìn)程隱藏的以下幾個(gè)方面:
Windows進(jìn)程
隱藏直接內(nèi)核對(duì)象的修改
概念性證明(PoC)
使用Volatility進(jìn)行內(nèi)存檢測(cè)
這個(gè)概念在2004年的美國(guó)黑帽大會(huì)上被介紹,不過(guò)到現(xiàn)在還被用于幾個(gè)內(nèi)核工具,比如介紹者本人所開(kāi)發(fā)的FU-rootkit。
Windows進(jìn)程
Windows內(nèi)核使用 EPROCESS 來(lái)處理進(jìn)程,這些是不透明進(jìn)程,且沒(méi)有被微軟記錄,標(biāo)準(zhǔn)編譯頭也沒(méi)有詳細(xì)標(biāo)明。
MSDN鏈接: EPROCESS (Windows Driver)
但是這仍然能通過(guò)使用 KD 通過(guò)內(nèi)核調(diào)試被分析。
該示例中的結(jié)構(gòu)有207個(gè)字段(Windows 10 64位系統(tǒng))。
只有三個(gè)相關(guān)的可以解釋該技術(shù)。
此列表包含兩個(gè)鏈接: Flink 和 Blink 。這些鏈接很有趣,因?yàn)樗鼈冎赶驅(qū)儆趯儆谙乱粋€(gè)進(jìn)程( Forwardlink )和之前的進(jìn)程( Backlink )的另外兩個(gè) LIST_ENTRY 結(jié)構(gòu)。
Windows系統(tǒng)中的所有進(jìn)程通過(guò)其 ActiveProcessLinks 結(jié)構(gòu)中的指針來(lái)引用。它們構(gòu)成了諸如taskmgr.exe(任務(wù)管理器)或某些 SysInternals (例如 procexp.exe )等工具使用的雙鏈表。
雙鏈表會(huì)被定時(shí)檢查以更新進(jìn)程顯示。
隱藏直接內(nèi)核對(duì)象的修改
DKOM技術(shù)隱藏了一個(gè)取消鏈接它自己的 ActiveProcessLinks 的進(jìn)程,并將“前一個(gè)”和“下一個(gè)”進(jìn)程直接相互鏈接。
從雙鏈表中獲取進(jìn)程(示例圖中的 smss.exe )使得它不依賴于此列表的工具來(lái)顯示進(jìn)程。
取消鏈接流程不會(huì)影響其執(zhí)行流程。調(diào)度器將計(jì)算時(shí)間分配給線程,而不是進(jìn)程。
當(dāng)修改惡意進(jìn)程的 ActiveProcessList 時(shí),它的 Blink 和 Flink 被修改以指向它們自己的結(jié)構(gòu)。這樣做是為了避免在進(jìn)程退出時(shí)出現(xiàn)任何問(wèn)題。如果 Blink 或 Flink 指向的是舊的或無(wú)效的內(nèi)存地址,那么當(dāng)嘗試更新“相鄰”進(jìn)程時(shí),內(nèi)核可能會(huì)引發(fā)異常。
實(shí)現(xiàn)
關(guān)于概念性證明(PoC)的評(píng)論
CERT在Github上的代碼 是一個(gè)測(cè)試驅(qū)動(dòng)程序,它是從使用 內(nèi)核模式驅(qū)動(dòng)程序框架 的Windows示例中實(shí)現(xiàn)的。驅(qū)動(dòng)配置的初始化使用 WDF_DRIVER_CONFIG_INIT() 被hook。該hook搜索一個(gè) ImageFileName 字段為 virus.exe 的進(jìn)程,并使用DKOM技術(shù)進(jìn)行隱藏。
注意:這不是一個(gè)功能性的工具(只是在安裝的時(shí)候會(huì)嘗試隱藏一個(gè)進(jìn)程),而且只被用于教學(xué)目的。
該代碼大量使用Windows 10 64位測(cè)試的硬編碼的存儲(chǔ)器偏移。它們被用于直接訪問(wèn) EPROCESS 字段,并且在其他Windows版本上可能無(wú)法正常工作。
以上顯示的偏移可以在 Windows進(jìn)程 部分的第一個(gè) KD 截圖中找到。
代碼很容易被改進(jìn),可以使用更穩(wěn)定的訪問(wèn)這些字段的方式然后提供一個(gè)用戶控制界面。
EPROCESS字段訪問(wèn)及版本
Windows API沒(méi)有提供 EPROCESS 的結(jié)構(gòu)定義,但是可以使用API調(diào)用來(lái)檢索這些結(jié)構(gòu)的指針。
PoC中使用的函數(shù)是 PsGetCurrentProcess() ,它返回一個(gè)當(dāng)前進(jìn)程“ EPROCESS ”結(jié)構(gòu)的指針。在執(zhí)行的過(guò)程中,它返回一個(gè)指向System進(jìn)程結(jié)構(gòu)的指針,一旦找到一個(gè) EPROCESS 結(jié)構(gòu),就調(diào)用一個(gè)搜索函數(shù),以便通過(guò) EPROCESS 循環(huán)列表來(lái)查找 virus.exe ImageFileName 。
如果搜索返回一個(gè) EPROCESS 結(jié)構(gòu),那么它的 ActiveProcessLinks 就會(huì)被修以隱藏它。這通過(guò) EPROCESS 結(jié)構(gòu)在內(nèi)存中的操作來(lái)實(shí)現(xiàn)。
其他相關(guān)與當(dāng)前操作系統(tǒng)的保護(hù)
PoC生成的驅(qū)動(dòng)程序已提交到 https://nodistribute.com/ 平臺(tái),以檢查是否會(huì)報(bào)毒。
沒(méi)有一個(gè)報(bào)了毒,考慮到代碼十分簡(jiǎn)單,系統(tǒng)調(diào)用量也很低,這樣一來(lái)就一點(diǎn)也不奇怪了。另外,雖然這種技術(shù)非常隱蔽,但是并不是在所有Windows版本上都很穩(wěn)定。
一個(gè)叫PatchGuard的對(duì)Windows 64位的保護(hù)可以檢測(cè)前面提到的操作。 PatchGuard 也被稱為內(nèi)核補(bǔ)丁保護(hù)( KPP ),于2005年在Windows XP 64位和Windows Server 2003 SP1中被引入。
KPP以一個(gè)隨機(jī)頻率驗(yàn)證內(nèi)核結(jié)構(gòu),幾十分鐘可以分開(kāi)成兩個(gè)檢查。當(dāng)檢測(cè)到異常時(shí),會(huì)引發(fā) 0×109 - CRITICAL_STRUCTURE_CORRUPTION 內(nèi)核錯(cuò)誤,然后強(qiáng)制阻止系統(tǒng)執(zhí)行。其實(shí) KPP 并沒(méi)有真正阻止這種技術(shù)的執(zhí)行,它只是關(guān)閉了操作系統(tǒng)。
由于該技術(shù)旨在提供隱蔽性,而藍(lán)屏的顯示會(huì)破壞其有效性。另外,該保護(hù)僅在64位版本的Windows中實(shí)現(xiàn),所以32位系統(tǒng)就會(huì)容易受到攻擊。如今,大多數(shù)人安裝的都是64位,因此他們會(huì)被保護(hù)免受這種威脅。
不過(guò)即使使用了 KPP ,這種技術(shù)也不能忽視,因?yàn)椋?/p>
在32位系統(tǒng)的事件響應(yīng)中可以遇到。
內(nèi)核模式驅(qū)動(dòng)(仍然是一個(gè)活躍的研究領(lǐng)域)存在對(duì) PatchGuard 的攻擊。
使用Volatility進(jìn)行內(nèi)存檢測(cè)
使用工具在受感染的主機(jī)上檢測(cè)這種技術(shù)可能有點(diǎn)棘手,不過(guò)它可以很容易地在內(nèi)存捕獲中被檢測(cè)到。事實(shí)上,許多監(jiān)控/系統(tǒng)工具(例如 SysInternals Microsoft套件 )都是基于雙鏈表的進(jìn)程枚舉。
為了演示這個(gè)概念,PoC已在運(yùn)行Windows 10 Professional版本的主機(jī)上執(zhí)行。
在PoC系統(tǒng)上執(zhí)行的Process Explorer,VMMap,ListDlls和Handle64的示例
這個(gè)進(jìn)程對(duì)于這幾個(gè)工具是不可見(jiàn)的。但是該進(jìn)程其實(shí)正在運(yùn)行,并且其系統(tǒng)事件可以被進(jìn)程監(jiān)視器捕獲。
在現(xiàn)實(shí)生活中,很多rootkit可以修改和劫持大量的系統(tǒng)功能,使得大多數(shù)實(shí)時(shí)檢測(cè)變得更加困難。這里推薦使用諸如 Volatility 等適應(yīng)框架對(duì)RAM轉(zhuǎn)儲(chǔ)然后脫機(jī)研究。
以前提到的Windows版本由擁有Win10x64_14393的配置文件的Volatility 2.6支持。
內(nèi)存轉(zhuǎn)儲(chǔ)由Winpmem實(shí)現(xiàn),該工具是Google Rekall項(xiàng)目分發(fā)的工具。
在Winpmem的輸出中列出了驅(qū)動(dòng)程序名稱,我們可以看到PoC二進(jìn)制文件(這里稱為2017_remote_helloworld)。
一旦內(nèi)存捕獲過(guò)程完成,研究就可以開(kāi)始了。
Volatility有幾個(gè)插件來(lái)分析轉(zhuǎn)儲(chǔ)中的運(yùn)行進(jìn)程,可以通過(guò)以下方式進(jìn)行快速比較:
只有psscan和psxview發(fā)現(xiàn)了我們的隱藏過(guò)程。
這些插件的文檔可以幫助我們了解為什么有些人會(huì)發(fā)現(xiàn)這個(gè)進(jìn)程,為什么有些人沒(méi)有發(fā)現(xiàn)。
pslist – 通過(guò)檢查雙鏈表來(lái)檢測(cè)進(jìn)程
pstree – 使用了相同技術(shù),只是顯示有小小的差別
psscan – 在內(nèi)存中掃描_POOL_HEADER結(jié)構(gòu)(內(nèi)存頁(yè)池)以識(shí)別相關(guān)進(jìn)程
psxview – 幾種技術(shù)的組合:
pslist :如上所述
psscan :如上所述
thrdproc :線程掃描,檢索調(diào)度程序使用的_KTHREAD列表(不能在不中斷進(jìn)程執(zhí)行的情況下修改它),然后搜索相關(guān)的_EPROCESS對(duì)象。
pspcid
csrss :csrss.exe進(jìn)程保留著可以在其內(nèi)存中檢索到的進(jìn)程的獨(dú)立列表。
session
deskthrd
在這些插件中,psxview是分析正在運(yùn)行的進(jìn)程的最快方法,它為用戶提供了不同檢測(cè)技術(shù)。
我們知道隱藏的進(jìn)程稱為virus.exe,且PID為4952,現(xiàn)在可以利用Volatility進(jìn)一步研究。
在這種“隱藏”情況下,PID不能直接被Volatility插件使用,因此必須指定進(jìn)程內(nèi)存偏移量。
對(duì)于大多數(shù)波動(dòng)插件,可以使用存儲(chǔ)器偏移(P代表Physical)代替PID。
有了這個(gè)信息,可以獲得很多東西,例如:
打開(kāi)系統(tǒng)資源的處理(文件,注冊(cè)表項(xiàng)…)
進(jìn)程命令行
驅(qū)動(dòng)程序/rootkit也可以從內(nèi)存轉(zhuǎn)儲(chǔ)中恢復(fù)