端口掃描技術
絕大多數時候,一個功能強大的工具可以提高我們的工作效率,節省很多時間和精力,當然前提是我們要熟悉我們手中的工具。這樣才能将工具充分利用起來,就如古語所說:千裡馬常有,而伯樂不常有。
雖然Nmap努力産生正确的結果,但請記住所有結果都是基于目标機器(或者它們前面的防火牆)傳回的封包的。 。這些主機也許是不值得信任的,它們可能響應以迷惑或誤導Nmap的封包。 更普遍的是非RFC相容的主機以不正确的方式響應Nmap探測。FIN,Null和Xmas掃描 特别容易遇到這個問題。這些是特定掃描類型的問題,是以我們在個别掃描類型裡讨論它們。
-
-sS (TCP SYN掃描)
SYN掃描作為預設的也是最受歡迎的掃描選項,是有充分理由的。 它執行得很快,在一個沒有入侵防火牆的快速網絡上,每秒鐘可以掃描數千個 端口。 SYN掃描相對來說不張揚,不易被注意到,因為它從來不完成TCP連接配接。 它也不像Fin/Null/Xmas,Maimon和Idle掃描依賴于特定平台,而可以應對任何相容的 TCP協定棧。 它還可以明确可靠地區分open(開放的), closed(關閉的),和filtered(被過濾的) 狀态
它常常被稱為半開放掃描, 因為它不打開一個完全的TCP連接配接。它發送一個SYN封包, 就像您真的要打開一個連接配接,然後等待響應。 SYN/ACK表示端口在監聽 (開放),而 RST (複位)表示沒有監聽者。如果數次重發後仍沒響應, 該端口就被标記為被過濾。如果收到ICMP不可到達錯誤 (類型3,代碼1,2,3,9,10,或者13),該端口也被标記為被過濾。
-
-sT (TCP connect()掃描)
當SYN掃描不能用時,CP Connect()掃描就是預設的TCP掃描。 當使用者沒有權限發送原始封包或者掃描IPv6網絡時,就是這種情況。 Instead of writing raw packets as most other scan types do,Nmap通過建立connect() 系統調用要求作業系統和目标機以及端口建立連接配接,而不像其它掃描類型直接發送原始封包。 這是和Web浏覽器,P2P用戶端以及大多數其它網絡應用程式用以建立連接配接一樣的 高層系統調用。它是叫做Berkeley Sockets API程式設計接口的一部分。Nmap用 該API獲得每個連接配接嘗試的狀态資訊,而不是讀取響應的原始封包。
當SYN掃描可用時,它通常是更好的選擇。因為Nmap對高層的 connect()調用比對原始封包控制更少, 是以前者效率較低。 該系統調用完全連接配接到開放的目标端口而不是像SYN掃描進行 半開放的複位。這不僅花更長時間,需要更多封包得到同樣資訊,目标機也更可能 記錄下連接配接。IDS(入侵檢測系統)可以捕獲兩者,但大部分機器沒有這樣的警報系統。 當Nmap連接配接,然後不發送資料又關閉連接配接, 許多普通UNIX系統上的服務會在syslog留下記錄,有時候是一條加密的錯誤消息。 此時,有些真正可憐的服務會崩潰,雖然這不常發生。如果管理者在日志裡看到來自同一系統的 一堆連接配接嘗試,她應該知道她的系統被掃描了。
-
-sU (UDP掃描)
雖然網際網路上很多流行的服務運作在TCP 協定上,UDP服務也不少。 DNS,SNMP,和DHCP (注冊的端口是53,161/162,和67/68)是最常見的三個。 因為UDP掃描一般較慢,比TCP更困難,一些安全稽核人員忽略這些端口。 這是一個錯誤,因為可探測的UDP服務相當普遍,攻擊者當然不會忽略整個協定。 所幸,Nmap可以幫助記錄并報告UDP端口。
UDP掃描用-sU選項激活。它可以和TCP掃描如 SYN掃描 (-sS)結合使用來同時檢查兩種協定。
UDP掃描發送空的(沒有資料)UDP報頭到每個目标端口。 如果傳回ICMP端口不可到達錯誤(類型3,代碼3), 該端口是closed(關閉的)。 其它ICMP不可到達錯誤(類型3, 代碼1,2,9,10,或者13)表明該端口是filtered(被過濾的)。 偶爾地,某服務會響應一個UDP封包,證明該端口是open(開放的)。 如果幾次重試後還沒有響應,該端口就被認為是 open|filtered(開放|被過濾的)。 這意味着該端口可能是開放的,也可能包過濾器正在封鎖通信。 可以用版本掃描(-sV)幫助區分真正的開放端口和被過濾的端口。
UDP掃描的巨大挑戰是怎樣使它更快速。 開放的和被過濾的端口很少響應,讓Nmap逾時然後再探測,以防探測幀或者 響應丢失。關閉的端口常常是更大的問題。 它們一般發回一個ICMP端口無法到達錯誤。但是不像關閉的TCP端口響應SYN或者Connect 掃描所發送的RST封包,許多主機在預設情況下限制ICMP端口不可到達消息。 Linux和Solaris對此特别嚴格。例如, Linux 2.4.20核心限制一秒鐘隻發送一條目标不可到達消息 (見net/ipv4/icmp。c)。
Nmap探測速率限制并相應地減慢來避免用那些目标機會丢棄的無用封包來阻塞 網絡。不幸的是,Linux式的一秒鐘一個封包的限制使65,536個端口的掃描要花 18小時以上。加速UDP掃描的方法包括并發掃描更多的主機,先隻對主要端口進行快速 掃描,從防火牆後面掃描,使用–host-timeout跳過慢速的 主機。
-
-sN; -sF; -sX (TCP Null,FIN,and Xmas掃描)
這三種掃描類型 (甚至用下一節描述的 –scanflags 選項的更多類型) 在TCP RFC 中發掘了一個微妙的方法來區分open(開放的)和 closed(關閉的)端口。第65頁說“如果 [目标]端口狀态是關閉的…. 進入的不含RST的封包導緻一個RST響應。” 接下來的一頁 讨論不設定SYN,RST,或者ACK位的封包發送到開放端口: “理論上,這不應該發生,如果您确實收到了,丢棄該封包,傳回。 ”
如果掃描系統遵循該RFC,當端口關閉時,任何不包含SYN,RST,或者ACK位的封包會導緻 一個RST傳回,而當端口開放時,應該沒有任何響應。隻要不包含SYN,RST,或者ACK, 任何其它三種(FIN,PSH,and URG)的組合都行。Nmap有三種掃描類型利用這一點:
Null掃描 (-sN)
不設定任何标志位(tcp标志頭是0)
FIN掃描 (-sF)
隻設定TCP FIN标志位。
Xmas掃描 (-sX)
設定FIN,PSH,和URG标志位,就像點亮聖誕樹上所有的燈一樣。
除了探測封包的标志位不同,這三種掃描在行為上完全一緻。 如果收到一個RST封包,該端口被認為是 closed(關閉的),而沒有響應則意味着 端口是open|filtered(開放或者被過濾的)。 如果收到ICMP不可到達錯誤(類型 3,代号 1,2,3,9,10,或者13),該端口就被标記為 被過濾的。
這些掃描的關鍵優勢是它們能躲過一些無狀态防火牆和封包過濾路由器。 另一個優勢是這些掃描類型甚至比SYN掃描還要隐秘一些。但是别依賴它 – 多數 現代的IDS産品可以發現它們。一個很大的不足是并非所有系統都嚴格遵循RFC 793。 許多系統不管端口開放還是關閉,都響應RST。 這導緻所有端口都标記為closed(關閉的)。 這樣的作業系統主要有Microsoft Windows,許多Cisco裝置,BSDI,以及IBM OS/400。 但是這種掃描對多數UNIX系統都能工作。這些掃描的另一個不足是 它們不能辨識open(開放的)端口和一些特定的 filtered(被過濾的)端口,進而傳回 open|filtered(開放或者被過濾的)。
-
-sA (TCP ACK掃描)
這種掃描與目前為止讨論的其它掃描的不同之處在于 它不能确定open(開放的)或者 open|filtered(開放或者過濾的))端口。 它用于發現防火牆規則,确定它們是有狀态的還是無狀态的,哪些端口是被過濾的。
ACK掃描探測封包隻設定ACK标志位(除非您使用 –scanflags)。當掃描未被過濾的系統時, open(開放的)和closed(關閉的) 端口 都會傳回RST封包。Nmap把它們标記為 unfiltered(未被過濾的),意思是 ACK封包不能到達,但至于它們是open(開放的)或者 closed(關閉的) 無法确定。不響應的端口 或者發送特定的ICMP錯誤消息(類型3,代号1,2,3,9,10, 或者13)的端口,标記為 filtered(被過濾的)。
-
-sW (TCP視窗掃描)
除了利用特定系統的實作細節來區分開放端口和關閉端口,當收到RST時不總是列印unfiltered, 視窗掃描和ACK掃描完全一樣。 它通過檢查傳回的RST封包的TCP視窗域做到這一點。 在某些系統上,開放端口用正數表示視窗大小(甚至對于RST封包) 而關閉端口的視窗大小為0。是以,當收到RST時,視窗掃描不總是把端口标記為 unfiltered, 而是根據TCP視窗值是正數還是0,分别把端口标記為open或者 closed
該掃描依賴于網際網路上少數系統的實作細節, 是以您不能永遠相信它。不支援它的系統會通常傳回所有端口closed。 當然,一台機器沒有開放端口也是有可能的。 如果大部分被掃描的端口是 closed,而一些常見的端口 (如 22, 25,53) 是 filtered,該系統就非常可疑了。 偶爾地,系統甚至會顯示恰恰相反的行為。 如果您的掃描顯示1000個開放的端口和3個關閉的或者被過濾的端口, 那麼那3個很可能也是開放的端口。
-
-sM (TCP Maimon掃描)
Maimon掃描是用它的發現者Uriel Maimon命名的。他在 Phrack Magazine issue #49 (November 1996)中描述了這一技術。 Nmap在兩期後加入了這一技術。 這項技術和Null,FIN,以及Xmas掃描完全一樣,除了探測封包是FIN/ACK。 根據RFC 793 (TCP),無論端口開放或者關閉,都應該對這樣的探測響應RST封包。 然而,Uriel注意到如果端口開放,許多基于BSD的系統隻是丢棄該探測封包。
-
–scanflags (定制的TCP掃描)
真正的Nmap進階使用者不需要被這些現成的掃描類型束縛。 –scanflags選項允許您通過指定任意TCP标志位來設計您自己的掃描。 讓您的創造力流動,躲開那些僅靠本手冊添加規則的入侵檢測系統!
–scanflags選項可以是一個數字标記值如9 (PSH和FIN), 但使用字元名更容易些。 隻要是URG, ACK,PSH, RST,SYN,and FIN的任何組合就行。例如,–scanflags URGACKPSHRSTSYNFIN設定了所有标志位,但是這對掃描沒有太大用處。 标志位的順序不重要。
除了設定需要的标志位,您也可以設定 TCP掃描類型(如-sA或者-sF)。 那個基本類型告訴Nmap怎樣解釋響應。例如, SYN掃描認為沒有響應意味着 filtered端口,而FIN掃描則認為是 open|filtered。 除了使用您指定的TCP标記位,Nmap會和基本掃描類型一樣工作。 如果您不指定基本類型,就使用SYN掃描。
-
-sI < zombie host[:probeport] > (Idlescan)
這種進階的掃描方法允許對目标進行真正的TCP端口盲掃描 (意味着沒有封包從您的真實IP位址發送到目标)。
除了極端隐蔽(由于它不從真實IP位址發送任何封包), 該掃描類型可以建立機器間的基于IP的信任關系。 端口清單從zombie 主機的角度。顯示開放的端口。 是以您可以嘗試用您認為(通過路由器/包過濾規則)可能被信任的 zombies掃描目标。
如果您由于IPID改變希望探測zombie上的特定端口, 您可以在zombie 主機後加上一個冒号和端口号。 否則Nmap會使用預設端口(80)。
-
-sO (IP協定掃描)
IP 協定掃描可以讓您确定目标機支援哪些IP協定 (TCP,ICMP,IGMP,等等)。從技術上說,這不是端口掃描 ,既然它周遊的是IP協定号而不是TCP或者UDP端口号。 但是它仍使用 -p選項選擇要掃描的協定号, 用正常的端口表格式報告結果,甚至用和真正的端口掃描一樣 的掃描引擎。是以它和端口掃描非常接近,也被放在這裡讨論。
除了本身很有用,協定掃描還顯示了開源軟體的力量。 盡管基本想法非常簡單,我過去從沒想過增加這一功能也沒收到任何對它的請求。 在2000年夏天,Gerhard Rieger孕育了這個想法,寫了一個很棒的更新檔程式,發送到nmap-hackers郵件清單。 我把那個更新檔加入了Nmap,第二天釋出了新版本。 幾乎沒有商業軟體會有使用者有足夠的熱情設計并貢獻他們的改進。
協定掃描以和UDP掃描類似的方式工作。它不是在UDP封包的端口域上循環, 而是在IP協定域的8位上循環,發送IP封包頭。 封包頭通常是空的,不包含資料,甚至不包含所申明的協定的正确封包頭 TCP,UDP,和ICMP是三個例外。它們三個會使用正常的協定頭,因為否則某些系 統拒絕發送,而且Nmap有函數建立它們。協定掃描不是注意ICMP端口不可到達消息, 而是ICMP 協定不可到達消息。如果Nmap從目标主機收到 任何協定的任何響應,Nmap就把那個協定标記為open。 ICMP協定不可到達 錯誤(類型 3,代号 2) 導緻協定被标記為 closed。其它ICMP不可到達協定(類型 3,代号 1,3,9,10,或者13) 導緻協定被标記為 filtered (雖然同時他們證明ICMP是 open )。如果重試之後仍沒有收到響應, 該協定就被标記為open|filtered
-
-b (FTP彈跳掃描)
FTP協定的一個有趣特征(RFC 959) 是支援所謂代理ftp連接配接。它允許使用者連接配接到一台FTP伺服器,然後要求檔案送到一台第三方伺服器。 這個特性在很多層次上被濫用,是以許多伺服器已經停止支援它了。其中一種就是導緻FTP伺服器對其它主機端口掃描。 隻要請求FTP伺服器輪流發送一個檔案到目标主機上的所感興趣的端口。 錯誤消息會描述端口是開放還是關閉的。 這是繞過防火牆的好方法,因為FTP伺服器常常被置于可以通路比Web主機更多其它内部主機的位置。 Nmap用-b選項支援ftp彈跳掃描。參數格式是 :@:。 是某個脆弱的FTP伺服器的名字或者IP位址。 您也許可以省略:, 如果伺服器上開放了匿名使用者(user:anonymous password:[email protected])。 端口号(以及前面的冒号) 也可以省略,如果使用預設的FTP端口(21)。
當Nmap1997年釋出時,這個弱點被廣泛利用,但現在大部分已經被fix了。 脆弱的伺服器仍然存在,是以如果其它都失敗了,這也值得一試。 如果您的目标是繞過防火牆,掃描目标網絡上的開放的21端口(或者 甚至任何ftp服務,如果您用版本探測掃描所有端口), 然後對每個嘗試彈跳掃描。Nmap會告訴您該主機脆弱與否。 如果您隻是試着玩Nmap,您不必(事實上,不應該)限制您自己。 在您随機地在網際網路上尋找脆弱的FTP伺服器時,考慮一下系統管理者不太喜歡您這樣濫用他們的伺服器。