nmap官方文件

observerk發表於2024-06-13

名稱

nmap — 網路探測工具和安全/埠掃描器
理論
滲透測試流程以及每個階段需要做的事情
與客戶確認測試範圍——獲得授權書——資訊收集——漏洞挖掘——漏洞利用——後滲透——痕跡清除——生成滲透測試報告
專案啟動:事先與客戶溝通,測試事項、獲得授權、保密協議測試物件和範圍,測試環境,測試方式黑盒白盒灰盒, 是否包括破壞性測試
專案準備:編寫測試方案,測試工具和應急預案,
測試實施:資訊收集、脆弱性測試、問題驗證、關聯資料收集
測試彙報:測試資料、問題彙總、解決措施、測試報告、彙報PPT
資訊收集需要收集的內容,以及收集的方式
資訊收集的方式可以分為兩種:主動和被動。

主動資訊收集:透過直接訪問、掃描網站,這種流量將流經網站

被動資訊收集:利用第三方的服務對目標進行訪問了解,比例:Google搜尋、Shodan搜尋等。

資訊收集方式:掃描(埠掃描、漏洞掃描)、公開資訊(搜尋引擎、網站、論壇、媒體報導、微步社群、潮汐指紋、站長之家、子域名挖掘、備案號)、其他方式(釣魚郵件、社工)

蒐集的內容:

(1)埠
一個網站可能會開放多個不同的埠,而我們可以透過同一網站的不同埠進行測試,掃描開放埠的方法有很多,這裡我分為兩種:第一種線上埠掃描,第二種利用工具掃描埠。比較常見的線上埠掃描網站有:線上埠掃描,IP/伺服器埠線上掃描-TooL.cc、線上埠檢測,埠掃描,埠開放檢查-線上工具-postjson等;埠掃描工具有nmap,goby等。

(2)子域名
目標的子域是一個重要的測試點,你收集到的可用的子域名越多,意味著你的機會也就越多,所以說要儘可能的收集目標的子域名。子域名的收集方法有很多,這裡我分為兩種:第一種線上子域名收集。第二種利用工具進行子域名收集。比較常見的線上子域名搜尋(爆破)的網站有:線上子域名爆破-子成君提供、線上子域名查詢等;子域名掃描工具有oneforall、layer子域名挖掘機、SubDomainsBrute等。

(3)C段旁註
當我們 對於目標主機無計可施時,我們可以嘗試一下從C段或者旁註入手。C段入侵是拿下同一C段下的伺服器,也就是說是D段1-255中的一臺伺服器,然後直接從被端掉的伺服器出發進行其他測試;旁註的意思就是從同臺伺服器上的其他網站入手,提權,然後把伺服器拿下了,就自然把那個網站拿下了。兩者的區別:C段:同網段不同伺服器,旁註:同伺服器不同站點。C段旁註掃描:同IP網站查詢,C段查詢,IP反查域名,C段旁註,旁註工具

(4)目錄(敏感資訊)
目錄掃描也是一個滲透測試的重要點,如果你能從目錄中找到一些敏感資訊,那麼你的滲透過程就會輕鬆很多。例如掃描出後臺,原始碼,robots.txt的敏感目錄或者敏感資訊。目錄掃描我分為兩種:一種時線上目錄掃描,一種是利用工具掃描目錄。
線上目錄掃描可以使用Google語法然後利用我們平時用的搜尋引擎(搜狗,百度,bing,Google等)進行搜尋。

NMAP有哪些功能(寫出引數)
nmap -sn -T4 192.168.8.0/24 //-sn掃描這個網段的IP -T設定掃描速度級別最大為5最快
nmap -A 192.168.8.156 // -A是完全掃描
-v 輸出掃描過程
-sV 掃描系統和服務版本
-O 掃描作業系統版本
–version-light做輕量級掃描
-sS syn半開放掃描
-sU UDP 掃描
-p 指定埠範圍,預設掃描1000個埠
-Pn不做ping掃描
-sn只做ping掃描,不做埠掃描
-F fast模式,只掃描常見服務埠,比預設埠少

大綱

nmap [ <掃描型別> ...] [ <選項> ] { <掃描目標說明> }

描述

[注意] 注意
本文件描述了Nmap版本4.50。最新文件以英語 https://nmap.org/book/man.html提供。

Nmap (“Network Mapper(網路對映器)”) 是一款開放原始碼的 網路探測和安全稽核的工具。它的設計目標是快速地掃描大型網路,當然用它掃描單個 主機也沒有問題。Nmap以新穎的方式使用原始IP報文來發現網路上有哪些主機,那些 主機提供什麼服務(應用程式名和版本),那些服務執行在什麼作業系統(包括版本資訊), 它們使用什麼型別的報文過濾器/防火牆,以及一堆其它功能。雖然Nmap通常用於安全稽核, 許多系統管理員和網路管理員也用它來做一些日常的工作,比如檢視整個網路的資訊, 管理服務升級計劃,以及監視主機和服務的執行。

Nmap輸出的是掃描目標的列表,以及每個目標的補充資訊,至於是哪些資訊則依賴於所使用的選項。 “所感興趣的埠表格”是其中的關鍵。那張表列出埠號,協議,服務名稱和狀態。狀態可能是 open(開放的),filtered(被過濾的), closed(關閉的),或者unfiltered(未被過濾的)。 Open(開放的)意味著目標機器上的應用程式正在該埠監聽連線/報文。 filtered(被過濾的) 意味著防火牆,過濾器或者其它網路障礙阻止了該埠被訪問,Nmap無法得知 它是 open(開放的) 還是 closed(關閉的)。 closed(關閉的) 埠沒有應用程式在它上面監聽,但是他們隨時可能開放。 當埠對Nmap的探測做出響應,但是Nmap無法確定它們是關閉還是開放時,這些埠就被認為是 unfiltered(未被過濾的) 如果Nmap報告狀態組合 open|filteredclosed|filtered時,那說明Nmap無法確定該埠處於兩個狀態中的哪一個狀態。 當要求進行版本探測時,埠表也可以包含軟體的版本資訊。當要求進行IP協議掃描時 (-sO),Nmap提供關於所支援的IP協議而不是正在監聽的埠的資訊。

除了所感興趣的埠表,Nmap還能提供關於目標機的進一步資訊,包括反向域名,作業系統猜測,裝置型別,和MAC地址。

一個典型的Nmap掃描如例 1 “一個典型的Nmap掃描”所示。在這個例子中,唯一的選項是-A, 用來進行作業系統及其版本的探測,-T4 可以加快執行速度,接著是兩個目標主機名。

例 1. 一個典型的Nmap掃描

# nmap -A -T4 scanme.nmap.org playground

Starting nmap ( https://nmap.org/ )
Interesting ports on scanme.nmap.org (205.217.153.62):
(The 1663 ports scanned but not shown below are in state: filtered)
port    STATE  SERVICE VERSION
22/tcp  open   ssh     OpenSSH 3.9p1 (protocol 1.99)
53/tcp  open   domain
70/tcp  closed gopher
80/tcp  open   http    Apache httpd 2.0.52 ((Fedora))
113/tcp closed auth
Device type: general purpose
Running: Linux 2.4.X|2.5.X|2.6.X
OS details: Linux 2.4.7 - 2.6.11,Linux 2.6.0 - 2.6.11
Uptime 33。908 days (since Thu Jul 21 03:38:03 2005)

Interesting ports on playground。nmap。或者g (192.168.0.40):
(The 1659 ports scanned but not shown below are in state: closed)
port     STATE SERVICE       VERSION
135/tcp  open  msrpc         Microsoft Windows RPC
139/tcp  open  netbios-ssn
389/tcp  open  ldap?
445/tcp  open  microsoft-ds  Microsoft Windows XP microsoft-ds
1002/tcp open  windows-icfw?
1025/tcp open  msrpc         Microsoft Windows RPC
1720/tcp open  H.323/Q.931   CompTek AquaGateKeeper
5800/tcp open  vnc-http      RealVNC 4.0 (Resolution 400x250; VNC TCP port: 5900)
5900/tcp open  vnc           VNC (protocol 3.8)
MAC Address: 00:A0:CC:63:85:4B (Lite-on Communications)
Device type: general purpose
Running: Microsoft Windows NT/2K/XP
OS details: Microsoft Windows XP Pro RC1+ through final release
Service Info: OSs: Windows,Windows XP

Nmap finished: 2 IP addresses (2 hosts up) scanned in 88.392 seconds

主機發現

任何網路探測任務的最初幾個步驟之一就是把一組IP範圍(有時該範圍是巨大的)縮小為 一列活動的或者您感興趣的主機。掃描每個IP的每個埠很慢,通常也沒必要。 當然,什麼樣的主機令您感興趣主要依賴於掃描的目的。網管也許只對執行特定服務的 主機感興趣,而從事安全的人士則可能對一個馬桶都感興趣,只要它有IP地址:-)。一個系統管理員 也許僅僅使用Ping來定位內網上的主機,而一個外部入侵測試人員則可能絞盡腦汁用各種方法試圖 突破防火牆的封鎖。

由於主機發現的需求五花八門,Nmap提供了一籮筐的選項來定製您的需求。 主機發現有時候也叫做ping掃描,但它遠遠超越用世人皆知的ping工具 傳送簡單的ICMP回聲請求報文。使用者完全可以透過使用列表掃描(-sL)或者 透過關閉ping (-P0)跳過ping的步驟,也可以使用多個埠把TCP SYN/ACK,UDP和ICMP 任意組合起來玩一玩。這些探測的目的是獲得響應以顯示某個IP地址是否是活動的(正在被某 主機或者網路裝置使用)。 在許多網路上,在給定的時間,往往只有小部分的IP地址是活動的。 這種情況在基於RFC1918的私有地址空間如10.0.0.0/8尤其普遍。 那個網路有16,000,000個IP,但我見過一些使用它的公司連1000臺機器都沒有。 主機發現能夠找到零星分佈於IP地址海洋上的那些機器。

如果沒有給出主機發現的選項,Nmap 就傳送一個TCP ACK報文到80埠和一個ICMP回聲請求到每臺目標機器。 一個例外是ARP掃描用於區域網上的任何目標機器。對於非特權UNIX shell使用者,使用connect()系統呼叫會傳送一個SYN報文而不是ACK 這些預設行為和使用-PA -PE選項的效果相同。 掃描區域網時,這種主機發現一般夠用了,但是對於安全稽核,建議進行 更加全面的探測。

-P*選項(用於選擇 ping的型別)可以被結合使用。 您可以透過使用不同的TCP埠/標誌位和ICMP碼傳送許多探測報文 來增加穿透防守嚴密的防火牆的機會。另外要注意的是即使您指定了其它 -P*選項,ARP發現(-PR)對於區域網上的 目標而言是預設行為,因為它總是更快更有效。

下列選項控制主機發現。

  • -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掃描

埠掃描基礎

雖然Nmap這些年來功能越來越多, 它也是從一個高效的埠掃描器開始的,並且那仍然是它的核心功能。 nmap *<target>*這個簡單的命令掃描主機<target>上的超過 1660個TCP埠。 。許多傳統的埠掃描器只列出所有埠是開放還是關閉的, Nmap的資訊粒度比它們要細得多。 它把埠分成六個狀態: open(開放的), closed(關閉的),filtered(被過濾的), unfiltered(未被過濾的), open|filtered(開放或者被過濾的),或者 closed|filtered(關閉或者被過濾的)

這些狀態並非埠本身的性質,而是描述Nmap怎樣看待它們。例如, 對於同樣的目標機器的135/tcp埠,從同網路掃描顯示它是開放的,而跨網路作完全相同的掃描則可能顯示它是 filtered(被過濾的)。

Nmap所識別的6個埠狀態。

  • open(開放的)

    應用程式正在該埠接收TCP 連線或者UDP報文。發現這一點常常是埠掃描 的主要目標。安全意識強的人們知道每個開放的埠 都是攻擊的入口。攻擊者或者入侵測試者想要發現開放的埠。 而管理員則試圖關閉它們或者用防火牆保護它們以免妨礙了合法使用者。 非安全掃描可能對開放的埠也感興趣,因為它們顯示了網路上那些服務可供使用。

  • closed(關閉的)

    關閉的埠對於Nmap也是可訪問的(它接受Nmap的探測報文並作出響應), 但沒有應用程式在其上監聽。 它們可以顯示該IP地址上(主機發現,或者ping掃描)的主機正在執行up 也對部分作業系統探測有所幫助。 因為關閉的關口是可訪問的,也許過會兒值得再掃描一下,可能一些又開放了。 系統管理員可能會考慮用防火牆封鎖這樣的埠。 那樣他們就會被顯示為被過濾的狀態,下面討論。

  • filtered(被過濾的)

    由於包過濾阻止探測報文到達埠, Nmap無法確定該埠是否開放。過濾可能來自專業的防火牆裝置,路由器規則 或者主機上的軟體防火牆。這樣的埠讓攻擊者感覺很挫折,因為它們幾乎不提供 任何資訊。有時候它們響應ICMP錯誤訊息如型別3程式碼13 (無法到達目標: 通訊被管理員禁止),但更普遍的是過濾器只是丟棄探測幀, 不做任何響應。 這迫使Nmap重試若干次以訪萬一探測包是由於網路阻塞丟棄的。 這使得掃描速度明顯變慢。

  • unfiltered(未被過濾的)

    未被過濾狀態意味著埠可訪問,但Nmap不能確定它是開放還是關閉。 只有用於對映防火牆規則集的ACK掃描才會把埠分類到這種狀態。 用其它型別的掃描如視窗掃描,SYN掃描,或者FIN掃描來掃描未被過濾的埠可以幫助確定 埠是否開放。

  • open|filtered(開放或者被過濾的)

    當無法確定埠是開放還是被過濾的,Nmap就把該埠劃分成 這種狀態。開放的埠不響應就是一個例子。沒有響應也可能意味著報文過濾器丟棄 了探測報文或者它引發的任何響應。因此Nmap無法確定該埠是開放的還是被過濾的。 UDP,IP協議, FIN,Null,和Xmas掃描可能把埠歸入此類。

  • closed|filtered(關閉或者被過濾的)

    該狀態用於Nmap不能確定埠是關閉的還是被過濾的。 它只可能出現在IPID Idle掃描中。

埠掃描技術

作為一個修車新手,我可能折騰幾個小時來摸索怎樣把基本工具(錘子,膠帶,扳子等) 用於手頭的任務。當我慘痛地失敗,把我的老爺車拖到一個真正的技師那兒的時候 ,他總是在他的工具箱裡翻來翻去,直到拽出一個完美的工具然後似乎不費吹灰之力搞定它。 埠掃描的藝術和這個類似。專家理解成打的掃描技術,選擇最適合的一種 (或者組合)來完成給定的 任務。 另一方面,沒有經驗的使用者和剛入門者總是用預設的SYN掃描解決每個問題。 既然Nmap是免費的,掌握埠掃描的唯一障礙就是知識。這當然是汽車世界所不能比的, 在那裡,可能需要高超的技巧才能確定您需要一個壓桿彈簧壓縮機,接著您還得為它付數千美金。

大部分掃描型別只對特權使用者可用。 這是因為他們傳送接收原始報文,這在Unix系統需要root許可權。 在Windows上推薦使用administrator賬戶,但是當WinPcap已經被載入到作業系統時, 非特權使用者也可以正常使用Nmap。當Nmap在1997年釋出時,需要root許可權是一個嚴重的 侷限,因為很多使用者只有共享的shell賬戶。現在,世界變了,計算機便宜了,更多人擁有網際網路連線 ,桌面UNIX系統 (包括Linux和MAC OS X)很普遍了。Windows版本的Nmap現在也有了,這使它可以執行在更多的桌面上。 由於所有這些原因,使用者不再需要用有限的共享shell賬戶執行Nmap。 這是很幸運的,因為特權選項讓Nmap強大得多也靈活得多。

雖然Nmap努力產生正確的結果,但請記住所有結果都是基於目標機器(或者它們前面的防火牆)返回的報文的。 。這些主機也許是不值得信任的,它們可能響應以迷惑或誤導Nmap的報文。 更普遍的是非RFC相容的主機以不正確的方式響應Nmap探測。FIN,Null和Xmas掃描 特別容易遇到這個問題。這些是特定掃描型別的問題,因此我們在個別掃描型別裡討論它們。

這一節討論Nmap支援的大約十幾種掃描技術。 一般一次只用一種方法, 除了UDP掃描(-sU)可能和任何一種TCP掃描型別結合使用。 友情提示一下,埠掃描型別的選項格式是-s**, 其中<C> 是個顯眼的字元,通常是第一個字元。 一個例外是deprecated FTP bounce掃描(-b)。預設情況下,Nmap執行一個 SYN掃描,但是如果使用者沒有許可權傳送原始報文(在UNIX上需要root許可權)或者如果指定的是IPv6目標,Nmap呼叫connect()。 本節列出的掃描中,非特權使用者只能執行connect()和ftp bounce掃描。

  • -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), 但使用字元名更容易些。 只要是URGACKPSHRSTSYN,and FIN的任何組合就行。例如,--scanflags URGACKPSHRSTSYNFIN設定了所有標誌位,但是這對掃描沒有太大用處。 標誌位的順序不重要。除了設定需要的標誌位,您也可以設定 TCP掃描型別(如-sA或者-sF)。 那個基本型別告訴Nmap怎樣解釋響應。例如, SYN掃描認為沒有響應意味著 filtered埠,而FIN掃描則認為是 open|filtered。 除了使用您指定的TCP標記位,Nmap會和基本掃描型別一樣工作。 如果您不指定基本型別,就使用SYN掃描。

  • -sI <zombie host[:probeport]> (Idlescan)

    這種高階的掃描方法允許對目標進行真正的TCP埠盲掃描 (意味著沒有報文從您的真實IP地址傳送到目標)。相反,side-channel攻擊 利用zombie主機上已知的IP分段ID序列生成演算法來窺探目標上開放埠的資訊。 IDS系統將顯示掃描來自您指定的zombie機(必須執行並且符合一定的標準)。 這種奇妙的掃描型別太複雜了,不能在此完全描述,所以我寫一篇非正式的論文, 釋出在https://nmap.org/book/idlescan.html。除了極端隱蔽(由於它不從真實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 relay host> (FTP彈跳掃描)

    FTP協議的一個有趣特徵(RFC 959) 是支援所謂代理ftp連線。它允許使用者連線到一臺FTP伺服器,然後要求檔案送到一臺第三方伺服器。 這個特性在很多層次上被濫用,所以許多伺服器已經停止支援它了。其中一種就是導致FTP伺服器對其它主機埠掃描。 只要請求FTP伺服器輪流傳送一個檔案到目標主機上的所感興趣的埠。 錯誤訊息會描述埠是開放還是關閉的。 這是繞過防火牆的好方法,因為FTP伺服器常常被置於可以訪問比Web主機更多其它內部主機的位置。 Nmap用-b選項支援ftp彈跳掃描。引數格式是 <username>:<password>@<server>:<port><Server> 是某個脆弱的FTP伺服器的名字或者IP地址。 您也許可以省略<username>:<password>, 如果伺服器上開放了匿名使用者(user:anonymous password:-wwwuser@)。 埠號(以及前面的冒號) 也可以省略,如果<server>使用預設的FTP埠(21)。當Nmap1997年釋出時,這個弱點被廣泛利用,但現在大部分已經被fix了。 脆弱的伺服器仍然存在,所以如果其它都失敗了,這也值得一試。 如果您的目標是繞過防火牆,掃描目標網路上的開放的21埠(或者 甚至任何ftp服務,如果您用版本探測掃描所有埠), 然後對每個嘗試彈跳掃描。Nmap會告訴您該主機脆弱與否。 如果您只是試著玩Nmap,您不必(事實上,不應該)限制您自己。 在您隨機地在網際網路上尋找脆弱的FTP伺服器時,考慮一下系統管理員不太喜歡您這樣濫用他們的伺服器。

埠說明和掃描順序

除了所有前面討論的掃描方法, Nmap提供選項說明那些埠被掃描以及掃描是隨機還是順序進行。 預設情況下,Nmap用指定的協議對埠1到1024以及nmap-services 檔案中列出的更高的埠在掃描。

  • -p <port ranges> (只掃描指定的埠)

    該選項指明您想掃描的埠,覆蓋預設值。 單個埠和用連字元表示的埠範圍(如 1-1023)都可以。 範圍的開始以及/或者結束值可以被省略, 分別導致Nmap使用1和65535。所以您可以指定 -p-從埠1掃描到65535。 如果您特別指定,也可以掃描埠0。 對於IP協議掃描(-sO),該選項指定您希望掃描的協議號 (0-255)。當既掃描TCP埠又掃描UDP埠時,您可以透過在埠號前加上T: 或者U:指定協議。 協議限定符一直有效您直到指定另一個。 例如,引數 -p U:53,111,137,T:21-25,80,139,8080 將掃描UDP 埠53,111,和137,同時掃描列出的TCP埠。注意,要既掃描 UDP又掃描TCP,您必須指定 -sU ,以及至少一個TCP掃描型別(如 -sS-sF,或者 -sT)。如果沒有給定協議限定符, 埠號會被加到所有協議列表。

  • -F (快速 (有限的埠) 掃描)

    在nmap的nmap-services 檔案中(對於-sO,是協議檔案)指定您想要掃描的埠。 這比掃描所有65535個埠快得多。 因為該列表包含如此多的TCP埠(1200多),這和預設的TCP掃描 scan (大約1600個埠)速度差別不是很大。如果您用--datadir選項指定您自己的 小小的nmap-services檔案 ,差別會很驚人。

  • -r (不要按隨機順序掃描埠)

    預設情況下,Nmap按隨機順序掃描埠 (除了出於效率的考慮,常用的埠前移)。這種隨機化通常都是受歡迎的, 但您也可以指定-r來順序埠掃描。

服務和版本探測

把Nmap指向一個遠端機器,它可能告訴您 埠25/tcp,80/tcp,和53/udp是開放的。使用包含大約2,200個著名的服務的 nmap-services資料庫, Nmap可以報告那些埠可能分別對應於一個郵件伺服器 (SMTP),web伺服器(HTTP),和域名伺服器(DNS)。 這種查詢通常是正確的 -- 事實上,絕大多數在TCP埠25監聽的守護程序是郵件 伺服器。然而,您不應該把賭注押在這上面! 人們完全可以在一些奇怪的埠上執行服務。

即使Nmap是對的,假設執行服務的確實是 SMTP,HTTP和DNS,那也不是特別多的資訊。 當為您的公司或者客戶作安全評估(或者甚至簡單的網路明細清單)時, 您確實想知道正在執行什麼郵件和域名伺服器以及它們的版本。 有一個精確的版本號對了解伺服器有什麼漏洞有巨大幫助。 版本探測可以幫您獲得該資訊。

在用某種其它型別的掃描方法發現TCP 和/或者UDP埠後, 版本探測會詢問這些埠,確定到底什麼服務正在執行。 nmap-service-probes 資料庫包含查詢不同服務的探測報文 和解析識別響應的匹配表示式。 Nmap試圖確定服務協議 (如 ftp,ssh,telnet,http),應用程式名(如ISC Bind,Apache httpd,Solaris telnetd),版本號, 主機名,裝置型別(如 印表機,路由器),作業系統家族 (如Windows,Linux)以及其它的細節,如 如是否可以連線X server,SSH協議版本 ,或者KaZaA使用者名稱)。當然,並非所有服務都提供所有這些資訊。 如果Nmap被編譯成支援OpenSSL, 它將連線到SSL伺服器,推測什麼服務在加密層後面監聽。 當發現RPC服務時, Nmap RPC grinder (-sR)會自動被用於確定RPC程式和它的版本號。 如果在掃描某個UDP埠後仍然無法確定該埠是開放的還是被過濾的,那麼該埠狀態就 被標記為open|filtered。 版本探測將試圖從這些埠引發一個響應(就像它對開放埠做的一樣), 如果成功,就把狀態改為開放。 open|filtered TCP埠用同樣的方法對待。 注意Nmap -A選項在其它情況下開啟版本探測。 有一篇關於版本探測的原理,使用和定製的文章在 https://nmap.org/vscan/

當Nmap從某個服務收到響應,但不能在資料庫中找到匹配時, 它就列印一個特殊的fingerprint和一個URL給您提交,如果您確實知道什麼服務執行在埠。 請花兩分鐘提交您的發現,讓每個人受益。由於這些提交, Nmap有350種以上協議如smtp,ftp,http等的大約3,000條模式匹配。

用下列的選項開啟和控制版本探測。

  • -sV (版本探測)

    開啟版本探測。 您也可以用-A同時開啟作業系統探測和版本探測。

  • --allports (不為版本探測排除任何埠)

    預設情況下,Nmap版本探測會跳過9100 TCP埠,因為一些印表機簡單地列印送到該埠的 任何資料,這回導致數十頁HTTP get請求,二進位制 SSL會話請求等等被列印出來。這一行為可以透過修改或刪除nmap-service-probes 中的Exclude指示符改變, 您也可以不理會任何Exclude指示符,指定--allports掃描所有埠

  • --version-intensity <intensity> (設定 版本掃描強度)

    當進行版本掃描(-sV)時,nmap傳送一系列探測報文 ,每個報文都被賦予一個1到9之間的值。 被賦予較低值的探測報文對大範圍的常見服務有效,而被賦予較高值的報文 一般沒什麼用。強度水平說明了應該使用哪些探測報文。數值越高, 服務越有可能被正確識別。 然而,高強度掃描花更多時間。強度值必須在0和9之間。 預設是7。當探測報文透過nmap-service-probes ports指示符 註冊到目標埠時,無論什麼強度水平,探測報文都會被嘗試。這保證了DNS 探測將永遠在任何開放的53埠嘗試, SSL探測將在443埠嘗試,等等。

  • --version-light (開啟輕量級模式)

    這是 --version-intensity 2的方便的別名。輕量級模式使 版本掃描快許多,但它識別服務的可能性也略微小一點。

  • --version-all (嘗試每個探測)

    --version-intensity 9的別名, 保證對每個埠嘗試每個探測報文。

  • --version-trace (跟蹤版本掃描活動)

    這導致Nmap列印出詳細的關於正在進行的掃描的除錯資訊。 它是您用--packet-trace所得到的資訊的子集。

  • -sR (RPC掃描)

    這種方法和許多埠掃描方法聯合使用。 它對所有被發現開放的TCP/UDP埠執行SunRPC程式NULL命令,來試圖 確定它們是否RPC埠,如果是, 是什麼程式和版本號。因此您可以有效地獲得和rpcinfo -p一樣的資訊, 即使目標的埠對映在防火牆後面(或者被TCP包裝器保護)。Decoys目前不能和RPC scan一起工作。 這作為版本掃描(-sV)的一部分自動開啟。 由於版本探測包括它並且全面得多,-sR很少被需要。

作業系統探測

Nmap最著名的功能之一是用TCP/IP協議棧fingerprinting進行遠端作業系統探測。 Nmap傳送一系列TCP和UDP報文到遠端主機,檢查響應中的每一個位元。 在進行一打測試如TCP ISN取樣,TCP選項支援和排序,IPID取樣,和初始視窗大小檢查之後, Nmap把結果和資料庫nmap-os-fingerprints中超過 1500個已知的作業系統的fingerprints進行比較,如果有匹配,就列印出作業系統的詳細資訊。 每個fingerprint包括一個自由格式的關於OS的描述文字, 和一個分類資訊,它提供供應商名稱(如Sun),下面的作業系統(如Solaris),OS版本(如10), 和裝置型別(通用裝置,路由器,switch,遊戲控制檯, 等)。

如果Nmap不能猜出作業系統,並且有些好的已知條件(如 至少發現了一個開放埠和一個關閉埠),Nmap會提供一個 URL,如果您確知執行的作業系統,您可以把fingerprint提交到那個URL。 這樣您就擴大了Nmap的作業系統知識庫,從而讓每個Nmap使用者都受益。

作業系統檢測可以進行其它一些測試,這些測試可以利用處理 過程中收集到的資訊。例如執行時間檢測,使用TCP時間戳選項(RFC 1323) 來估計主機上次重啟的時間,這僅適用於提供這類資訊的主機。另一種 是TCP序列號預測分類,用於測試針對遠端主機建立一個偽造的TCP連線 的可能難度。這對於利用基於源IP地址的可信關係(rlogin,防火牆過濾等) 或者隱含源地址的攻擊非常重要。這一類哄騙攻擊現在很少見,但一些 主機仍然存在這方面的漏洞。實際的難度值基於統計取樣,因此可能會有 一些波動。通常採用英國的分類較好,如“worthy challenge”或者 “trivial joke”。在詳細模式(-v)下只以 普通的方式輸出,如果同時使用-O,還報告IPID序列產生號。 很多主機的序列號是“增加”類別,即在每個傳送包的IP頭中 增加ID域值, 這對一些先進的資訊收集和哄騙攻擊來說是個漏洞。

https://nmap.org/book/osdetect.html 文件使用多種語言描述了版本檢測的方式、使用和定製。

採用下列選項啟用和控制作業系統檢測:

  • -O (啟用作業系統檢測)

    也可以使用-A來同時啟用作業系統檢測和版本檢測。

  • --osscan-limit (針對指定的目標進行作業系統檢測)

    如果發現一個開啟和關閉的TCP埠時,作業系統檢測會更有效。 採用這個選項,Nmap只對滿足這個條件的主機進行作業系統檢測,這樣可以 節約時間,特別在使用-P0掃描多個主機時。這個選項僅在使用 -O-A 進行作業系統檢測時起作用。

  • --osscan-guess; --fuzzy (推測作業系統檢測結果)

    當Nmap無法確定所檢測的作業系統時,會盡可能地提供最相近的匹配,Nmap預設 進行這種匹配,使用上述任一個選項使得Nmap的推測更加有效。

時間和效能

Nmap開發的最高優先順序是效能。在本地網路對一個主機的預設掃描(nmap *<hostname>*)需要1/5秒。而僅僅眨眼的 時間,就需要掃描上萬甚至幾十萬的主機。此外,一些特定的掃描選項會明顯增 加掃描時間,如UDP掃描和版本檢測。同樣,防火牆配置以及特殊的響應速度限制也會 增加時間。Nmap使用了並行演算法和許多先進的演算法來加速掃描,使用者對Nmap如何 工作有最終的控制權。高階使用者可以仔細地調整Nmap命令,在滿足時間要求的同時獲得他們所關心的資訊。

改善掃描時間的技術有:忽略非關鍵的檢測、升級最新版本的Nmap(效能增強不斷改善)。 最佳化時間引數也會帶來實質性的變化,這些引數如下。

  • --min-hostgroup <size>; --max-hostgroup <size> (調整並行掃描組的大小)

    Nmap具有並行掃描多主機埠或版本的能力,Nmap將多個目標IP地址 空間分成組,然後在同一時間對一個組進行掃描。通常,大的組更有效。缺 點是隻有當整個組掃描結束後才會提供主機的掃描結果。如果組的大小定義 為50,則只有當前50個主機掃描結束後才能得到報告(詳細模式中的補充資訊 除外)。預設方式下,Nmap採取折衷的方法。開始掃描時的組較小, 最小為5,這樣便於儘快產生結果;隨後增長組的大小,最大為1024。確切的 大小依賴於所給定的選項。為保證效率,針對UDP或少量埠的TCP掃描,Nmap 使用大的組。--max-hostgroup選項用於說明使用最大的組,Nmap不 會超出這個大小。--min-hostgroup選項說明最小的組,Nmap 會保持組大於這個值。如果在指定的介面上沒有足夠的目標主機來滿足所 指定的最小值,Nmap可能會採用比所指定的值小的組。這兩個引數雖然很少使用, 但都用於保持組的大小在一個指定的範圍之內。這些選項的主要用途是說明一個最小組的大小,使得整個掃描更加快速。通常 選擇256來掃描C類網段。對於埠數較多的掃描,超出該值沒有意義。對於 埠數較少的掃描,2048或更大的組大小是有幫助的。

  • --min-parallelism <numprobes>; --max-parallelism <numprobes> (調整探測報文的並行度)

    這些選項控制用於主機組的探測報文數量,可用於埠掃描和主機發現。預設狀態下, Nmap基於網路效能計算一個理想的並行度,這個值經常改變。如果報文被丟棄, Nmap降低速度,探測報文數量減少。隨著網路效能的改善,理想的探測報文數量會緩慢增加。 這些選項確定這個變數的大小範圍。預設狀態下,當網路不可靠時,理想的並行度值 可能為1,在好的條件下,可能會增長至幾百。最常見的應用是--min-parallelism值大於1,以加快 效能不佳的主機或網路的掃描。這個選項具有風險,如果過高則影響準確度,同時 也會降低Nmap基於網路條件動態控制並行度的能力。這個值設為10較為合適, 這個值的調整往往作為最後的手段。--max-parallelism選項通常設為1,以防止Nmap在同一時間 向主機傳送多個探測報文,和選擇--scan-delay同時使用非常有用,雖然 這個選項本身的用途已經很好。

  • --min-rtt-timeout <milliseconds>--max-rtt-timeout <milliseconds>--initial-rtt-timeout <milliseconds> (調整探測報文超時)

    Nmap使用一個執行超時值來確定等待探測報文響應的時間,隨後會放棄或重新 傳送探測報文。Nmap基於上一個探測報文的響應時間來計算超時值,如果網路延遲比較顯著 和不定,這個超時值會增加幾秒。初始值的比較保守(高),而當Nmap掃描無響應 的主機時,這個保守值會保持一段時間。這些選項以毫秒為單位,採用小的--max-rtt-timeout值,使 --initial-rtt-timeout值大於預設值可以明顯減少掃描時間,特別 是對不能ping通的掃描(-P0)以及具有嚴格過濾的網路。如果使用太 小的值,使得很多探測報文超時從而重新傳送,而此時可能響應訊息正在傳送,這使得整個掃描的時 間會增加。如果所有的主機都在本地網路,對於--max-rtt-timeout值來 說,100毫秒比較合適。如果存在路由,首先使用ICMP ping工具ping主機,或使用其 它報文工具如hpings,可以更好地穿透防火牆。檢視大約10個包的最大往返時間,然後將 --initial-rtt-timeout設成這個時間的2倍,--max-rtt-timeout 可設成這個時間值的3倍或4倍。通常,不管ping的時間是多少,最大的rtt值不得小於100ms, 不能超過1000ms。--min-rtt-timeout這個選項很少使用,當網路不可靠時, Nmap的預設值也顯得過於強烈,這時這個選項可起作用。當網路看起來不可靠時,Nmap僅將 超時時間降至最小值,這個情況是不正常的,需要向nmap-dev郵件列表報告bug。

  • --host-timeout <milliseconds> (放棄低速目標主機)

    由於效能較差或不可靠的網路硬體或軟體、頻寬限制、嚴格的防火牆等原因, 一些主機需要很長的時間掃描。這些極少數的主機掃描往往佔 據了大部分的掃描時間。因此,最好的辦法是減少時間消耗並且忽略這些主機,使用 --host-timeout選項來說明等待的時間(毫秒)。通常使用1800000 來保證Nmap不會在單個主機上使用超過半小時的時間。需要注意的是,Nmap在這半小時中可以 同時掃描其它主機,因此並不是完全放棄掃描。超時的主機被忽略,因此也沒有針對該主機的 埠表、作業系統檢測或版本檢測結果的輸出。

  • --scan-delay <milliseconds>; --max-scan-delay <milliseconds> (調整探測報文的時間間隔)

    這個選項用於Nmap控制針對一個主機傳送探測報文的等待時間(毫秒),在頻寬 控制的情況下這個選項非常有效。Solaris主機在響應UDP掃描探測報文報文時,每秒 只傳送一個ICMP訊息,因此Nmap傳送的很多數探測報文是浪費的。--scan-delay 設為1000,使Nmap低速執行。Nmap嘗試檢測頻寬控制並相應地調整掃描的延遲,但 並不影響明確說明何種速度工作最佳。--scan-delay的另一個用途是躲閉基於閾值的入侵檢測和預防 系統(IDS/IPS)。

  • -T <Paranoid|Sneaky|Polite|Normal|Aggressive|Insane> (設定時間模板)

    上述最佳化時間控制選項的功能很強大也很有效,但有些使用者會被迷惑。此外, 往往選擇合適引數的時間超過了所需最佳化的掃描時間。因此,Nmap提供了一些簡單的 方法,使用6個時間模板,使用時採用-T選項及數字(0 - 5) 或名稱。模板名稱有paranoid (0)、sneaky (1)、polite (2)、normal(3)、 aggressive (4)和insane (5)。前兩種模式用於IDS躲避,Polite模式降低了掃描 速度以使用更少的頻寬和目標主機資源。預設模式為Normal,因此-T3 實際上是未做任何最佳化。Aggressive模式假設使用者具有合適及可靠的網路從而加速 掃描。Insane模式假設使用者具有特別快的網路或者願意為獲得速度而犧牲準確性。使用者可以根據自己的需要選擇不同的模板,由Nmap負責選擇實際的時間值。 模板也會針對其它的最佳化控制選項進行速度微調。例如,-T4 針對TCP埠禁止動態掃描延遲超過10ms,-T5對應的值為5ms。 模板可以和最佳化調整控制選項組合使用,但模板必須首先指定,否則模板的標準值 會覆蓋使用者指定的值。建議在掃描可靠的網路時使用 -T4,即使 在自己要增加最佳化控制選項時也使用(在命令列的開始),從而從這些額外的較小的最佳化 中獲益。如果用於有足夠的頻寬或乙太網連線,仍然建議使用-T4選項。 有些使用者喜歡-T5選項,但這個過於強烈。有時使用者考慮到避免使主機 崩潰或者希望更禮貌一些會採用-T2選項。他們並沒意識到-T Polite選項是如何的慢,這種模式的掃描比預設方式實際上要多花10倍的時間。預設時間 選項(-T3)很少有主機崩潰和頻寬問題,比較適合於謹慎的使用者。不進行 版本檢測比進行時間調整能更有效地解決這些問題。雖然-T0-T1選項可能有助於避免IDS告警,但 在進行上千個主機或埠掃描時,會顯著增加時間。對於這種長時間的掃描,寧可設定確切的時間 值,而不要去依賴封裝的-T0-T1選項。T0選項的主要影響是對於連續掃描,在一個時間只能掃描一個埠, 每個探測報文的傳送間隔為5分鐘。T1T2選項比較類似, 探測報文間隔分別為15秒和0.4秒。T3是Nmap的預設選項,包含了並行掃描。 T4選項與 --max-rtt-timeout 1250 --initial-rtt-timeout 500 等價,最大TCP掃描延遲為10ms。T5等價於 --max-rtt-timeout 300 --min-rtt-timeout 50 --initial-rtt-timeout 250 --host-timeout 900000,最大TCP掃描延遲為5ms。

防火牆/IDS躲避和哄騙

很多Internet先驅們設想了一個全球開放的網路,使用全域性的IP 地址空間,使得任何兩個節點之間都有虛擬連線。這使得主機間可以作為真 正的對等體,相互間提供服務和獲取資訊。人們可以在工作時訪問家裡所 有的系統、調節空調溫度、為提前到來的客人開門。隨後,這些全球連線的設想 受到了地址空間短缺和安全考慮的限制。在90年代早期,各種機構開始部 署防火牆來實現減少連線的目的,大型網路透過代理、NAT和包過濾器與未 過濾的Internet隔離。不受限的資訊流被嚴格控制的可信通訊通道資訊流所替代。

類似防火牆的網路隔離使得對網路的搜尋更加困難,隨意的搜 索變得不再簡單。然而,Nmap提供了很多特性用於理解這些複雜的網 絡,並且檢驗這些過濾器是否正常工作。此外,Nmap提供了繞過某些較弱的 防範機制的手段。檢驗網路安全狀態最有效的方法之一是嘗試哄騙網路,將 自己想象成一個攻擊者,使用本節提供的技術來攻擊自己的網路。如使用FTP bounce掃描、Idle掃描、分片攻擊或嘗試穿透自己的代理。

除限止網路的行為外,使用入侵檢測系統(IDS)的公司也不斷增加。由於Nmap 常用於攻擊前期的掃描,因此所有主流的IDS都包含了檢測Nmap掃描的規則。 現在,這些產品變形為入侵預防系統(IPS),可以主 動地阻止可疑的惡意行為。不幸的是,網路管理員和IDS廠商透過分析報文 來檢測惡意行為是一個艱苦的工作,有耐心和技術的攻擊者,在特定Nmap選項 的幫助下,常常可以不被IDS檢測到。同時,管理員必須應付大量的誤報結果, 正常的行為被誤判而被改變或阻止。

有時,人們建議Nmap不應該提供躲閉防火牆規則或哄騙IDS的功能, 這些功能可能會被攻擊者濫用,然而管理員卻可以利用這些功能來增強安全性。 實際上,攻擊的方法仍可被攻擊者利用,他們可以發現其它工具或Nmap的補丁程 序。同時,管理員發現攻擊者的工作更加困難,相比較採取措施來預防執 行FTP Bounce攻擊的工具而言,部署先進的、打過補丁的FTP伺服器更 加有效。

Nmap不提供檢測和破壞防火牆及IDS系統的魔彈(或Nmap選項),它使用 的是技術和經驗,這超出了本參考手冊的範圍,下面描述了相關的選項和 完成的工作。

  • -f (報文分段); --mtu (使用指定的MTU)

    -f選項要求掃描時(包挺ping掃描)使用 小的IP包分段。其思路是將TCP頭分段在幾個包中,使得包過濾器、 IDS以及其它工具的檢測更加困難。必須小心使用這個選項,有些系 統在處理這些小包時存在問題,例如舊的網路嗅探器Sniffit在接收 到第一個分段時會立刻出現分段錯誤。該選項使用一次,Nmap在IP 頭後將包分成8個位元組或更小。因此,一個20位元組的TCP頭會被分成3個 包,其中2個包分別有TCP頭的8個位元組,另1個包有TCP頭的剩下4個字 節。當然,每個包都有一個IP頭。再次使用-f可使用 16位元組的分段(減少分段數量)。使用--mtu選項可 以自定義偏移的大小,使用時不需要-f,偏移量必須 是8的倍數。包過濾器和防火牆對所有的IP分段排隊,如Linux核心中的 CONFIG-IP-ALWAYS-DEFRAG配置項,分段包不會直接使用。一些網路無法 承受這樣所帶來的效能衝擊,會將這個配置禁止。其它禁止的原因有分段 包會透過不同的路由進入網路。一些源系統在核心中對傳送的報文進行 分段,使用iptables連線跟蹤模組的Linux就是一個例子。當使用類似Ethereal 的嗅探器時,掃描必須保證傳送的報文要分段。如果主機作業系統會產 生問題,嘗試使用--send-eth選項以避開IP層而直接 傳送原始的乙太網幀。

  • -D <decoy1 [,decoy2][,ME],...> (使用誘餌隱蔽掃描)

    為使誘餌掃描起作用,需要使遠端主機認為是誘餌在掃描目標網路。 IDS可能會報個某個IP的5-10個埠掃描,但並不知道哪個IP在掃描以及 哪些不是誘餌。但這種方式可以透過路由跟蹤、響應丟棄以及其它主動 機制在解決。這是一種常用的隱藏自身IP地址的有效技術。使用逗號分隔每個誘餌主機,也可用自己的真實IP作為誘餌,這時可使用 ME選項說明。如果在第6個位置或 更後的位置使用ME選項,一些常用 埠掃描檢測器(如Solar Designer's excellent scanlogd)就不會報告 這個真實IP。如果不使用ME選項,Nmap 將真實IP放在一個隨機的位置注意,作為誘餌的主機須在工作狀態,否則會導致目標主機的SYN洪水攻擊。 如果在網路中只有一個主機在工作,那就很容易確定哪個主機在掃描。也可 使用IP地址代替主機名(被誘騙的網路就不可能在名字伺服器日誌中發現)。誘餌可用在初始的ping掃描(ICMP、SYN、ACK等)階段或真正的埠掃描 階段。誘餌也可以用於遠端作業系統檢測(-O)。在進行版 本檢測或TCP連線掃描時,誘餌無效。使用過多的誘餌沒有任何價值,反而導致掃描變慢並且結果不準確。 此外,一些ISP會過濾哄騙的報文,但很多對欺騙IP包沒有任何限制。

  • -S <IP_Address> (源地址哄騙)

    在某些情況下,Nmap可能無法確定你的源地址(如果這樣,Nmap會給出 提示)。此時,使用-S選項並說明所需傳送包的介面IP地址。這個標誌的另一個用處是哄騙性的掃描,使得目標認為是另 一個地址在進行掃描。可以想象某一個競爭對手在不斷掃描某個公司! -e選項常在這種情況下使用,也可採用-P0選項。

  • -e <interface> (使用指定的介面)

    告訴Nmap使用哪個介面傳送和接收報文,Nmap可以進行自動檢測, 如果檢測不出會給出提示。

  • --source-port <portnumber>; -g <portnumber> (源埠哄騙)

    僅依賴於源埠號就信任資料流是一種常見的錯誤配置,這個問題非常 好理解。例如一個管理員部署了一個新的防火牆,但招來了很多使用者的不滿,因為 他們的應用停止工作了。可能是由於外部的UDP DNS伺服器響應無法進入網路,而導致 DNS的崩潰。FTP是另一個常見的例子,在FTP傳輸時,遠端伺服器嘗試和內部用 建立連線以傳輸資料。對這些問題有安全解決方案,通常是應用級代理或協議分析防火牆模組。 但也存在一些不安全的方案。注意到DNS響應來自於53埠,FTP連線 來自於20埠,很多管理員會掉入一個陷阱,即允許來自於這些埠的資料進入 網路。他們認為這些埠裡不會有值得注意的攻擊和漏洞利用。此外,管理員 或許認為這是一個短期的措施,直至他們採取更安全的方案。但他們忽視了安全的 升級。不僅僅是工作量過多的網路管理員掉入這種陷阱,很多產品本身也會有這類 不安全的隱患,甚至是微軟的產品。Windows 2000和Windows XP中包含的IPsec過濾 器也包含了一些隱含規則,允許所有來自88埠(Kerberos)的TCP和UDP資料流。另 一個常見的例子是Zone Alarm個人防火牆到2.1.25版本仍然允許源埠53(DNS)或 67(DHCP)的UDP包進入。Nmap提供了-g--source-port選項(它們是 等價的),用於利用上述弱點。只需要提供一個埠號,Nmap就可以從這些 埠傳送資料。為使特定的作業系統正常工作,Nmap必須使用不同的埠號。 DNS請求會忽略--source-port選項,這是因為Nmap依靠系 統庫來處理。大部分TCP掃描,包括SYN掃描,可以完全支援這些選項,UDP掃 描同樣如此。

  • --data-length <number> (傳送報文時 附加隨機資料)

    正常情況下,Nmap傳送最少的報文,只含一個包頭。因此TCP包通常 是40位元組,ICMP ECHO請求只有28位元組。這個選項告訴Nmap在傳送的報文上 附加指定數量的隨機位元組。作業系統檢測(-O)包不受影響, 但大部分ping和埠掃描包受影響,這會使處理變慢,但對掃描的影響較小。

  • --ttl <value> (設定IP time-to-live域)

    設定IPv4報文的time-to-live域為指定的值。

  • --randomize-hosts (對目標主機的順序隨機排列)

    告訴Nmap在掃描主機前對每個組中的主機隨機排列,最多可達 8096個主機。這會使得掃描針對不同的網路監控系統來說變得不是很 明顯,特別是配合值較小的時間選項時更有效。如果需要對一個較大 的組進行隨機排列,需要增大nmap.h檔案中 PING-GROUP-SZ的值,並重新編譯。另一種方法是使用列表掃描 (-sL -n -oN **),產生目標IP的列表, 使用Perl指令碼進行隨機化,然後使用-iL提供給Nmap。

  • --spoof-mac <mac address,prefix,or vendor name> (MAC地址哄騙)

    要求Nmap在傳送原乙太網幀時使用指定的MAC地址,這個選項隱含了 --send-eth選項,以保證Nmap真正傳送乙太網包。MAC地址有幾 種格式。如果簡單地使用字串“0”,Nmap選擇一個完全隨機的MAC 地址。如果給定的字元品是一個16進位制偶數(使用:分隔),Nmap將使用這個MAC地址。 如果是小於12的16進位制數字,Nmap會隨機填充剩下的6個位元組。如果引數不是0或16進 制字串,Nmap將透過nmap-mac-prefixes查詢 廠商的名稱(大小寫區分),如果找到匹配,Nmap將使用廠商的OUI(3位元組字首),然後 隨機填充剩餘的3個節字。正確的--spoof-mac引數有, Apple001:02:03:04:05:06deadbeefcafe0020F2, 和Cisco.

輸出

任何安全工具只有在輸出結果時才是有價值的,如果沒有透過組織和 易於理解的方式來表達,複雜的測試和演算法幾乎沒有意義。Nmap提供了一些 方式供使用者和其它軟體使用,實際上,沒有一種方式可以使所有人滿意。 因此Nmap提供了一些格式,包含了方便直接檢視的互動方式和方便軟體處理 的XML格式。

除了提供輸出格式外,Nmap還提供了選項來控制輸出的細節以及除錯 資訊。輸出內容可傳送給標準輸出或命名檔案,可以追加或覆蓋。輸出檔案還可 被用於繼續中斷的掃描。

Nmap提供5種不同的輸出格式。預設的方式是interactive output, 傳送給標準輸出(stdout)。normal output方式類似於 interactive,但顯示較少的執行時間資訊 和告警資訊,這是由於這些資訊是在掃描完全結束後用於分析,而不是互動式的。

XML輸出是最重要的輸出型別,可被轉換成HTML,對於程式處理非常方便, 如用於Nmap圖形使用者介面或匯入資料庫。

另兩種輸出型別比較簡單,grepable output格式,在一行中包含目標主機最多的資訊;sCRiPt KiDDi3 0utPUt 格式,用於考慮自己的使用者 |<-r4d。

互動式輸出是預設方式,沒有相應的命令列選項,其它四種格式選項 使用相同的語法,採用一個引數,即存放結果的檔名。多種格式可同時 使用,但一種格式只能使用一次。例如,在標準輸出用於檢視的同時,可將結 果儲存到XML檔案用於程式分析,這時可以使用選項-oX myscan.xml -oN myscan.nmap。 為便於描述的簡化,本章使用類似於myscan.xml的簡單檔名, 建議採用更具有描述性的檔名。檔名的選擇與個人喜好有關,建議增加 掃描日期以及一到兩個單詞來描述,並放置於一個目錄中。

在將結果輸出到檔案的同時,Nmap仍將結果傳送給標準輸出。例如, 命令nmap -oX myscan.xml target將 輸出XML至myscan.xml,並在stdout 上列印相同的互動式結果,而此時-oX選項沒有采用。可以 使用連字元作為選項來改變,這使得Nmap禁止互動式輸出,而是將結果列印到 所指定的標準輸出流中。因此,命令nmap -oX - target只 輸出XML至標準輸出stdout。嚴重錯誤仍然是輸出到標準錯誤流stderr中。

與其它Nmap引數不同,日誌檔案選項的空格(如-oX)和 檔名或連字元是必需的。如果省略了標記,例如-oG--oXscan.xml,Nmap的向後相容特點將建立 標準格式的輸出檔案,相應的檔名為G-Xscan.xml

Nmap還提供了控制掃描細節以及輸出檔案的新增或覆蓋的選項,這些選項 如下所述。

Nmap輸出格式

  • -oN <filespec> (標準輸出)

    要求將標準輸出直接寫入指定 的檔案。如上所述,這個格式與互動式輸出 略有不同。

  • -oX <filespec> (XML輸出)

    要求XML輸出直接寫入指定 的檔案。Nmap包含了一個文件型別定義(DTD),使XML解析器有效地 進行XML輸出。這主要是為了程式應用,同時也可以協助人工解釋 Nmap的XML輸出。DTD定義了合法的格式元素,列舉可使用的屬性和 值。最新的版本可在 https://nmap.org/data/nmap.dtd獲取。XML提供了可供軟體解析的穩定格式輸出,主要的計算機 語言都提供了免費的XML解析器,如C/C++,Perl,Python和Java。 針對這些語言有一些捆綁程式碼用於處理Nmap的輸出和特定的執行程式。 例如perl CPAN中的Nmap::ScannerNmap::Parser。 對幾乎所有與Nmap有介面的主要應用來說,XML是首選的格式。XML輸出引用了一個XSL樣式表,用於格式化輸出結果,類似於 HTML。最方便的方法是將XML輸出載入到一個Web瀏覽器,如Firefox 或IE。由於nmap.xsl檔案的絕對 路徑,因此通常只能在執行了Nmap的機器上工作(或類似配置的機器)。 類似於任何支援Web機器的HTML檔案,--stylesheet 選項可用於建立可移植的XML檔案。

  • -oS <filespec> (ScRipT KIdd|3 oUTpuT)

    指令碼小子輸出類似於互動工具輸出,這是一個事後處理,適合於 'l33t HaXXorZ, 由於原來全都是大寫的Nmap輸出。這個選項和指令碼小子開了玩笑,看上去似乎是為了 “幫助他們”。

  • -oG <filespec> (Grep輸出)

    這種方式最後介紹,因為不建議使用。XML輸格式很強大,便於有經驗 的使用者使用。XML是一種標準,由許多解析器構成,而Grep輸屆更簡化。XML 是可擴充套件的,以支援新發布的Nmap特點。使用Grep輸出的目的是忽略這些 特點,因為沒有足夠的空間。然面,Grep輸出仍然很常使用。它是一種簡單格式,每行一個主機,可以 透過UNIX工具(如grep、awk、cut、sed、diff)和Perl方便地查詢和分解。常可 用於在命令列上進行一次性測式。查詢ssh埠開啟或執行Sloaris的主機,只需 要一個簡單的grep主機說明,使用通道並透過awk或cut命令列印所需的域。Grep輸出可以包含註釋(每行由#號開始)。每行由6個標記的域組成,由製表符及 冒號分隔。這些域有主機協議忽略狀態作業系統序列號IPID狀態。這些域中最重要的是Ports,它提供 了所關注的埠的細節,埠項由逗號分隔。每個埠項代表一個所關注的埠, 每個子域由/分隔。這些子域有:埠號狀態協議擁有者服務SunRPCinfo版本資訊。對於XML輸出,本手冊無法列舉所有的格式,有關Nmap Grep輸出的更詳細資訊可 查閱http://www.unspecific.com/nmap-oG-output

  • -oA <basename> (輸出至所有格式)

    為使用方便,利用-oA**選項 可將掃描結果以標準格式、XML格式和Grep格式一次性輸出。分別存放在 <basename>.nmap,<basename>.xml和 <basename>.gnmap檔案中。也可以在檔名前 指定目錄名,如在UNIX中,使用~/nmaplogs/foocorp/, 在Window中,使用c:\hacking\sco on Windows。<basename>

細節和除錯選項

  • -v (提高輸出資訊的詳細度)

    透過提高詳細度,Nmap可以輸出掃描過程的更多資訊。 輸出發現的開啟埠,若Nmap認為掃描需要更多時間會顯示估計 的結束時間。這個選項使用兩次,會提供更詳細的資訊。這個選 項使用兩次以上不起作用。大部分的變化僅影響互動式輸出,也有一些影響標準和指令碼 小子輸出。其它輸出型別由機器處理,此時Nmap預設提供詳細的信 息,不需要人工干預。然而,其它模式也會有一些變化,省略一些 細節可以減小輸出大小。例如,Grep輸出中的註釋行提供所有掃描 埠列表,但由於這些資訊過長,因此只能在細節模式中輸出。

  • -d [level] (提高或設定除錯級別)

    當詳細模式也不能為使用者提供足夠的資料時,使用除錯可以得到更 多的資訊。使用細節選項(-v)時,可啟用命令列引數 (-d),多次使用可提高除錯級別。也可在-d 後面使用引數設定除錯級別。例如,-d9設定級別9。這是 最高的級別,將會產生上千行的輸出,除非只對很少的埠和目標進行簡單掃描。如果Nmap因為Bug而掛起或者對Nmap的工作及原理有疑問,除錯輸出 非常有效。主要是開發人員用這個選項,除錯行不具備自我解釋的特點。 例如,Timeoutvals: srtt: -1 rttvar: -1 to: 1000000 delta 14987 ==> srtt: 14987 rttvar: 14987 to: 100000。如果對某行輸出不明白, 可以忽略、檢視原始碼或向開發列表(nmap-dev)求助。有些輸出行會有自 我解釋的特點,但隨著除錯級別的升高,會越來越含糊。

  • --packet-trace (跟蹤傳送和接收的報文)

    要求Nmap列印傳送和接收的每個報文的摘要,通常用於 除錯,有助於新使用者更好地理解Nmap的真正工作。為避免輸出過 多的行,可以限制掃描的埠數,如-p20-30。 如果只需進行版本檢測,使用--version-trace

  • --iflist (列舉介面和路由)

    輸出Nmap檢測到的介面列表和系統路由,用於除錯路由 問題或裝置描述失誤(如Nmap把PPP連線當作乙太網對待)。

其它輸出選項

  • --append-output (在輸出檔案中新增)

    當使用檔案作為輸出格式,如-oX-oN, 預設該檔案被覆蓋。如果希望檔案保留現有內容,將結果新增在現 有檔案後面,使用--append-output選項。所有指 定的輸出檔案都被新增。但對於XML(-oX)掃描輸出 檔案無效,無法正常解析,需要手工修改。

  • --resume <filename> (繼續中斷的掃描)

    一些擴充套件的Nmap執行需要很長的時間 -- 以天計算,這類掃描 往往不會結束。可以進行一些限制,禁止Nmap在工作時間執行,導致 網路中斷、執行Nmap的主機計劃或非計劃地重啟、或者Nmap自己中斷。 執行Nmap的管理員可以因其它原因取消執行,按下ctrl-C 即可。從頭開始啟動掃描可能令人不快,幸運的是,如果標準掃描 (-oN)或Grep掃描(-oG)日誌 被保留,使用者可以要求Nmap恢復終止的掃描,只需要簡單地使用選項 --resume並說明標準/Grep掃描輸出檔案,不允許 使用其它引數,Nmap會解析輸出檔案並使用原來的格式輸出。使用方式 如nmap --resume *<logfilename>*。 Nmap將把新地結果新增到檔案中,這種方式不支援XML輸出格式,原因是 將兩次執行結果合併至一個XML檔案比較困難。

  • --stylesheet <path or URL> (設定XSL樣式表,轉換XML輸出)

    Nmap提從了XSL樣式表nmap.xsl,用於檢視 或轉換XML輸出至HTML。XML輸出包含了一個xml-stylesheet, 直接指向nmap.xml檔案, 該檔案由Nmap安裝(或位於Windows當前工作目錄)。在Web瀏覽器 中開啟Nmap的XML輸出時,將會在檔案系統中尋找nmap.xsl檔案, 並使用它輸出結果。如果希望使用不同的樣式表,將它作為 --stylesheet的引數,必段指明完整的路 徑或URL,常見的呼叫方式是--stylesheet https://nmap.org/data/nmap.xsl。 這告訴瀏覽器從Insecire.Org中載入最新的樣式表。這使得 沒安裝Nmap(和nmap.xsl) 的機器中可以方便地檢視結果。因此,URL更方便使用,本地檔案系統 的nmap.xsl用於預設方式。

  • --no-stylesheet (忽略XML宣告的XSL樣式表)

    使用該選項禁止Nmap的XML輸出關聯任何XSL樣式表。 xml-stylesheet指示被忽略。

其它選項

本節描述一些重要的(和並不重要)的選項,這些選項 不適合其它任何地方。

  • -6 (啟用IPv6掃描)

    從2002年起,Nmap提供對IPv6的一些主要特徵的支援。ping掃描(TCP-only)、 連線掃描以及版本檢測都支援IPv6。除增加-6選項外, 其它命令語法相同。當然,必須使用IPv6地址來替換主機名,如 3ffe:7501:4819:2000:210:f3ff:fe03:14d0。 除“所關注的埠”行的地址部分為IPv6地址。IPv6目前未在全球廣泛採用,目前在一些國家(亞洲)應用較多, 一些高階作業系統支援IPv6。使用Nmap的IPv6功能,掃描的源和目 的都需要配置IPv6。如果ISP(大部分)不分配IPv6地址,Nmap可以採用 免費的隧道代理。一種較好的選擇是BT Exact,位於https://tb.ipv6.btexact.com/。 此外,還有Hurricane Electric,位於http://ipv6tb.he.net/。6to4隧道是 另一種常用的免費方法。

  • -A (激烈掃描模式選項)

    這個選項啟用額外的高階和高強度選項,目前還未確定代表 的內容。目前,這個選項啟用了作業系統檢測(-O) 和版本掃描(-sV),以後會增加更多的功能。 目的是啟用一個全面的掃描選項集合,不需要使用者記憶大量的 選項。這個選項僅僅啟用功能,不包含用於可能所需要的 時間選項(如-T4)或細節選項(-v)。

  • --datadir <directoryname> (說明使用者Nmap資料檔案位置)

    Nmap在執行時從檔案中獲得特殊的資料,這些檔案有 nmap-service-probesnmap-servicesnmap-protocolsnmap-rpcnmap-mac-prefixesnmap-os-fingerprints。Nmap首先 在--datadir選項說明的目錄中查詢這些檔案。 未找到的檔案,將在BMAPDIR環境變數說明的目錄中查詢。 接下來是用於真正和有效UID的~/.nmap 或Nmap可執行程式碼的位置(僅Win32);然後是是編譯位置, 如/usr/local/share/nmap/usr/share/nmap。 Nmap查詢的最後一個位置是當前目錄。

  • --send-eth (使用原乙太網幀傳送)

    要求Nmap在乙太網(資料鏈路)層而不是IP(網路層)傳送 報文。預設方式下,Nmap選擇最適合其執行平臺的方式,原套接 字(IP層)是UNIX主機最有效的方式,而乙太網幀最適合Windows操作 系統,因為Microsoft禁用了原套接字支援。在UNIX中,如果沒有其 它選擇(如無乙太網連線),不管是否有該選項,Nmap都使用原IP包。

  • --send-ip (在原IP層傳送)

    要求Nmap透過原IP套接字傳送報文,而不是低層的以 太網幀。這是--send-eth選項的補充。

  • --privileged (假定使用者具有全部許可權)

    告訴Nmap假定其具有足夠的許可權進行源套接字包傳送、 報文捕獲和類似UNIX系統中根使用者操作的許可權。預設狀態下, 如果由getuid()請求的類似操作不為0,Nmap將退出。 --privileged在具有Linux核心效能的類似 系統中使用非常有效,這些系統配置允許非特權使用者可以進行 原報文掃描。需要明確的是,在其它選項之前使用這些需要權 限的選項(SYN掃描、作業系統檢測等)。Nmap-PRIVILEGED變數 設定等價於--privileged選項。

  • -V; --version (列印版本資訊)

    列印Nmap版本號並退出。

  • -h; --help (列印幫助摘要面)

    列印一個短的幫助螢幕,列出大部分常用的 命令選項,這個功能與不帶引數執行Nmap是相同的。

相關文章