Atom
HTB - Network Enumeration with Nmap Part1

HTB - Network Enumeration with Nmap Part1

有些模組會做筆記有些不會,平時時間不多,有空就寫。

HTB的模組真的非常推薦,講的詳細而且好入門。


Enumeration

Enumeration - 列舉,這是所有滲透開始的基礎。

這一階段的目標是:找出所有有可能攻進去的方式。
也就是把對方的服務、協定、設定、錯誤與疏忽,一個一個翻出來,變成之後的攻擊清單。

兩種最重要的資訊類型

能拿到系統的方式,大致可以縮成兩種類型:

  1. 可以跟系統互動的功能 / 資源
    例如:登入介面、檔案上傳點、API、遠端管理服務
    這些東西會有可以交互的地方。例如傳指令、丟檔案、修改設定

  2. 會吐出更多資訊的地方
    例如:版本資訊、錯誤訊息、公開分享目錄、描述過頭的服務 banner

能動手的地方,跟會列出更多訊息的地方,都是枚舉時要特別盯緊的目標。

HTB給了一個很好懂的比喻:

1
2
3
4
5
我們的伴侶不在家,而且把車鑰匙弄丟了。
我們打電話問他/她鑰匙在哪裡。
如果對方回答“在客廳”,那就完全不清楚了,找起來可能很花時間。
但是如果對方說「在客廳,電視旁邊,白色架子上的第三個抽屜裡」呢?
這樣一來,找鑰匙就容易多了。

Enumeration 就是開始滲透目標的第一把鑰匙。


Nmap 是什麼?

Nmap,全名 Network Mapper,是一個開源的網路分析與安全稽核工具。
它用各種封包去跟目標主機互動,幫我們了解標的。

官方列出的一些常見用途大致如下:

  • 網路資安稽核(Audit the security aspects of networks)
  • 模擬滲透測試
  • 檢查防火牆與 IDS 設定 / 規則是否如預期
  • 做網路拓樸 / 主機分佈的 mapping
  • 分析服務回應
  • 找出開放的 Port、看有哪些服務在對外暴露
  • 作為弱點評估的前置資訊來源

在HTB的介紹中,Nmap 的功能拆成以下幾個階段:

  1. Host discovery

    目標:找出哪些 IP 真的有主機在線上
    類似「先確認房子裡有沒有人」

  2. Port scanning

    目標:這台主機上哪些 Port 有服務在聽?
    就像看這棟房子哪些門有開、哪些窗有人在探頭

  3. Service enumeration and detection

    目標:這些 Port 上跑的是什麼服務?版本是什麼?
    例如:22/tcp open ssh OpenSSH 8.x、80/tcp open http nginx 1.x

  4. OS detection

    目標:推測對方是 Windows / Linux / 某些特定版本
    有些掃描會根據回應的細節與 TCP/IP stack 行為來判斷

  5. Scriptable interaction(Nmap Scripting Engine, NSE)

    目標:用腳本自動跟服務互動,做更深的檢測
    例如:列出 HTTP 目錄、嘗試弱密碼、檢查已知漏洞等


Nmap 的基本語法

1
nmap <scan types> <options> <target>
  • :自訂掃描技術(例如 -sS、-sU…)
  • :額外的參數(像 -p- 掃全部 Port、-oN 儲存結果)
  • :目標 IP / 網段 / 主機名稱

例如:

1
nmap -sS -sV -p- 10.129.137.173
  • -sS:使用 TCP SYN 掃描
  • -sV:偵測服務版本
  • -p-:掃描所有 TCP Port(1–65535)
  • 10.129.137.173:目標主機

如果不清楚有什麼掃描選項,可以使用nmap --help來查詢(或是直接google問AI都行)

1
2
3
4
5
6
7
8
9
SCAN TECHNIQUES:
-sS/sT/sA/sW/sM: TCP SYN/Connect()/ACK/Window/Maimon scans
-sU: UDP Scan
-sN/sF/sX: TCP Null, FIN, and Xmas scans
--scanflags <flags>: Customize TCP scan flags
-sI <zombie host[:probeport]>: Idle scan
-sY/sZ: SCTP INIT/COOKIE-ECHO scans
-sO: IP protocol scan
-b <FTP relay host>: FTP bounce scan

常用參數介紹:

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
sudo nmap 10.129.2.0/24 -sn -oA tnet
  • 10.129.2.0/24:目標網段
  • -sn:只做主機探測,不掃 port
  • -oA tnet:輸出成 tnet.nmap、tnet.xml、tnet.gnmap 三種檔案

之後寫報告或是需要腳本自動化時就能直接使用。

掃整個網段

最基本的 Host Discovery,就是掃一整段網段:

1
sudo nmap 10.129.2.0/24 -sn -oA tnet | grep "for" | cut -d" " -f5
  • -sn 讓 Nmap 只做「有沒有活著」
  • -oA tnet 把結果存檔
    後面的 grep 與 cut 則是從輸出中只留下 IP 清單,方便後續用

這種寫法很適合內網評估時,先粗略看這一段裡有哪些機器在線。

實務上,客戶會直接給需要測試的 IP list,例如:

1
2
3
4
5
6
cat hosts.lst
10.129.2.4
10.129.2.10
10.129.2.11
10.129.2.18
10.129.2.19

這時就可以用 -iL 從檔案讀取目標:

1
sudo nmap -sn -oA tnet -iL hosts.lst | grep "for" | cut -d" " -f5
  • -iL hosts.lst:從檔案讀取目標 IP 清單

結果可能只回報其中幾台是 alive,其餘沒有回應。
這不一定代表機器關機,也有可能是:

  • 防火牆擋了 ICMP echo request
  • 僅允許特定來源的 Ping
  • 或是主機只對特定網段回應

這種情況就要交給之後的 Firewall / IDS Evasion 技巧處理了(在其他模組會有)。

多個 IP / IP 範圍的寫法

如果你只想掃少數幾台機器,可以:

直接列出多個 IP

1
sudo nmap -sn -oA tnet 10.129.2.18 10.129.2.19 10.129.2.20

或直接使用範圍掃描

1
sudo nmap -sn -oA tnet 10.129.2.18-20

Nmap 到底用什麼方法判斷「Host is up」?

預設情況:內網會先用 ARP 掃

同一個 L2 網段裡執行 -sn 掃描時,
Nmap 預設會先發送 ARP who-has 封包,而不是直接丟 ICMP ping。

我們可以用 –packet-trace 把封包細節印出來看:

1
sudo nmap 10.129.2.18 -sn -oA host -PE --packet-trace

輸出會類似:

1
2
3
4
5
SENT ARP who-has 10.129.2.18 tell 10.10.14.2
RCVD ARP reply 10.129.2.18 is-at DE:AD:00:00:BE:EF

Nmap scan report for 10.129.2.18
Host is up (0.023s latency).

再配上 –reason:

1
sudo nmap 10.129.2.18 -sn -oA host -PE --reason

就能看到:

1
Host is up, received arp-response

也就是說:
在同網段時,Nmap 單靠 ARP 往返就知道主機活著了。
ICMP 在這種情況下反而不是主要依據。

強制改用 ICMP Echo:關掉 ARP Ping

停用 ARP 請求並使用所需內容掃描我們的目標ICMP echo requests, 我們可以透過設定來停用 ARP ping--disable-arp-ping

1
sudo nmap 10.129.2.18 -sn -oA host -PE --packet-trace --disable-arp-ping

這樣 Nmap 就不再用 ARP,而是乖乖丟出:

1
2
SENT ICMP Echo request
RCVD ICMP Echo reply

在封包內容裡:
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.
根據課程的搜尋結果,找出它所屬的作業系統。將作業系統名稱作為結果提交。

解答
windows

Nmap 的 6 種 Port 狀態

Nmap 對每個 Port 的「結果」其實很講究,不是只有「開」或「關」。
官方定義有 6 種狀態:

  1. open
    這個 Port 有服務在監聽,
    TCP/UDP/SCTP 都有可能
    對紅隊來說幾乎等於這裡值得深入查看

  2. closed
    主機有回應,但告訴你這裡沒有服務
    TCP 會用 RST 回你
    雖然現在沒服務,但代表這個 IP 是活的,以後有可能變成攻擊面。

  3. filtered
    Nmap 不確定是開還是關
    可能完全沒回應
    或收到像「port unreachable」之類的 ICMP 錯誤
    通常表示有防火牆/封包過濾在中間。

  4. unfiltered
    只有在 TCP ACK 掃描 時會出現
    代表「封包到得了這個 Port,但不確定開或關」。

  5. open|filtered
    Nmap 沒拿到明確回應,
    可能是開、也可能被防火牆吃掉
    在 UDP 掃描非常常見。

  6. 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
sudo nmap 10.129.2.28 --top-ports=10

範例

快速 UDP 掃描
範例

1
nmap scanme.nmap.org -F -sU
  • -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
nmap -p- -sS -n -Pn --min-rate 1000 -oA full-tcp <TARGET_IP>
  • -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
grep "/tcp" full-tcp.nmap | grep "open" | wc -l

輸出結果:

範例

解答
7

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
nmap -p 139,445 -sV -sC -Pn -n -oA smb-enum 10.129.2.49
  • -p 139,445:只針對 SMB 相關的兩個 port,掃描速度快、輸出也比較乾淨。
  • -sV:問服務「什麼版本以及細節」。
  • -sC:跑一組預設 NSE 腳本,其中就包含 smb-os-discovery、smb2-security-mode 之類會幫你抓 Computer name / NetBIOS name 的腳本。
  • -Pn -n:不再 ping / 不做 DNS 解析。

輸出結果:

範例
最後我們使用grep來找題目要求的名稱:

1
grep -i "Computer name" smb-enum.nmap

輸出結果:
範例

解答
nix-nmap-default

把 XML 轉成 HTML 報告

使用剛剛輸出的檔案當作範例
我們可以用xsltproc:把 Nmap 的 XML 套上官方的 XSL 樣板,生出一份人類友善的 HTML 報告

1
xsltproc full-tcp.xml -o full-tcp.html
  • 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
nmap -p- -sS -n -Pn --min-rate 1000 -oA full-tcp <TARGET_IP>

如果你要轉存成HTML:

1
xsltproc full-tcp.xml -o full-tcp.html

尋找最大的那個port:

1
grep "/tcp" full-tcp.nmap | grep "open" | cut -d "/" -f1 | tr -d ' ' | sort -n | tail -1
  • grep “/tcp” full-tcp.nmap:抓出有寫 xxx/tcp 的行。
  • grep “open”:只留 open 的 Port。
  • cut -d “/“ -f1:以 / 切欄位,拿第一段(例如 31337)。
  • tr -d ‘ ‘:把開頭的空白去掉。
  • sort -n:用數字排序。
  • tail -1:取最後一個,就是最大的 port。

範例

解答
31337

當然你也可以直接用肉眼查看,不過我前公司的技術主管常說:學會全部都使用指令直接輸出最精準的答案,你會省下很多時間。


Banner:服務一開始回給你的「自我介紹文字」。

一連上去,對方就丟給你的那串訊息,就叫 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
nc -nv 10.129.2.49 31337

標的就會直接將flag給吐出來。

解答
HTB{pr0F7pDv3r510nb4nn3r}

NSE;Nmap Scripting Engine-Nmap腳本引擎

NSE內建了一些好用的工具讓你檢查更詳細的內容,這些腳本主要分為14種類:
(同一隻腳本可能同時屬於多個分類)

  1. auth:認證 & 帳號相關
    用途:跟登入有關的事情。
    測試是不是允許匿名登入(像 FTP、SMB 匿名)。
    列出支援的認證機制。
    有些會幫你試弱帳號
    什麼時候用:

    • 掃到 FTP / SSH / POP3 / IMAP / HTTP 登入頁時,可以先讓 auth 類腳本跑一輪,看有沒有「不用帳密就能進去」的。
      1
      nmap -p 21,22,110 --script auth <IP>
  2. broadcast:靠廣播找整個網路的東西(這類很多需要在本地網段才有用)
    用途:用 broadcast/multicast 在整個 LAN 進行查詢,看誰回。
    找開啟的 DHCP server、UPnP 裝置、NetBIOS 名稱、mDNS 服務等。
    什麼時候用:

    • 剛進一個不熟的內網,只知道自己拿到一個 IP,想快速看整個網段有什麼服務。
      1
      nmap --script broadcast-* 
  3. brute:爆破密碼
    用途:對各種服務做暴力/字典登入嘗試。
    如 SSH、FTP、RDP、資料庫、HTTP 表單等。
    很容易被鎖帳號 / 觸發防禦系統
    通常被標記為 intrusive
    什麼時候用:

    • 只適合在你真的被授權做密碼測試的情況,像內部紅隊 / 室內靶機。
      1
      nmap -p 22 --script ssh-brute <IP>
  4. default:-sC 那一包
    用途:Nmap 官方的預設腳本集合。
    大多數是安全、不太侵入的東西。
    什麼時候用:

    • 要做第一輪枚舉時都可以先 -sC。
      1
      nmap -sV -sC -p <ports> <IP>
  5. 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>
  6. dos:Denial of Service
    用途:專門用來測試 DoS 漏洞或造成服務當機的腳本。
    在正式環境幾乎是禁止使用
    什麼時候用:

    • 幾乎只在測試環境或是專門做 DoS 研究時才會用;一般滲透報告頂多在說明階段提「存在已知 DoS 漏洞」,不會真的跑。
      1
      nmap --script dos <IP>
  7. exploit:直接嘗試利用漏洞
    用途:嘗試直接 exploit。例如針對某些已知 CVE 的利用腳本。
    特性:
    有成功就可能直接拿 shell / 建帳號 / 破壞資料。
    非常 intrusive。
    什麼時候用:
    在完全授權的測試 / 靶機上可以玩玩;現場客戶環境要極度謹慎,通常用專門 exploit 框架會更可控。

    1
    nmap --script exploit -p <port> <IP>
  8. external:會連出網路查資料的腳本
    用途:
    會去問外部服務 / API(比如 WHOIS、GeoIP、黑名單、漏洞資料庫…)。
    什麼時候用:
    有對外網路,而且允許掃描機連出。
    想把掃描結果跟外部資訊(地理位置、惡意 IP / domain 評級)合在一起看。
    這類腳本要注意:
    掃描紀錄不只會出現在目標端 log,也會出現在「第三方服務」那邊。

  9. fuzzer:亂丟東西看服務會不會爆
    用途:
    對某種協定丟一堆 fuzzed payload,試探未知漏洞 / 崩潰點。
    特性:
    風險類似 dos / exploit
    容易讓服務掛掉,甚至發現新的 bug
    什麼時候用:
    比較偏研究型或想測試自家服務穩定性時。
    一般滲透測試很少用它,因為太不穩定。

  10. intrusive:有風險、可能被視為攻擊行為的腳本
    用途 / 特性:
    這是性質標籤,不是功能領域。
    brute、dos、exploit 很多都被標成 intrusive。
    代表腳本行為可能:

    • 造成服務異常
    • 觸發 IDS/IPS
    • 改變目標狀態
      什麼時候用:
      只在明確得到允許時用。
      1
      nmap --script intrusive <IP>
  11. malware:惡意軟體相關
    用途:
    偵測目標是否有已知後門 / botnet / 奇怪服務特徵。
    例如檢查特定 port 上是否像某家惡意程式的 C2。
    什麼時候用:
    做事件調查、懷疑有入侵時,可以搭配這類腳本粗略掃一下。

    1
    nmap --script malware <IP>
  12. safe:保證避開破壞性的腳本
    用途 / 特性:
    同樣是一個「性質標籤」。
    代表腳本設計上不會修改目標、不會嘗試 exploit、不刻意造成 DoS。
    什麼時候用:
    要避開具破壞性的腳本時。
    例如:

    1
    nmap -sV --script "default,safe" <IP>
  13. version:-sV 的腳本
    用途:
    這些腳本主要是為了改良版本偵測、識別更精確的服務資訊。
    大多數在你加 -sV 的時候就會自動參與,不一定會特別指定。
    什麼時候用:
    一般不會單獨叫 –script version,

  14. 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
sudo nmap 10.129.2.49 -p 80 -sV --script http-enum -oA http-enum

範例
發現這個網站有使用robots

這邊我們可以直接查看內容

1
curl 10.129.2.49/robots.txt
解答
HTB{873nniuc71bu6usbs1i96as6dsv26}

Part1到此結束了,
繞過防火牆會寫在part2。(因為那個都是Lab)

本文作者:Atom
本文鏈接:https://d0ngd.github.io/2025/12/30/HTB - Network Enumeration with Nmap/
版權聲明:本文採用 CC BY-NC-SA 3.0 CN 協議進行許可