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. 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 學到的概念:封包會經過不同網路路徑,而防火牆可能對不同來源套用不同規則。
所以,掃描結果一定要連同來源、時間與方法一起解讀。
實線為內網探測路徑;虛線為外部可能被過濾的探測路徑,不表示已抵達 NAS。人工示例須以路徑與日誌核實。
NAS:TCP 8000
同一目標,兩條獨立觀察路徑。
內部管理電腦 → NAS TCP 8000
→ NAS:TCP 8000
人工示例:open。只支持這次內網來源能連線。
經核准的外部位置 → 同一 NAS
→ NAS:TCP 8000
人工示例:filtered。無法確定入口是否開啟;需核對防火牆與路徑。
三、四個掃描設定問題:學會看懂 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|掃描的三個資訊層次。每增加一個層次,可能需要更多探測、資源與授權。
箭頭表示資訊由主機、入口到身分逐步細化;不是每次都要執行全部階段。-sn 省略埠掃描,-Pn 跳過一般探索判定。
- 主機探索:-sn/-Pn
-sn 不掃連接埠;-Pn 跳過一般探索判定,不是存活證據。
- 連接埠與狀態:-sT/-p
指定方法與入口,判讀 open、closed、filtered 及其理由。
- 服務與系統:-sV/-O
額外探測提供身分線索;由管理端核實實際服務及系統。
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 |
| Port | 8000、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 三種證據層次
以下是平行比較,沒有先後箭頭。每張卡說明不同證據能支持的結論。
- 單次觀察
在指定來源、時間與方法下,8000/tcp 接受連線。
- 工具推論
服務或系統候選需要相應探測;埠號本身不等於版本。
- 管理端核實
由負責人核對執行中程序、設定及日誌,對齊設備與時間。
這裡可以建立一個研究及資安稽核都很好用的框架:
| 證據層次 | 範例 | 可以支持的結論 |
|---|---|---|
| 直接觀察 | 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
待補:收到相關問題後,會整理為匿名教學版。