您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)內(nèi)核級(jí)木馬有什么危害,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
內(nèi)核級(jí)木馬一個(gè)無(wú)進(jìn)程、無(wú)DLL、無(wú)啟動(dòng)項(xiàng)的、集多種Rootkit技術(shù)特征的獨(dú)立功能遠(yuǎn)程控制后門程序。其利用線程注射DLL到系統(tǒng)進(jìn)程,解除DLL映射并刪除自身文件和啟動(dòng)項(xiàng),關(guān)機(jī)時(shí)恢復(fù)。它是內(nèi)核級(jí)的木馬程序,主要部分工作在Ring0,因此有很強(qiáng)的隱蔽性和殺傷力。
目前,傳統(tǒng)應(yīng)用層木馬由于當(dāng)下一些主動(dòng)防御軟件,殺毒的免費(fèi)使用,各類反病毒工具對(duì)其技倆了如指掌,而木馬能帶來(lái)巨大危害的主要原因在其隱蔽性,各類反病毒工具的快速發(fā)展就導(dǎo)致木馬謀取利益的成本大幅度提高,其帶來(lái)的利益以及威脅程度呈現(xiàn)逐年下降的趨勢(shì)。由于傳統(tǒng)應(yīng)用層木馬的隱蔽性大幅度下降,黑客為了提升帶來(lái)的效益以及獲得被控主機(jī)更加持久的控制權(quán),因而提升木馬的隱藏技術(shù)就顯得更加迫在眉睫。
內(nèi)核級(jí)木馬的隱藏主要使用內(nèi)核Rootkit技術(shù),內(nèi)核Rootkit程序在使得遠(yuǎn)程黑客能夠更長(zhǎng)期的享有目標(biāo)機(jī)器的底層系統(tǒng)控制權(quán)的同時(shí)在很大程度上不被殺毒軟件發(fā)現(xiàn),從而對(duì)被控主機(jī)造成更加嚴(yán)重的安全威脅,此外內(nèi)核Rootkit不僅僅存在于Windows系統(tǒng)中,同樣存在于LINUX等其他系統(tǒng)中。
而對(duì)于信息安全工作者,找出防御內(nèi)核級(jí)木馬的最有效途徑自然是要深入了解內(nèi)核木馬的工作機(jī)制,內(nèi)核Rootkit攻擊技術(shù),內(nèi)核Rootkit隱藏技術(shù),掌握其規(guī)律和特性,才能更好的找到應(yīng)對(duì)此類木馬的措施,以及對(duì)未來(lái)可能出現(xiàn)的安全隱患做好一些提前的防備。
內(nèi)核級(jí)木馬隱藏主要有進(jìn)程隱藏,文件隱藏,自啟動(dòng)隱藏,通信隱藏等,主要于木馬的架構(gòu)有關(guān),那么對(duì)于一些主從型內(nèi)核級(jí)木馬,木馬涉及到的功能模塊越多自然對(duì)應(yīng)涉及的隱藏項(xiàng)也就越多,甚至有時(shí)候還要做注冊(cè)表隱藏,服務(wù)隱藏等。
進(jìn)程隱藏最初技術(shù)體系為最簡(jiǎn)單的混淆字符隱藏,如系統(tǒng)進(jìn)程名為svchost.exe,木馬進(jìn)程名改為svch0st.exe隱藏,緊接著到注冊(cè)服務(wù)隱藏,dll注入隱藏?,F(xiàn)在內(nèi)核級(jí)木馬大部分通過(guò)進(jìn)程控制塊中的活動(dòng)進(jìn)程鏈表(ActiveProcessLinks)中摘除自身來(lái)達(dá)到隱藏,或通過(guò)從PspCidTable表中摘除自身等方法來(lái)達(dá)到隱藏目的。
文件隱藏最初是通過(guò)存放于敏感目錄(系統(tǒng)目錄)并混淆文件名來(lái)實(shí)現(xiàn),后來(lái)有些人通過(guò)掛鉤應(yīng)用層上的FindFirstFile,FindNextFile等API來(lái)實(shí)現(xiàn)該目的,現(xiàn)在在內(nèi)核層隱藏文件方法一般試用FSDHook或FSD Inline Hook來(lái)實(shí)現(xiàn)。
自啟動(dòng)隱藏先后經(jīng)歷了添加注冊(cè)表Run值,修改系統(tǒng)啟動(dòng)文件,注冊(cè)為服務(wù),修改定時(shí)程序,感染系統(tǒng)文件技術(shù)來(lái)實(shí)現(xiàn),現(xiàn)在黑客開(kāi)始關(guān)注于在硬盤固件,bios等地方做手腳來(lái)實(shí)現(xiàn)自啟動(dòng)隱藏。
對(duì)于通信隱藏來(lái)說(shuō),現(xiàn)在有些研究者已經(jīng)實(shí)現(xiàn)了NDIS小端口驅(qū)動(dòng)層的隱藏,不過(guò)主流的木馬仍然在TDI層面上通信或者在NDIS中間層上通信。
應(yīng)用層級(jí)隱藏技術(shù)由于處在ring3層,一般難以抵抗通過(guò)從內(nèi)核層獲取相應(yīng)的信息的一些軟件的檢測(cè),而在內(nèi)核級(jí)隱藏技術(shù)中,由于各種方案有著不同的特點(diǎn)、所要達(dá)到的目的不同因而這些方案所使用的隱藏技術(shù)也各有差異,這一節(jié)中,將重點(diǎn)分析內(nèi)核級(jí)木馬可能用到的一些隱藏技術(shù)。
對(duì)于應(yīng)用層級(jí)的木馬,自啟動(dòng)的方法可謂是五花八門,有捆綁文件、修改注冊(cè)表項(xiàng)、加自啟動(dòng)快捷方式等,但是安全軟件對(duì)應(yīng)用層的檢查比較嚴(yán)格,雖說(shuō)對(duì)于內(nèi)核層的自啟動(dòng)方法也有檢查,不過(guò)相對(duì)來(lái)說(shuō),內(nèi)核級(jí)的自啟動(dòng)一般要更有效一些。常見(jiàn)的內(nèi)核級(jí)木馬自啟動(dòng)方法主要有以下幾點(diǎn):
(1)注冊(cè)為后臺(tái)服務(wù)
跟應(yīng)層級(jí)木馬自啟動(dòng)中的注冊(cè)為服務(wù)的原理一樣,只不過(guò)前者是將應(yīng)用程序注冊(cè)為系統(tǒng)服務(wù),這兒是把寫好的驅(qū)動(dòng)程序注冊(cè)為系統(tǒng)服務(wù),進(jìn)而實(shí)現(xiàn)自啟動(dòng)。這種方法主要是把驅(qū)動(dòng)程序注冊(cè)為系統(tǒng)的一個(gè)服務(wù)(一般使用SCM ( Services Control Manager)接口來(lái)實(shí)現(xiàn)服務(wù)的安裝、啟動(dòng)、停止等,使用這種方式加載的驅(qū)動(dòng)程序是不可分頁(yè)的,不需要考慮分頁(yè)的問(wèn)題,另外,一般也不會(huì)由于驅(qū)動(dòng)的加載導(dǎo)致BSOD),在注冊(cè)表中生成[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\“ServiceName”]子鍵,再在其中設(shè)置好自己的一些啟動(dòng)參數(shù),如ImagePath等。普通的驅(qū)動(dòng)程序一般就是采用這種方法加載的,內(nèi)核級(jí)木馬的驅(qū)動(dòng)模塊當(dāng)然也可以使用這種方法,但由于涉及到在注冊(cè)表中插入鍵值,首先,在加載的時(shí)候可能被攔截,另外,若是加載成功了,也需要在后續(xù)的代碼中對(duì)該注冊(cè)表項(xiàng)和服務(wù)項(xiàng)做隱藏。
(2)使用Native API ZwSetSystemInformation()
該方法使用了未文檔化的API函數(shù)ZwSetSystemInformation(),可以在不創(chuàng)建注冊(cè)表鍵的情況下實(shí)現(xiàn)驅(qū)動(dòng)的加載,但是由于驅(qū)動(dòng)程序的分頁(yè)性,若在驅(qū)動(dòng)運(yùn)行過(guò)程中,通過(guò)該種方法加載的內(nèi)核木馬驅(qū)動(dòng)被頁(yè)換出,則對(duì)其的訪問(wèn)就會(huì)導(dǎo)致BSOD[11]。因而,若要使用該種方案,還需針對(duì)分頁(yè)問(wèn)題進(jìn)行一定的設(shè)計(jì),如migbot是通過(guò)將全部的操作代碼復(fù)制到不分頁(yè)的內(nèi)存池來(lái)實(shí)現(xiàn)這個(gè)目的。
一般在應(yīng)用層級(jí)實(shí)現(xiàn)的文件隱藏都是基于偽裝,而并不是真正意義上的隱藏,也可以說(shuō)只是在視覺(jué)上欺騙了用戶,如將文件名修改為酷似系統(tǒng)文件的名字(通過(guò)使用一些易混淆的字符來(lái)實(shí)現(xiàn))等。在內(nèi)核中,可以通過(guò)修改文件操作時(shí)的內(nèi)核處理流程來(lái)實(shí)現(xiàn)對(duì)文件的隱藏,進(jìn)而使用戶無(wú)法在系統(tǒng)中通過(guò)工具(使用同種或更上層方法來(lái)枚舉文件的工具)來(lái)查看被隱藏的文件。常見(jiàn)的內(nèi)核層的文件隱藏技術(shù)一般有一下幾種:
(1)Hook ZwQueryDirectoryFile()函數(shù)
在Windows中,實(shí)現(xiàn)文件的枚舉操作,最后都是調(diào)用Native API(in ntdll.dll)函數(shù)NtQueryDirectoryFile()來(lái)實(shí)現(xiàn),接著通過(guò)中斷進(jìn)入內(nèi)核,進(jìn)而通過(guò)查詢SSDT(System ServicesDescriptor Table,系統(tǒng)服務(wù)描述符表)表獲得相應(yīng)的函數(shù)ZwQueryDirectoryFile()的地址,進(jìn)而調(diào)用真正的函數(shù)執(zhí)行體來(lái)完成對(duì)文件的枚舉。Hook SSDT表隱藏文件主要是篡改函數(shù)在SSDT表中的真實(shí)地址,讓程序在枚舉文件信息時(shí)首先進(jìn)入修改后的地址對(duì)應(yīng)的函數(shù)中執(zhí)行,接著對(duì)待隱藏文件的信息進(jìn)行過(guò)濾,讓應(yīng)用層以及通過(guò)該種機(jī)制獲取文件信息的工具法枚舉到被隱藏的文件。
(2)文件過(guò)濾驅(qū)
1) 過(guò)濾驅(qū)動(dòng)程序:
對(duì)于文件過(guò)濾驅(qū)動(dòng)來(lái)說(shuō),主要是截獲上層文件操作請(qǐng)求,根據(jù)需要的功能做相應(yīng)的處理。
2) 文件系統(tǒng)驅(qū)動(dòng)程序(FSD,F(xiàn)ile System Driver):
它是Windows下標(biāo)準(zhǔn)的核心層驅(qū)動(dòng)程序,主要負(fù)責(zé)處理用戶與磁盤等存儲(chǔ)介質(zhì)之間的存儲(chǔ)信息以及維護(hù)各種文件系統(tǒng)(如FAT32、NTFS等)的磁盤結(jié)構(gòu)。
3) 設(shè)備驅(qū)動(dòng)程序:
主要是跟相應(yīng)的硬件打交道,直接依附于相應(yīng)的硬件設(shè)備。磁盤及其他的存儲(chǔ)驅(qū)動(dòng)程序主要是實(shí)現(xiàn)存儲(chǔ)設(shè)備的管理、存儲(chǔ)等。通過(guò)文件過(guò)濾驅(qū)動(dòng)實(shí)現(xiàn)文件的隱藏,主要是通過(guò)設(shè)置IRP_MJ_DIRECTORY_ CONTROL分發(fā)函數(shù),并在其中設(shè)置回調(diào)函數(shù),這樣發(fā)送給文件系統(tǒng)中卷設(shè)備的IRP,在從文件系統(tǒng)驅(qū)動(dòng)返回時(shí),將會(huì)觸發(fā)回調(diào)函數(shù)的執(zhí)行,在回調(diào)函數(shù)中將需要過(guò)濾的文件從返回的FILE_BOTH_DIR_INFORMATION結(jié)構(gòu)鏈表中刪除,這樣就可以實(shí)現(xiàn)對(duì)指定文件隱藏的功能。
內(nèi)核級(jí)木馬在進(jìn)程隱藏上,不斷發(fā)展了好多方法,不過(guò)從根本上來(lái)說(shuō),主要是通過(guò)鉤掛內(nèi)核函數(shù)、修改內(nèi)核返回信息(文件鏈表或句柄表)來(lái)實(shí)現(xiàn)進(jìn)程隱藏的。主要的有內(nèi)核掛鉤、DKOM技術(shù)、抹掉進(jìn)程句柄等。
(1)內(nèi)核掛鉤
SSDT實(shí)現(xiàn)了從用戶態(tài)函數(shù)到內(nèi)核態(tài)函數(shù)的引導(dǎo)。當(dāng)掛鉤 SSDT之后,進(jìn)程枚舉、查詢類函數(shù)(一般都是掛鉤ZwQuerySystemInformation()函數(shù))對(duì)應(yīng)的內(nèi)核服務(wù)函數(shù)在SSDT表中的地址被修改。這樣,當(dāng)產(chǎn)生進(jìn)程枚舉的調(diào)用時(shí),就會(huì)運(yùn)行修改后的函數(shù),接著在修改后的函數(shù)中
首先獲取完整的進(jìn)程信息,然后查找需要隱藏的進(jìn)程信息,對(duì)其實(shí)行過(guò)濾,再把處理后的結(jié)果返回給上層,這樣就可以使最終的用戶層的用戶看不到隱藏后的進(jìn)程。另外的一種內(nèi)核鉤實(shí)現(xiàn)進(jìn)程隱藏的方法是掛鉤IDT ( Interrupt Dispatch Table,中斷調(diào)度表)。在Windows系統(tǒng)中,用戶層的API函數(shù)都是通過(guò)軟中斷進(jìn)入內(nèi)核的。當(dāng)軟中斷出現(xiàn)時(shí),系統(tǒng)就會(huì)從IDT表中調(diào)用相應(yīng)的中斷服務(wù)處理例程,對(duì)應(yīng)INT 2E中斷的服務(wù)處理程序?yàn)镵iSystemService()。該程序又會(huì)調(diào)用SSDT表中的函數(shù)實(shí)現(xiàn)最終的調(diào)用。因而,通過(guò)掛鉤IDT,修改中斷響應(yīng)過(guò)程,就可以實(shí)現(xiàn)對(duì)進(jìn)程信息的監(jiān)視和修改,達(dá)到隱藏的目的。
(2)DKOM技術(shù)
DKOM(Direct Kernel ObjectManipulation,直接內(nèi)核對(duì)象操作)實(shí)現(xiàn)進(jìn)程隱藏使用的是另外一種機(jī)制。跟上面提到的內(nèi)核鉤子相比,隱藏性更好,相比來(lái)說(shuō),一般也不容易被檢測(cè)到。說(shuō)到使用該機(jī)制隱藏進(jìn)程,不得不提到Windows下跟進(jìn)程相關(guān)的一個(gè)數(shù)據(jù)結(jié)構(gòu)EPROCESS。
在Windows中,使用雙向鏈表的典型示例就是進(jìn)程和線程的數(shù)據(jù)結(jié)構(gòu)。對(duì)于進(jìn)程來(lái)說(shuō),每個(gè)進(jìn)程都擁有自己的EPROCESS數(shù)據(jù)結(jié)構(gòu),用來(lái)描述進(jìn)程的地址空間、進(jìn)程名、線程等信息。該結(jié)構(gòu)中的ActiveProcessLinks字段是一個(gè)LIST_ENTRY結(jié)構(gòu),所有進(jìn)程的EPROCESS結(jié)構(gòu)被LIST_ENTRY鏈接成一個(gè)雙向鏈表。這樣,使用該結(jié)構(gòu),我們可以很容易的遍歷該鏈表,找到需要的LIST_ENTRY結(jié)構(gòu)。
不過(guò),EPROCESS結(jié)構(gòu)在內(nèi)存中的位置幾乎在OS的每個(gè)發(fā)布版本中都會(huì)發(fā)生改變,這就給我們?cè)趦?nèi)存找到進(jìn)程的EPROCESS帶來(lái)了一些麻煩。好在通過(guò)PsGetCurrentProcess()函數(shù)始終能找到指向當(dāng)前運(yùn)行的進(jìn)程的指針,進(jìn)而找到當(dāng)前進(jìn)程的EPROCESS結(jié)構(gòu)。然后以當(dāng)前進(jìn)程指針為終止判斷條件,遍歷EPROCESS雙向鏈表,就一定能定位到需要隱藏的進(jìn)程。
當(dāng)找到需要隱藏的進(jìn)程的結(jié)構(gòu)后,通過(guò)修改其LIST_ENTRY中的Flink和Blink的值,將待隱藏的進(jìn)程的前一個(gè)LIST_ENTRY結(jié)構(gòu)(Previous Entry)的Flink指針指向下一個(gè)LIST_ENTRY結(jié)構(gòu)(Next Entry),而下一個(gè)結(jié)構(gòu)的Blink指向前一個(gè)結(jié)構(gòu)。另外,為了防止因指針指向無(wú)效內(nèi)存區(qū)域?qū)е孪到y(tǒng)崩潰,將待摘除的進(jìn)程的LIST_ENTRY結(jié)構(gòu)中的Flink和Blink指向自身。這樣就完成了脫鏈,系統(tǒng)就無(wú)法通過(guò)這種方法列舉被隱藏進(jìn)程的信息其中實(shí)線表示的是實(shí)際的進(jìn)程鏈表的情形,而虛線表示的是刪除待隱藏的進(jìn)程結(jié)構(gòu)后的進(jìn)程鏈表的情形),從而實(shí)現(xiàn)進(jìn)程的隱藏。需要指出的是,摘除進(jìn)程鏈表中的被隱藏進(jìn)程結(jié)構(gòu)后,并不會(huì)影響進(jìn)程的調(diào)度執(zhí)行,這是由于Windows是基于線程來(lái)實(shí)行任務(wù)調(diào)度的。
(3)抹掉進(jìn)程句柄
兩種常用的抹掉進(jìn)程句柄的做法分別是抹掉CSRSS句柄表中的待隱藏進(jìn)程句柄和抹掉PspCidTable中的待隱藏進(jìn)程句柄。
(1)抹掉CSRSS
句柄表中的進(jìn)程信息一個(gè)進(jìn)程在創(chuàng)建的時(shí)候,系統(tǒng)會(huì)為其分配一個(gè)句柄表。該句柄表主要是供內(nèi)核對(duì)象調(diào)用。實(shí)際上,其是一個(gè)結(jié)構(gòu)體數(shù)組,數(shù)組中的每個(gè)元素包含了以下三項(xiàng):指向一個(gè)內(nèi)核對(duì)象的指針、訪問(wèn)掩碼、與對(duì)象句柄的繼承相關(guān)的一些標(biāo)志等。對(duì)于進(jìn)程對(duì)象來(lái)說(shuō),其對(duì)象指針也放在句柄表中,通過(guò)遍歷CSRSS句柄表,可以根據(jù)需要過(guò)濾的特定進(jìn)程的信息,實(shí)現(xiàn)進(jìn)程的隱藏。
(2) 抹掉PspCidTable中的進(jìn)程信息
PspCidTable是一個(gè)特殊的句柄表,跟普通的句柄表相比,主要區(qū)別在于該句柄表中存放的是系統(tǒng)中的進(jìn)程對(duì)象體EPROCESS、線程對(duì)象體ETHREAD等。因而通過(guò)該句柄表可以遍歷系統(tǒng)中的所有進(jìn)程(IceSword工具就是使用這種方法來(lái)枚舉進(jìn)程的)。不過(guò)該句柄表并未導(dǎo)出,因而使用該方法隱藏進(jìn)程需要自己定位PspCidTable的地址。一般是通過(guò)PsLookupProcessByProcessId()函數(shù)來(lái)搜索定位的。定位好后,就可以從中過(guò)濾掉待隱藏進(jìn)程的句柄,不過(guò)使用該方法時(shí),有一點(diǎn)需要注意的是若被隱藏的進(jìn)程退出時(shí),需要重新恢復(fù)原先的進(jìn)程對(duì)象(恢復(fù)原先的表的結(jié)構(gòu)),否則,當(dāng)調(diào)用ExDestroyHandle()銷毀句柄,若遇到不存在的句柄(內(nèi)核中訪問(wèn)未知的內(nèi)存地址),就會(huì)導(dǎo)致BSOD。
同內(nèi)核模式的網(wǎng)絡(luò)編程接口相比,用戶模式的網(wǎng)絡(luò)編程雖說(shuō)在隱蔽性上稍微差一些,不過(guò)其實(shí)現(xiàn)起來(lái)簡(jiǎn)單、可以使用大量的內(nèi)置函數(shù)。但是,為了追求更好的隱蔽性,內(nèi)核級(jí)的隱藏技術(shù)顯得尤為重要,畢竟一個(gè)木馬不可能沒(méi)有通信模塊,否則其功能將無(wú)法實(shí)現(xiàn)。在Windows中,OSI的網(wǎng)絡(luò)模型與Windows系統(tǒng)結(jié)構(gòu)的概略映射。
其中網(wǎng)絡(luò)應(yīng)用程序即用戶編寫的基于Winsock API的通訊代碼;網(wǎng)絡(luò)API DLL則給上層的應(yīng)用程序提供網(wǎng)絡(luò)的接口,以便通過(guò)進(jìn)一步調(diào)用下層的協(xié)議驅(qū)動(dòng)等完成最后的通信;TDI(Transport DataInterface,傳輸數(shù)據(jù)接口)客戶是網(wǎng)絡(luò)API的核心態(tài)的驅(qū)動(dòng)程序,它可根據(jù)相應(yīng)的網(wǎng)絡(luò)標(biāo)準(zhǔn)格式化相應(yīng)的數(shù)據(jù)包,傳送給協(xié)議驅(qū)動(dòng);TDI傳送器即NDIS(Network Driver Interface Specification,網(wǎng)絡(luò)驅(qū)動(dòng)接口規(guī)范)協(xié)議驅(qū)動(dòng)程序,它接受上層傳送過(guò)來(lái)的數(shù)據(jù)包,接著根據(jù)不同的需求,按照不同的協(xié)議(TCP、IPX等)給數(shù)據(jù)包添加相應(yīng)的協(xié)議頭,以便提供給下層做進(jìn)一步的處理;NDIS庫(kù)則在為其上下層提供接口,同時(shí)也隱藏了設(shè)備的細(xì)節(jié),使協(xié)議驅(qū)動(dòng)程序跟網(wǎng)卡驅(qū)動(dòng)程序通信時(shí)不用考慮設(shè)備相關(guān)性,直接通過(guò)這些接口透明地進(jìn)行通信。
通過(guò)以上的分析,一般在內(nèi)核層,要實(shí)現(xiàn)通信隱藏,要么是Hook網(wǎng)絡(luò)API共同調(diào)用的函數(shù),要么就得深入更內(nèi)核,在TDI、NDIS協(xié)議驅(qū)動(dòng)或NDIS中間層驅(qū)動(dòng)程序等上做過(guò)濾操作。常見(jiàn)的通信隱藏方法有以下幾種:
(1)Hook ZwDeviceIoControlFile()
Netstat、Fport等獲取端口列表的工具,一般是通過(guò)iphlpapi.dll中提供的函數(shù)AllocateAndGetTcpTableFromStack()等來(lái)獲取端口相關(guān)的信息的。而這些函數(shù)最后又都是通過(guò)調(diào)用NtDeviceIoControlFile()這個(gè)Native API 來(lái)進(jìn)入內(nèi)核的。因而在SSDT中通過(guò)Hook該函數(shù)對(duì)應(yīng)的函數(shù)ZwDeviceIoControlFile(),對(duì)返回的端口信息進(jìn)行過(guò)濾,就可以將特定的端口隱藏掉。讓用戶無(wú)法通過(guò)一些常用的工具枚舉到木馬開(kāi)啟的通信端口,進(jìn)而實(shí)現(xiàn)端口隱藏來(lái)進(jìn)行隱蔽通信。不過(guò)對(duì)于像卡巴斯基防火墻等通過(guò)TDI過(guò)濾驅(qū)動(dòng)來(lái)獲取網(wǎng)絡(luò)連接、保證通信安全的軟件,該方法一般難以逃避檢測(cè)。
(2)TDI過(guò)濾驅(qū)動(dòng)
應(yīng)用層的網(wǎng)絡(luò)應(yīng)用程序要發(fā)送或接收數(shù)據(jù),都得通過(guò)下層的驅(qū)動(dòng)程序來(lái)格式化這些數(shù)據(jù)。那么只要在上層的IRP到達(dá)之后,根據(jù)自己的需求設(shè)定過(guò)濾規(guī)則,對(duì)特定的信息進(jìn)行過(guò)濾,會(huì)使用戶層的一些檢測(cè)工具或使用同種機(jī)制實(shí)施過(guò)濾的防火墻無(wú)法查看到自己已經(jīng)處理過(guò)的通信信息。不過(guò)該過(guò)濾驅(qū)動(dòng)位于TcpIp.sys之上,屬于UpperDriver,若一些檢測(cè)工具或防火墻是通過(guò)TcpIp.sys來(lái)獲取通信的信息的,那么該種方法就無(wú)法對(duì)特定的數(shù)據(jù)包實(shí)施過(guò)濾,也就難以逃避檢測(cè)。
(3)NDIS過(guò)濾驅(qū)動(dòng)
NDIS是Microsoft 和3COM公司聯(lián)合制定的網(wǎng)絡(luò)驅(qū)動(dòng)接口規(guī)范,其包括NDISProtocol Driver(NDIS協(xié)議驅(qū)動(dòng))、NDIS Intermediate Driver(NDIS中間層驅(qū)動(dòng))、NDIS MiniPortDriver(NDIS微端口驅(qū)動(dòng),有的文獻(xiàn)中也稱之為NDIS小端口驅(qū)動(dòng))。在這三個(gè)層次的驅(qū)動(dòng)中,在后兩個(gè)上可以獲取系統(tǒng)的網(wǎng)絡(luò)通信的相關(guān)信息,如源地址、目的地址等,這樣就可以在這兩個(gè)層次較為方便的獲得關(guān)于通信隱藏的依據(jù),進(jìn)而將這些信息直接發(fā)往自己的木馬功能模塊或者調(diào)用原先的流程繼續(xù)傳遞。直接發(fā)往木馬模塊的通信信息由于沒(méi)有通過(guò)系統(tǒng)的常規(guī)流程,因而,基于這些流程中間一些層次上的檢測(cè)工具或防火墻將無(wú)法截獲到這些信息。
驅(qū)動(dòng)模塊隱藏主要實(shí)現(xiàn)對(duì)內(nèi)核通信模塊、木馬功能模塊等驅(qū)動(dòng)程序的模塊的隱藏,防止用戶通過(guò)一些軟件查看到系統(tǒng)中已加載的驅(qū)動(dòng)模塊,進(jìn)而發(fā)現(xiàn)非法的木馬驅(qū)動(dòng)模塊。對(duì)于驅(qū)動(dòng)模塊的隱藏,使用的是DKOM技術(shù),其跟前面分析的用于進(jìn)程隱藏的DKOM技術(shù)原理一樣,只不過(guò)實(shí)現(xiàn)進(jìn)程隱藏操作的是EPROCESS結(jié)構(gòu),而要實(shí)現(xiàn)驅(qū)動(dòng)模塊的隱藏操作的卻是MODULE_ENTRY結(jié)構(gòu)鏈表。
在MODULE_ENTRY結(jié)構(gòu)(以下簡(jiǎn)稱為“結(jié)構(gòu)1”)中,記錄了內(nèi)核中驅(qū)動(dòng)的一些信息,如驅(qū)動(dòng)路徑、驅(qū)動(dòng)名等,該結(jié)構(gòu)實(shí)際上是_LDR_DATA_TABLE_ENTRY(以下簡(jiǎn)稱為“結(jié)構(gòu)2”)的一個(gè)簡(jiǎn)化結(jié)構(gòu),只是選取了跟模塊相關(guān)的一些字段來(lái)組成結(jié)構(gòu)體MODULE_ENTRY的,其中變量1對(duì)應(yīng)于結(jié)構(gòu)2中的InInitializationOrderLinks;變量2是為了保證跟_LDR_DATA_TABLE_ENTRY中字段的偏移一致而添加的一個(gè)變量;變量3、4、5、6、7對(duì)應(yīng)分別是結(jié)構(gòu)2中的DllBase、EntryPoint、SizeOfImage、FullDllName、BaseDllName。從MODULE_ENTRY的結(jié)構(gòu)可以看出其第一個(gè)參數(shù)是LIST_ENTRY結(jié)構(gòu)。對(duì)應(yīng)的_LIST_ENTRY的結(jié)構(gòu)如下:
typedef struct _LIST_ENTRY{
struct _LIST_ENTRY*Flink;
struct _LIST_ENTRY*Blink;
} LIST_ENTRY, *PLIST_ENTRY;
其中Flink參數(shù)實(shí)現(xiàn)指向下一個(gè)鏈表結(jié)構(gòu),若無(wú)后續(xù)節(jié)點(diǎn),則將其指向鏈表頭,若當(dāng)前的節(jié)點(diǎn)是鏈表頭結(jié)點(diǎn),則Flink指向鏈表的第一個(gè)節(jié)點(diǎn),若鏈表為空,則Flink指向表頭本身;Blink
參數(shù)實(shí)現(xiàn)指向前一個(gè)鏈表結(jié)構(gòu),若無(wú)前驅(qū)節(jié)點(diǎn),則其指向鏈表的頭節(jié)點(diǎn),若當(dāng)前的節(jié)點(diǎn)是鏈表頭,則Blink指向鏈表的最后一個(gè)節(jié)點(diǎn),若鏈表為空,則Blink指向鏈表頭本身。
這樣,只要順著MODULE_ENTRY雙向鏈表,就可以找到準(zhǔn)備隱藏的驅(qū)動(dòng)模塊,只要從中刪除該節(jié)點(diǎn),使用這種機(jī)制獲取驅(qū)動(dòng)模塊列表的工具將無(wú)法找到被隱藏的驅(qū)動(dòng)模塊。刪除前后的MODULE_ENTRY,實(shí)線是未修改的鏈表結(jié)構(gòu),虛線是修改后的鏈表結(jié)構(gòu)。同進(jìn)程刪除鏈表的處理類似,為了防止因指針指向無(wú)效內(nèi)存區(qū)域?qū)е孪到y(tǒng)崩潰,刪除操作后,將待摘除的模塊的LIST_ENTRY結(jié)構(gòu)中的Flink和Blink指向自身。
若要實(shí)現(xiàn)對(duì)注冊(cè)表中一些鍵值的隱藏,只需打破這種正常的調(diào)用機(jī)制,在其中某個(gè)易于操作的環(huán)節(jié)將鍵值過(guò)濾掉即可。對(duì)于內(nèi)核層來(lái)說(shuō),通過(guò)掛鉤或修改SSDT表、ntoskrnl.exe等中的相關(guān)函數(shù)等,就可以完成該功能。
看完上述內(nèi)容,你們對(duì)內(nèi)核級(jí)木馬有什么危害有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。