Part 1: nmap — 為什麼大家都先跑 nmap
每個 CTF 題目與滲透測試背後的那個工具,以及深度與隱匿開始互相拉扯的地方。
在 TryHackMe、HackTheBox,以及我參與過的實際滲透測試專案中,幾乎每一個都是從 nmap 掃描開始的。2022 年我剛入行資安時,沒想太多,只是因為大家都在用就跟著用 nmap。
幾個月前,我終於坐下來畫了一張圖,試著回答「為什麼」。
畫的時候我很清楚,再看卻看不懂了 🙃
今天再回頭看這張圖,才發現我把自己搞糊塗了。所以這篇就是我重新解釋給你、也解釋給自己聽。
開始掃描之前:基本概念
網路上的每一台機器(不只是電腦,還包含印表機、監視器,甚至醫院裡的 IV 輸液幫浦和掃地機器人)都有唯一的 IP 位址,以及最多 65,535 個 port。
想像一個封閉式社區。每個社區都有自己的名字,裡面住著幾戶人家。把社區命名出來,讓大家可以互相區分——這就是 IP 位址在網路世界的用途。
我們這個社區有點大,一共有 65,535 戶人家。就跟其他社區的每一戶一樣,每戶都有自己的門牌號碼,屋主可以自行決定要做什麼。
幾個你可能聽過的:80 號住著網頁伺服器,443 號負責加密流量,22 號提供遠端連線。這些號碼我們稱為 port number。不是每一戶都有人住,也不是每一戶都很活躍。許多戶的服務比較安靜,有些則完全空著。
nmap 主要用來做什麼?
社區裡超過 60,000 戶,你一定會想知道哪些有人住、提供什麼服務、門有沒有開。一戶一戶敲,既費時又不實際。
nmap 就是用來自動化這件事的工具。可以把它想像成一個幫你走完整個社區、逐戶查訪的人。你也可以叫它大聲一點(用力搖門把),或叫它悄悄地(聽裡面有沒有動靜)去拜訪每一戶。
nmap 敲一戶時,會得到三種回應之一:
- 門大開——open port
- 門砰地關上——closed port
- 連門都摸不到,被一道牆擋住——filtered
為什麼 nmap 在攻擊性資安中這麼廣泛被使用?
我以前會想,除了 nmap 之外,有沒有其他更好的工具或起手式?我試過 Masscan,也用過 Shodan 或 OSINT 這類被動偵察。在摸索的過程中,我發現一個共同點:偵察 (reconnaissance)。
「知己知彼,百戰不殆」 ——孫子,《孫子兵法》
這句話老套歸老套,但我實在想不到更貼切的比喻來形容偵察。在攻擊性資安中,掌握目標怎麼運作、漏洞在哪、什麼時候最脆弱——是我們能悄悄滲透進去的關鍵。
nmap 幾乎是每一位資安從業者做偵察時都會用的工具。它是 Network Mapper 的縮寫。從我的觀察,nmap 之所以勝過其他工具,主要有兩個原因:
- 多功能性 — 不只做 port 掃描,它還能涵蓋很多功能。
- 實用性 — 讓工程師一次就能看到完整的結果。
這就像是選瑞士刀,而不是帶一支剪刀、一支開瓶器、一把菜刀上場。每一樣確實都做得比較專精,但沒有人想要帶三樣東西進現場。nmap 一次執行就能涵蓋夠多範圍,讓你不用在任務中頻繁切換工具。
有沒有辦法既隱匿又拿到最多資訊?
回到封閉式社區的比喻:如果有人要踩點整個社區,首要的優先順序就是盡可能低調,避免驚動警報。
要保持低調有很多手法。nmap 本身就提供許多可以搭配使用的旗標 (flags)。常見的幾個像是 -D,會把你真正的掃描流量和多個誘餌 IP 混在一起,讓防守方不容易分辨哪一個才是你;還有 -T 旗標,可以調整掃描速度。
nmap 的完整指令清單可以在網路上找到,我自己蠻喜歡這種緊湊的速查表:https://cdn.comparitech.com/wp-content/uploads/2019/06/Nmap-Cheat-Sheet.pdf
我在一個受控的實驗環境跑了兩種不同旗標組合的 nmap 掃描。第一次跑的是 -sS 的全 port 掃描;第二次則是 -sV 針對特定 port。兩次都設定來源 port 為 53,讓流量看起來像 DNS 回應,而防火牆通常預設會讓這類流量通過。(為什麼這樣能通過、什麼情況才有效,第二部分會再詳細說明。)
環境裡配置了警報計數,我因此能清楚看到每次掃描觸發了多少警報。以下是主要差異。
第一次又快又安靜,但只能告訴你哪些 port 是開的。第二次結果更豐富,但代價是花更多時間、產生更多噪音。光從這個觀察就能看出:深度與隱匿幾乎永遠是一種取捨。
不同的旗標會造成不同程度的噪音,以及不同的結果。仔細選擇掃描設定這件事常常被忽略,但它真的很重要。警報一多,就會吸引 SOC 分析師的注意,還沒開始正事前就先被發現。
知道要用哪些旗標只是故事的一半。在 第二部分,我們會深入看 nmap 在 wire 層級(封包層)真正在做什麼:它如何發現主機、目標位置會怎麼改變流程,以及為什麼以 root 執行 nmap 會徹底改變它在封包層能做什麼。