那座城他拿下了,但總覺得哪裡不對。
王座在手,該開的門都開了,該拿的東西也拿到了。可是他站在王座廳裡,總覺得這座城太安靜——安靜得不像一座有人住的城。
他在城裡又走了一圈。
然後他在王座廳後面,發現一扇他之前沒注意到的小門。
那扇門沒有鎖。他推開,門後是一條短短的通道,通道盡頭是另一扇門——而那扇門,開向另一座城。
O1 站在通道口,往那座城看。
看得到,但過不去。
中間隔著的不是牆,是距離。那座城不在他站的地方,它在通道的另一頭,而通道中間有一段是斷的——他從這裡看得見那座城的燈火,卻沒有一條路能讓他直接走過去。
他試著喊。沒有回應,太遠了。
他試著把破口術式往那座城丟。術式飛到通道一半就落下來了,它的力氣不夠遠。
他站在那裡,第一次遇到一種全新的難題:
不是那道門打不開。是那道門根本不在他站得到的地方。
他退回王座廳,坐下來想。
他想到的第一件事是:那座城既然連著這座城,那這座城裡一定有什麼東西,是經常在兩座城之間往返的。
不然那條通道不會存在。
他開始在城裡找。找那種身上帶著兩座城的塵土的人,找那種行李裡有另一座城的東西的僕役,找任何一個「不只屬於這座城」的痕跡。
他找了很久,最後在城牆的一個角落,找到一個管道夫。
那個管道夫每天的工作,就是在兩座城之間清理一條共用的水道。他有兩座城的通行牌。他每天走那條路,走到閉著眼睛都不會迷路。
O1 不需要自己過去。他只需要搭這個管道夫的路。
他花了點工夫,讓那個管道夫替他帶話——不是他親自過去,是他站在這座城,透過管道夫,把他的術式一段一段遞到那座城的門前。
第一次遞過去,力氣還是不夠,中間斷了。
他調整了一下:不是一次遞到底,是在通道中間設一個中繼,讓術式先到管道夫那裡,再從管道夫那裡出發。分兩段走,每一段都在射程之內。
第二次,術式到了。
那座城的門,從這座城被叩開了。
O1 坐在兩座城中間那條通道口,看著遠處那座城的門緩緩打開。
他忽然想到一件很久以前的事。
他想起在公會的時候,有一件委託他怎麼都接不到。他試了很多次,寫申請、遞記述、在窗口前面站著——全部沒有用。他那時候以為是自己能力不夠。
但那件委託,根本不在他站的那個窗口受理。
它在另一個部門,走另一條線。他在錯的窗口前面站了三年,把「站不到」誤會成「搆不上」。
沒有人告訴他要換一個窗口。因為告訴他的那個人,得先看得起他——而看得起他的人,不在那個窗口後面。
那天他在冊子上寫了一句話。
不是導典第一頁的規矩,是寫在當天那一頁的邊上,字很小:
「打不開,有時候不是因為你弱。是因為你站錯了地方。」
他寫完看著那句話,覺得它同時在講兩件事,而那兩件事他花了很多年才連起來。
到目前為止,談的每一台機器都是一台。這一篇開始,機器後面還有機器。
這是很多人第一次真正卡住的地方,因為它需要的不是新的攻擊技巧,是一個新的空間概念。
拿下一台機器(我們叫它「跳板」)之後,它常常不只有一張網卡。
你(Kali)
│
│ 10.10.10.0/24(你連得到)
│
[跳板機] ← 你剛拿下的
│
│ 172.16.5.0/24(你連不到,只有跳板連得到)
│
[內部機器們] ← 你的目標在這裡
關鍵在那第二個網段:172.16.5.0/24 你的 Kali 到不了,只有跳板機到得了。
故事裡那句「破口術式的力氣不夠遠」就是這個——不是你的攻擊沒用,是你的封包根本送不到那個網段。
拿下一台機器後,一定要問:這台機器還連著哪裡?
ip a; ip route # 幾張網卡、在哪些網段
ss -tunp # 正在跟誰通訊(Windows:netstat -ano)
arp -a # ARP 表——它最近跟誰講過話
cat /etc/hosts # 它知道哪些主機名
這一步接 Day 6、Day 9 講的「內部服務」和「第二張網卡」。 那時候埋的線,在這裡收。
如果你看到一張連到陌生網段的網卡、或者 ARP 表裡有你 Kali 到不了的位址——後面有東西。
| Port Forwarding | Pivoting / Tunneling | |
|---|---|---|
| 做什麼 | 把一個 port搬到你搆得到的地方 | 把整個網段變成你搆得到的 |
| 比喻 | 從那座城遞一樣東西出來 | 讓你的所有術式都能打到那座城 |
| 何時用 | 我只要碰那台機器的那個服務 | 我要對整個內網做列舉與攻擊 |
新手常見的錯誤是只會 port forwarding,於是每遇到一個新目標就手動轉一次 port,轉到自己都亂了。當你發現自己在轉第三個 port 的時候,就該改用 tunnel 了。
先講我自己的:兩次考試用的都是 chisel。
它是一個 Go 寫的單一執行檔,跑在自己和跳板兩邊,架出一條隧道。選它的理由很實際——準備考試那段時間,它比較多人用,官方教材也有提到。 資料多、範例多、遇到問題查得到答案,而且很多 Windows 跳板沒有好用的 SSH,chisel 這種「丟一個執行檔上去就能用」的工具最省事。
其他你會遇到的選項:
① SSH(跳板上有 SSH 存取時最乾淨)
不用上傳任何工具:
ssh -L 8080:172.16.5.10:80 user@跳板 # 本地轉發:搬一個 port 出來
ssh -D 1080 user@跳板 # 動態轉發:開 SOCKS proxy(這才是 pivoting)
② chisel(沒有 SSH、或要打穿防火牆時)
服務端跑在你這邊,客戶端丟到跳板上,架反向隧道 + SOCKS。考試環境的常客。
實際跑起來大概是這樣——服務端在你的 Kali 開一個 port 等連線,然後在跳板上執行:
.\chisel.exe client {你的IP}:{你開的PORT} R:socks
R:socks是重點:它建的是反向 SOCKS proxy——由跳板主動回連到你,而不是你去連跳板。這在跳板被防火牆擋住入向連線的時候特別有用,而內網的跳板幾乎都是這種情況。
③ Ligolo-ng
現在好像很多人推 Ligolo-ng。它用一個虛擬網卡介面,讓你像直接連在內網一樣操作,不用 proxychains、不用一個個轉 port,體感好非常多。
但我兩次考試都沒用它。
原因不是它不好,是時機。第一次考試的時候它還沒廣為周知;等它冒出頭來、大家開始推的時候,我第二次考試已經在幾個月內了。
那時候做了一個很現實的決定:不換。
不是因為 chisel 比較好,是因為在考試前幾個月去重新上手一個新工具,風險太高了。一個只練過幾次的工具,在長夜的壓力下最容易出狀況,會在最不該卡的地方,卡在「這個工具的某個參數不熟」。
它其實是這條路上一個一直存在的兩難:
知道有更好的工具,和來得及把它練到能上考場,是兩回事。
如果時間還充裕——學 Ligolo-ng,它值得。
如果考試在即——守住最熟的那個,不要在最後關頭換裝備。
新工具留到考完再學。會有下一個內網要打的。
隧道架好之後,工具預設還是不知道要走它。proxychains 負責把工具的流量塞進那條 SOCKS 隧道:
proxychains nmap -sT -Pn 172.16.5.10
proxychains crackmapexec smb 172.16.5.0/24
兩個一定要知道的坑,這兩個我沒踩到,是因為當年學的時候史帝凡先提醒了我,我把這份提醒轉給你:
-sT),不能用 SYN scan。因為 proxychains 走的是應用層,半開掃描那種底層封包過不去-Pn,跳過 ping。ICMP 通常也過不去隧道,不加的話 nmap 會以為主機都死了這兩個坑幾乎每個人都會踩一次,除非有人先跟你講。現在你也被講過了。
真實內網常常不只兩層。跳板後面還有跳板,你要串接多層隧道。
原理跟故事裡一樣:每一段都要在射程之內。 你不是從 Kali 一步打到最深處,是一層一層架過去,每一層都以前一層為起點。
印象最深的一次,是 OffSec Lab 裡一個特別刁鑽的環境。那個環境的層數多到,據說很多人考完試了都還沒把它全部打下來。
攻擊機 → 目標(第一層)→ 內一(第二層)→ 內二(第三層)→ ?(第四層)
最後穿到了第三層(應該是,有點久了)。
第四層一直沒突破。
多層 pivoting 到了一定深度,就是會有當下打不穿的東西。能穿三層、卡在第四層,這不是失敗,這是真實的內網。
卡住的點其實不是攻擊本身,是隧道。
要打第四層,得在更裡面設一個新的 proxy——但問題來了:設在哪一層?從哪個節點起跳?前面幾層的隧道怎麼疊上去讓封包一路轉到那麼深? 每多一層,這些問題就複雜一級。
而那個環境全破的人太少,網路上幾乎沒有提示。我試了幾種疊法都沒通,最後停在第三層。
多層 pivoting 真正難的不是「知道要 pivot」,是「在第四層那個位置,隧道還接不接得起來」。
(工具層面:多層串接 Ligolo-ng 會優雅很多;chisel/SSH 就是隧道疊隧道,邏輯一樣,但管理起來繁瑣。這也是我會建議「有時間就學 Ligolo-ng」的原因之一。)
技術細節之外,pivoting 教的是一件更大的事:
當你打不到一個目標的時候,第一個要問的不是「攻擊哪裡不夠強」,是「是不是站錯了位置」。
很多卡關不是火力問題,是視角問題。站在 Kali 這一側,用盡全力也打不到那個網段——不是因為自己弱,是因為那個網段本來就不對自己的位置開放。
要做的不是更用力,是換一個站的地方。
換位置這件事聽起來簡單,但它違反直覺。人卡住的時候,本能是「更用力試同一個方向」,而不是「退回去、找一條新的路徑」。
這一課,在機器上是 pivoting。在別的地方,它有別的名字。
打不開,有時候不是因為你弱。
是因為你站錯了地方。