[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 安全技術 > 其它 > 正文
揭開木馬的神秘面紗(二)
http://fetag.dhs.org/ (2001-05-20 12:10:00)
前言 
離冰河二的問世已經快一年了,大家對木馬這種遠程控制軟件也有了一定的認識,比如︰他會改注冊表,他會監聽端口等等,和一年前幾乎沒有人懂得木馬是什東西相比,這是一個質的飛躍。但是,在這個連“菜鳥”都會用NETSTAT看端口,用LOCKDOWN保護注冊表的今天,難道木馬就停步不前,等待我們的“殺戮”?回答顯然是否定的。木馬在這一年當中,同樣也不斷進步,不斷發展,他們變得更加隱蔽,更加靈活。本文試圖通過分析近一年以來木馬軟件的發展,向大家介紹木馬的最新攻防技巧,從而使大家能夠更加安全地暢遊在Internet上。(本文中默認的操作系統為Win2000,默認的編程環境是VC++6.0) 

在過去的一年當中,出過很多有名的木馬,SUB7,BO2000,冰河等等,他們都有幾個共同的特點,比如︰開TCP端口監聽,寫注冊表等等,因此,針對這些特點,也湧現出了不少查殺木馬的工具,比如LockDown2000, Clean等,這些工具一般都是利用檢查注冊表和端口來尋找木馬(也有利用特征碼來查找的,那種原始的思路我們就不說了,誰都知道,只要源碼稍微改改,特征碼查詢就毫無用處)甚至還出了一些號稱能防范未來多少年木馬的軟件。而在大家的不斷宣傳下,以下的木馬法則已經婦孺皆知︰ 
1、不要隨便從不知名的網站上下載可執行文件,不要隨便運行別人給的軟件; 
2、不要過相信別人,不要隨便打開郵件的附件; 
3、經常檢查自己的系統文件、注冊表、端口、進程; 
4、經常去查看最新的木馬公告,更新自己防火牆的木馬庫; 

這樣看來,第一代木馬的特性大家都已經耳熟能詳,在這種情況下,作為一個地下工作者,木馬的日子會非常難過。那,木馬就這樣甘受屠戮,坐以待斃?人類就這樣滅絕了木馬這個種族?不是!木馬為了生存,也在不斷進化,在我們放鬆警惕,慶祝勝利的時候,木馬已經經歷了幾次質的突變,現在的木馬比起他們的前輩要更加隱蔽,更加巧妙,更難以發現,功能更強大。 

實際上在我們總結了老一輩木馬的特征,並把它們寫進殺馬軟件、編入防馬教程、掛在各個安全網站的首頁的時候,木馬們就意識到了自己的危險,為了自身的安全,為了種族的延續,木馬們認真地審視了自己的不足(沒準也看了很多教程)覺得︰要想更好、更安全的發展下去,只有化缺點為優點,改短處為長處,否則只有死路一條。是,他們針對自己的不足,採取了以下的升級方案︰ 
一、關端口 
禍從口出,同樣,端口也是木馬的最大漏洞,經過大家的不斷宣傳,現在連一個剛剛上網沒有多久的“菜鳥”也知道用NETSTAT查看端口,木馬的端口越做越高,越做越象系統端口,被發現的概率卻越來越大。但是端口是木馬的生命之源,沒有端口木馬是無法和外界進行通訊的,更不要說進行遠程控制了。為了解決這個矛盾,木馬們深入研究了Richard Stevens的TCP/IP協議詳解,決定︰放棄原來他們賴以生存的端口,轉而進入地下。放棄了端口木馬怎和控制端聯絡呢?對這個問題,不同的木馬採用了不同的方法,大致分為以下兩種方法︰寄生、潛伏。 
1、寄生就是找一個已經打開的端口,寄生其上,平時只是監聽,遇到特殊的指令就進行解釋執行;因為木馬實際上是寄生在已有的系統服務之上的,因此,你在掃描或查看系統端口的時候是沒有任何異常的。據我所知,在98下進行這樣的操作是比較簡單的,但是對Win2000 相對要麻煩得多。由作者對這種技術沒有很深的研究,在這裡就不贅述了,感興趣的朋友可以去http://www.ahjmw.gov.cn/cit/或者西祠胡同的WinSock版查看相關的資料。 
2、潛伏是說使用IP協議族中的其它協議而非TCP/UDP來進行通訊,從而瞞過Netstat和端口掃描軟件。一種比較常見的潛伏手段是使用ICMP協議,ICMP(Internet控制報文)是IP協議的附屬協議,它是由內核或進程直接處理而不需要通過端口,一個最常見的ICMP協議就是Ping,它利用了ICMP的回顯請求和回顯應答報文。一個普通的ICMP木馬會監聽ICMP報文,當出現特殊的報文時(比如特殊大小的包、特殊的報文結構等)它會打開TCP端口等待控制端的連接,這種木馬在沒有激活時是不可見的,但是一旦連接上了控制端就和普通木馬一樣,本地可以看到狀態為Established的鏈接(如果端口的最大連接數設為1,在遠程使用Connect方法進行端口掃描還是沒有辦法發現的);而一個真正意義上的ICMP木馬則會嚴格地使用ICMP協議來進行數據和控制命令的傳遞(數據放在ICMP的報文中),在整個過程中,它都是不可見的。(除非使用嗅探軟件分析網絡流量) 
3、除了寄生和潛伏之外,木馬還有其他更好的方法進行隱藏,比如直接針對網卡或Modem進行底層的編程,這涉及到更高的編程技巧。 

二、隱藏進程。 
在win9x時代,簡單的注冊為系統進程就可以從任務欄中消失,可是在Window2000盛行的今天,這種方法遭到了慘敗,注冊為系統進程不僅僅能在任務欄中看到,而且可以直接在Services中直接控制停止、運行(太搞笑了,木馬被客戶端控制)。使用隱藏窗體或控制台的方法也不能欺騙無所不見的ADMIN大人(要知道,在NT下,Administrator是可以看見所有進程的)。在研究了其它軟件的長處之,木馬發現,Windows下的中文漢化軟件採用的陷阱技術非常適合木馬的使用。 
DLL陷阱技術是一種針對DLL(動態鏈接庫)的高級編程技術,編程者用特洛伊DLL替換已知的系統DLL,並對所有的函數調用進行過濾,對正常的調用,使用函數轉發器直接轉發給被替換的系統DLL,對一些事先約定好的特殊情況,DLL會執行一些相對應的操作,一個比較簡單的方法是起一個進程,雖然所有的操作都在DLL中完成會更加隱蔽,但是這大大增加了程序編寫的難度,實際上這樣的木馬大多數只是使用DLL進行監聽,一旦發現控制端的連接請求就激活自身,起一個綁端口的進程進行正常的木馬操作。操作結束關掉進程,繼續進入休眠狀況。 
因為大量特洛伊DLL的使用實際上已經危害到了Windows操作系統的安全和穩定性,據說微軟的下一代操作系統Window2001(海王星)已經使用了DLL數字簽名、校驗技術,因此,特洛伊DLL的時代很快會結束。取代它的將會是強行嵌入代碼技術(插入DLL,掛接API,進程的動態替換等等),但是這種技術對編寫者的匯編功底要求很高,涉及大量硬編碼的機器指令,並不是一般的木馬編寫者可以涉足。(暈,我是門都找不到,哪位高手可以指點我一下?) 

三、爭奪系統控制權 
木馬們並不甘老是處防守的地位,他們也會進攻,也會主動出擊。WINNT下的溢出型木馬就是這樣的積極者,他們不僅僅簡單的加載、守候、完成命令,而是利用種種系統的漏洞設法使自己成為系統的擁有者-ADMIN,甚至系統的控制者-System。那,木馬利用什方法能一改過去到處逃亡的面目,從而成為系統的主宰呢? 
首當其沖的顯然是注冊表︰多年馳騁注冊表的歷史使得木馬非常熟悉注冊表的構造和特點(你呢,你能比木馬更熟悉注冊表)Windows2000有幾個注冊表的權限漏洞,允許非授權用戶改寫ADMIN的設置,從而強迫ADMIN執行木馬程序,這個方法實現起來比較容易,但是會被大多數的防火牆發現。 
其次是利用系統的權限漏洞,改寫ADMIN的文件、配置等等,在ADMIN允許Active Desktop的情況下這個方法非常好用,但是對一個有經驗的管理員,這個方法不是太有效; 
第三個選擇是系統的本地溢出漏洞,由木馬是在本地運行的,它可以通過本地溢出的漏洞(比如IIS的本地溢出漏洞等),直接取得system的權限。這部分內容在袁哥和很多匯編高手的文章中都有介紹,我就不再贅述了。(偷偷告訴你,其實是我說不出來,我要是能寫出那樣的溢出程序我還用在這裡......) 

四、防火牆攻防戰 
現在,在個人防火牆如此之流行的今天,也許有人會說︰我裝個防火牆,不管你用什木馬,在我系統上搞什,防火牆設了只出不進,反正你沒法連進來。同樣,對局域網內的機器,原先的木馬也不能有效的進行控制(難道指望網關會給你做NAT?)但是,城牆從來就擋不住木馬︰在古希臘的特洛伊戰爭中,人們是推倒了城牆來恭迎木馬的,而在這個互聯網的時代,木馬仍然以其隱蔽性和欺詐性使得防火牆被從內部攻破。其中反彈端口型的木馬非常清晰的體現了這一思路。 
反彈端口型木馬分析了防火牆的特性發現︰防火牆對連入的鏈接往往會進行非常嚴格的過濾,但是對連出的鏈接卻疏防范。是,與一般的木馬相反,反彈端口型木馬的服務端(被控制端)使用主動端口,客戶端(控制端)使用被動端口,木馬定時監測控制端的存在,發現控制端上線立即彈出端口主動連結控制端打開的主動端口,為了隱蔽起見,控制端的被動端口一般開在80,這樣,即使用戶使用端口掃描軟件檢查自己的端口,發現的也是類似 TCPUserIP:1026ControllerIP:80 ESTABLISHED的情況,稍微疏忽一點你就會以為是自己在瀏覽網頁。(防火牆也會這認為的,我想大概沒有哪個防火牆會不給用戶向外連接80端口吧,嘿嘿)看到這裡,有人會問︰那服務端怎能知道控制端的IP地址呢?難道控制端只能使用固定的IP地址?哈哈,那不是自己找死?一查就查到了。實際上,這種反彈端口的木馬常常會採用固定IP的第三方存儲設備來進行IP地址的傳遞。舉一個簡單的例子︰事先約定好一個個人主頁的空間,在其中放置一個文本文件,木馬每分鐘去GET一次這個文件,如果文件內容為空,就什都不做,如果有內容就按照文本文件中的數據計算出控制端的IP和端口,反彈一個TCP鏈接回去,這樣每次控制者上線只需要FTP一個INI文件就可以告訴木馬自己的位置,為了保險起見,這個IP地址甚至可以經過一定的加密,除了服務和控制端,其他的人就算拿到了也沒有任何的意義。對一些能夠分析報文、過濾TCP/UDP的防火牆,反彈端口型木馬同樣有辦法對付,簡單的來說,控制端使用80端口的木馬完全可以真的使用HTTP協議,將傳送的數據包含在HTTP的報文中,難道防火牆真的精明到可以分辨通過HTTP協議傳送的究竟是網頁還是控制命令和數據? 

五、更加隱蔽的加載方式︰ 
記得一年前,大家覺得通過所謂圖片傳播的木馬非常神秘,其實現在幾乎人人都知道那只是一個綴名的小把戲,而綁定EXE文件的木馬也隨“不要輕易執行可執行文件”的警告變得越來越不可行,和過去不同是,現在木馬的入侵方式更加的隱蔽,在揉合了宏病毒的特性,木馬已經不僅僅通過欺騙來傳播了,隨網站互動化進程的不斷進步,越來越多的東西可以成為木馬傳播的介質,JavaScript,VBScript, ActiveX, XML......幾乎WWW每一個新出來的功能都會導致木馬的快速進化,曾幾何時,郵件木馬從附件走向了正文,簡單的瀏覽也會中毒,而一個Guest用戶也可以很容易的通過修改管理員的文件夾設置給管理員吃上一點耗子藥。當我們小心翼翼地穿行在互聯網森林中的時候,也許正有無數雙木馬的眼睛在黑暗中窺視,他們在等待你的一次疏忽,一個小小的疏忽,這將給他們一個完美的機會...... 

一點點感想︰ 
入侵高手可能會對木馬的編寫和防御不屑一顧,但是,許多入侵事件多多少少會有木馬的參與(這個時候,木馬程序往往被叫做門)在最近的微軟被黑事件中,入侵者使用的就是一種叫QAZ的木馬,實際上,這種木馬並不非常高級,甚至不能算是第二代木馬(只是一種通過共享傳播的蠕虫木馬),而正是一只小小的木馬,讓強大的微軟丟盡了臉。要知道︰入侵者和黑客不同,對入侵者來說,入侵是最終的目的,任何手段,只要能最快最簡單的進入,就是最好的手段,由被入侵的用戶大多數並不是專業人員,所以木馬往往是一個很好的選擇。 
在撰寫本文的過程中,曾經有朋友和我戲言︰危言聳聽。其實,事實並非如此,在本文中描述的木馬,雖然看起來匪夷所思,但是在互聯網上大多已經有了樣品出現,而且,我相信,一定還有技術含量遠遠超過上述木馬的軟件正在開發中。 

編說明︰ 
本文的撰寫,並不是為了發展木馬技術,擾亂互聯網,而是為了能深入探討木馬的攻擊和防御技術,引起人們對木馬的關注,盡量減小木馬傳播可能造成的危害。 
本文的撰寫得到了Lion Hook、無影貓、李逍遙、Yagami、 Quack以及Glacier的指導和幫助,在此向他們表示感謝。 

上面的文章為天極網邀稿,如需轉載請注明作者和“轉自天極網http://www.yesky.com"的字樣,並請保持全文完整,謝謝。 
關本文所述的木馬的程序實現,我會在一篇文章中進行探討,也歡迎大家給我來信討論編程的問題。 

(http://www.fanqiang.com)
    進入【UNIX論壇

相關文章

======
 

★  樊強制作 歡迎分享  ★