如果沒有給出主機發現的選項,Nmap 就發送一個TCP ACK報文到80連接埠和一個ICMP回聲請求到每台目標機器。 一個例外是ARP掃描用於區域網路上的任何目標機器。對於非特權UNIX shell使用者,使用connect()系統調用會發送一個SYN報文而不是ACK 這些預設行為和使用-PA -PE選項的效果相同。 掃描區域網路時,這種主機發現一般夠用了,但是對於安全性稽核,建議進行 更加全面的探測。
-
-sL (列表掃描)
-
列表掃描是主機發現的退化形式,它僅僅列出指定網路上的每台主機, 不發送任何報文到目標主機。預設情況下,Nmap仍然對主機進行反向網域名稱解析以擷取 它們的名字。簡單的主機名稱能給出的有用資訊常常令人驚訝。例如,
fw.chi.playboy.com是花花公子芝加哥辦公室的 防火牆。Nmap最後還會報告IP地址的總數。列表掃描可以很好的確保您擁有正確的目標IP。 如果主機的網域名稱出乎您的意料,那麼就值得進一步檢查以防錯誤地掃描其它組織的網路。
既然只是列印目標主機的列表,像其它一些進階功能如連接埠掃描,作業系統探測或者Ping掃描 的選項就沒有了。如果您希望關閉ping掃描而仍然執行這樣的進階功能,請繼續閱讀關於
-P0選項的介紹。
-
-sP (Ping掃描)
-
該選項告訴Nmap僅僅 進行ping掃描 (主機發現),然後列印出對掃描做出響應的那些主機。 沒有進一步的測試 (如連接埠掃描或者作業系統探測)。 這比列表掃描更積極,常常用於 和列表掃描相同的目的。它可以得到些許目標網路的資訊而不被特別注意到。 對於攻擊者來說,瞭解多少主機正在運行比列表掃描提供的一列IP和主機名稱往往更有價值。
系統管理員往往也很喜歡這個選項。 它可以很方便地得出 網路上有多少機器正在運行或者監視伺服器是否正常運行。常常有人稱它為 地毯式ping,它比ping廣播位址更可靠,因為許多主機對廣播請求不響應。
-sP選項在預設情況下, 發送一個ICMP回聲請求和一個TCP報文到80連接埠。如果非特權使用者執行,就發送一個SYN報文 (用connect()系統調用)到目標機的80連接埠。 當特權使用者掃描區域網路上的目標機時,會發送ARP請求(-PR), ,除非使用了--send-ip選項。
-sP選項可以和除-P0)之外的任何發現探測類型-P* 選項結合使用以達到更大的靈活性。 一旦使用了任何探測類型和連接埠選項,預設的探測(ACK和回應請求)就被覆蓋了。 當防守嚴密的防火牆位於運行Nmap的源主機和目標網路之間時, 推薦使用那些進階選項。否則,當防火牆捕獲並丟棄探測包或者響應包時,一些主機就不能被探測到。
-
-P0 (無ping)
-
該選項完全跳過Nmap發現階段。 通常Nmap在進行高強度的掃描時用它確定正在啟動並執行機器。 預設情況下,Nmap只對正在啟動並執行主機進行高強度的探測如 連接埠掃描,版本探測,或者作業系統探測。用-P0禁止 主機發現會使Nmap對每一個指定的目標IP地址 進行所要求的掃描。所以如果在命令列指定一個B類目標地址空間(/16), 所有 65,536 個IP地址都會被掃描。
-P0的第二個字元是數字0而不是字母O。 和列表掃描一樣,跳過正常的主機發現,但不是列印一個目標列表, 而是繼續執行所要求的功能,就好像每個IP都是活動的。
-
-PS [portlist] (TCP SYN Ping)
-
該選項發送一個設定了SYN標誌位的空TCP報文。 預設目的連接埠為80 (可以通過改變nmap.h) 檔案中的DEFAULT-TCP-PROBE-PORT值進行配置,但不同的連接埠也可以作為選項指定。 甚至可以指定一個以逗號分隔的連接埠列表(如
-PS22,23,25,80,113,1050,35000), 在這種情況下,每個連接埠會被並發地掃描。
SYN標誌位告訴對方您正試圖建立一個串連。 通常目標連接埠是關閉的,一個RST (複位) 包會發回來。 如果碰巧連接埠是開放的,目標會進行TCP三步握手的第二步,回應 一個SYN/ACK TCP報文。然後運行Nmap的機器則會扼殺這個正在建立的串連, 發送一個RST而非ACK報文,否則,一個完全的串連將會建立。 RST報文是運行Nmap的機器而不是Nmap本身響應的,因為它對收到 的SYN/ACK感到很意外。
Nmap並不關心連接埠開放還是關閉。 無論RST還是SYN/ACK響應都告訴Nmap該主機正在運行。
在UNIX機器上,通常只有特權使用者 root 能否發送和接收 原始的TCP報文。因此作為一個變通的方法,對於非特權使用者, Nmap會為每個目標主機進行系統調用connect(),它也會發送一個SYN 報文來嘗試建立串連。如果connect()迅速返回成功或者一個ECONNREFUSED 失敗,下面的TCP堆棧一定已經收到了一個SYN/ACK或者RST,該主機將被 標誌位為在運行。 如果連線逾時了,該主機就標誌位為down掉了。這種方法也用於IPv6
串連,因為Nmap目前還不支援原始的IPv6報文。
-
-PA [portlist] (TCP ACK Ping)
-
TCP ACK ping和剛才討論的SYN ping相當類似。 也許您已經猜到了,區別就是設定TCP的ACK標誌位而不是SYN標誌位。
ACK報文表示確認一個建立串連的嘗試,但該串連尚未完全建立。 所以遠程主機應該總是回應一個RST報文, 因為它們並沒有發出過串連請求到運行Nmap的機器,如果它們正在啟動並執行話。
-PA選項使用和SYN探測相同的預設連接埠(80),也可以 用相同的格式指定目標連接埠列表。如果非特權使用者嘗試該功能, 或者指定的是IPv6目標,前面說過的connect()方法將被使用。 這個方法並不完美,因為它實際上發送的是SYN報文,而不是ACK報文。
提供SYN和ACK兩種ping探測的原因是使通過防火牆的機會儘可能大。 許多管理員會配置他們的路由器或者其它簡單的防火牆來封鎖SYN報文,除非 串連目標是那些公開的伺服器像公司網站或者郵件伺服器。 這可以阻止其它進入組織的串連,同時也允許使用者訪問互連網。 這種無狀態的方法幾乎不佔用防火牆/路由器的資源,因而被硬體和軟體過濾器 廣泛支援。Linux Netfilter/iptables 防火牆軟體提供方便的
--syn選項來實現這種無狀態的方法。 當這樣的無狀態防火牆規則存在時,發送到關閉目標連接埠的SYN ping探測 (-PS) 很可能被封鎖。這種情況下,ACK探測格外有閃光點,因為它正好利用了 這樣的規則。
另外一種常用的防火牆用有狀態的規則來封鎖非預期的報文。 這一特性已開始只存在於高端防火牆,但是這些年類它越來越普遍了。 Linux Netfilter/iptables 通過
--state選項支援這一特性,它根據串連狀態把報文 進行分類。SYN探測更有可能用於這樣的系統,由於沒頭沒腦的ACK報文 通常會被識別成偽造的而丟棄。解決這個兩難的方法是通過即指定
-PS又指定-PA來即發送SYN又發送ACK。
-
-PU [portlist] (UDP Ping)
-
還有一個主機發現的選項是UDP ping,它發送一個空的(除非指定了--data-length UDP報文到給定的連接埠。連接埠列表的格式和前面討論過的-PS和-PA選項還是一樣。
如果不指定連接埠,預設是31338。該預設值可以通過在編譯時間改變nmap.h檔案中的 DEFAULT-UDP-PROBE-PORT值進行配置。預設使用這樣一個奇怪的連接埠是因為對開放連接埠 進行這種掃描一般都不受歡迎。
如果目標機器的連接埠是關閉的,UDP探測應該馬上得到一個ICMP連接埠無法到達的回應報文。 這對於Nmap意味著該機器正在運行。 許多其它類型的ICMP錯誤,像主機/網路無法到達或者TTL逾時則表示down掉的或者不可到達的主機。 沒有回應也被這樣解釋。如果到達一個開放的連接埠,大部分服務僅僅忽略這個 空報文而不做任何回應。這就是為什麼預設探測連接埠是31338這樣一個 極不可能被使用的連接埠。少數服務如chargen會響應一個空的UDP報文, 從而向Nmap表明該機器正在運行。
該掃描類型的主要優勢是它可以穿越只過濾TCP的防火牆和過濾器。 例如。我曾經有過一個Linksys BEFW11S4無線寬頻路由器。預設情況下, 該裝置對外的網卡過濾所有TCP連接埠,但UDP探測仍然會引發一個連接埠不可到達 的訊息,從而暴露了它自己。
-
-PE;
-PP; -PM (ICMP Ping Types)
-
除了前面討論的這些不常見的TCP和UDP主機發現類型, Nmap也能發送世人皆知的ping 程式所發送的報文。Nmap發送一個ICMP type 8 (回聲請求)報文到目標IP地址, 期待從啟動並執行主機得到一個type 0 (回聲響應)報文。 對於網路探索者而言,不幸的是,許多主機和 防火牆現在封鎖這些報文,而不是按期望的那樣響應, 參見RFC
1122。因此,僅僅ICMP掃描對於互連網上的目標通常是不夠的。 但對於系統管理員監視一個內部網路,它們可能是實際有效途徑。 使用-PE選項開啟該回聲請求功能。
雖然回聲請求是標準的ICMP ping查詢, Nmap並不止於此。ICMP標準 (RFC 792)還規範了時間戳記請求,資訊請求 request,和位址遮罩請求,它們的代碼分別是13,15和17。 雖然這些查詢的表面目的是擷取資訊如位址遮罩和目前時間, 它們也可以很容易地用於主機發現。 很簡單,回應的系統就是在啟動並執行系統。Nmap目前沒有實現資訊請求報文,
因為它們還沒有被廣泛支援。RFC 1122 堅持 “主機不應該實現這些訊息”。 時間戳記和位址遮罩查詢可以分別用-PP和-PM選項發送。 時間戳記響應(ICMP代碼14)或者位址遮罩響應(代碼18)表示主機在運行。 當管理員特別封鎖了回聲請求報文而忘了其它ICMP查詢可能用於 相同目的時,這兩個查詢可能很有價值。
-
-PR (ARP Ping)
-
最常見的Nmap使用情境之一是掃描一個以太區域網路。 在大部分區域網路上,特別是那些使用基於 RFC1918私人位址範圍的網路,在一個給定的時間絕大部分 IP地址都是不使用的。 當Nmap試圖發送一個原始IP報文如ICMP回聲請求時, 作業系統必須確定對應於目標IP的硬體 地址(ARP),這樣它才能把以太幀送往正確的地址。 這一般比較慢而且會有些問題,因為作業系統設計者認為一般不會在短時間內 對沒有啟動並執行機器作幾百萬次的ARP請求。
當進行ARP掃描時,Nmap用它最佳化的演算法管理ARP請求。 當它收到響應時, Nmap甚至不需要擔心基於IP的ping報文,既然它已經知道該主機正在運行了。 這使得ARP掃描比基於IP的掃描更快更可靠。 所以預設情況下,如果Nmap發現目標主機就在它所在的區域網路上,它會進行ARP掃描。 即使指定了不同的ping類型(如
-PI或者 -PS) ,Nmap也會對任何相同區域網路上的目標機使用ARP。 如果您真的不想要ARP掃描,指定
--send-ip。
-
-n (不用網域名稱解析)
-
告訴Nmap 永不對它發現的活動IP地址進行反向網域名稱解析。 既然DNS一般比較慢,這可以讓事情更快些。
-
-R (為所有目標解析網域名稱)
-
告訴Nmap 永遠 對目標IP地址作反向網域名稱解析。 一般只有當發現機器正在運行時才進行這項操作。
-
--system-dns (使用系統網域名稱解析器)
-
預設情況下,Nmap通過直接發送查詢到您的主機上配置的網域名稱伺服器 來解析網域名稱。為了提高效能,許多請求 (一般幾十個 ) 並發執行。如果您希望使用系統內建的解析器,就指定該選項 (通過getnameinfo()調用一次解析一個IP)。除非Nmap的DNS代碼有bug--如果是這樣,請聯絡我們。 一般不使用該選項,因為它慢多了。系統解析器總是用於IPv6掃描。