他回去的時候,屋子是暗的。
他把門帶上,伸手往左邊牆上摸,開燈。
這個動作他做了一年多。
摹室裡那道門,是他第一次真正面對的門。
導典教的第一個能用的東西是破口術式,所以他做的第一件事就是用它。他把術式套上去,門紋亮了一下,然後滅了。
他換了一個。滅了。
他換了第三個。這次連亮都沒亮。
O1 站在那道門前面,手心開始出汗。這種感覺他很熟——是那種「我明明學過,為什麼不會」的感覺。他在公會的頭兩年常常有這種感覺,後來那種感覺消失了,他一直以為是自己變強了。
現在他知道不是。那是因為後來的七年,沒有人再給過他不會的東西。
他退後兩步,坐在地上。
他想起導典的五根柱子。他自己抄目錄的時候整理出來的那五根:
怎麼看、怎麼進、怎麼動、怎麼待著、怎麼寫下來。
「怎麼看」是第一根。
而他剛剛跳過了它。
他忽然覺得有點難為情。他在公會做了七年的卷宗,每一次他做得比別人好的地方,都不是他手比較快,是他看得比較細。他會把一面牆的斷面畫出來,會去數那些別人懶得數的東西。
結果他拿到自己的第一道門,第一件事就是拿槌子。
他站起來,把所有術式都收起來。
然後他開始看。
那道門所在的那面牆,遠看是平的。
他走近,蹲下,開始數上面的孔。
第一遍他數到七個。都是常見的那種,位置標準,邊緣整齊,一看就是照規制開的。他把七個孔的位置、大小、深度抄在冊子上。
第二遍他換了個角度,從側面看。
側面看過去,牆上的光影不一樣。他在第三個孔的下方發現一道淺淺的痕——不是孔,是磨損。那個位置有東西長期進出過。
第三遍他趴下來,看牆根。
牆根的泥比較厚,顏色也比較深,看起來就是牆根該有的樣子。他伸手撥了撥。
泥底下有一個孔。
很小,位置也不對——不在規制上,不在任何一張標準圖裡。它的邊緣很光滑,是被磨出來的,不是被開出來的。有人用過它,而且用了很久。
O1 在那個孔前面蹲了很久。
他沒有立刻動手。他把它的位置、大小、磨損的方向都抄下來,然後回頭把前面七個孔又看了一遍——因為他想知道,這第八個孔是為了繞過哪一個而存在的。
抄完之後,他才把手伸進去。
門開了。
他坐在那間終於打開的房間裡,看著自己的冊子。
前面三個多小時,他什麼都沒做,只是看。最後開門的動作,花了不到一分鐘。
他忽然想明白一件事,而且這件事讓他有一點難過:
他不是比較會砸。他只是比較會看。
這一直是他唯一的長處。七年來沒有人因為這個誇過他,因為「看得比較細」不是一件會被看見的事——看是安靜的,砸才有聲音。
而派令官從來只聽聲音。
那天晚上,他在導典第一頁又加了一行。
那一頁現在有三行字了:
桌子是我的。
先做,再讀。
先看完,再動手。
他把書闔上的時候,屋子還是亮的。整棟樓大概只剩他這一盞。
他關掉摹室,關燈,去睡。
第二天回來,屋子又是暗的。他伸手往左邊牆上摸。
這一篇談 OSCP 整條路上最重要、也最被低估的一件事:列舉(enumeration)。
先講結論:如果你卡關,九成的情況不是你不會攻擊,是你沒看完。
nmap 不加參數的時候,只掃最常見的 1000 個 TCP port。
這個預設值對網管很合理,對叩門者是災難。
說實話,我第一次踩到這件事,不是自己發現的。
那是在 OffSec 的實驗室,一台我卡了很久的機器。掃出來的東西我全部試過,該看的都看了,就是進不去。後來是別人點了我一句,我才回頭把全 port 掃一次——那台機器的服務,被刻意放在一個你不會想到的高號 port 上。
那次之後我再也不敢只掃前一千個。
現在我的順序固定是:先掃全 port,看哪些開著;再回頭看每個是什麼服務、什麼版本。
# 1. 全 port 快掃(只要知道哪些開著)
nmap -p- --min-rate 5000 -oA scans/01-allports <target>
# 2. 針對開著的 port 深掃(服務、版本、預設腳本)
nmap -p 22,80,445,49152 -sCV -oA scans/02-detail <target>
分兩階段的理由:全 port 掃描要快,所以不做服務偵測;服務偵測很慢,所以只對真正開著的做。一次全掃又全偵測,你會等到天亮。
先誠實說:我實務上掃 UDP 的機會不多。 因為接的案子以網站滲透為主,UDP 幾乎用不到。
但練習和考試一定要做,因為靶機環境會把突破口放在那裡,而且真實的內網案子、AD 環境是另一回事。
別全掃,會慢到不可接受:
sudo nmap -sU --top-ports 100 -oA scans/03-udp <target>
值得注意的 UDP 服務:SNMP(161)、TFTP(69)、NFS(2049)、DNS(53)。
-oA 一次產生三種格式(normal / greppable / XML),全部留著。
搭配 Day 4 的目錄規範:scans/ 裡的檔名帶時間戳與階段編號。
這是本篇的核心。
掃描只是第一步。列舉的產出不應該是一張 port 清單,而是一句話:
這台機器在做什麼?為誰服務?
同一個 80 port,背後可能是公司官網、內部管理介面、或某個設備的設定頁——三者的攻擊路徑完全不同。所以每一個開放的 port 你都要問:
| 問題 | 從哪裡看 |
|---|---|
| 是什麼服務、什麼版本 | -sCV 的輸出、banner |
| 有沒有已知漏洞 | 版本號 → searchsploit / CVE 查詢 |
| 有沒有預設憑證 | 產品文件、廠商預設帳密 |
| 它洩漏了什麼 | HTTP title、憑證的 CN 與 SAN、SMB 的主機名與網域名、錯誤訊息 |
憑證的 CN/SAN 和 SMB 洩漏的網域名特別重要——在 AD 環境裡,那常常是你第一次看到網域名稱的地方(Day 15 會用到)。
只要有 80/443,工作量就會翻倍。
當年我只用 gobuster。 一個工具、一份字典,跑完就當作掃完了。
現在我會跑三個——gobuster、dirsearch、feroxbuster,必要時再加 dirb。
為什麼?因為它們的預設行為、遞迴策略、對回應碼與長度的處理都不一樣,同一個目標,三個工具跑出來的結果不會完全相同。我被這件事坑過,所以現在寧可多花十分鐘交叉確認。
(Day 5 提過「目錄列舉從一行長成三個工具」,指的就是這件事。)
# 目錄與檔案
gobuster dir -u http://<target> -w <wordlist> -x php,txt,html
# 虛擬主機
ffuf -u http://<target> -H "Host: FUZZ.<domain>" -w <wordlist> -fs <filter-size>
外加一定要用眼睛做的部分:原始碼與註解、robots.txt、favicon、錯誤訊息的框架版本、登入頁的行為差異(帳號存在與否的回應時間或訊息)。
工具跑完只是把地圖畫出來,讀地圖的還是你。
拿到 shell 之後,要從裡面再勘一次。
外面看到的和裡面看到的是兩台不同的機器:本機開了哪些只綁 127.0.0.1 的服務、有哪些使用者、跑著哪些排程、掛載了什麼、有沒有第二張網卡(Day 14 借道的入口)。
很多人拿到 shell 就急著提權,結果提權的答案其實在一個他沒看過的內部服務上。
一句話:回到第一行,這次看得更細。
最後一項最致命,那是 Day 11〈幻廊〉的主題。
兩個理由。
第一,列舉決定你接下來能做什麼。
很基本但常被跳過的一件事:你得先列舉,才知道要用哪個工具。 不是先挑工具再去找目標。卡關的人常常是反過來的——手上握著一把很熟的槌子,就一直找釘子。
第二,它是唯一一件努力一定會有回報的事。
破口術式有沒有用,看的是那台機器裝了什麼,你控制不了。提權成不成,看的是管理員犯了什麼錯,你也控制不了。
但「有沒有看完」,百分之百由你決定。
在一條充滿運氣成分的路上,它是少數你能完全掌握的東西。
九成的門是勘開的,不是砸開的。
而砸有聲音,看沒有。
九成的門是勘開的,不是砸開的。
而砸有聲音,看沒有。