盂 蕾
摘要:從木馬原理出發。分析了幾種木馬隱藏方法。并對各自優缺點做了簡要評論。
關鍵詞:木馬隱蔽性端口反彈溢出植入
中圖分類號:TP309.5
文獻標識碼:A文章編號:1002-2422(2007)05-0004-02
特洛伊木馬(英文叫“Trojanhorse”,以下簡稱木馬),是一種基于遠程控制的黑客工具,基本過程是控制端向服務端發送命令,然后服務端運行這些命令,因而具有非授權性和隱蔽性的特點。非授權性是指一旦控制端與服務器端連接后,控制端將享有服務端的大部分操作權限,如修改、添加、刪除文件,修改注冊表,控制鼠標和鍵盤等,而這些權力并不是服務端賦予的,是通過木馬程序竊取的。隱蔽性是指木馬的設計者為了防止木馬被發現,會采用多種手段來隱藏木馬,這樣服務端即使發現感染了木馬,由于不能確定木馬的具體位置,因此沒有辦法刪掉。本文重點研究了木馬的隱蔽性。
1基本的隱藏方式
1.1端口隱藏
木馬能夠實現遠程控制,需要服務端執行客戶端命令。這些都是通過端口進行的,可以說端口是木馬的生命之源,沒有端口木馬是無法和外界進行通訊的,更無法進行遠程控制了。通過察看端口的方法(比如NETSTAT。一些端口掃描軟件),可以發現端口的打開情況,進而發現木馬。采用“寄生”和“潛伏”的方法可以解決這個問題。
(1)寄生是找一個已經打開的端口,寄生其上,平時只是監聽,遇到特殊的指令就可以激活木馬。由于木馬是寄生在已有的系統服務上的,因此在掃描或查看系統端口的時候是沒有任何異常的,如冰河、SUBSEVEN等。這一點和反彈式木馬有很大的相似之處。
(2)潛伏是指使用TCP/IP協議族中的ICMP協議而非TCP/UDP來進行通訊,從而瞞過Netstat和端口掃描軟件。ICMP是IP協議的附屬協議。它是由內核或進程直接處理而不需要通過端口。最常見的ICMP協議就是Ping,它利用了ICMP的回顯請求和回顯應答報文。一般的ICMP木馬會監聽ICMP報文,當出現特殊的報文時(比如特殊大小的包、特殊的報文結構等)會打開TCP端口等待控制端的連接。這種木馬在沒有激活時是不可見的,一旦連接上了控制端就和普通木馬一樣,本地可以看到狀態為Established的鏈接(如果端口的最大連接數設為1,在遠程使用Connect方法進行端口掃描還是沒有辦法發現的)。一個真正意義上的ICMP木馬會嚴格地使用ICMP協議來進行數據和控制命令的傳遞(數據放在ICMP的報文中),在整個過程中是不可見的。
這兩種方法都是被動式的,通過察看進程,或者察看注冊表RUN下面運行的程序,即可發現。因為在系統中增加了木馬文件,所以一般殺毒軟件也可以發現。
1.2進程隱藏
在win9x時代,注冊為系統進程就可以從任務欄中消失,就實現了隱藏??墒窃赪indow2000流行的今天,在Administrator下面(Ctrl+Ah+Del)可以看到所有正在運行的進程,從而發現木馬的進程,也就意味著可以刪除它。
進程隱藏是指把木馬寫入驅動和內核的級別,通過攔截系統調用的服務,用替代系統功能(改寫驅動程序或動態鏈接庫)或者說是嵌入式的方法,來達到隱蔽的目的,從而逃過系統對木馬的監測。例如:如果系統運行windows.exe,同時運行了木馬和windows.exe,而木馬嵌入在win-dows.exe中,能看到,但沒法刪除,因為windows.exe是系統進程,不允許刪除。這樣就相當于隱藏了木馬進程。相關的軟件如ROOTKIT。
雖然所有的操作都在DLL中完成會更加隱蔽,但是這大大增加了程序編寫的難度。這樣的木馬大多數只是使用DLL進行監聽,一旦發現控制端的連接請求就激活自身,運行一個綁端口的進程進行正常的木馬操作,操作結束后關掉進程,繼續進入休眠狀態。
采用替代系統功能的方法(改寫驅動程序或動態鏈接庫),這樣做的結果是:系統中沒有增加新的文件,不能用掃描的方法查殺;不需要打開新的端口,不能用端口監視的方法查殺;沒有新的進程,使用進程查看的方法發現不了它,也不能用kill進程的方法終止它的運行,在正常運行時木馬幾乎沒有任何的癥狀,一旦木馬的控制端向被控端發出特定的信息后,隱藏的程序就立即開始運作。
這樣的木馬也存在著一些問題:由于是寫入內核和驅動的,對系統會有較大影響,因此容易被發現;代碼量較多,編寫程序有較大難度;是被動式的。
1.3反彈式木馬
如果服務端裝有防火墻,客戶端發起的連接就會被服務端主機上的防火墻攔截,使服務端程序不能收到連接,軟件不能正常工作。同樣,局域網內通過代理上網的電腦,因為是多臺共用代理服務器的IP地址,而本機沒有獨立的互聯網的IP地址(只有局域網的IP地址),所以也不能正常使用。傳統型的木馬一般不能入侵裝有防火墻和在局域網內部的服務端主機。
對防火墻的特性進行分析發現:防火墻對于連入的連接往往會進行非常嚴格的過濾,但是對于連出的連接卻疏于防范。于是,出現了與一般木馬工作原理相反的反彈式(主動式)木馬,即:服務端(被控制端)主動連接客戶端(控制端),而不是被動的等待客戶端發送命令。為了隱蔽起見,客戶端的監聽端口一般開在80(提供HTTP服務的端口),這樣,即使用戶使用端口掃描軟件檢查自己的端口,稍一疏忽就會以為是自己在瀏覽網頁(防火墻也會這么認為的)。
如何使服務端連接客戶端呢?可以通過主頁空間上的文件實現。當客戶端想與服務端建立連接時,登錄到PlY服務器或者某個WEB服務器(一般事先定義好了),把信息寫到主頁上面的一個文件,并打開端口監聽,等待服務端的連接;服務端則定期的用HITP協議讀取這個文件的內容,當發現是客戶端讓自己開始連接時,就主動連接,如此就可完成連接工作。
這種反彈式木馬威力極大,由于采用主動連接,因此一般防火墻對它無能為力。如果稍有疏忽(比如通過改名等一系列方法,變成類似系統進程或者常用應用程序的名字),該種木馬可以輕易的繞過管理員的視線。網絡神偷就是典型的這類木馬。
1.4溢出植入型木馬
溢出植入型木馬是基于這樣的原理考慮的:由于程序設計的原因(比如數組越界等等),因此很多操作系統都存在著溢出漏洞(特別是存在著可以遠程利用的通用漏洞),現在流行的幾種操作系統如:Windows、UNIX等都存在著溢出漏洞,而它們的原理是一樣的。只要通過客戶端把指令以代碼的方式發送給溢出漏洞,服務端執行,就實現了遠程控制。即利用系統溢出的漏洞,植入木馬。這種木馬也有較強的隱蔽性。溢出的代碼執行是在正常服務的內部進行的,很容易就實現了進程的隱藏;注入到一個正常的應用程序中,其啟動和控制無需修改注冊表等方式;利用本身的端口和SOCKET很容易就能實現通訊的端口復用和SOCKET復用,實現端口隱藏和繞過防火墻。
制造一個溢出漏洞比較簡單且容易實現,即使是一個非常安全的應用程序,制造一個溢出BUG也很容易,如一個收包的代碼調用:recv(sock,buf,xxxx,flag),只需要簡單的調整XXX的值就使其存在了一個溢出的漏洞。這種木馬可以認為是綜合了“寄生”和“隱藏進程”的優勢。
采用這種方法要考慮幾個問題:溢出點的定位、溢出覆蓋后對變量的引用、擴展堆棧的修改等等。這種方法最大的缺點是技術難度太高,設計者需要對操作系統的漏洞和原理、內存分配甚至匯編語言等有較深入的研究和較全面的掌握。
2結束語
端口和進程隱藏的方法是目前普遍采用的。該方法比較成熟,很容易實現。進程隱藏的方法已經危害到了Win-dows操作系統的安全和穩定,微軟的下一代操作系統將會使用DLL數字簽名、校驗技術等,預計木馬DLL的時代很快會結束。反彈式和溢出植入型則比較少見。反彈式采用主動連接,威力較大,而溢出植入型,基于溢出漏洞考慮,使得服務器端的代碼量很少,對系統的影響非常小,而且激活木馬的客戶端程序只存在內存之中,更難發現和清除。