----------------------------------------------------------------------------------------------------
正文:
連線埠掃描技術
前言
第一部分,我們講述TCP連線的建立過程(通常稱作三階段握手),然後討論與掃描程式有關的一些實現細節。
然後,簡單介紹一下經典的掃描器(全連線)以及所謂的SYN(半連線)掃描器。
第三部分主要討論間接掃描和秘密掃描,還有隱藏攻擊源的技術。
秘密掃描基於FIN段的使用。在大多數實現中,關閉的連線埠對一個FIN 段返回一個RST,但是打開的連線埠通常丟棄這個段,不作任何回答。間接掃描,就像它的名字,是用一個欺騙主機來幫助實施,這台主機通常不是自願的。
第四部分介紹了一種與套用協定有關掃描。這些掃描器通常利用協定實現中的一些缺陷或者錯誤。認證掃描(ident scanning)也被成為代理掃描(proxy scanning)。
最後一部分,介紹了另外一些掃描技術。考慮了一些不是基於TCP連線埠和主要用來進行安全掃描的掃描工具(例如SATAN)。另外分析了使用掃描器的棧指紋。棧指紋通過檢測主機TCP並將應答跟已知作業系統TCP/IP協定棧應答相比較,解決了識別作業系統的問題。
一:TCP/IP相關問題
連線端及標記IP位址和連線埠被稱作套接字,它代表一個TCP連線的一個連線端。為了獲得TCP服務,必須在傳送機的一個連線埠上和接收機的一個連線埠上建立連線。TCP連線用兩個連線端來區別,也就是(連線端1,連線端2)。連線端互相傳送數據包。
一個TCP數據包包括一個TCP頭,後面是選項和數據。一個TCP頭包含6個標誌位。它們的意義分別為:
SYN: 標誌位用來建立連線,讓連線雙方同步序列號。如果SYN=1而ACK=0,則表示該數據包為連線請求,如果SYN=1而ACK=1則表示接受連線。
FIN: 表示傳送端已經沒有數據要求傳輸了,希望釋放連線。
RST: 用來復位一個連線。RST標誌置位的數據包稱為復位包。一般情況下,如果TCP收到的一個分段明顯不是屬於該主機上的任何一個連線,則向遠端傳送一個復位包。
URG: 為緊急數據標誌。如果它為1,表示本數據包中包含緊急數據。此時緊急數據指針有效。
ACK: 為確認標誌位。如果為1,表示包中的確認號時有效的。否則,包中的確認號無效。
PSH: 如果置位,接收端應儘快把數據傳送給套用層。
TCP連線的建立
TCP是一個面向連線的可靠傳輸協定。面向連線表示兩個套用端在利用TCP傳送數據前必須先建立TCP連線。TCP的可靠性通過校驗和,定時器,數據序號和應答來提供。通過給每個傳送的位元組分配一個序號,接收端接收到數據後傳送應答,TCP協定保證了數據的可靠傳輸。數據序號用來保證數據的順序,剔除重複的數據。在一個TCP會話中,有兩個數據流(每個連線端從另外一端接收數據,同時向對方傳送數據),因此在建立連線時,必須要為每一個數據流分配ISN(初始序號)。為了了解實現過程,我們假設客戶端C希望跟伺服器端S建立連線,然後分析連線建立的過程(通常稱作三階段握手):
1: C --SYN XXà S
2: C ?-SYN YY/ACK XX+1------- S
3: C ----ACK YY+1--à S
1:C傳送一個TCP包(SYN 請求)給S,其中標記SYN(同步序號)要打開。SYN請求指明了客戶端希望連線的伺服器端連線埠號和客戶端的ISN(XX是一個例子)。
2:伺服器端發回應答,包含自己的SYN信息ISN(YY)和對C的SYN應答,應答時返回下一個希望得到的位元組序號(YY+1)。
3:C 對從S 來的SYN進行應答,數據傳送開始。
一些實現細節
大部分TCP/IP實現遵循以下原則:
1:當一個SYN或者FIN數據包到達一個關閉的連線埠,TCP丟棄數據包同時傳送一個RST數據包。
2:當一個RST數據包到達一個監聽連線埠,RST被丟棄。
3:當一個RST數據包到達一個關閉的連線埠,RST被丟棄。
4:當一個包含ACK的數據包到達一個監聽連線埠時,數據包被丟棄,同時傳送一個RST數據包。
5:當一個SYN位關閉的數據包到達一個監聽連線埠時,數據包被丟棄。
6:當一個SYN數據包到達一個監聽連線埠時,正常的三階段握手繼續,回答一個SYN ACK數據包。
7:當一個FIN數據包到達一個監聽連線埠時,數據包被丟棄。"FIN行為"(關閉得連線埠返回RST,監聽連線埠丟棄包),在URG和PSH標誌位置位時同樣要發生。所有的URG,PSH和FIN,或者沒有任何標記的TCP數據包都會引起"FIN行為"。
二:全TCP連線和SYN掃描器
全TCP連線全TCP連線是長期以來TCP連線埠掃描的基礎。掃描主機嘗試(使用三次握手)與目的機指定連線埠建立建立正規的連線。連線由系統調用connect()開始。對於每一個監聽連線埠,connect()會獲得成功,否則返回-1,表示連線埠不可訪問。由於通常情況下,這不需要什麼特權,所以幾乎所有的用戶(包括多用戶環境下)都可以通過connect來實現這個技術。
這種掃描方法很容易檢測出來(在日誌檔案中會有大量密集的連線和錯誤記錄)。Courtney,Gabriel和TCPWrapper監測程式通常用來進行監測。另外,TCP Wrapper可以對連線請求進行控制,所以它可以用來阻止來自不明主機的全連線掃描。
TCP SYN掃描
在這種技術中,掃描主機向目標主機的選擇連線埠傳送SYN數據段。如果應答是RST,那么說明連線埠是關閉的,按照設定就探聽其它連線埠;如果應答中包含SYN和ACK,說明目標連線埠處於監聽狀態。由於所有的掃描主機都需要知道這個信息,傳送一個RST給目標機從而停止建立連線。由於在SYN掃描時,全連線尚未建立,所以這種技術通常被稱為半打開掃描。SYN掃描的優點在於即使日誌中對掃描有所記錄,但是嘗試進行連線的記錄也要比全掃描少得多。缺點是在大部分操作系統下,傳送主機需要構造適用於這種掃描的IP包,通常情況下,構造SYN數據包需要超級用戶或者授權用戶訪問專門的系統調用。
三:秘密掃描與間接掃描
秘密掃描技術
由於這種技術不包含標準的TCP三次握手協定的任何部分,所以無法被記錄下來,從而必SYN掃描隱蔽得多。另外,FIN數據包能夠通過只監測SYN包的包過濾器。
秘密掃描技術使用FIN數據包來探聽連線埠。當一個FIN數據包到達一個關閉的連線埠,數據包會被丟掉,並且回返回一個RST數據包。否則,當一個FIN數據包到達一個打開的連線埠,數據包只是簡單的丟掉(不返回RST)。
Xmas和Null掃描是秘密掃描的兩個變種。Xmas掃描打開FIN,URG和PUSH標記,而Null掃描關閉所有標記。這些組合的目的是為了通過所謂的FIN標記監測器的過濾。
秘密掃描通常適用於UNIX目標主機,除過少量的應當丟棄數據包卻傳送reset信號的作業系統(包括CISCO,BSDI,HP/UX,MVS和IRIX)。在Windows95/NT環境下,該方法無效,因為不論目標連線埠是否打開,作業系統都傳送RST。
跟SYN掃描類似,秘密掃描也需要自己構造IP 包。
間接掃描
間接掃描的思想是利用第三方的IP(欺騙主機)來隱藏真正掃描者的IP。由於掃描主機會對欺騙主機傳送回應信息,所以必須監控欺騙主機的IP行為,從而獲得原始掃描的結果。間接掃描的工作過程如下:
假定參與掃描過程的主機為掃描機,隱藏機,目標機。掃描機和目標記的角色非常明顯。隱藏機是一個非常特殊的角色,在掃描機掃描目的機的時候,它不能傳送任何數據包(除了與掃描有關的包)。
四:認證掃描和代理掃描
認證掃描
到目前為止,我們分析的掃描器在設計時都只有一個目的:判斷一個主機中哪個連線埠上有進程在監聽。然而,最近的幾個新掃描器增加了其它的功能,能夠獲取監聽連線埠的進程的特徵和行為。
認證掃描是一個非常有趣的例子。利用認證協定,這種掃描器能夠獲取運行在某個連線埠上進程的用戶名(userid)。認證掃描嘗試與一個TCP連線埠建立連接,如果連線成功,掃描器傳送認證請求到目的主機的113TCP連線埠。認證掃描同時也被成為反向認證掃描,因為即使最初的RFC建議了一種幫助伺服器認證客戶端的協定,然而在實際的實現中也考慮了反向套用(即客戶端認證伺服器)。
代理掃描
檔案傳輸協定(FTP)支持一個非常有意思的選項:代理ftp連線。這個選項最初的目的(RFC959)是允許一個客戶端同時跟兩個FTP伺服器建立連接,然後在伺服器之間直接傳輸數據。然而,在大部分實現中,實際上能夠使得FTP伺服器傳送檔案到Internet的任何地方。許多攻擊正是利用了這個缺陷。最近的許多掃描器利用這個弱點實現ftp代理掃描。
ftp連線埠掃描主要使用ftp代理伺服器來掃描tcp連線埠。掃描步驟如下:
1:假定S是掃描機,T是掃描目標,F是一個ftp伺服器,這個伺服器支持代理選項,能夠跟S和T建立連線。
2:S與F建立一個ftp會話,使用PORT命令聲明一個選擇的連線埠(稱之為p-T)作為代理傳輸所需要的被動連線埠。
3:然後S使用一個LIST命令嘗試啟動一個到p-T的數據傳輸。
4:如果連線埠p-T確實在監聽,傳輸就會成功(返回碼150和226被傳送回給S)。否則S回收到"425無法打開數據連線"的應答。
5:S持續使用PORT和LIST命令,直到T上所有的選擇連線埠掃描完畢。
FTP代理掃描不但難以跟蹤,而且當ftp伺服器在_blank">防火牆後面的時候
五:其它掃描方法
Ping掃描如果需要掃描一個主機上甚至整個子網上的成千上萬個連線埠,首先判斷一個主機是否開機就非常重要了。這就是Ping掃描器的目的。主要由兩種方法用來實現Ping掃描。
1:真實掃描:例如傳送ICMP請求包給目標IP位址,有相應的表示主機開機。
2:TCPPing:例如傳送特殊的TCP包給通常都打開且沒有過濾的連線埠(例如80連線埠)。對於沒有root許可權的掃描者,使用標準的connect來實現。否則,ACK數據包傳送給每一個需要探測的主機IP。每一個返回的RST表明相應主機開機了。另外,一種類似於SYN掃描連線埠80(或者類似的)也被經常使用。
安全掃描器
安全掃描器是用來自動檢查一個本地或者遠程主機的安全漏洞的程式。象其它連線埠掃描器一樣,它們查詢連線埠並記錄返回結果。但是它們。它們主要要解決以下問題:
1:是否允許匿名登錄。
2:是否某種網路服務需要認證。
3:是否存在已知安全漏洞。
可能SATAN是最著名的安全掃描器。1995年四月SATAN最初發布的時候,人們都認為這就是它的最終版本,認為它不但能夠發現相當多的已知漏洞,而且能夠針對任何很難發現的漏洞提供信息。但是,從它發布以來,安全掃描器一直在不斷地發展,其實現機制也越來越複雜。
棧指紋
絕大部分安全漏洞與缺陷都與作業系統相關,因此遠程作業系統探測是系統管理員關心的一個問題。
遠程作業系統探測不是一個新問題。近年來,TCP/IP實現提供了主機作業系統信息服務。FTP,TELNET,HTTP和DNS伺服器就是很好的例子。然而,實際上提供的信息都是不完整的,甚至有可能是錯誤的。最初的掃描器,依靠檢測不同作業系統對TCP/IP的不同實現來識別作業系統。由於差別的有限性,現在只能最多只能識別出10餘種作業系統。
最近出現的兩個掃描器,QueSO和NMAP,在指紋掃描中引入了新的技術。QueSO第一個實現了使用分離的資料庫於指紋。NMAP包含了很多的作業系統探測技術,定義了一個模板數據結構來描述指紋。由於新的指紋可以很容易地以模板的形式加入,NMAP指紋資料庫是不斷增長的,它能識別的作業系統也越來越多。
這種使用掃描器判斷遠程作業系統的技術稱為(TCP/IP)棧指紋技術。
另外有一種技術稱為活動探測。活動探測把TCP的實現看作一個黑盒子。通過研究TCP對探測的回應,就可以發現 TCP實現的特點。TCP/IP棧指紋技術是活動探測的一個變種,它適用於整個TCP/IP協定的實現和作業系統。棧指紋使用好幾種技術來探測TCP/IP協定棧和作業系統的細微區別。這些信息用來創建一個指紋,然後跟已知的指紋進行比較,就可以判斷出當前被掃描的作業系統。
棧指紋掃描包含了相當多的技術。下面是一個不太完整的清單:
1:FIN探測
2:BOGUS標記探測
3:TCP ISN 取樣
4:TCP 初始視窗
5:ACK值
6:ICMP錯誤信息
7:ICMP信息
8:服務類型
9:TCP選項