Nmap 是 the Network Mapper 的縮寫。是知名開源網路通訊埠掃描 (Port scan) 工具 。在滲透測試或紅隊演練的作業中,常做為第一步偵察網路環境的工具。
功能強大,但是參數繁多,常使初學者不知道哪種情境需要應用什麼參數。接下來的文章,會列出 Nmap 9 個常見的掃描情境,提供給讀者參考。讓讀者可以直接針對情境,直接複製參數,即可應用。
如果你對 Nmap 的掃描情境有興趣,就請你繼續看下去吧。
請注意!以下 Nmap 指令操作禁止在非授權環境下執行!。可利用虛擬機器軟體練習,建立虛擬主機,以進行掃描。
文章目錄
加快掃描速度
nmap -T4 192.168.0.1
在 Nmap Time and Performance 手冊裡提到,Nmap 有數個影響掃描速度的參數選項,但設定錯誤,有可能會交互影響,甚至可能讓掃描速度減慢。
Nmap 開發者貼心提供使用者一個Timing 掃描時間範本參數選項 -T
,一次幫大家配好影響掃描速度的參數,堪稱是「掃描速度懶人包」。
而數字越大代表掃描速度越快,分別如下:
paranoid
(0
)sneaky
(1
)polite
(2
)normal
(3
)aggressive
(4
)insane
(5
)
若完全沒有設定,預設是使用 -T3 參數。手冊說如果網路環境穩定,參數建議調整為 -T4。-T4
禁止動態 TCP Port 掃描延遲超過 10 ms。而 -T5 選項對於掃描時間要求太過嚴苛,可能會失去準度 。雖掃描速度快,但仍不建議使用。而 -T0 ~ -T1 是避免 IDS 告警,但掃描速度頗慢,沒有特殊需求,不建議使用。
-T4 代表
--max-rtt-timeout 1250ms --min-rtt-timeout 100ms --initial-rtt-timeout 500ms --max-retries 6 --max-scan-delay 10ms
無論如何,一定要開啟 -T4 參數,增進掃描效率。
Port Scan 技術 (-sS 與 -sT 參數)
-sS 參數代表掃描技術是 TCP SYN Scan,若 Nmap 使用 root 權限執行,具備操控 raw socket 封包的權限, 僅送出 TCP SYN 封包進行測試。官方說明文件表示此種掃描技術執行效率較佳,但實測則不然。
-sT 參數代表掃描技術是 TCP Connect Scan,掃描時會呼叫 作業系統的 System Call Connect API,以送出刺探封包,僅需普通使用者權限即可執行。官方說明文件表示在預設沒有 root 權限時會使用此掃描技術。
經實測比較 -sS 與 -sT 掃描速度,掃描對象是 192.168.0.1 的 TCP Port 1 ~ 65535 ,帶 -sT 參數的 Nmap 掃描,約 35 秒掃描完畢。
$ time nmap -T4 -sT -p T:1-65535 192.168.0.1 Starting Nmap 7.01 ( https://nmap.org ) at 2021-05-02 11:36 CST Nmap scan report for 192.168.0.1 Host is up (0.0048s latency). Not shown: 39528 closed ports, 26001 filtered ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 139/tcp open netbios-ssn 445/tcp open microsoft-ds 2000/tcp open cisco-sccp 5060/tcp open sip Nmap done: 1 IP address (1 host up) scanned in 35.63 seconds
而帶 -sS 參數的 Nmap 掃描,卻要花到超過 4000 秒,才掃描完畢。建議使用 -sT 參數進行掃描。
$ sudo time nmap -T4 -sS -p T:1-65535 192.168.0.1 Starting Nmap 7.01 ( https://nmap.org ) at 2021-05-02 11:38 CST Stats: 0:18:07 elapsed; 0 hosts completed (1 up), 1 undergoing SYN Stealth Scan SYN Stealth Scan Timing: About 27.42% done; ETC: 12:44 (0:48:00 remaining) Nmap scan report for 192.168.0.1 Host is up (0.012s latency). Not shown: 39526 closed ports, 26005 filtered ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 139/tcp open netbios-ssn 445/tcp open microsoft-ds Nmap done: 1 IP address (1 host up) scanned in 4232.79 seconds
列舉開啟服務的詳細版本
$ nmap -sV -T4 192.168.0.1 Starting Nmap 7.01 ( https://nmap.org ) at 2021-04-25 14:47 CST Nmap scan report for 192.168.0.1 Host is up (0.021s latency). Not shown: 997 closed ports PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0) 3389/tcp open ms-wbt-server Microsoft Terminal Service 8080/tcp open http Apache httpd Service Info: OSs: Linux, Windows; CPE: cpe:/o:linux:linux_kernel, cpe:/o:microsoft:windows
開啟 -sV
參數時,當 Nmap 掃描到服務通訊埠開啟時,會再進一步查詢內建的 nmap-service-probes
資料庫,再多送出幾個刺探封包,想辦法從回傳的封包資料,去判斷開啟的服務與 Banner。而查詢資料庫的深度會由 --version-intensity
參數決定,範圍是 0 ~ 9,預設是 7。
建議查詢資料庫深度不用指定,使用預設參數即可。
確認目標網段內有哪些機器活著
一開始想針對大範圍網段,確認同網段的主機哪些有開機,適合使用「Ping scan」,參數是「-sn」。 如此一來,就不會執行詳細的通訊埠掃描。僅確認同網段主機是否開機。
$ nmap -T4 -sn 192.168.1.0/24 Starting Nmap 7.01 ( https://nmap.org ) at 2021-04-25 15:37 CST Nmap scan report for 192.168.1.1 Host is up (0.12s latency). Nmap scan report for 192.168.1.3 Host is up (0.14s latency). Nmap scan report for 192.168.1.5 Host is up (0.061s latency). Nmap scan report for 192.168.1.100 Host is up (0.00021s latency). Nmap done: 256 IP addresses (4 hosts up) scanned in 4.66 seconds
掃描 1-65535 Port
Nmap 為了掃描效率,只會掃描常見的 1000 個 Port。怕遺漏的話,可以指定掃描參數 -p 1-65535
,如此一來會從 Port 1 掃描到 Port 65535。
$ nmap -T4 -sT -p 1-65535 192.168.0.1 Starting Nmap 7.01 ( https://nmap.org ) at 2021-04-25 16:04 CST Nmap scan report for 192.168.0.1 Host is up (0.044s latency). Not shown: 65532 closed ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 3389/tcp open ms-wbt-server
若要限定是 TCP Port,則可加上T: 前置。比方說, -p T:1-65535
。
$ nmap -T4 -sT -p T:1-65535 192.168.0.1
不 Ping Probes 直接掃描
Starting Nmap 7.01 ( https://nmap.org ) at 2021-04-25 10:45 CST Note: Host seems down. If it is really up, but blocking our ping probes, try -Pn Nmap done: 1 IP address (0 hosts up) scanned in 2.00 seconds
如果你看到以上的訊息,就表示防火牆阻擋了 Nmap 主機存活的刺探封包。
Nmap 掃描之前,會向 TCP Port 80 與 443 發送 SYN 封包。並藉由回應的 ACK 封包或 ICMP 封包 (Destination Port unreachable) ,確認主機是否存在。
若是主機前端的防火牆直接拒絕回應 TCP Port 80 與 443 的 SYN 封包,就會得到上面訊息的回應。此時,若讀者非常確定主機有上線,可以下 -Pn
參數。直接請 Nmap 跳過存活刺探步驟,直接進行掃描。
$ nmap -T4 -Pn 192.168.0.1 Starting Nmap 7.01 ( https://nmap.org ) at 2021-04-25 11:13 CST Nmap scan report for 192.168.0.1 Host is up (0.0012s latency). Not shown: 998 closed ports PORT STATE SERVICE 80/tcp filtered http 443/tcp filtered https Nmap done: 1 IP address (1 host up) scanned in 1.26 seconds
Nmap 掃描結果顯示主機的 TCP Port 80 與 Port 443 是有防火牆在過濾封包的。
防火牆保護下的通訊埠掃描
Nmap 預設即能探尋主機前端的防火牆狀態。但是會依照防火牆規則的設定方式,分為白名單規則與黑名單規則。
白名單規則的定義是,預設全部連線阻擋(Deny ALL),僅開放部份允許。黑名單規則的定亦是,預設全部連線允許(Allow ALL),僅開放部份阻擋。實體防火牆設備,出廠預設都是 Deny ALL。讓使用者再選擇開放允許的連線埠。
白名單防火牆規則
防火牆僅用白名單方式,開放 TCP Port 3306、3389,預設阻擋其他的Port 。所以也一併阻擋了 Nmap 向 TCP Port 80, Port 443 發送的主機存活刺探封包。必須得加上 -Pn 參數進行掃描。
但主機上未開啟 TCP Port 3389、3306 的服務。Nmap 掃描結果如下:
$ nmap -T4 -Pn 192.168.0.1 Starting Nmap 7.01 ( https://nmap.org ) at 2021-04-25 15:02 CST Nmap scan report for 192.168.0.1 Host is up (0.00022s latency). Not shown: 998 filtered ports PORT STATE SERVICE 3306/tcp closed mysql 3389/tcp closed ms-wbt-server Nmap done: 1 IP address (1 host up) scanned in 3.94 seconds
「Not shown: 998 filtered ports」訊息 ,表示向主機 其他的 998 個 Port 的連線,全部被防火牆過濾了。防火牆僅開放 Port 3306 與 Port 3389 的連線。但是主機上未開啟TCP Port 3389、3306 的服務,STATE 顯示 closed。
主機上有開啟 TCP Port 3389、3306 的情境,Nmap 掃描結果如下:
$ nmap -T4 -Pn 192.168.0.1 Starting Nmap 7.01 ( https://nmap.org ) at 2021-04-25 15:11 CST Nmap scan report for 192.168.0.1 Host is up (0.00039s latency). Not shown: 998 filtered ports PORT STATE SERVICE 3306/tcp open mysql 3389/tcp open ms-wbt-server Nmap done: 1 IP address (1 host up) scanned in 4.88 seconds
STATE 顯示 Open 表示,防火牆有開放 TCP Port 3306 與 TCP Port 3389。而且主機上也有開啟 TCP Port 3389 與 Port 3306 的服務,STATE 顯示 open。
黑名單防火牆規則
若防火牆是黑名單規則,預設允許全部,但阻擋 TCP Port 3306 與 TCP Port 3389的連線,則會出現以下掃描結果。
$ nmap -T4 -Pn 192.168.0.1 Starting Nmap 7.01 ( https://nmap.org ) at 2021-04-25 15:19 CST Nmap scan report for 192.168.0.1 Host is up (0.00018s latency). Not shown: 998 closed ports PORT STATE SERVICE 3306/tcp filtered mysql 3389/tcp filtered ms-wbt-server Nmap done: 1 IP address (1 host up) scanned in 1.24 seconds
表示 TCP Port 3306 與 TCP Port 3389 的連線,防火牆有過濾規則,STATE 顯示 filtered。「Not shown: 998 closed ports」訊息,代表其他 998 個 Port 均關閉,沒有任何服務。
猜測檢測目標的作業系統版本
以 Connect 模式 (-sT) 去猜測檢測目標的作業系統版本,由於 TCP/IP fingerprinting (for OS scan,參數 -O) 需要以 root 權限執行,故執行時使用 sudo
$ sudo nmap -T4 -sT -O 192.168.0.1 Starting Nmap 7.01 ( https://nmap.org ) at 2021-05-02 11:00 CST Nmap scan report for 192.168.0.1 Host is up (0.013s latency). Not shown: 568 closed ports, 428 filtered ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 139/tcp open netbios-ssn 445/tcp open microsoft-ds Device type: general purpose Running: Linux 2.6.X OS CPE: cpe:/o:linux:linux_kernel:2.6 OS details: Linux 2.6.15 - 2.6.26 (likely embedded) Network Distance: 2 hops OS detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 4.60 seconds
OS details 欄位就是 猜測為檢測目標是執行 Linux Kernel 2.6.15 – 2.6.26 版本。由於 Nmap 是從刺探封包的回應與開啟的服務,去猜測檢測目標的作業系統版本,所以無法得知是執行哪一個 Linux Distribution,頂多只能分辨出 Linux 或 Windows 作業系統的差別。
掃描結果輸出成 TXT 與 XML
-oN <logfile>
參數可以將掃描結果,同時以純文字格式,輸出到 logfile 檔案與螢幕上。
$ nmap -T4 -sT 192.168.0.1 -oN nmap.log Starting Nmap 7.01 ( https://nmap.org ) at 2021-05-02 16:00 CST Nmap scan report for 192.168.0.1 Host is up (0.0027s latency). Not shown: 568 closed ports, 428 filtered ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 139/tcp open netbios-ssn 445/tcp open microsoft-ds Nmap done: 1 IP address (1 host up) scanned in 8.34 seconds
觀察 nmap.log 內容,為純文字格式的掃描結果檔。
$ cat nmap.log # Nmap 7.01 scan initiated Fri May 2 16:00:31 2021 as: nmap -T4 -sT -oN nmap.log 192.168.0.1 Nmap scan report for 192.168.0.1 Host is up (0.0027s latency). Not shown: 568 closed ports, 428 filtered ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 139/tcp open netbios-ssn 445/tcp open microsoft-ds # Nmap done at Fri May 2 16:00:39 2021 -- 1 IP address (1 host up) scanned in 8.34 seconds
-oX <logfile>
參數可以將掃描結果,以 XML 格式輸出到 logfile 檔案中,而螢幕上則維持純文字輸出。
$ nmap -T4 -sT 192.168.0.1 -oX nmap-log.xml Starting Nmap 7.01 ( https://nmap.org ) at 2021-05-02 16:09 CST Nmap scan report for 192.168.0.1 Host is up (0.0035s latency). Not shown: 568 closed ports, 428 filtered ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 139/tcp open netbios-ssn 445/tcp open microsoft-ds Nmap done: 1 IP address (1 host up) scanned in 2.11 seconds
觀察 nmap-log.xml 內容,為 xml 格式的掃描結果檔。很適合完成掃描後,用程式剖析 xml 格式的掃描結果檔。
$ cat namp-log.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE nmaprun> <?xml-stylesheet href="file:///usr/bin/../share/nmap/nmap.xsl" type="text/xsl"?> <!-- Nmap 7.01 scan initiated Fri May 2 16:09:39 2021 as: nmap -T4 -sT -oX nmap-log.xml 192.168.0.1 --> <nmaprun scanner="nmap" args="nmap -T4 -sT -oX nmap-log.xml 192.168.0.1" start="162321234" startstr="Fri May 2 16:09:39 2021" version="7.01" xmloutputversion="1.04"> <scaninfo type="connect" protocol="tcp" numservices="1000" services="1,3-4,6-7,9,13,17,19-26,30,32-33,37,42-43,49,53,70,79-85,88-90,99-100,106,109-111,113,119,125,135,139,143-144,146,1,... ...[redacted].. 62078,63331,64623,64680,65000,65129,65389"/> <verbose level="0"/> <debugging level="0"/> <host starttime="162321234" endtime="162321244"><status state="up" reason="syn-ack" reason_ttl="0"/> <address addr="192.168.0.1" addrtype="ipv4"/> <hostnames> </hostnames> <ports><extraports state="closed" count="568"> <extrareasons reason="conn-refused" count="568"/> </extraports> <extraports state="filtered" count="428"> <extrareasons reason="no-responses" count="428"/> </extraports> <port protocol="tcp" portid="22"><state state="open" reason="syn-ack" reason_ttl="0"/><service name="ssh" method="table" conf="3"/></port> <port protocol="tcp" portid="80"><state state="open" reason="syn-ack" reason_ttl="0"/><service name="http" method="table" conf="3"/></port> <port protocol="tcp" portid="139"><state state="open" reason="syn-ack" reason_ttl="0"/><service name="netbios-ssn" method="table" conf="3"/></port> <port protocol="tcp" portid="445"><state state="open" reason="syn-ack" reason_ttl="0"/><service name="microsoft-ds" method="table" conf="3"/></port> </ports> <times srtt="3484" rttvar="814" to="100000"/> </host> <runstats><finished time="1620374981" timestr="Fri May 2 16:09:41 2021" elapsed="2.11" summary="Nmap done at Fri May 2 16:09:41 2021; 1 IP address (1 host up) scanned in 2.11 seconds" exit="success"/><hosts up="1" down="0" total="1"/> </runstats> </nmaprun>
多個參數一次滿足
以上是針對 Nmap 單一選項的說明。但實務上,針對單一目標主機,我通常會一次輸入多個參數,讓 Nmap 慢慢列舉開啟的通訊埠、服務類型與執行 Default 類型的 NSE Script ,以達成資訊蒐集目的。
$ nmap -T4 -sT -p 1-65535 -r -sC -sV 192.168.0.1
-T4、-sT 、-p、-sV 的參數說明,在前面已有介紹。而 -sC 是要執行 Default 類型的 NSE Script,而 Default 類型的 NSE Script 通常以資訊蒐集為主,較不具破壞性,細節說明請參照 Nmap NSE 文件說明。
-r 參數是請 Nmap 循序掃 Port,這參數是方便用網路封包側錄軟體 wireshark 監控目前的掃 Port 進度。
輸入以上的參數組合,Nmap 需要一段不短的時間執行,若想要加快速度,得到目標主機所開啟的通訊埠。
可參考我另外一篇文章「掃port 最速工具軟體– RustScan」。