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


