CS KAIROS · LEARNING LIBRARY

M03-07 · Nmap、掃描設定與結果判讀

從授權範圍、掃描設定與原始結果,練習可查核的 Nmap 判讀與本機實驗。

CEH M03-07|Nmap、掃描設定與結果判讀:白話文完整教學

這一章的核心觀念是:Nmap 不只是用來找出哪些 Port 有開啟,更重要的是知道自己檢查了什麼、沒有檢查什麼,以及結果究竟能證明什麼。

這也是從「會操作資安工具」進一步成為「能夠執行專業資安檢測」的關鍵。

本教學依據 CS Kairos Learn — M03-07 的九個章節,並對照 Nmap 官方文件整理。

一、先建立完整概念:Nmap 就像大樓安全巡查員

假設你是負責大樓安全的管理員。

大樓有 100 扇門,但今天主管只授權你檢查第 1 號和第 2 號門。

你檢查後發現:

  • 第 1 號門:可以開啟。
  • 第 2 號門:無法開啟。

這時候,你能不能告訴主管:「整棟大樓都非常安全」?

當然不行。

因為你只檢查了兩扇門,剩下的 98 扇門根本沒有檢查。

Nmap 也是一樣的道理。

假設你今天只掃描一台主機的 TCP 8000 與 8001:

  • 8000 顯示 `open`
  • 8001 顯示 `closed`

你只能說這兩個 TCP Port 在這次掃描條件下呈現什麼狀態,不能直接推論整台主機沒有弱點。

Nmap 的完整工作流程

圖 1|從授權到可核對的結果

箭頭代表工作順序。每一步限定下一步的範圍,不代表完成掃描就證明安全。

  1. 授權與問題

    確認目標、排除項目、時段、來源與停止條件。

  2. 最小必要設定

    選定協定、連接埠及方法,逐項確認附加功能。

  3. 保留原始結果

    保存命令、版本、時間、回應、警告與未完成範圍。

  4. 比對與核實

    以管理端設定、程序及日誌核對,再決定下一步。

下載 SVG 圖檔

圖 1|從授權、檢測到核實,形成可追溯的資安檢查流程

你可以把這個流程理解成四個問題:

1. Scope(範圍): 我被允許檢查哪些設備?

2. Configuration(設定): 我準備怎麼檢查?

3. Evidence(證據): 我實際觀察到什麼?

4. Verification(核實): 這些觀察可以支持哪些結論?

這四個問題,就是 M03-07 的主軸。

二、授權範圍(Scope):有鑰匙,不代表可以檢查每一間房間

假設你是醫院的資安工程師,醫院有三台 NAS。

主管只授權你檢查第一台 NAS 的 TCP 8000 與 8001,目的是確認兩個服務入口是否正常。

那麼,你不能因為「另外兩台 NAS 也連得上」,就順便掃描它們。

這裡有一個非常重要的差別:

技術上做得到,不等於管理上被允許。

正式進行掃描前,至少要確認以下資訊:

項目白話解釋範例
Target要檢查誰指定的一台 NAS
Scope可以檢查的範圍TCP 8000、8001
Method使用什麼方法TCP Connect
Source從哪裡檢查實驗室內網電腦
Time Window什麼時候檢查核准的維護時段
Stop Condition什麼情況停止服務異常、系統告警
Evidence結果放在哪裡指定的稽核紀錄目錄

為什麼要記錄來源位置?

因為你從醫院內網連接 NAS,與從網際網路連接同一台 NAS,可能得到完全不同的結果。

圖 2|示意情境:內部觀察到 open,不代表外部一定能直接連線;filtered 也不代表服務已關閉。

這其實就是前面 M03-02 與 M03-03 學到的概念:封包會經過不同網路路徑,而防火牆可能對不同來源套用不同規則。

所以,掃描結果一定要連同來源、時間與方法一起解讀。

圖 2|同一入口,兩個觀察位置

實線為內網探測路徑;虛線為外部可能被過濾的探測路徑,不表示已抵達 NAS。人工示例須以路徑與日誌核實。

NAS:TCP 8000

同一目標,兩條獨立觀察路徑。

內部管理電腦 → NAS TCP 8000

→ NAS:TCP 8000

人工示例:open。只支持這次內網來源能連線。

經核准的外部位置 → 同一 NAS

→ NAS:TCP 8000

人工示例:filtered。無法確定入口是否開啟;需核對防火牆與路徑。

下載 SVG 圖檔

三、四個掃描設定問題:學會看懂 Nmap 命令

教材提供了這一行命令:

教材範例|本機測試

nmap -n -sT -p 8000,8001 --reason -oN lab-check.nmap -oX lab-check.xml 127.0.0.1

看起來很長,但你可以將它拆解成八個部分:

命令白話文意思
`nmap`啟動 Nmap 工具
`-n`不進行反向 DNS 名稱查詢
`-sT`使用 TCP 完整連線方式掃描
`-p 8000,8001`只檢查兩個 Port
`--reason`顯示為什麼判斷為 open、closed 等狀態
`-oN lab-check.nmap`保存一般文字格式
`-oX lab-check.xml`保存 XML 格式
`127.0.0.1`檢查執行命令的本機環境

3.1 `-p`:我要檢查哪些門?

你已經知道 Port 是作業系統用來將網路流量交給對應服務的入口。

Nmap 讓你指定要檢查哪些入口。

# 只檢查 TCP 80
nmap -sT -p 80 127.0.0.1

# 檢查兩個 TCP Port
nmap -sT -p 8000,8001 127.0.0.1

# 檢查 TCP Port 8000 到 8010
nmap -sT -p 8000-8010 127.0.0.1

另外兩個常見選項:

  • `-p-`:檢查 TCP Port 1 到 65535(搭配 TCP 掃描方法時)。
  • `-F`:快速模式,只檢查較少的常見 Port,並不是對相同 Port 範圍進行更快速的掃描。

考試重點:沒有指定檢查的 Port,不能因為結果沒有列出,就認定它是關閉的。

3.2 `-sT`:我要怎麼敲門?

這裡直接連結前面 M03-03 的 TCP Connect、SYN 與 UDP 掃描。

掃描方式白話文比喻核心概念
`-sT`敲門,建立完整連線TCP Connect Scan
`-sS`敲門,確認有人回應,但不完成連線TCP SYN Scan
`-sU`傳送訊息,看對方有沒有反應UDP Scan

使用 `-sT` 時,Nmap 會請作業系統使用 `connect()` 嘗試建立 TCP 連線。

如果目標接受連線,通常會判定為 `open`;如果目標明確拒絕,例如回應 RST,通常會判定為 `closed`;如果封包被過濾而無法確定結果,可能是 `filtered`。

特別注意:`-sS` 沒有完成 TCP 三向交握,不代表不會被 IDS、IPS 或日誌偵測到。

3.3 `-n`:不要浪費時間反查名稱

假設 Nmap 發現一台主機 IP 是 `192.168.1.10`。

它可能額外嘗試進行 Reverse DNS Lookup(反向 DNS 查詢),看能不能查出主機名稱。

`-n` 就是告訴 Nmap:「這次不需要反查名稱,專心進行指定檢查。」

請注意,它不代表不需要 DNS 才能解析你輸入的網域名稱,也不是隱藏 IP 的功能。

3.4 `--reason`:告訴我判斷的依據

想像你詢問實習生:

「你為什麼認為這扇門是關的?」

實習生只回答:「因為我覺得它是關的。」

這種回報很難查核。

`--reason` 則會讓 Nmap 顯示它據以判斷主機或 Port 狀態的回應資訊。

例如 TCP RST 或 TCP SYN/ACK 等。

這讓你不只看到結論,也能了解工具為何得出這個結論。

四、重要選項:`-sn`、`-Pn`、`-sV`、`-O`、`-A`

這一節尤其重要,因為這些選項容易混淆。

你可以把檢測分成三個層次:

圖 3|掃描的三個資訊層次。每增加一個層次,可能需要更多探測、資源與授權。

圖 3|掃描的三個資訊層次

箭頭表示資訊由主機、入口到身分逐步細化;不是每次都要執行全部階段。-sn 省略埠掃描,-Pn 跳過一般探索判定。

  1. 主機探索:-sn/-Pn

    -sn 不掃連接埠;-Pn 跳過一般探索判定,不是存活證據。

  2. 連接埠與狀態:-sT/-p

    指定方法與入口,判讀 open、closed、filtered 及其理由。

  3. 服務與系統:-sV/-O

    額外探測提供身分線索;由管理端核實實際服務及系統。

下載 SVG 圖檔

4.1 `-sn`:只查主機,不掃 Port

nmap -sn 127.0.0.1

這個選項的意思是:

「我想知道目標是否有回應,這次不進行 Port Scan。」

把它想成在大樓門口確認有沒有人,而不是逐一檢查大樓裡的門。

所以使用 `-sn` 的報告,不能宣稱已檢查所有 Port。

4.2 `-Pn`:不先確認主機是否存活,直接嘗試掃描

nmap -Pn -sT -p 8000,8001 127.0.0.1

一般情況下,Nmap 會先做主機探索,再決定是否進行後續掃描。

`-Pn` 則會跳過一般主機探索判定,把指定目標當作後續掃描的候選。

這就像主管告訴你:

「不用先確認這棟樓有沒有人,直接依照核准範圍檢查指定的門。」

要記住兩個陷阱:

  • `-Pn` 不代表主機真的存活。
  • `-Pn` 不代表可以繞過防火牆。

而且在同一個區域網路內,底層通訊仍可能需要 ARP 來取得下一站的 MAC 位址。

4.3 `-sV`:辨識正在提供的服務

nmap -sT -sV -p 8000 127.0.0.1

假設你知道 TCP 8000 是開啟的,但不知道裡面是什麼程式。

`-sV` 會進一步嘗試辨識服務與版本。

這與 M03-05 的 Service Fingerprinting(服務指紋辨識)相連。

不過要區分:

8000 是 Port 編號;服務名稱和版本是另外需要確認的資訊。

尤其沒有執行版本探測時,Nmap 顯示的 `SERVICE` 欄位可能只是依據常見 Port 對照資料庫得到的名稱,不能直接當成軟體的實際身分。

4.4 `-O`:嘗試辨識作業系統

sudo nmap -O -p 8000,8001 127.0.0.1

這是另行核准 OS 探測時的參數範例。`-p` 指定連接埠掃描清單;`-O` 仍可能增加 TCP、UDP 與 ICMP 探測,不能把它視為只檢查兩個 TCP 入口的原實驗。Nmap:OS 探測方法

這個大寫 `O` 是 OS Detection。

Nmap 會觀察不同網路探測的回應特徵,嘗試推測目標使用哪一類作業系統。

例如 Linux、Windows 或 FreeBSD。

這正好延伸前一課 M03-06 的作業系統指紋辨識。

但推測結果不保證正確,尤其經過防火牆、NAT 或特定網路設備時,觀察可能受到影響。實務上還是要用管理端資訊核實。

4.5 `-A`:一次啟動多種額外檢測

這個參數很容易被誤解。

`-A` 不是「讓原本相同的掃描變得更準確」。

它會額外啟動多種功能,包括:

  • `-sV`:服務版本探測。
  • `-O`:作業系統辨識。
  • `-sC`:預設 NSE 腳本掃描。
  • `--traceroute`:路由路徑追蹤。

部分功能可能需要額外權限,而且預設腳本可能對服務造成較多互動。因此應在核准範圍內使用。

CEH 記憶重點: `-A` 是增加檢測功能的集合選項,不是提高準確度的保證,也不是調整速度的參數。

五、掃描速度:越快不一定越準確

這一節是在教你 Timing、Timeout 與 Retry。

假設你在打電話給朋友。

你撥過去,兩秒沒接,就認定「朋友不在家」。

但其實他可能只是還沒拿起電話。

網路掃描也是同樣的道理。

三個關鍵概念

名稱白話解釋
Timeout(逾時)等了多久,才認為沒有取得預期回應
Retry(重試)沒有收到回應,再嘗試幾次
Timing Template(時間範本)控制掃描等待、並行及其他時間相關行為

Nmap 有六種常見時間範本:

選項名稱概念
`-T0`Paranoid非常緩慢
`-T1`Sneaky緩慢
`-T2`Polite較保守
`-T3`Normal一般預設
`-T4`Aggressive較積極
`-T5`Insane非常積極

例如:

nmap -sT -T3 -p 8000,8001 127.0.0.1

這裡的 `-T3` 是時間設定,不是安全等級。

假設你把等待時間設定得太短,對方還沒回應,Nmap 就已經放棄等待。這可能造成遺漏或降低判讀可信度。

相反地,如果探測頻率太高,也可能對網路或服務增加負擔。

所以在正式工作中,應把時間範本、逾時、重試限制與中斷情況記錄下來。

六、結果保存:為什麼截圖不夠?

假設你做了一份資安報告,只附上一張顯示 `8000/tcp open` 的螢幕截圖。

主管可能會問:

「你什麼時候掃描的?從哪台電腦掃描?用什麼方法?當時有沒有出現錯誤?」

這張截圖通常無法完整回答。

所以 Nmap 提供多種輸出格式。

參數格式主要用途
`-oN`一般文字人工閱讀、檢查
`-oX`XML程式解析、自動化比對
`-oA`三種格式一次產生 `.nmap`、`.xml`、`.gnmap`

其中 `.gnmap` 是舊式 grepable 格式,官方已不建議新整合優先使用;需要自動化處理時,較建議使用 XML。

一份真正可以查核的掃描紀錄

我建議至少包含以下資訊:

Nmap 掃描工作單

範例

工作欄位範例
目標`127.0.0.1`
協定TCP
Port8000、8001
掃描方法TCP Connect
執行位置本機實驗環境
時間實際開始/結束時間與時區
Nmap 版本實際版本號
原始證據文字檔及 XML
其他紀錄完整命令、警告、錯誤、中斷
未檢測其他 Port、UDP、外部路徑等

最重要的原則:保留原始資料,再製作分析報告。

如果需要對外分享,應另外建立移除敏感資訊的副本,而不是直接修改唯一的原始證據。

七、結果判讀:工具觀察、工具推測與事實核實不同

現在進入 M03-07 最重要的技術判讀。

教材提供一個人工合成的案例:

目標:隔離實驗環境的本機
掃描:TCP Connect

PORT       STATE
8000/tcp   open
8001/tcp   closed

這不是實際掃描結果,而是用來練習判讀的範例。

7.1 `open` 到底證明什麼?

當 Nmap 顯示:

8000/tcp open

代表在這次掃描條件下,Nmap 判斷 TCP 8000 有服務接受連線。

但是這個結果不能直接證明:

  • 服務是 HTTP、HTTPS 或其他協定。
  • 服務的實際版本。
  • 這個服務存在漏洞。
  • 攻擊者能利用漏洞取得權限。
  • 網際網路上的人也能連上這個服務。

這些都是額外需要驗證的問題。

7.2 `closed` 與 `filtered` 的差別

這裡使用一個門口保全的比喻:

狀態比喻技術意義
`open`門有人應答、願意接待有服務接受該次連線探測
`closed`有人明確告訴你這扇門不開放該次探測收到表示無服務接聽的回應
`filtered`你被擋在前面,無法確認門內情況封包受到過濾等影響,無法判定 Port 是否開啟
`open|filtered`不知道是有人但沒回應,還是被擋住某些方法無法區分開啟與過濾

注意:上表是概念比喻;實際狀態判定依賴掃描方法及網路回應。

這也是為什麼不能把 `filtered` 當成 `closed`。

7.3 三種證據層次

圖 4|三種證據角色分開記錄

以下是平行比較,沒有先後箭頭。每張卡說明不同證據能支持的結論。

  • 單次觀察

    在指定來源、時間與方法下,8000/tcp 接受連線。

  • 工具推論

    服務或系統候選需要相應探測;埠號本身不等於版本。

  • 管理端核實

    由負責人核對執行中程序、設定及日誌,對齊設備與時間。

下載 SVG 圖檔

這裡可以建立一個研究及資安稽核都很好用的框架:

證據層次範例可以支持的結論
直接觀察TCP 8000 是 open該次測試觀察到入口接受連線
工具推論`-sV` 推測為某版本 HTTP Server可能的服務身分,仍需核實
管理端核實管理者查閱程序、組態與日誌核對實際服務、版本及配置

這三者不應混為一談。

尤其是學術研究,這也對應到 Measurement(測量)、Inference(推論)與 Validation(驗證)的區別。

八、如何將 Nmap 用在真正的防護驗收?

以實驗室三台 NAS 為例,假設我們的需求是:

「NAS 的管理介面只允許內部管理電腦使用,外部網路不應直接連線。」

那麼,光執行 Nmap 是不夠的。

比較完整的流程如下:

1. 定義預期行為

指定哪些來源應該能連線,哪些來源不應直接連線。

2. 從核准位置實際測量

從內網及經核准的外部測試位置,分別保存掃描結果。

3. 比對防火牆與管理端日誌

確認觀察結果是否符合預期規則,而不是只看 Nmap 顯示 open 或 filtered。

4. 調整並重新測試

若發現不符合預期的入口,由管理者修正設定,再用可比較的測試條件驗證,同時確認必要服務沒有受到影響。

如果你的 NAS 是透過 Cloudflare Tunnel 與 Access 提供遠端存取,還需要額外驗證身分驗證、個別 NAS 的授權與應用程式存取規則。Nmap 對 NAS IP 的 Port Scan,不能取代對 Tunnel 後方應用程式的存取控制測試。

這樣才能讓掃描結果成為有意義的防護驗收證據,而不只是一份 Port 清單。

九、在自己的 Ubuntu 上進行安全實驗

教材原本採用紙上判讀。以下額外補充一個只針對本機 `127.0.0.1` 的實驗,讓你觀察完整流程。

實驗目的:建立自己的服務,觀察 open、closed 與原始證據

步驟 1:建立一個乾淨的測試資料夾

環境:自己管理的 Ubuntu,已安裝 Python 3 與 Nmap。先確認 TCP 8000 未被占用;8001 若已有服務,保留觀察結果,不任意停止其他程式。出現非預期服務、警告或錯誤時,停止並保留紀錄。以下命令只使用本機迴路位址。

在 Ubuntu 第一個終端機輸入:

mkdir -p ~/nmap-local-demo
cd ~/nmap-local-demo
python3 -m http.server 8000 --bind 127.0.0.1

這會建立一個簡單 HTTP Server,監聽本機 TCP 8000。

終端機保持開啟。

步驟 2:在第二個終端機執行 Nmap

先檢查 Nmap 是否已安裝:

nmap --version

接著在第二個終端機切換到相同資料夾;先確認這些輸出檔名尚未使用,以免覆寫舊證據:

cd ~/nmap-local-demo

執行:

nmap -n -sT -p 8000,8001 --reason \
  -oN lab-check.nmap \
  -oX lab-check.xml \
  127.0.0.1

假設沒有其他程式使用 8001,預期可能看到類似:

PORT       STATE    SERVICE
8000/tcp   open     http-alt
8001/tcp   closed   vcom-tunnel

這裡的 `SERVICE` 名稱可能是依 Port 對照資料庫推定,不代表已經執行 `-sV` 驗證服務身分。

實際輸出依你的本機環境為準。

步驟 3:觀察原始紀錄

cat lab-check.nmap

再檢查 XML:

head -n 30 lab-check.xml

觀察兩者的格式差異。

步驟 4:停止服務後,再掃描一次

回到第一個終端機,按下 `Ctrl+C` 停止 HTTP Server。

然後在第二個終端機執行:

nmap -n -sT -p 8000,8001 --reason -oN lab-after.nmap -oX lab-after.xml 127.0.0.1

如果 8000 沒有其他程式接手監聽,你應該會觀察到它由 `open` 轉成 `closed`。

這個練習讓你直接看到:

服務狀態改變 → 網路回應改變 → Nmap 判讀改變。

而且也能理解為什麼掃描時間、來源與執行環境都需要被記錄。

清理:確認第一個終端機的 HTTP Server 已停止;依保留需求保存兩組文字與 XML 紀錄。測試資料夾只放練習資料,避免 HTTP Server 意外提供其他檔案。

十、CEH M03-07 一頁重點整理

指令/觀念必須記住的意思
`-p`指定掃描的 Port
`-p-`掃描指定協定的 Port 1–65535
`-F`較少常見 Port 的快速模式
`-sT`TCP Connect Scan
`-sS`TCP SYN Scan
`-sU`UDP Scan
`-sn`只做主機探索,不做 Port Scan
`-Pn`跳過一般主機探索判定,進行後續掃描
`-sV`服務版本辨識
`-O`作業系統辨識
`-A`啟用多項進階掃描功能
`-n`不反查 DNS 名稱
`--reason`顯示狀態判定依據
`-T0`~`-T5`時間行為範本
`-oN`保存文字結果
`-oX`保存 XML 結果
`-oA`同時保存三種格式

官方補充資料:Nmap Reference Guide、Nmap Host Discovery、Nmap Output。

理解檢核:三個實務情境

請先自行思考,不必急著查看教材的參考解答。

問題一|掃描範圍

你只掃描 TCP 8000 與 8001,兩者都是 closed。主管問:「這台主機是不是沒有任何網路服務?」你會怎麼回答?

問題二|掃描設定

同事認為 -Pn 可以繞過防火牆,而 -A 可以讓掃描結果百分之百準確。這兩個說法各有什麼問題?

問題三|防護驗收

你從內網掃描 NAS 的 TCP 8000 是 open,從外部掃描卻是 filtered。你會如何解釋,並提出哪兩項後續驗證?

本章最值得帶走的能力,是在看到任何 Nmap 結果時,都能清楚說出:「這份結果是怎麼得到的、證據支持什麼,以及哪些事情仍然不知道。」

這項能力會直接延伸到後續的 CEH M04 列舉(Enumeration)、M05 弱點分析(Vulnerability Analysis),以及實際的滲透測試與資安稽核工作。

官方參考來源

Nmap:連接埠與狀態;掃描方法;連接埠選擇;附加功能;時間與效能;服務辨識;OS 辨識。

參考解答:兩個埠代表整台主機嗎?

不能。證據只涵蓋指定來源、時間、TCP方法與8000、8001兩個埠。其他TCP埠、UDP及其他觀察位置都沒有被這次資料涵蓋。適合的紀錄是「本次指定兩個TCP埠未觀察到open」,另列未測範圍;不要改寫成整台主機沒有服務。

參考解答:-sn、-Pn 各做什麼?

-sn 做主機探索但不做連接埠掃描;-Pn 跳過一般探索判定,讓指定目標進入後續掃描。兩個選項本身都不是存活證據,還要看實際回應與判定依據。-Pn 不會把關機設備變成存活,也不會自動穿越防火牆;本地網路仍可能涉及ARP位址解析。

參考解答:加入 -A 前要確認什麼?

先核對核准目的是否涵蓋版本、系統、預設腳本及路徑追蹤等附加功能,以及目標、負載、時段與停止條件。-A擴充功能集合,不只是同一個兩埠連線測試的精準度開關,也不是時間範本。只需要確認入口可連線時,保留最小必要方法即可。

參考解答:open 與 filtered 怎麼比較?

兩份原始結果都保留,分別記下來源位置、時間、目標、協定、埠、方法、版本與警告;比較防火牆及服務紀錄,找出路徑或條件差異。open支持該次方法看見服務接受連線;filtered表示該次無法確定是否開啟。未核對前,不把差異直接寫成服務關閉或成功入侵。

概念 Q&A

待補:收到相關問題後,會整理為匿名教學版。