自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

惡意軟件分析:利用Speakeasy仿真執(zhí)行內(nèi)核態(tài)Rootkits

安全
在這篇文章中,我們探索了如何使用Speakeasy有效地從內(nèi)核模式二進(jìn)制文件中自動(dòng)識(shí)別rootkit活動(dòng)。

概述

在2020年8月,我們發(fā)布了一篇文章,內(nèi)容涉及到如何使用Speakeasy仿真框架來模擬用戶模式的惡意軟件,例如Shellcode。我們建議還沒有讀過這篇文章的讀者首先閱讀這篇文章。

除了用戶模式仿真之外,Speakeasy還支持內(nèi)核模式Windows二進(jìn)制文件的仿真。當(dāng)惡意軟件作者使用內(nèi)核模式的惡意軟件時(shí),通常會(huì)采用設(shè)備驅(qū)動(dòng)程序的形式,其最終目標(biāo)是完全感染目標(biāo)系統(tǒng)。該惡意軟件通常不與硬件交互,而是利用內(nèi)核模式完全破壞系統(tǒng)并保持隱蔽性。

動(dòng)態(tài)分析內(nèi)核惡意軟件面臨的挑戰(zhàn)

理想情況下,可以使用反匯編程序之類的工具對(duì)內(nèi)核模式的樣本進(jìn)行靜態(tài)分析。但是,二進(jìn)制加殼程序和用戶模式樣本一樣,容易混淆內(nèi)核惡意軟件。另外,靜態(tài)分析通常成本較高,且耗費(fèi)大量時(shí)間。如果我們的任務(wù)是自動(dòng)分析同一惡意軟件家族的多個(gè)變種,那么可以動(dòng)態(tài)分析惡意驅(qū)動(dòng)程序樣本。

與用戶模式樣本相比,對(duì)內(nèi)核模式惡意軟件的動(dòng)態(tài)分析可能會(huì)涉及更多內(nèi)容。為了調(diào)試內(nèi)核惡意軟件,需要?jiǎng)?chuàng)建適當(dāng)?shù)沫h(huán)境。這個(gè)過程通常會(huì)涉及到將兩個(gè)獨(dú)立的虛擬機(jī)設(shè)置為調(diào)試器和被調(diào)試器。然后,可以將該惡意軟件作為按需的內(nèi)核服務(wù)進(jìn)行加載,這里可以使用WinDbg之類的工具遠(yuǎn)程調(diào)試驅(qū)動(dòng)程序。

此外,還存在一些使用掛鉤或其他監(jiān)視技術(shù)的沙箱型應(yīng)用程序,但通常以用戶模式應(yīng)用程序?yàn)槟繕?biāo)。對(duì)于內(nèi)核模式代碼來說,也有類似的沙箱監(jiān)視工作,會(huì)需要用到比較深入的系統(tǒng)級(jí)掛鉤,這可能會(huì)產(chǎn)生很大的噪音。

驅(qū)動(dòng)程序仿真

對(duì)于惡意程序來說,仿真是一種有效的分析技術(shù)。通過這種方式,我們不需要自定義設(shè)置,并且可以大規(guī)模模擬驅(qū)動(dòng)程序。此外,與沙箱環(huán)境相比,這種方式更容易實(shí)現(xiàn)更大的代碼覆蓋范圍。通常,rootkit可能會(huì)通過I/O請(qǐng)求數(shù)據(jù)包(IRP)處理程序(或其他回調(diào))公開惡意功能。在普通的Windows系統(tǒng)上,當(dāng)其他應(yīng)用程序或設(shè)備向驅(qū)動(dòng)程序發(fā)送輸入/輸出請(qǐng)求時(shí),將會(huì)執(zhí)行這些例程。這里包括一些常見的任務(wù),例如讀取、寫入或?qū)⒃O(shè)備I/O控制(IOCTL)發(fā)送給驅(qū)動(dòng)程序以執(zhí)行某種類型的功能。

使用仿真的方式,可以使用IRP數(shù)據(jù)包直接調(diào)用這些入口點(diǎn),以便在rootkit中標(biāo)識(shí)盡可能多的功能。正如我們?cè)诘谝黄猄peakeasy文章中所討論的,在發(fā)現(xiàn)其他入口點(diǎn)時(shí)會(huì)對(duì)其進(jìn)行仿真。驅(qū)動(dòng)程序的DriverMain入口點(diǎn)負(fù)責(zé)初始化一個(gè)函數(shù)分配表,該表將被調(diào)用以處理I/O請(qǐng)求。在主入口點(diǎn)完成后,Speakeasy將嘗試通過提供虛擬IRP來仿真這些函數(shù)。此外,按順序模擬所有創(chuàng)建的系統(tǒng)線程或工作項(xiàng),以盡可能覆蓋更多的代碼。

仿真內(nèi)核模式植入工具

在這篇文章中,我們將展示Speakeasy在仿真真實(shí)內(nèi)核模式植入工具(Winnti)的一個(gè)案例。盡管我們之前就使用過這個(gè)示例,但在本文中還是選擇了它,因?yàn)樗员容^透明的方式實(shí)現(xiàn)了一些經(jīng)典的rootkit功能。這篇文章并不是對(duì)惡意軟件本身進(jìn)行分析,因?yàn)閻阂廛浖呀?jīng)過時(shí)了,相反,我們將專注于仿真期間捕獲到的事件。

我們所分析的Winnti樣本的SHA-256哈希值為c465238c9da9c5ea5994fe9faf1b5835767210132db0ce9a79cb1195851a36fb,其原始文件名為tcprelay.sys。在本文的大部分案例中,我們都將檢查Speakeasy生成的仿真報(bào)告。注意,由于內(nèi)核補(bǔ)丁程序保護(hù)(PatchGuard)可以防止對(duì)關(guān)鍵內(nèi)核數(shù)據(jù)結(jié)構(gòu)進(jìn)行修改,因此這個(gè)32位rootkit所采用的許多技術(shù)在現(xiàn)代64位版本的Windows上將不起作用。

首先,我們將使用Speakeasy按照下圖所示的命令行來仿真內(nèi)核驅(qū)動(dòng)程序。我們指示Speakeasy創(chuàng)建一個(gè)完整的內(nèi)核轉(zhuǎn)儲(chǔ)(使用“-d”標(biāo)志),以便后續(xù)可以獲取內(nèi)存。這里還加上了內(nèi)存跟蹤標(biāo)志(“-m”),它將記錄惡意軟件執(zhí)行的所有內(nèi)存讀取和寫入操作。這對(duì)于檢測(cè)掛鉤和直接內(nèi)核對(duì)象操縱(DKOM)等非常有幫助。

用于仿真惡意驅(qū)動(dòng)程序的命令行:

惡意軟件分析:利用Speakeasy仿真執(zhí)行內(nèi)核態(tài)Rootkits

隨后,Speakeasy將開始仿真惡意軟件的DriverEntry函數(shù)。驅(qū)動(dòng)程序的入口點(diǎn)負(fù)責(zé)設(shè)置被動(dòng)回調(diào)例程,該例程將為用戶模式I/O請(qǐng)求以及用于設(shè)備添加、移除和卸載的回調(diào)提供服務(wù)。我們可以查看惡意軟件DriverEntry函數(shù)的仿真報(bào)告(在JSON報(bào)告中以“epry_point”的“ep_type”標(biāo)識(shí)),表明該惡意軟件找到了Windows內(nèi)核的基址。該惡意軟件通過使用ZwQuerySystemInformation API來找到所有內(nèi)核模塊的基址,然后查找一個(gè)名為“ntoskrnl.exe”的工具來實(shí)現(xiàn)此目的。隨后,惡意軟件會(huì)手動(dòng)找到PsCreateSystemThread API的地址。然后,它用于啟動(dòng)系統(tǒng)線程以執(zhí)行其實(shí)際功能。下圖展示了從惡意軟件入口點(diǎn)調(diào)用的API。

tcprelay.sys入口點(diǎn)中的關(guān)鍵功能:

惡意軟件分析:利用Speakeasy仿真執(zhí)行內(nèi)核態(tài)Rootkits

隱藏驅(qū)動(dòng)程序?qū)ο?/strong>

該惡意軟件會(huì)在執(zhí)行其主系統(tǒng)線程之前嘗試隱藏自身。惡意軟件首先在自己的DRIVER_OBJECT結(jié)構(gòu)中查找“DriverSection”字段。該字段包含一個(gè)帶有所有已加載內(nèi)核模塊的鏈表,惡意軟件嘗試將自身取消鏈接,從而在列出已加載驅(qū)動(dòng)程序的API中隱藏。在下圖Speakeasy報(bào)告中的“mem_access”字段中,我們可以看到在其前后分別對(duì)DriverSection條目進(jìn)行了兩次內(nèi)存寫入,這會(huì)將其自身從鏈表中刪除。

表示tcprelay.sys惡意軟件的內(nèi)存寫入事件,嘗試將自身取消鏈接以實(shí)現(xiàn)隱藏:

惡意軟件分析:利用Speakeasy仿真執(zhí)行內(nèi)核態(tài)Rootkits

如之前的Speakeasy文章所述,當(dāng)在運(yùn)行時(shí)創(chuàng)建線程或其他動(dòng)態(tài)入口點(diǎn)時(shí),框架會(huì)跟隨它們進(jìn)行仿真。在這種情況下,惡意軟件會(huì)創(chuàng)建一個(gè)系統(tǒng)線程,而Speakeasy會(huì)自動(dòng)對(duì)其進(jìn)行仿真。

我們轉(zhuǎn)到新創(chuàng)建的線程(由“system_thread”的“ep_type”標(biāo)識(shí)),可以看到惡意軟件開始了真正的功能。該惡意軟件首先遍歷主機(jī)上所有正在運(yùn)行的進(jìn)程,然后查找名為services.exe的服務(wù)控制器進(jìn)程。最重要的是,通過對(duì)JSON配置文件進(jìn)行配置,可以記錄仿真樣本的進(jìn)程列表。有關(guān)這些配置選項(xiàng)的更多信息,可以參見我們GitHub倉(cāng)庫(kù)上的Speakeasy README。這個(gè)可配置進(jìn)程列表的示例如下圖所示。

提供給Speakeasy的進(jìn)程列表配置字段:

惡意軟件分析:利用Speakeasy仿真執(zhí)行內(nèi)核態(tài)Rootkits

轉(zhuǎn)到用戶模式

一旦惡意軟件找到了services.exe進(jìn)程,它將附加到進(jìn)程上下文,并開始檢查用戶模式內(nèi)存,以便找到導(dǎo)出的用戶模式函數(shù)的地址。惡意軟件會(huì)這樣做,以便可以將編碼的、駐留在內(nèi)存的DLL注入到services.exe進(jìn)程中。下圖展示了rootkit用于解決其用戶模式導(dǎo)出的API。

tcprelay.sys rootkit用于解決其用戶模式植入工具導(dǎo)出問題的日志API:

惡意軟件分析:利用Speakeasy仿真執(zhí)行內(nèi)核態(tài)Rootkits

在解決了導(dǎo)出函數(shù)之后,rootkit準(zhǔn)備注入用戶模式DLL組件。接下來,惡意軟件手動(dòng)將內(nèi)存中的DLL復(fù)制到services.exe進(jìn)程地址空間中。這些內(nèi)存寫入事件被捕獲到,如下圖所示。

將用戶模式植入復(fù)制到services.exe時(shí)捕獲到的內(nèi)存寫入事件:

惡意軟件分析:利用Speakeasy仿真執(zhí)行內(nèi)核態(tài)Rootkits

Rootkit用于執(zhí)行用戶模式代碼的常用技術(shù)依賴于一種名為“異步過程調(diào)用”(Asynchronous Procedure Calls,APC)的Windows功能。APC是在提供的線程的上下文中異步執(zhí)行的函數(shù)。使用APC,內(nèi)核模式應(yīng)用程序可以將代碼以隊(duì)列方式在線程的用戶模式上下文中運(yùn)行。惡意軟件通常會(huì)希望注入用戶模式,因?yàn)檫@樣一來,就可以更容易地訪問Windows內(nèi)的許多常用功能(例如網(wǎng)絡(luò)通信)。此外,如果在用戶模式下運(yùn)行,在代碼Bug排查過程中被發(fā)現(xiàn)的概率較小。

為了讓APC按照隊(duì)列順序以用戶模式啟動(dòng),惡意軟件必須將線程定位為Alertable的狀態(tài)。當(dāng)線程將執(zhí)行交給內(nèi)核線程調(diào)度程序并通知內(nèi)核可以分配APC時(shí),通常就被稱為是“可警告的”(線程等待狀態(tài))。惡意軟件會(huì)在services.exe進(jìn)程中搜索線程,一旦檢測(cè)到可警告的線程,它將為DLL分配內(nèi)存以記性呢注入,然后將APC按照隊(duì)列順序執(zhí)行。

Speakeasy模擬這個(gè)過程中涉及到的所有內(nèi)核結(jié)構(gòu),特別是為Windows系統(tǒng)上的每個(gè)線程分配的執(zhí)行線程對(duì)象(ETHREAD)結(jié)構(gòu)。惡意軟件可能會(huì)嘗試遍歷這種不透明的結(jié)構(gòu),以識(shí)別何時(shí)設(shè)置了線程的警告標(biāo)志(APC的有效候選對(duì)象)。下圖展示了Winnti惡意軟件在services.exe進(jìn)程中手動(dòng)解析ETHREAD結(jié)構(gòu)以確認(rèn)其處于可警告狀態(tài)時(shí)記錄的內(nèi)存讀取事件。在撰寫本文時(shí),默認(rèn)情況下,仿真器中的所有線程都將自己表示為可警告的狀態(tài)。

tcprelay.sys惡意軟件確認(rèn)線程是否處于可警告狀態(tài)時(shí)記錄的事件:

惡意軟件分析:利用Speakeasy仿真執(zhí)行內(nèi)核態(tài)Rootkits

接下來,惡意軟件可以使用此線程對(duì)象執(zhí)行所需的任何用戶模式代碼。其中未記錄的函數(shù)KeInitializeApc和KeInsertQueueApc將分別初始化并執(zhí)行用戶模式APC。下圖顯示了惡意軟件用于將用戶模式模塊注入到services.exe進(jìn)程的API集。該惡意軟件執(zhí)行一個(gè)Shellcode stub作為APC的目標(biāo),然后將為注入的DLL執(zhí)行一個(gè)加載程序。所有這些都可以從內(nèi)存轉(zhuǎn)儲(chǔ)中恢復(fù),并在后續(xù)進(jìn)行分析。

tcprelay.sys rootkit用于通過APC注入到用戶模式的日志API:

惡意軟件分析:利用Speakeasy仿真執(zhí)行內(nèi)核態(tài)Rootkits

網(wǎng)絡(luò)掛鉤

在注入到用戶模式后,內(nèi)核組件將嘗試安裝網(wǎng)絡(luò)混淆掛鉤(推測(cè)是用于隱藏用戶模式植入工具)。Speakeasy跟蹤并標(biāo)記仿真空間中的所有內(nèi)存。在內(nèi)核模式仿真的上下文中,這包括所有內(nèi)核對(duì)象(例如驅(qū)動(dòng)程序、設(shè)備對(duì)象以及內(nèi)核模塊本身)。我們觀察到惡意軟件將其用戶模式植入后,立即開始嘗試掛鉤內(nèi)核組件。根據(jù)靜態(tài)分析的結(jié)果,我們確認(rèn)它用于網(wǎng)絡(luò)隱藏。

仿真報(bào)告的內(nèi)存訪問部分顯示,該惡意軟件修改了netio.sys驅(qū)動(dòng)程序,特別是在名為NsiEnumerateObjectsAllParametersEx的導(dǎo)出函數(shù)中的代碼。當(dāng)系統(tǒng)上的用戶運(yùn)行“netstat”命令時(shí),最終會(huì)調(diào)用這個(gè)函數(shù),與此同時(shí)惡意軟件可能會(huì)對(duì)這個(gè)函數(shù)進(jìn)行掛鉤,以隱藏受感染系統(tǒng)上已連接的網(wǎng)絡(luò)端口。這個(gè)內(nèi)聯(lián)掛鉤使用了下圖所示的事件標(biāo)識(shí)。

惡意軟件設(shè)置的內(nèi)聯(lián)函數(shù)掛鉤,用于隱藏網(wǎng)絡(luò)連接:

惡意軟件分析:利用Speakeasy仿真執(zhí)行內(nèi)核態(tài)Rootkits

此外,惡意軟件還會(huì)掛鉤TCPIP驅(qū)動(dòng)程序?qū)ο?,以?shí)現(xiàn)其他的網(wǎng)絡(luò)隱藏功能。具體而言,該惡意軟件將TCPIP驅(qū)動(dòng)程序的IRP_MJ_DEVICE_CONTROL處理程序掛鉤。查詢活動(dòng)連接時(shí),用戶模式代碼可能會(huì)將IOCTL代碼發(fā)送給這個(gè)函數(shù)。通過查找對(duì)關(guān)鍵內(nèi)核對(duì)象的內(nèi)存寫入,可以使用Speakeasy輕松識(shí)別這種掛鉤,如下圖所示。

用于掛鉤TCPIP網(wǎng)絡(luò)驅(qū)動(dòng)程序的內(nèi)存寫入事件系統(tǒng)服務(wù)調(diào)度表掛鉤:

惡意軟件分析:利用Speakeasy仿真執(zhí)行內(nèi)核態(tài)Rootkits

系統(tǒng)服務(wù)分配表掛鉤

最后,rootkit將嘗試使用系統(tǒng)服務(wù)分派表(SSDT)修補(bǔ)這種近乎古老的技術(shù)來隱藏自身。Speakeasy分配了偽造的SSDT,以便惡意軟件可以與其進(jìn)行交互。SSDT是一個(gè)函數(shù)表,可以將內(nèi)核功能公開給用戶模式代碼。下圖中的事件表明,SSDT結(jié)構(gòu)在運(yùn)行時(shí)已經(jīng)被修改。

Speakeasy檢測(cè)到的SSDT掛鉤:

惡意軟件分析:利用Speakeasy仿真執(zhí)行內(nèi)核態(tài)Rootkits

如果我們?cè)贗DA Pro中查看惡意軟件,就可以確認(rèn)該惡意軟件已經(jīng)修改了ZwQueryDirectoryFile和ZwEnumerateKeyAPI的SSDT條目,以用于隱藏自身,不會(huì)在文件系統(tǒng)分析和注冊(cè)表分析過程中被發(fā)現(xiàn)。

IDA Pro中顯示的用于文件隱藏的SSDT修改后函數(shù):

惡意軟件分析:利用Speakeasy仿真執(zhí)行內(nèi)核態(tài)Rootkits

在設(shè)置完這些掛鉤后,系統(tǒng)線程將會(huì)推出。驅(qū)動(dòng)程序中的其他入口點(diǎn)(例如IRP處理程序和DriverUnload例程)不是太值得分析,其中包含的基本都是示例驅(qū)動(dòng)程序代碼。

獲取注入的用戶模式植入工具

現(xiàn)在,我們已經(jīng)知道了驅(qū)動(dòng)程序在系統(tǒng)上隱藏自身的方式,就可以用Speakeasy創(chuàng)建的內(nèi)存轉(zhuǎn)儲(chǔ)來獲取前面所說的注入的DLL。打開我們?cè)诜抡鏁r(shí)創(chuàng)建的ZIP文件,可以找到上穩(wěn)重引用過的內(nèi)存標(biāo)簽。我們迅速確認(rèn)了該內(nèi)存塊具有有效的PE標(biāo)頭,并且能夠成功地將其加載到IDA Pro中,如下圖所示。

從Speakeasy內(nèi)存轉(zhuǎn)儲(chǔ)中恢復(fù)的注入用戶模式DLL:

惡意軟件分析:利用Speakeasy仿真執(zhí)行內(nèi)核態(tài)Rootkits

總結(jié)

在這篇文章中,我們探索了如何使用Speakeasy有效地從內(nèi)核模式二進(jìn)制文件中自動(dòng)識(shí)別rootkit活動(dòng)。Speakeasy可以用于快速分類內(nèi)核二進(jìn)制文件,解決了通常情況下難以進(jìn)行動(dòng)態(tài)分析的問題。如果想了解更多信息或查看源代碼,歡迎訪問我們的GitHub倉(cāng)庫(kù)( https://github.com/fireeye/speakeasy )。

本文翻譯自:

https://www.fireeye.com/blog/threat-research/2021/01/emulation-of-kernel-mode-rootkits-with-speakeasy.html

 

責(zé)任編輯:趙寧寧 來源: 嘶吼網(wǎng)
相關(guān)推薦

2009-02-04 10:30:47

2022-09-27 14:46:03

網(wǎng)絡(luò)安全計(jì)算機(jī)惡意軟件

2021-04-28 09:35:16

惡意程序惡意代碼、攻擊

2017-08-16 16:20:01

Linux內(nèi)核態(tài)搶占用戶態(tài)搶占

2017-07-17 06:46:06

2022-05-05 09:04:33

惡意軟件黑客

2020-09-25 09:26:04

Speakeasy

2013-08-12 15:44:44

Pyew惡意軟件分析工具惡意軟件分析

2015-08-24 11:58:14

2014-02-24 09:13:49

2015-05-06 11:22:30

2012-04-21 19:02:25

黑客Instagram

2021-02-02 09:12:13

惡意軟件Android網(wǎng)絡(luò)攻擊

2015-05-12 10:53:33

2014-09-23 17:14:39

2013-11-26 09:38:24

惡意軟件滲透NSA

2021-12-20 09:53:51

用戶態(tài)內(nèi)核態(tài)應(yīng)用程序

2023-10-26 11:39:54

Linux系統(tǒng)CPU

2023-12-12 09:00:00

2009-08-06 19:12:07

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)