自從“廣外幽靈”開創(chuàng)了dll木馬時(shí)代的先河以來,現(xiàn)在采用線程注射的dll木馬和惡意程序已經(jīng)隨處可見了,除了普遍被采用的另行編寫dll加載器程序躲在啟動(dòng)項(xiàng)里運(yùn)行加載dll主體之外,“求職信”還帶來了一種比較少見的通過注冊(cè)表“hkey_local_machine\software\microsoft\windows nt\currentversion\windows\appinit_dlls”項(xiàng)目加載自身dll的啟動(dòng)方法,而相對(duì)于以上幾種早期方法,現(xiàn)在更有一種直接利用系統(tǒng)服務(wù)啟動(dòng)自身的木馬程序,這才是真正的難纏!
“服務(wù)”是windows系統(tǒng)的一大核心部分,在nt架構(gòu)系統(tǒng)中,服務(wù)是指執(zhí)行指定系統(tǒng)功能的程序、例程或進(jìn)程,以便支持其他程序,尤其是底層(接近硬件)程序。通過網(wǎng)絡(luò)提供服務(wù)時(shí),服務(wù)可以在active directory中發(fā)布,從而促進(jìn)了以服務(wù)為中心的管理和使用。服務(wù)是一種應(yīng)用程序類型,它在后臺(tái)運(yùn)行。服務(wù)應(yīng)用程序通??梢栽诒镜睾屯ㄟ^網(wǎng)絡(luò)為用戶提供一些功能,例如客戶端/服務(wù)器應(yīng)用程序、web服務(wù)器、數(shù)據(jù)庫服務(wù)器以及其他基于服務(wù)器的應(yīng)用程序。 “服務(wù)”自身也是一種程序,由于使用的領(lǐng)域和作用不同,服務(wù)程序也有兩種形式:exe和dll,采用dll形式的服務(wù)是因?yàn)閐ll能實(shí)現(xiàn)hook,這是一些服務(wù)必需的數(shù)據(jù)交換行為,而nt架構(gòu)系統(tǒng)采用一個(gè)被稱為“svchost.exe”的程序來執(zhí)行dll的加載過程,所有服務(wù)dll都統(tǒng)一由這個(gè)程序根據(jù)特定分組載入內(nèi)存,然而,如今越來越多病毒作者瞄上了這個(gè)系統(tǒng)自帶的加載器,因?yàn)樗肋h(yuǎn)也不能被查殺。
病毒作者將木馬主體寫成一個(gè)符合微軟開發(fā)文檔規(guī)范的服務(wù)性質(zhì)dll模塊文件,然后通過一段安裝程序,將木馬dll放入系統(tǒng)目錄,并在服務(wù)管理器(scm)里注冊(cè)自身為通過svchost.exe加載的服務(wù)dll組件之一,為了提高隱蔽性,病毒作者甚至直接替換系統(tǒng)里某些不太重要而默認(rèn)開啟的服務(wù)加載代碼,如“distributed link tracking client”,其默認(rèn)的啟動(dòng)命令是“svchost -k netsvcs”,如果有個(gè)病毒替換了啟動(dòng)命令為自己建立的分組“netsvsc”,即“svchost -k netsvsc”,在這種旁門左道加社會(huì)工程學(xué)的攻勢(shì)下,即使是具備一般查毒經(jīng)驗(yàn)的用戶也難以在第一時(shí)間內(nèi)察覺到問題出自服務(wù)項(xiàng),于是病毒得以成功逃離各種查殺。
目前被發(fā)現(xiàn)使用此方法的木馬已經(jīng)出現(xiàn),其中一個(gè)進(jìn)程名為“ad1.exe”的廣告程序就是典型例子,它通過替換“distributed link tracking client”服務(wù)的svchost啟動(dòng)項(xiàng)來躲過一般的手工查殺,同時(shí)它自身還是個(gè)病毒下載器,一旦系統(tǒng)感染了這個(gè)惡意程序,各種木馬都有可能光臨你的機(jī)器。
要清理dll木馬,用戶需要借助于sysinternals出品的第三方進(jìn)程管理工具“process explorer”,利用它的“find handle or dll”功能,能迅速搜索到某個(gè)dll依附的進(jìn)程信息并終結(jié),讓dll失去載體后就能成功刪除,而dll木馬的文件名為了避免和系統(tǒng)dll發(fā)生沖突,一般不會(huì)起得太專業(yè),甚至有“safaf.dll”、“est.dll”這樣的命名出現(xiàn),或者在某些系統(tǒng)下根本不會(huì)出現(xiàn)的文件名,如“kernel.dll”、“rundll32.dll”等。除了使用“process explorer”查找并終止進(jìn)程以外,還可以用icesword強(qiáng)行卸載某個(gè)進(jìn)程里的dll模塊來達(dá)到效果。
對(duì)于服務(wù)性質(zhì)的dll,我們?nèi)匀皇褂谩皃rocess explorer”進(jìn)行查殺,由于它的層次結(jié)構(gòu),用戶可以很直觀的看到進(jìn)程的啟動(dòng)聯(lián)系,如果一臺(tái)機(jī)器感染了殺不掉的頑固木馬,有經(jīng)驗(yàn)的用戶做的第一件事情就是禁止掉不相關(guān)或者不重要的程序和服務(wù)在開機(jī)時(shí)運(yùn)行,然后使用“process explorer”觀察各個(gè)進(jìn)程的情況,通過svchost.exe啟動(dòng)的dll木馬雖然狡猾,但是它釋放出exe文件運(yùn)行時(shí),一切都暴露了:一個(gè)svchost.exe服務(wù)進(jìn)程執(zhí)行了一個(gè)ad1.exe,還有比這更明顯的嗎?
svchost的分組信息位于注冊(cè)表的“hkey_local_machine\software\microsoft\windows nt\currentversion\svchost”項(xiàng)目,這是svchost加載dll時(shí)的分組依據(jù),如果用戶發(fā)現(xiàn)了一個(gè)奇怪的分組信息,那就要提高警惕了。
隱藏技術(shù)發(fā)展的顛峰:Rootkit木馬
隨著安全技術(shù)的發(fā)展和計(jì)算機(jī)用戶群的技術(shù)提高,一般的木馬后門越來越難生存,于是一部分有能力的后門作者把眼光投向了系統(tǒng)底層——ring 0。位于ring 0層的是系統(tǒng)核心模塊和各種驅(qū)動(dòng)程序模塊,所以位于這一層的木馬也是以驅(qū)動(dòng)的形式生存的,而不是一般的exe。后門作者把后門寫成符合wdm規(guī)范(windows driver model)的驅(qū)動(dòng)程序模塊,把自身添加進(jìn)注冊(cè)表的驅(qū)動(dòng)程序加載入口,便實(shí)現(xiàn)了“無啟動(dòng)項(xiàng)”運(yùn)行。一般的進(jìn)程查看器都只能枚舉可執(zhí)行文件exe的信息,所以通過驅(qū)動(dòng)模塊和執(zhí)行文件結(jié)合的后門程序便得以生存下來,由于它運(yùn)行在ring 0級(jí)別,擁有與系統(tǒng)核心同等級(jí)的權(quán)限,因此它可以更輕易的把自己隱藏起來,無論是進(jìn)程信息還是文件體,甚至通訊的端口和流量也能被隱藏起來,在如此強(qiáng)大的隱藏技術(shù)面前,無論是任務(wù)管理器還是系統(tǒng)配置實(shí)用程序,甚至系統(tǒng)自帶的注冊(cè)表工具都失去了效果,這種木馬,就是讓人問之色變的Rootkit。
要了解Rootkit木馬的原理,就必須從系統(tǒng)原理說起,我們知道,操作系統(tǒng)是由內(nèi)核(kernel)和外殼(shell)兩部分組成的,內(nèi)核負(fù)責(zé)一切實(shí)際的工作,包括cpu任務(wù)調(diào)度、內(nèi)存分配管理、設(shè)備管理、文件操作等,外殼是基于內(nèi)核提供的交互功能而存在的界面,它負(fù)責(zé)指令傳遞和解釋。由于內(nèi)核和外殼負(fù)責(zé)的任務(wù)不同,它們的處理環(huán)境也不同,因此處理器提供了多個(gè)不同的處理環(huán)境,把它們稱為運(yùn)行級(jí)別(ring),ring讓程序指令能訪問的計(jì)算機(jī)資源依次逐級(jí)遞減,目的在于保護(hù)計(jì)算機(jī)遭受意外損害——內(nèi)核運(yùn)行于ring 0級(jí)別,擁有最完全最底層的管理功能,而到了外殼部分,它只能擁有ring 3級(jí)別,這個(gè)級(jí)別能操作的功能極少,幾乎所有指令都需要傳遞給內(nèi)核來決定能否執(zhí)行,一旦發(fā)現(xiàn)有可能對(duì)系統(tǒng)造成破壞的指令傳遞(例如超越指定范圍的內(nèi)存讀寫),內(nèi)核便返回一個(gè)“非法越權(quán)”標(biāo)志,發(fā)送這個(gè)指令的程序就有可能被終止運(yùn)行,這就是大部分常見的“非法操作”的由來,這樣做的目的是為了保護(hù)計(jì)算機(jī)免遭破壞,如果外殼和內(nèi)核的運(yùn)行級(jí)別一樣,用戶一個(gè)不經(jīng)意的點(diǎn)擊都有可能破壞整個(gè)系統(tǒng)。
由于ring的存在,除了由系統(tǒng)內(nèi)核加載的程序以外,由外殼調(diào)用執(zhí)行的一般程序都只能運(yùn)行在ring 3級(jí)別,也就是說,它們的操作指令全部依賴于內(nèi)核授權(quán)的功能,一般的進(jìn)程查看工具和殺毒軟件也不例外,由于這層機(jī)制的存在,我們能看到的進(jìn)程其實(shí)是內(nèi)核“看到”并通過相關(guān)接口指令(還記得api嗎?)反饋到應(yīng)用程序的,這樣就不可避免的存在一條數(shù)據(jù)通道,雖然在一般情況下它是難以被篡改的,但是不能避免意外的發(fā)生,Rootkit正是“制造”這種意外的程序。簡單的說,Rootkit實(shí)質(zhì)是一種“越權(quán)執(zhí)行”的應(yīng)用程序,它設(shè)法讓自己達(dá)到和內(nèi)核一樣的運(yùn)行級(jí)別,甚至進(jìn)入內(nèi)核空間,這樣它就擁有了和內(nèi)核一樣的訪問權(quán)限,因而可以對(duì)內(nèi)核指令進(jìn)行修改,最常見的是修改內(nèi)核枚舉進(jìn)程的api,讓它們返回的數(shù)據(jù)始終“遺漏”Rootkit自身進(jìn)程的信息,一般的進(jìn)程工具自然就“看”不到Rootkit了。更高級(jí)的Rootkit還篡改更多api,這樣,用戶就看不到進(jìn)程(進(jìn)程api被攔截),看不到文件(文件讀寫api被攔截),看不到被打開的端口(網(wǎng)絡(luò)組件sock api被攔截),更攔截不到相關(guān)的網(wǎng)絡(luò)數(shù)據(jù)包(網(wǎng)絡(luò)組件ndis api被攔截)了,我們使用的系統(tǒng)是在內(nèi)核功能支持下運(yùn)作的,如果內(nèi)核變得不可信任了,依賴它運(yùn)行的程序還能信任嗎?
但即使是Rootkit這一類恐怖的寄生蟲,它們也并非所向無敵的,要知道,既然Rootkit是利用內(nèi)核和ring 0配合的欺騙,那么我們同樣也能使用可以“越權(quán)”的檢查程序,繞過api提供的數(shù)據(jù),直接從內(nèi)核領(lǐng)域里讀取進(jìn)程列表,因?yàn)樗羞M(jìn)程在這里都不可能把自己隱藏,除非它已經(jīng)不想運(yùn)行了。也就是說,內(nèi)核始終擁有最真實(shí)的進(jìn)程列表和主宰權(quán),只要能讀取這個(gè)原始的進(jìn)程列表,再和進(jìn)程api枚舉的進(jìn)程列表對(duì)比,便能發(fā)現(xiàn)Rootkit進(jìn)程,由于這類工具也“越權(quán)”了,因而對(duì)Rootkit進(jìn)行查殺也就不再是難事,而Rootkit進(jìn)程一旦被清除,它隱藏自身的措施也就不復(fù)存在,內(nèi)核就能把它“供”出來了,用戶會(huì)突然發(fā)現(xiàn)那個(gè)一直“找不到”的Rootkit程序文件已經(jīng)老實(shí)的呆在文件管理器的視圖里了。這類工具現(xiàn)在已經(jīng)很多,例如icesword、patchfinder、gdb等。
道高一尺,魔高一丈,因?yàn)槟壳暗闹髁鱎ootkit檢測(cè)工具已經(jīng)能檢測(cè)出許多Rootkit木馬的存在,因此一部分Rootkit作者轉(zhuǎn)而研究Rootkit檢測(cè)工具的運(yùn)行檢測(cè)算法機(jī)制,從而制作出新一代更難被檢測(cè)到的木馬——futo Rootkit。
國產(chǎn)優(yōu)秀檢測(cè)工具icesword在futo面前敗下陣來,因?yàn)閒uto編寫者研究的檢測(cè)工具原型就是一款與之類似的black & light,所以我們只能換用另一款Rootkit檢測(cè)工具darkspy,并開啟“強(qiáng)力模式”,方可正常查殺Rootkit。
但是由于檢測(cè)機(jī)制的變化,darkspy要檢測(cè)到futo的存在,就必須保證自己的驅(qū)動(dòng)比futo提前加載運(yùn)行,這就涉及到優(yōu)先級(jí)的問題,也是讓業(yè)界感覺不太滿意的一種方式,因?yàn)檫@樣做的后果會(huì)導(dǎo)致系統(tǒng)運(yùn)行效率下降,不到緊急關(guān)頭,都不要輕易采用這種方法,然而現(xiàn)在的瑞星卡卡助手所推廣的“破甲”技術(shù),實(shí)現(xiàn)原理是與之類似的,它也會(huì)對(duì)系統(tǒng)造成一定影響,因而,這個(gè)介于安全和效率之間的選擇,唯有留給用戶自己思考了。