HTB - Network Enumeration with Nmap Part1
有些模組會做筆記有些不會,平時時間不多,有空就寫。
HTB的模組真的非常推薦,講的詳細而且好入門。
Enumeration
Enumeration - 列舉,這是所有滲透開始的基礎。
這一階段的目標是:找出所有有可能攻進去的方式。
也就是把對方的服務、協定、設定、錯誤與疏忽,一個一個翻出來,變成之後的攻擊清單。
兩種最重要的資訊類型
能拿到系統的方式,大致可以縮成兩種類型:
可以跟系統互動的功能 / 資源
例如:登入介面、檔案上傳點、API、遠端管理服務
這些東西會有可以交互的地方。例如傳指令、丟檔案、修改設定會吐出更多資訊的地方
例如:版本資訊、錯誤訊息、公開分享目錄、描述過頭的服務 banner
能動手的地方,跟會列出更多訊息的地方,都是枚舉時要特別盯緊的目標。
HTB給了一個很好懂的比喻:
1 | |
Enumeration 就是開始滲透目標的第一把鑰匙。
Nmap 是什麼?
Nmap,全名 Network Mapper,是一個開源的網路分析與安全稽核工具。
它用各種封包去跟目標主機互動,幫我們了解標的。
官方列出的一些常見用途大致如下:
- 網路資安稽核(Audit the security aspects of networks)
- 模擬滲透測試
- 檢查防火牆與 IDS 設定 / 規則是否如預期
- 做網路拓樸 / 主機分佈的 mapping
- 分析服務回應
- 找出開放的 Port、看有哪些服務在對外暴露
- 作為弱點評估的前置資訊來源
在HTB的介紹中,Nmap 的功能拆成以下幾個階段:
Host discovery
目標:找出哪些 IP 真的有主機在線上
類似「先確認房子裡有沒有人」Port scanning
目標:這台主機上哪些 Port 有服務在聽?
就像看這棟房子哪些門有開、哪些窗有人在探頭Service enumeration and detection
目標:這些 Port 上跑的是什麼服務?版本是什麼?
例如:22/tcp open ssh OpenSSH 8.x、80/tcp open http nginx 1.xOS detection
目標:推測對方是 Windows / Linux / 某些特定版本
有些掃描會根據回應的細節與 TCP/IP stack 行為來判斷Scriptable interaction(Nmap Scripting Engine, NSE)
目標:用腳本自動跟服務互動,做更深的檢測
例如:列出 HTTP 目錄、嘗試弱密碼、檢查已知漏洞等
Nmap 的基本語法
1 | |
:自訂掃描技術(例如 -sS、-sU…) :額外的參數(像 -p- 掃全部 Port、-oN 儲存結果) :目標 IP / 網段 / 主機名稱
例如:
1 | |
- -sS:使用 TCP SYN 掃描
- -sV:偵測服務版本
- -p-:掃描所有 TCP Port(1–65535)
- 10.129.137.173:目標主機
如果不清楚有什麼掃描選項,可以使用nmap --help來查詢(或是直接google問AI都行)
1 | |
常用參數介紹:
TCP 掃描
-sS:TCP SYN scan(半開連線掃描)
-sT:TCP Connect()(完整三向交握)
-sA:TCP ACK 掃描(常用來測試防火牆規則)
-sN / -sF / -sX:Null / FIN / Xmas(用奇怪旗標來探測主機反應,對某些防火牆或舊系統有奇效)
UDP 掃描
-sU:掃描 UDP Port,常用來找 DNS、SNMP、DHCP 等服務。
UDP 掃描通常比較慢,誤判率也比較高(因為很多 UDP 不回應)。
比較特別的掃描
–scanflags:自己決定 TCP flag 組合
-sI:Idle scan,使用殭屍主機當中繼,達到高度隱匿
-sO:掃描 IP Protocol(而不是 Port),例如 1=ICMP、6=TCP、17=UDP
-b:FTP bounce scan,利用 FTP 代理去掃其他主機(現代環境比較少見)
範例參數講解:TCP SYN 掃描(-sS)
- Nmap 的預設掃描方式之一
- 超常用、而且效率高
- 不會完整建立 TCP 連線,也被稱作「半開連線掃描」
操作邏輯簡述:
Nmap 對某個 Port 丟一個 SYN 封包
如果對方回 SYN-ACK → 代表 Port 是 open
如果對方回 RST → 代表 Port 是 closed
如果對方完全沒回 → Nmap 會標記為 filtered(可能被防火牆丟掉)
因為它沒有走完 SYN → SYN/ACK → ACK 的三向交握,
所以在某些紀錄裡不會被視為「真正的連線」,
速度也可以開得很快,一秒掃很多 Port。
Host Discovery:主機存活掃描
在做內網滲透或大型環境評估的時候,第一件事就是Host Discovery
在進到指令前,先養成一個很重要的習慣:
每一次掃描,都存檔。
原因有三個:
- 方便之後比對(今天 vs 下週有沒有多開服務)
- 報告寫作時可以直接引用輸出
- 不同工具結果可能不同,留紀錄可以回頭比對
Nmap 提供 -oA 一次輸出三種格式(normal / XML / grepable):
1 | |
- 10.129.2.0/24:目標網段
- -sn:只做主機探測,不掃 port
- -oA tnet:輸出成 tnet.nmap、tnet.xml、tnet.gnmap 三種檔案
之後寫報告或是需要腳本自動化時就能直接使用。
掃整個網段
最基本的 Host Discovery,就是掃一整段網段:
1 | |
- -sn 讓 Nmap 只做「有沒有活著」
- -oA tnet 把結果存檔
後面的 grep 與 cut 則是從輸出中只留下 IP 清單,方便後續用
這種寫法很適合內網評估時,先粗略看這一段裡有哪些機器在線。
實務上,客戶會直接給需要測試的 IP list,例如:
1 | |
這時就可以用 -iL 從檔案讀取目標:
1 | |
- -iL hosts.lst:從檔案讀取目標 IP 清單
結果可能只回報其中幾台是 alive,其餘沒有回應。
這不一定代表機器關機,也有可能是:
- 防火牆擋了 ICMP echo request
- 僅允許特定來源的 Ping
- 或是主機只對特定網段回應
這種情況就要交給之後的 Firewall / IDS Evasion 技巧處理了(在其他模組會有)。
多個 IP / IP 範圍的寫法
如果你只想掃少數幾台機器,可以:
直接列出多個 IP
1 | |
或直接使用範圍掃描
1 | |
Nmap 到底用什麼方法判斷「Host is up」?
預設情況:內網會先用 ARP 掃
在同一個 L2 網段裡執行 -sn 掃描時,
Nmap 預設會先發送 ARP who-has 封包,而不是直接丟 ICMP ping。
我們可以用 –packet-trace 把封包細節印出來看:
1 | |
輸出會類似:
1 | |
再配上 –reason:
1 | |
就能看到:
1 | |
也就是說:
在同網段時,Nmap 單靠 ARP 往返就知道主機活著了。
ICMP 在這種情況下反而不是主要依據。
強制改用 ICMP Echo:關掉 ARP Ping
停用 ARP 請求並使用所需內容掃描我們的目標ICMP echo requests, 我們可以透過設定來停用 ARP ping--disable-arp-ping
1 | |
這樣 Nmap 就不再用 ARP,而是乖乖丟出:
1 | |
在封包內容裡:
TTL = 128 → 很典型的 Windows 預設 TTL
TTL = 64 → 常見在很多 Linux / Unix 系統上
範例題目
Based on the last result, find out which operating system it belongs to. Submit the name of the operating system as result.
根據課程的搜尋結果,找出它所屬的作業系統。將作業系統名稱作為結果提交。
Nmap 的 6 種 Port 狀態
Nmap 對每個 Port 的「結果」其實很講究,不是只有「開」或「關」。
官方定義有 6 種狀態:
open
這個 Port 有服務在監聽,
TCP/UDP/SCTP 都有可能
對紅隊來說幾乎等於這裡值得深入查看closed
主機有回應,但告訴你這裡沒有服務
TCP 會用 RST 回你
雖然現在沒服務,但代表這個 IP 是活的,以後有可能變成攻擊面。filtered
Nmap 不確定是開還是關
可能完全沒回應
或收到像「port unreachable」之類的 ICMP 錯誤
通常表示有防火牆/封包過濾在中間。unfiltered
只有在 TCP ACK 掃描 時會出現
代表「封包到得了這個 Port,但不確定開或關」。open|filtered
Nmap 沒拿到明確回應,
可能是開、也可能被防火牆吃掉
在 UDP 掃描非常常見。closed|filtered
只會出現在 IP ID idle scan
代表沒辦法分辨是「關」還是被過濾。
預設情況下,Nmap 會:
掃 top 1000 TCP ports
如果是 root / 管理員權限執行,預設用 SYN scan -sS
如果沒有 raw socket 權限,則改用 Connect scan -sT
Port 也可以自己指定:
- 指定單一或多個:-p 22,25,80,139,445
- 指定範圍:-p 22-445
- 掃「最常見的 N 個 Port」:–top-ports=10
- 掃所有 Port:-p-
- 快速掃 top 100:-F
範例:掃 Top 10 TCP Ports (掃少數常用port就是為了加速,畢竟在考試時有時間限制)
1 | |

快速 UDP 掃描
範例
1 | |
- -sU:啟用 UDP 掃描
- -F:只掃「快速列表」裡的常見 Port
![範例]()
Not shown: 96 closed udp ports (port-unreach)
這行的意思是:有 96 個 UDP Port,Nmap 收到了 ICMP type 3 code 3:Port Unreachable 的回應,
所以它把這些 Port 判定為 closed,並統一折疊起來不逐一列出。
也就是說,這些 Port: - 主機有回復,這個 UDP port 沒有服務在聽
- 對掃描速度來說反而是好事,因為不用等到 timeout
範例題目:
Find all TCP ports on your target. Submit the total number of found TCP ports as the answer.
找出目標伺服器上的所有 TCP 連接埠。將找到的 TCP 連接埠總數作為答案提交。
→ 暗示你要做 full TCP scan(全 TCP 連接埠掃描)。
常見指令:
1 | |
- -p-:掃 1–65535 所有 TCP port,而不是只掃前 1000 個。
- -sS:SYN 掃描,效率高、比較不會在 log 裡留下完整連線紀錄(半開連線)。
- -n:不做 DNS 反解,少浪費時間在查名字。
- -Pn:當作 host 一定是 up,不再額外 ping;避免因為 ICMP 被擋掉導致整台被標成 down。
- –min-rate 1000:請 Nmap 至少每秒丟 1000 個封包,加快掃描(Lab 環境常用)。
- -oA full-tcp:把結果存成 full-tcp.nmap / .gnmap / .xml,之後好查。
輸出結果:

接下來是數有多少個開啟的TCP Port數量
這裡我們使用wc -l計算剛剛掃描完成的結果。
1 | |
輸出結果:

Enumerate the hostname of your target and submit it as the answer. (case-sensitive)
請列出目標主機名稱並將其作為答案提交。 (區分大小寫)
依照前面的結果這裡我們選擇SMB/NetBIOS的服務port
SMB/NetBIOS常常會把:
- Computer name
- NetBIOS name
- Domain / Workgroup
都顯示出來。
1 | |
- -p 139,445:只針對 SMB 相關的兩個 port,掃描速度快、輸出也比較乾淨。
- -sV:問服務「什麼版本以及細節」。
- -sC:跑一組預設 NSE 腳本,其中就包含 smb-os-discovery、smb2-security-mode 之類會幫你抓 Computer name / NetBIOS name 的腳本。
- -Pn -n:不再 ping / 不做 DNS 解析。
輸出結果:

最後我們使用grep來找題目要求的名稱:
1 | |
輸出結果:
把 XML 轉成 HTML 報告
使用剛剛輸出的檔案當作範例
我們可以用xsltproc:把 Nmap 的 XML 套上官方的 XSL 樣板,生出一份人類友善的 HTML 報告
1 | |
- full-tcp.xml:就是剛剛 -oA full-tcp 生出的 XML 檔。
- -o full-tcp.html:指定輸出成 full-tcp.html。

範例題目:
Perform a full TCP port scan on your target and create an HTML report. Submit the number of the highest port as the answer.
對目標裝置執行完整的 TCP 連接埠掃描,並產生 HTML 報告。將掃描到的最高連接埠號碼作為答案提交。
掃描方式跟前面一樣:
1 | |
如果你要轉存成HTML:
1 | |
尋找最大的那個port:
1 | |
- grep “/tcp” full-tcp.nmap:抓出有寫 xxx/tcp 的行。
- grep “open”:只留 open 的 Port。
- cut -d “/“ -f1:以 / 切欄位,拿第一段(例如 31337)。
- tr -d ‘ ‘:把開頭的空白去掉。
- sort -n:用數字排序。
- tail -1:取最後一個,就是最大的 port。

當然你也可以直接用肉眼查看,不過我前公司的技術主管常說:學會全部都使用指令直接輸出最精準的答案,你會省下很多時間。
一連上去,對方就丟給你的那串訊息,就叫 banner。
紅隊的術語裡會說:
- Banner grabbing
意思就是主動連到服務上去,讀它丟出來 banner,好蒐集版本與系統資訊。
範例題目:
Enumerate all ports and their services. One of the services contains the flag you have to submit as the answer.
列出所有連接埠及其服務。其中一項服務包含您需要提交的標誌。
第一步:先有所有開放的 TCP port
第二步:對這些 port 做 Service Enumeration
第三步:鎖定看起來不正常的服務
前面兩步我們已經完成了,因此直接進行第三步即可。
1 | |
標的就會直接將flag給吐出來。
NSE;Nmap Scripting Engine-Nmap腳本引擎
NSE內建了一些好用的工具讓你檢查更詳細的內容,這些腳本主要分為14種類:
(同一隻腳本可能同時屬於多個分類)
auth:認證 & 帳號相關
用途:跟登入有關的事情。
測試是不是允許匿名登入(像 FTP、SMB 匿名)。
列出支援的認證機制。
有些會幫你試弱帳號。
什麼時候用:- 掃到 FTP / SSH / POP3 / IMAP / HTTP 登入頁時,可以先讓 auth 類腳本跑一輪,看有沒有「不用帳密就能進去」的。
1
nmap -p 21,22,110 --script auth <IP>
- 掃到 FTP / SSH / POP3 / IMAP / HTTP 登入頁時,可以先讓 auth 類腳本跑一輪,看有沒有「不用帳密就能進去」的。
broadcast:靠廣播找整個網路的東西(這類很多需要在本地網段才有用)
用途:用 broadcast/multicast 在整個 LAN 進行查詢,看誰回。
找開啟的 DHCP server、UPnP 裝置、NetBIOS 名稱、mDNS 服務等。
什麼時候用:- 剛進一個不熟的內網,只知道自己拿到一個 IP,想快速看整個網段有什麼服務。
1
nmap --script broadcast-*
- 剛進一個不熟的內網,只知道自己拿到一個 IP,想快速看整個網段有什麼服務。
brute:爆破密碼
用途:對各種服務做暴力/字典登入嘗試。
如 SSH、FTP、RDP、資料庫、HTTP 表單等。
很容易被鎖帳號 / 觸發防禦系統
通常被標記為 intrusive
什麼時候用:- 只適合在你真的被授權做密碼測試的情況,像內部紅隊 / 室內靶機。
1
nmap -p 22 --script ssh-brute <IP>
- 只適合在你真的被授權做密碼測試的情況,像內部紅隊 / 室內靶機。
default:-sC 那一包
用途:Nmap 官方的預設腳本集合。
大多數是安全、不太侵入的東西。
什麼時候用:- 要做第一輪枚舉時都可以先 -sC。
1
nmap -sV -sC -p <ports> <IP>
- 要做第一輪枚舉時都可以先 -sC。
discovery:挖更多資訊
用途:幫你從服務裡挖更多 metadata / 結構資訊。
例子像:
http-enum:列常見 web 路徑。
smb-os-discovery:抓 OS、Computer name、Domain。
ssh-hostkey:列 SSH host key。
什麼時候用:
在做枚舉階段,想從已知服務挖出更多線索時就很適合。1
nmap --script discovery -p 80,139,445 <IP>dos:Denial of Service
用途:專門用來測試 DoS 漏洞或造成服務當機的腳本。
在正式環境幾乎是禁止使用
什麼時候用:- 幾乎只在測試環境或是專門做 DoS 研究時才會用;一般滲透報告頂多在說明階段提「存在已知 DoS 漏洞」,不會真的跑。
1
nmap --script dos <IP>
- 幾乎只在測試環境或是專門做 DoS 研究時才會用;一般滲透報告頂多在說明階段提「存在已知 DoS 漏洞」,不會真的跑。
exploit:直接嘗試利用漏洞
用途:嘗試直接 exploit。例如針對某些已知 CVE 的利用腳本。
特性:
有成功就可能直接拿 shell / 建帳號 / 破壞資料。
非常 intrusive。
什麼時候用:
在完全授權的測試 / 靶機上可以玩玩;現場客戶環境要極度謹慎,通常用專門 exploit 框架會更可控。1
nmap --script exploit -p <port> <IP>external:會連出網路查資料的腳本
用途:
會去問外部服務 / API(比如 WHOIS、GeoIP、黑名單、漏洞資料庫…)。
什麼時候用:
有對外網路,而且允許掃描機連出。
想把掃描結果跟外部資訊(地理位置、惡意 IP / domain 評級)合在一起看。
這類腳本要注意:
掃描紀錄不只會出現在目標端 log,也會出現在「第三方服務」那邊。fuzzer:亂丟東西看服務會不會爆
用途:
對某種協定丟一堆 fuzzed payload,試探未知漏洞 / 崩潰點。
特性:
風險類似 dos / exploit
容易讓服務掛掉,甚至發現新的 bug
什麼時候用:
比較偏研究型或想測試自家服務穩定性時。
一般滲透測試很少用它,因為太不穩定。intrusive:有風險、可能被視為攻擊行為的腳本
用途 / 特性:
這是性質標籤,不是功能領域。
brute、dos、exploit 很多都被標成 intrusive。
代表腳本行為可能:- 造成服務異常
- 觸發 IDS/IPS
- 改變目標狀態
什麼時候用:
只在明確得到允許時用。1
nmap --script intrusive <IP>
malware:惡意軟體相關
用途:
偵測目標是否有已知後門 / botnet / 奇怪服務特徵。
例如檢查特定 port 上是否像某家惡意程式的 C2。
什麼時候用:
做事件調查、懷疑有入侵時,可以搭配這類腳本粗略掃一下。1
nmap --script malware <IP>safe:保證避開破壞性的腳本
用途 / 特性:
同樣是一個「性質標籤」。
代表腳本設計上不會修改目標、不會嘗試 exploit、不刻意造成 DoS。
什麼時候用:
要避開具破壞性的腳本時。
例如:1
nmap -sV --script "default,safe" <IP>version:-sV 的腳本
用途:
這些腳本主要是為了改良版本偵測、識別更精確的服務資訊。
大多數在你加 -sV 的時候就會自動參與,不一定會特別指定。
什麼時候用:
一般不會單獨叫 –script version,vuln:檢查特定已知漏洞
用途:
針對已知的 CVE / 漏洞寫好的檢查腳本。
比 exploit 溫和:通常只檢測條件,不一定真的去利用。
什麼時候用:
已經知道服務類型與版本,想確認沒有命中某些已知漏洞。
在 Lab / 自家環境可以直接:1
nmap -sV --script vuln <IP>
懶人推薦組合(安全好用):
- 一般服務枚舉
1
nmap -sV -sC --script "default,discovery,safe" <IP> - 想再找漏洞
1
nmap -sV --script "default,discovery,safe,vuln" <IP>
範例題目:
Use NSE and its scripts to find the flag that one of the services contain and submit it as the answer.
使用 NSE 及其腳本查找其中一個服務中包含的 flag,並將其作為答案提交。
由於我們在前面已經知道80port有開了,因此我們直接進行掃描查看更詳細的內容
1 | |

發現這個網站有使用robots
這邊我們可以直接查看內容
1 | |
Part1到此結束了,
繞過防火牆會寫在part2。(因為那個都是Lab)
