Nmap的詳細使用
介紹
常用參數選項
主機發現
端口掃描
服務和版本探測
作業系統探測
性能優化
防火牆/IDS 躲避和哄騙
輸出
(一)介紹
Nmap — 網絡探測工具和安全/端口掃描器。
Nmap (“Network Mapper(網絡映射器)”) 是一款開放源代碼的 網絡探測和安全稽核的工具。它的設計目标是快速地掃描大型網絡,當然用它掃描單個 主機也沒有問題。Nmap 以新穎的方式使用原始 IP 封包來發現網絡上有哪些主機,那些 主機提供什麼服務(應用程式名和版本),那些服務運作在什麼作業系統(包括版本資訊), 它們使用什麼類型的封包過濾器/ 防火牆,以及一堆其它功能。雖然Nmap 通常用于安全稽核, 許多系統管理者和網絡管理者也用它來做一些日常的工作,比如檢視整個網絡的資訊, 管理服務更新計劃,以及監視主機和服務的運作。
Nmap 輸出的是掃描目标的清單,以及每個目标的補充資訊,至于是哪些資訊則依賴于所使用的選項。 “所感興趣的端口表格”是其中的關鍵。那張表列出端口号,協定,服務名稱和狀态。狀态可能是 open(開放的),filtered(被過濾的), closed(關閉的),或者unfiltered(未被過濾的)。 Open( 開放的) 意味着目标機器上的應用程式正在該端口監聽連接配接/ 封包。filtered(被過濾的) 意味着防火牆,過濾器或者其它網絡障礙阻止了該端口被通路,Nmap 無法得知 它是 open(開放的) 還是 closed(關閉的)。 closed(關閉的) 端口沒有應用程式在它上面監聽,但是他們随時可能開放。 當端口對Nmap 的探測做出響應,但是Nmap 無法确定它們是關閉還是開放時,這些端口就被認為是 unfiltered(未被過濾的) 如果Nmap 報告狀态組合 open|filtered 和 closed|filtered 時,那說明Nmap 無法确定該端口處于兩個狀态中的哪一個狀态。 當要求進行版本探測時,端口表也可以包含軟體的版本資訊。當要求進行 IP 協定掃描時 (-sO),Nmap 提供關于所支援的IP 協定而不是正在監聽的端口的資訊。除了所感興趣的端口表,Nmap 還能提供關于目标機的進一步資訊,包括反向域名,作業系統猜測,裝置類型,和MAC 位址。
參數選項
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | Nmap支援主機名,ip,網段的表示方式 例如:blah.highon.coffee, namp.org/24, 192.168.0.1;10.0.0-25.1-254 -iL filename 從檔案中讀取待檢測的目标,檔案中的表示方法支援機名,ip,網段 -iR hostnum 随機選取,進行掃描.如果-iR指定為0,則是無休止的掃描 --exclude host1[, host2] 從掃描任務中需要排除的主機 --exculdefile exclude_file 排除檔案中的IP,格式和-iL指定掃描檔案的格式相同 主機發現 -sL 僅僅是顯示,掃描的IP數目,不會進行任何掃描 -sn ping掃描,即主機發現 -Pn 不檢測主機存活 -PS/PA/PU/PY[portlist] TCP SYN Ping/TCP ACK Ping/UDP Ping發現 -PE/PP/PM 使用ICMP echo , timestamp and netmask 請求包發現主機 -PO[prococol list] 使用IP協定包探測對方主機是否開啟 -n/-R 不對IP進行域名反向解析/為所有的IP都進行域名的反響解析 掃描技巧 -sS/sT/sA/sW/sM TCP SYN/TCP connect()/ACK/TCP視窗掃描/TCP Maimon掃描 -sU UDP掃描 -sN/sF/sX TCP Null,FIN, and Xmas掃描 --scanflags 自定義TCP包中的flags -sI zombie host[:probeport] Idlescan -sY/sZ SCTP INIT/COOKIE- ECHO 掃描 -sO 使用IP protocol 掃描确定目标機支援的協定類型 -b “FTP relay host” 使用FTP bounce scan 指定端口和掃描順序 -p 特定的端口 -p80,443 或者 -p1-65535 -p U:PORT 掃描udp的某個端口, -p U:53 -F 快速掃描模式,比預設的掃描端口還少 -r 不随機掃描端口,預設是随機掃描的 --top-ports "number" 掃描開放機率最高的number個端口,出現的機率需要參考nmap-services檔案,ubuntu中該檔案位于/usr/share/nmap.nmap預設掃前1000個 --port-ratio "ratio" 掃描指定頻率以上的端口 服務版本識别 -sV 開放版本探測,可以直接使用-A同時打開作業系統探測和版本探測 --version-intensity "level" 設定版本掃描強度,強度水準說明了應該使用哪些探測封包。數值越高,服務越有可能被正确識别。預設是7 --version-light 打開輕量級模式,為--version-intensity 2的别名 --version-all 嘗試所有探測,為--version-intensity 9的别名 --version-trace 顯示出詳細的版本偵測過程資訊 腳本掃描 -sC 根據端口識别的服務,調用預設腳本 --script=”Lua scripts” 調用的腳本名 --script-args=n1=v1,[n2=v2] 調用的腳本傳遞的參數 --script-args-file=filename 使用文本傳遞參數 --script-trace 顯示所有發送和接收到的資料 --script-updatedb 更新腳本的資料庫 --script-help=”Lua script” 顯示指定腳本的幫助 OS識别 -O 啟用作業系統檢測,-A來同時啟用作業系統檢測和版本檢測 --osscan-limit 針對指定的目标進行作業系統檢測(至少需确知該主機分别有一個open和closed的端口) --osscan-guess 推測作業系統檢測結果,當Nmap無法确定所檢測的作業系統時,會盡可能地提供最相近的比對,Nmap預設進行這種比對 防火牆/IDS躲避和哄騙 -f; --mtu value 指定使用分片、指定資料包的MTU. -D decoy1,decoy2,ME 使用誘餌隐蔽掃描 -S IP-ADDRESS 源位址欺騙 -e interface 使用指定的接口 -g/ --source-port PROTNUM 使用指定源端口 --proxies url1,[url2],... 使用HTTP或者SOCKS4的代理 --data-length NUM 填充随機資料讓資料包長度達到NUM --ip-options OPTIONS 使用指定的IP選項來發送資料包 --ttl VALUE 設定IP time-to-live域 --spoof-mac ADDR/PREFIX/VEBDOR MAC位址僞裝 --badsum 使用錯誤的checksum來發送資料包 Nmap 輸出 -oN 将标準輸出直接寫入指定的檔案 -oX 輸出xml檔案 -oS 将所有的輸出都改為大寫 -oG 輸出便于通過bash或者perl處理的格式,非xml -oA BASENAME 可将掃描結果以标準格式、XML格式和Grep格式一次性輸出 -v 提高輸出資訊的詳細度 -d level 設定debug級别,最高是9 --reason 顯示端口處于帶确認狀态的原因 --open 隻輸出端口狀态為open的端口 --packet-trace 顯示所有發送或者接收到的資料包 --iflist 顯示路由資訊和接口,便于調試 --log-errors 把日志等級為errors/warings的日志輸出 --append-output 追加到指定的檔案 --resume FILENAME 恢複已停止的掃描 --stylesheet PATH/URL 設定XSL樣式表,轉換XML輸出 --webxml 從namp.org得到XML的樣式 --no-sytlesheet 忽略XML聲明的XSL樣式表 時間性能優化 -T 時間優化(0-5)(paranoid|sneaky|polite|normal|aggressive|insane) -F 快速掃描。 --max-retries 調整重傳次數。 --min-hostgroup/--max-hostgroup size 設定組的大小 --min-parallelism/--max-parellelism time 指定時間内的探針數 --min-rtt-timrout/--max-rtt-timrout/initial-rtt-timrouttime 指定探針逾時 --scan-delay/-max-scan-delay time 指定探針之間的時延 --max-retries tries 指定探針重傳轉發數 --host-timeout time 設定掃描主機的最大時間 --defeat-rst-ratelimit 設定rst的限制 其他nmap選項 -6 開啟IPv6 -A OS識别,版本探測,腳本掃描和traceroute --datedir DIRNAME 說明使用者Nmap資料檔案位置 --send-eth / --send-ip 使用原以太網幀發送/在原IP層發送 --privileged 假定使用者具有全部權限 --unprovoleged 假定使用者不具有全部權限,建立原始套接字需要root權限 -V 列印版本資訊 -h 輸出幫助 |
(3)主機發現
1.指定目标的格式
指定單個目标
1 | namp -sS 192.168.14.144 -A |
指定多個目标(使用逗号分隔)
1 | namp -sS 192.168.14.144,192.192.10.22 -A |
指定掃描範圍
1 2 3 4 5 | namp -sS 192.168.14.0-255 或者 namp -sS 192.168.14.0/24 |
從清單中輸入(-iL <inputfilename> )
隻要生成要掃描的主機的清單,用-iL 把檔案名作為選項傳給Nmap。清單中的項可以是Nmap 在 指令行上接受的任何格式(IP 位址,主機名,CIDR,IPv6,或者八位位元組範圍)。 每一項必須以一個或多個空格,制表符或換行符分開。 如果您希望Nmap 從标準輸入而不是實際檔案讀取清單, 您可以用一個連字元(-)作為檔案名
1 2 3 | 例子: namp -iL ip.txt |
随機選擇目标(-iR <hostnum> )
對于網際網路範圍内的調查和研究 您也許想随機地選擇目标
1 2 3 | 例子: nmap -sS - PS80 -iR 0 -p 80 |
注意:選項0意味永無休止的掃描
排除主機/網絡(--exclude <host1[,host2][,host3],...>)
如果在您指定的掃描範圍有一些主機或網絡不是您的目标, 那就用該選項加上以逗号分隔的清單排除它們。該清單用正常的Nmap 文法, 是以它可以包括主機名,CIDR,八位位元組範圍等等。 當您希望掃描的網絡包含執行關鍵任務的伺服器,已知的對端口掃描反應強烈的 系統或者被其它人看管的子網時,這也許有用。
1 2 3 | 例子: namp -sS 192.168.10.0/24 --exclude 192.168.10.157,192.168.10.188 |
排除檔案中的清單(--excludefile <excludefile> )
這和--exclude 選項的功能一樣,隻是所排除的目标是用以 換行符,空格,或者制表符分隔的 <excludefile>提供的,而不是在指令行上輸入的。
1 2 3 | 例子: namp -sS 192.168.14.0/24 --excludefile ip.txt |
2.主機發現
清單掃描 -sL
Ping 掃描 -sP
1 2 3 4 | 隻會列印活着的主機 。沒有進一步的測試 (如端口掃描或者作業系統探測)。 它可以很友善地得出 網絡上有多少機器正在運作或者監視伺服器是否正常運作。 注意:需要root權限,如果不是root權限,PING掃描将會使用connect()調用。 |
無ping掃描 -P0
1 | 對所有指定目标進行掃描,不管這個目标是不是活的。 |
TCP SYN Ping -PS [portlist]
1 2 3 4 5 | 該選項發送一個設定了 SYN 标志位的空 TCP 封包。 預設目的端口為80。 SYN 标志位告訴對方您正試圖建立一個連接配接 通常目标端口是關閉的,一個 RST (複位) 包會發回來。 如果碰巧端口是開放的,目标會進行 TCP 三步握手的第二步,回應 一個SYN/ACK TCP 封包。然後運作 Nmap 的機器則會扼殺這個正在建立的連接配接 發送一個RST 而非 ACK 封包,否則,一個完全的連接配接将會建立。 RST 封包是運作Nmap 的機器而不是Nmap 本身響應的,因為它對收到 的SYN/ACK 感到很意外。 Nmap 并不關心端口開放還是關閉。 無論 RST 還是 SYN/ACK 響應都告訴 Nmap 該主機正在運作。 |
TCP ACK Ping -PA [portlist]
1 2 3 4 5 | TCP ACK ping 和剛才讨論的SYN ping 相當類似,差別就是設定TCP 的 ACK 标志位而不是SYN 标志位。 提供SYN 和ACK 兩種ping 探測的原因是使通過防火牆的機會盡可能大 許多管理者會配置他們的路由器或者其它簡單的防火牆來封鎖SYN 封包,除非 連接配接目标是那些公開的伺服器像公司網站或者郵件伺服器。 這可以阻止其它進入組織的連接配接,同時也允許使用者通路網際網路。 這種無狀态的方法幾乎不占用防火牆/路由器的資源,因而被硬體和軟體過濾器 廣泛支援 Linux Netfilter/iptables 防火牆軟體提供友善的 --syn 選項來實作這種無狀态的方法 。當這樣的無狀态防火牆規則存在時,發送到關閉目标端口的SYN ping 探測 (-PS) 很可能被封鎖。這種情況下,ACK 探測格外有閃光點,因為它正好利用了 這樣的規則。 另外一種常用的防火牆用有狀态的規則來封鎖非預期的封包。 這一特性已開始隻存在于高端防火牆,但是這些年類它越來越普遍了。 Linux Netfilter/iptables 通過 --state 選項支援這一特性,它根據連接配接狀态把封包 進行分類。SYN 探測更有可能用于這樣的系統,由于沒頭沒腦的 ACK 封包 通常會被識别成僞造的而丢棄。解決這個兩難的方法是通過即指定 -PS 又指定-PA 來即發送SYN 又發送ACK。 |
UDP Ping -PU [portlist]
1 2 3 4 | 還有一個主機發現的選項是 UDP ping,它發送一個空的(除非指定了--data-length UDP 封包到給定的端口。端口清單的格式和前面讨論過的-PS 和-PA 選項還是一樣 如果不指定端口 , 默 認 是 31338 。 該 默 認 值 可 以 通 過 在 編 譯 時 改 變 nmap.h 文 件 中 的 DEFAULT_UDP_PROBE_PORT 值進行配置。預設使用這樣一個奇怪的端口是因為對開放端口 進行這種掃描一般都不受歡迎。 該掃描類型的主要優勢是它可以穿越隻過濾TCP 的防火牆和過濾器。 |
ARP Ping -PR
1 2 3 | 最常見的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
1 | 告訴Nmap 永不對它發現的活動IP 位址進行反向域名解析。 既然DNS 一般比較慢,這可以讓事情更快些。 |
為所有目标解析域名 -R
1 | 告訴Nmap 永遠 對目标IP 位址作反向域名解析。 一般隻有當發現機器正在運作時才進行這項操作。 |
使用系統域名解析器 --system_dns
1 | 預設情況下,Nmap 通過直接發送查詢到您的主機上配置的域名伺服器 來解析域名。為了提高性能,許多請求 (一般幾十個 ) 并發執行。如果您希望使用系統自帶的解析器,就指定該選項 (通過 getnameinfo()調用一次解析一個 IP)。除非 Nmap 的 DNS 代碼有 bug--如果是這樣,請聯系我們。 一般不使用該選項,因為它慢多了。系統解析器總是用于 IPv6掃描 。 |
(四)端口掃描
Nmap把端口分成六個狀态: open(開放的), closed(關閉的),filtered(被過濾的),unfiltered(未被過濾的), open|filtered(開放或者被過濾的),或者 closed|filtered(關閉或者未被過濾的)。
1.Nmap 所識别的6個端口狀态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | open(開放的) 應用程式正在該端口接收TCP 連接配接或者UDP 封包。發現這一點常常是端口掃描 的主要目标。安全意識強的人們知道每個開放的端口 都是攻擊的入口。攻擊者或者入侵測試者想要發現開放的端口。 而管理者則試圖關閉它們或者用防火牆保護它們以免妨礙了合法使用者。非安全掃描可能對開放的端口也感興趣,因為它們顯示了網絡上那些服務可供使用。 closed(關閉的) 關閉的端口對于Nmap 也是可通路的(它接受Nmap 的探測封包并作出響應), 但沒有應用程式在其上監聽 它們可以顯示該IP 位址上(主機發現,或者 ping 掃描)的主機正在運作up 也對部分作業系統探測有所幫助。 因為關閉的關口是可通路的,也許過會兒值得再掃描一下, 可能一些又開放了。 系統管理者可能會考慮用防火牆封鎖這樣的端口。 那樣他們就會被顯示為被過濾的狀态,下面讨論。 filtered(被過濾的) 由于包過濾阻止探測封包到達端口, Nmap 無法确定該端口是否開放。過濾可能來自專業的防火牆裝置,路由器規則 或者主機上的軟體防火牆。這樣的端口讓攻擊者感覺很挫折, 因為它們幾乎不提供 任何資訊。有時候它們響應ICMP 錯誤消息如類型3代碼13 (無法到達目标: 通信被管理者禁止),但更普遍的是過濾器隻是丢棄探測幀, 不做任何響應。 這迫使 Nmap 重試若幹次以訪萬一探測包是由于網絡阻塞丢棄的。 這使得掃描速度明顯變慢。 unfiltered(未被過濾的) 未被過濾狀态意味着端口可通路,但Nmap 不能确定它是開放還是關閉。 隻有用于映射防火牆規則集的ACK 掃描才會把端口分類到這種狀态。 用其它類型的掃描如視窗掃描,SYN 掃描,或者FIN 掃描來掃描未被過濾的端口可以幫助确定 端口是否開放。 open|filtered(開放或者被過濾的) 當無法确定端口是開放還是被過濾的,Namp 就把該端口劃分成 這種狀态。開放的端口不響應就是一個例子。沒有響應也可能意味着封包過濾器丢棄 了探測封包或者它引發的任何響應。是以 Nmap 無法确定該端口是開放的還是被過濾的。 UDP,IP 協定, FIN,Null, 和 Xmas 掃描可能把端口歸入此類。 closed|filtered(關閉或者被過濾的) 該狀态用于Nmap 不能确定端口是關閉的還是被過濾的 它隻可能出現在IPID Idle 掃描中 。 |
2.掃描技術
TCP SYN 掃描 -sS (匿名掃描,預設不加類型,需要root權限,掃描速度快)
TCP connect()掃描 -sT (TCP全連接配接掃描,不需要root權限,TCP掃描的預設模式,端口狀态和SYN相同,耗時長)
UDP 掃描 -sU
注意:UDP 掃描用-sU 選項激活。它可以和TCP 掃描如 SYN 掃描 (-sS)結合使用來同時檢查兩種協定。
IP 協定掃描 -sO
IP 協定掃描可以讓您确定目标機支援哪些IP 協定 (TCP,ICMP,IGMP,等等),從技術上說,這不是端口掃描,既然它周遊的是IP 協定号而不是TCP 或者 UDP 端口号。
3.端口說明和掃描順序
除了所有前面讨論的掃描方法, Nmap 提供選項說明那些端口被掃描以及掃描是随機還是順序進行。 預設情況下,Nmap 用指定的協定對端口1到1024以及 nmap-services 檔案中列出的更高的端口在掃描。
隻掃描指定的端口 -p <port ranges>
1 2 3 | 該選項指明您想掃描的端口,覆寫預設值 單個端口和用連字元表示的端口範圍(如 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
1 | 在 nmap 的nmap-services 檔案中(對于-sO,是協定檔案)指定您想要掃描的端口。 這比掃描所有65535個端口快得多。 因為該清單包含如此多的 TCP 端口(1200多),這和預設的 TCP 掃描 scan (大約1600個端口)速度差别不是很大。如果您用--datadir 選項指定您自己的 小小的 nmap-services 檔案 ,差别會很驚人。 |
不要按随機順序掃描端口 -r
1 | 預設情況下,Nmap 按随機順序掃描端口 (除了出于效率的考慮,常用的端口前移)。這種随機化通常都是受歡迎的, 但您也可以指定-r 來順序端口掃描。 |
(5)服務和版本探測
版本探測 -sV
1 | 打開版本探測。 您也可以用-A 同時打開作業系統探測和版本探測。 |
不為版本探測排除任何端口 --allports
1 | 預設情況下,Nmap 版本探測會跳過9100 TCP 端口,因為一些列印機簡單地列印送到該端口的 任何資料,這回導緻數十頁HTTP get 請求,二進制 SSL 會話請求等等被列印出來。這一行為可以通過修改或删除nmap-service-probes 中的 Exclude 訓示符改變, 您也可以不理會任何Exclude 訓示符,指定--allports 掃描所有端口 |
設定 版本掃描強度 --version-intensity <intensity>
1 | 當進行版本掃描(-sV)時,nmap 發送一系列探測封包 ,每個封包都被賦予一個1到9之間的值。 被賦予較低值的探測封包對大範圍的常見服務有效,而被賦予較高值的封包 一般沒什麼用。強度水準說明了應該使用哪些探測封包。數值越高, 服務越有可能被正确識别。 然而,高強度掃描花更多時間。強度值必須在0和9之間。 預設是7。當探測封包通過 nmap- service-probes ports 訓示符 注冊到目标端口時,無論什麼強度水準,探測封包都會被嘗試。這保證了DNS 探測将永遠在任何開放的53端口嘗試, SSL 探測将在443端口嘗試,等等。 |
打開輕量級模式 --version-light
1 | 這是 --version-intensity 2的友善的别名。輕量級模式使 版本掃描快許多,但它識别服務的可能性也略微小一點。 |
嘗試每個探測 --version-all
1 | --version-intensity 9的别名, 保證對每個端口嘗試每個探測封包。 |
--version-trace 跟蹤版本掃描活動
1 | 這導緻 Nmap 列印出詳細的關于正在進行的掃描的調試資訊。 它是您用--packet-trace 所得到的資訊的子集。 |
RPC 掃描 -sR
1 2 | 這種方法和許多端口掃描方法聯合使用。 它對所有被發現開放的 TCP/UDP 端口執行 SunRPC 程式 NULL 指令,來試圖 确定它們是否RPC 端口,如果是, 是什麼程式和版本号。是以您可以有效地獲得和 rpcinfo -p 一樣的資訊 即使目标的端口映射在防火牆後面(或者被TCP 包裝器保護)。Decoys 目前不能和RPC scan 一起工作。 這作為版本掃描(-sV)的一部分自動打開。 由于版本探測包括它并且全面得多,-sR 很少被需要。 |
(六)作業系統探測
啟用作業系統檢測 -O
1 | 也可以使用-A 來同時啟用作業系統檢測和版本檢測。 |
針對指定的目标進行作業系統檢測 --osscan-limit
1 | 如果發現一個打開和關閉的TCP 端口時,作業系統檢測會更有效。 采用這個選項,Nmap 隻對滿足這個條件的主機進行作業系統檢測,這樣可以 節約時間,特别在使用-P0掃描多個主機時。這個選項僅在使用 -O 或-A 進行作業系統檢測時起作用。 |
推測作業系統檢測結果 --osscan-guess; --fuzzy
1 | 當 Nmap 無法确定所檢測的作業系統時,會盡可能地提供最相近的比對, Nmap 預設 進行這種比對,使用上述任一個選項使得Nmap 的推測更加有效。 |
(七)優化性能
調整并行掃描組的大小 --min-hostgroup <milliseconds>; --max-hostgroup <milliseconds>
1 | Nmap 具有并行掃描多主機端口或版本的能力,Nmap 将多個目标IP 位址空間分成組,然後在同一時間對一個組進行掃描。通常,大的組更有效。缺點是隻有當整個組掃描結束後才會提供主機的掃描結果。如果組的大小定義為50,則隻有目前50個主機掃描結束後才能得到報告(詳細模式中的補充資訊除外)。<br><br> |
預設方式下,Nmap 采取折衷的方法。開始掃描時的組較小,最小為5,這樣便于盡快産生結果;随後增長組的大小,最大為1024。确切的大小依賴于所給定的選項。為保證效率,針對 UDP 或少量端口的TCP 掃描,Nmap 使用大的組。
--max-hostgroup 選項用于說明使用最大的組,Nmap 不會超出這個大小。--min-hostgroup 選項說明最小的組,Nmap 會保持組大于這個值。如果在指定的接口上沒有足夠的目标主機來滿足所指定的最小值,Nmap 可能會采用比所指定的值小的組。這兩個參數雖然很少使用, 但都用于保持組的大小在一個指定的範圍之内。
這些選項的主要用途是說明一個最小組的大小,使得整個掃描更加快速。通常選擇256來掃描 C 類網段。對于端口數較多的掃描,超出該值沒有意義。對于端口數較少的掃描, 2048 或更大的組大小是有幫助的。
調整探測封包的并行度 --min-parallelism <milliseconds>; --max-parallelism <milliseconds>
1 2 3 4 5 | 這些選項控制用于主機組的探測封包數量,可用于端口掃描和主機發現。預設狀态下 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>
1 2 3 4 5 6 7 8 9 | 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 僅将逾時時間降至最小值,這個情況是不正常的,需要向namp-dev 郵件清單報告bug。 |
放棄低速目标主機 --host-timeout <milliseconds>
1 2 | 由于性能較差或不可靠的網絡硬體或軟體、帶寬限制、嚴格的防火牆等原因,一些主機需要很長的時間掃描。這些極少數的主機掃描往往占據了大部分的掃描時間。是以,最好的辦法是減少時間消耗并且忽略這些主機,使用 --host-timeout 選項來說明等待的時間(毫秒)。通常使用1800000 來保證 Nmap 不會在單個主機上使用超過半小時的時間。需要注意的是, Nmap 在這半小時中可以同時掃描其它主機,是以并不是完全放棄掃描。逾時的主機被忽略 , 是以也沒有針對該主機的端口表、作業系統檢測或版本檢測結果的輸出。 |
調整探測封包的時間間隔 --scan-delay <milliseconds>; --max_scan-delay <milliseconds>
1 | 這個選項用于Nmap 控制針對一個主機發送探測封包的等待時間(毫秒),在帶寬控制的情況下這個選項非常有效 Solaris 主機在響應UDP 掃描探測封包封包時,每秒隻發送一個 ICMP 消息,是以 Nmap 發送的很多數探測封包是浪費的。--scan-delay 設為1000,使Nmap 低速運作。Nmap 嘗試檢測帶寬控制并相應地調整掃描的延遲,但并不影響明确說明何種速度工作最佳。 |
--scan-delay 的另一個用途是躲閉基于門檻值的入侵檢測和預防系統(IDS/IPS)。
設定時間模闆 -T <Paranoid|Sneaky|Polite|Normal|Aggressive|Insane>
1 2 3 4 5 6 7 8 9 10 11 12 13 | 上述優化時間控制選項的功能很強大也很有效,但有些使用者會被迷惑。此外,往往選擇合适參數的時間超過了所需優化的掃描時間。是以,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分鐘。T1和 T2選項比較類似,探測封包間隔分别為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 躲避和哄騙
封包分段 -f
1 | 要求掃描時(包挺 ping 掃描)使用 小的 IP 包分段。其思路是将 TCP 頭分段在幾個包中,使得包過濾器、 IDS 以及其它工具的檢測更加困難。 |
使用指定的MTU --mtu
1 | 使用--mtu 選項可 以自定義偏移的大小,使用時不需要-f,偏移量必須 是8的倍數。 |
使用誘餌隐蔽掃描 -D <decoy1 [,decoy2][,ME],...>
1 2 3 4 5 6 7 8 9 10 | 為使誘餌掃描起作用,需要使遠端主機認為是誘餌在掃描目标網絡 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>
1 2 3 | 在某些情況下,Nmap 可能無法确定你的源位址(如果這樣,Nmap 會給出 提示)。此時,使用-S 選項并說明所需發送包的接口IP 位址。 這個标志的另一個用處是哄騙性的掃描,使得目标認為是另 一個位址在進行掃描。 |
使用指定的接口 -e <interface>
1 | 告訴 Nmap 使用哪個接口發送和接收封包,Nmap 可以進行自動檢測, 如果檢測不出會給出提示。 |
源端口哄騙 --source-port <portnumber>; -g <portnumber>
1 | 依賴于源端口号就信任資料流是一種常見的錯誤配置,Nmap 提供了-g 和--source-port 選項(它們是等價的),用于利用上述弱點。隻需要提供一個端口号,Nmap 就可以從這些端口發送資料。為使特定的作業系統正常工作,Nmap 必須使用不同的端口号。 DNS 請求會忽略--source-port 選項,這是因為 Nmap 依靠系統庫來處理。大部分TCP 掃描,包括SYN 掃描,可以完全支援這些選項,UDP 掃描同樣如此。 |
發送封包時 附加随機資料 --data-length <number>
1 2 | 正常情況下,Nmap 發送最少的封包,隻含一個標頭。是以 TCP 包通常 是40位元組,ICMP ECHO 請求隻有28位元組。這個選項告訴 Nmap 在發送的封包上 附加指定數量的随機位元組。作業系統檢測(-O)包不受影響, 但大部分ping 和端口掃描包受影響,這會使處理變慢,但對掃描的影響較小。 |
設定IP time-to-live 域 --ttl <value>
1 | 設定IPv4封包的time-to-live 域為指定的值。 |
對目标主機的順序随機排列 --randomize-hosts
1 | 告訴Nmap 在掃描主機前對每個組中的主機随機排列,最多可達 8096個主機。這會使得掃描針對不同的網絡監控系統來說變得不是很 明顯,特别是配合值較小的時間選項時更有效。如果需要對一個較大 的組進行随機排列,需要增大 nmap.h 檔案中 PING_GROUP_SZ 的值 , 并重新編譯。另一種方法是使用清單掃描 (-sL -n -oN <filename>),産生目标 IP 的清單, 使用 Perl 腳本進行随機化,然後使用-iL 提供給Nmap。 |
MAC 位址哄騙 --spoof-mac <mac address,prefix,or vendor name>
1 | 要求 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 參數有, Apple, 0,01:02:03:04:05:06, deadbeefcafe,0020F2, 和Cisco. |
(九)輸出
Nmap 輸出格式
-oN <filespec> (标準輸出)
-oX <filespec> (XML 輸出)
-oS <filespec> (ScRipT KIdd|3 oUTpuT)
-oG <filespec> (Grep 輸出)
1 2 3 4 5 6 | 一種便于通過bash或者perl處理的格式,不建議使用。XML 輸格式很強大,便于有經驗的使用者使用。XML 是一種标準,由許多解析器構成,而Grep 輸出更簡化。XML 是可擴充的,以支援新釋出的 Nmap 特點。使用Grep 輸出的目的是忽略這些特點,因為沒有足夠的空間。 Grep 輸出可以包含注釋(每行由#号開始)。每行由6個标記的域組成,由制表符及冒号分隔。 這些域有主機,端口, 協定,忽略狀态, 作業系統,序列号, IPID 和狀态。 這些域中最重要的是Ports,它提供了所關注的端口的細節,端口項由逗号分隔。每個端口項代表一個所關注的端口,每個子域由/分隔。這些子域有:端口号, 狀态,協定, 擁有者,服務, SunRPCinfo 和版本資訊。 |
-oA <basename> (輸出至所有格式)
1 2 | 為使用友善,利用-oA< basename >選項 可将掃描結果以标準格式、XML 格式和Grep 格式一次性輸出。 分别存放在 < basename >.nmap,< basename >.xml 和 < basename>.gnmap 檔案 中。也可以在檔案名前 指定目錄名,如在 UNIX 中,使用~/nmaplo gs/foocorp/, 在 Window 中,使用c:\hacking\sco on Windows。 |