系統"服務"是windows系統的一大核心部分,在NT/2000/2003/XP架構系統中,服務是指執行指定系統功能的程式、例行程序,以便支援其他程式,尤其是底層核心(接近硬體)程式。
而通過網路提供服務時,服務可以在Active Directory(AD)中發佈,從而促進了以服務為中心的管理和使用。
服務是一種應用程式類型,它在後端運行。服務應用程式通常可以在本地和通過網路的用戶端提供一些功能,例如:客戶端/伺服器架構下的應用程式、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",在這種旁門左道加社會工程學的攻勢下,即使是具備一般解毒經驗的使用者也難以在第一時間內察覺到問題出自服務的啟動項目,於是病毒得以 成功逃離各種防毒軟體的查殺。
目前被發現使用此方法的木馬已經出現,其中一個Process名為"ad1.exe"的廣告程式就是典型例 子,它通過替換"distributed link tracking client"服務的 svchost 啟動項目來躲過一般的手工查殺,同時它自身還是個病毒下載器,一旦系統感染了這個惡意程式,各種木馬都有可能光臨你的機器。
要清理dll木馬,可以借助於第三方管理工具[ process explorer ],利用它的"find handle or dll"功能,能迅速搜索到某個dll依附的Process資訊並終結,讓dll失去載體後就能成功刪除,而dll木馬的文件名為了避免和系統 dll 發生衝突,一般不會起得太專業,甚至有 safaf.dll 、est.dll 這樣的命名出現,或者在某些系統下根本不會出現的文件名,如 kernel.dll、rundll32.dll 等。除了使用[ process explorer ]搜尋並終止進程以外,還可以用 icesword 強行卸載某個Process裡的dll 模組來達到效果。
對 於服務性質的dll,我們仍然使用[ process explorer ]進行查殺,由於它的層次結構,用戶可以很直覺的看到Process的啟動連結,如果一台機器感染了殺不掉的頑固木馬,有經驗的使用者做的第一件事情就是 禁止掉不相關或者不重要的程式和服務在開機時運行,然後使用[ 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)的驅動程式模組,把自身添加進註冊表的驅動程式載入入口,便實現了「無啟動項」運行。一般的Process查看器都只能列舉可執行文件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提供的數據,直接從內核領域裡讀取Process列表,因為所有Process在這裡都不可能把自己隱藏,除非它已經不想運行了。也就是說,內核始終擁有最真實的進程列表和主宰權,只要能讀取這個原始的進程列表,再和進程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提前載入運行,這就涉及到優先級的問題,也是讓業界感覺不 太滿意的一種方式,因為這樣做的後果會導致系統運行效率下降,不到緊急關頭,都不要輕易採用這種方法,然而現在的瑞星卡卡助手所推廣的「破甲」技術,實現 原理是與之類似的,它也會對系統造成一定影響,因而,這個介於安全和效率之間的選擇,唯有留給用戶自己思考了。
註:一旦木馬利用了Rootkit 技術,就變得十分難以辨認清除。
轉自網路攻防戰