Contact

Outil gratuit · 100 % navigateur

Reverse Shell Generator

Générez des reverse shells Bash, Python, PowerShell, PHP, Netcat, Socat et plus, avec le listener assorti et les encodages utiles. Pour les tests d’intrusion autorisés.
Traitement local Aucune donnée envoyée Sans compte

IP ou nom d’hôte de votre machine d’écoute.

Port d’écoute, de 1 à 65535.

Système cible
  • Bash -i bash
  • Bash 196 bash
  • Bash read line bash
  • Bash 5 bash
  • Bash UDP bash
  • nc -e netcat
  • nc -c netcat
  • nc mkfifo netcat
  • BusyBox nc -e netcat
  • ncat -e ncat
  • ncat UDP ncat
  • Perl perl
  • Perl sans sh perl
  • Python #1 python
  • Python3 #2 python
  • Python3 court python
  • Ruby ruby
  • Ruby sans sh ruby
  • PHP exec php
  • PHP shell_exec php
  • PHP system php
  • PHP passthru php
  • PHP popen php
  • PHP proc_open php
  • Node.js javascript
  • Node.js (net+spawn) javascript
  • Java Runtime.exec java
  • Groovy groovy
  • Telnet telnet
  • zsh zsh
  • Lua lua
  • Golang go
  • awk awk
  • socat #1 socat
  • socat #2 (statique) socat
  • sqlite3 nc mkfifo sqlite3
  • PowerShell #1 powershell
  • PowerShell #2 (one-liner) powershell
  • PowerShell #3 (court) powershell
  • PowerShell -e (Base64 UTF-16LE) powershell
  • ConPtyShell (référence) powershell
  • Windows nc.exe -e cmd netcat
  • linux/x64 shell_reverse_tcp (ELF) MSFVenom
  • windows/x64 shell_reverse_tcp (EXE) MSFVenom
  • php/reverse_php MSFVenom
  • java/jsp_shell_reverse_tcp (WAR) MSFVenom
  • python/shell_reverse_tcp MSFVenom
  • windows/x64 shell_reverse_tcp (ASPX) MSFVenom
  • nc -lvnp (bind) Bind
  • Python bind Bind
  • PHP bind Bind

Bash -i

Reverse · bash

Linux
payload

LListener

listener

TTYStabiliser le shell

Après réception du shell, déroulez ces étapes pour obtenir un terminal complet (complétion, flèches, Ctrl+C).

  1. 01Spawn pty (Python)
    Spawn pty (Python)
    python3 -c 'import pty; pty.spawn("/bin/bash")'
  2. 02Spawn pty (script)
    Spawn pty (script)
    script -qc /bin/bash /dev/null
  3. 03Backgrounder le shell
    Backgrounder le shell
    Ctrl+Z
  4. 04Mode raw côté attaquant
    Mode raw côté attaquant
    stty raw -echo; fg
  5. 05Réinitialiser l’affichage
    Réinitialiser l’affichage
    reset
  6. 06Type de terminal
    Type de terminal
    export TERM=xterm-256color
  7. 07Taille du terminal
    Taille du terminal
    stty rows 38 cols 116

Principe d’un reverse shell

Un reverse shell est un interpréteur de commandes dont l’entrée et la sortie sont redirigées vers une connexion réseau ouverte par la machine cible vers la machine de l’opérateur. L’opérateur lance d’abord un listener, un programme qui attend la connexion sur un port donné. Quand le payload s’exécute sur la cible, il se connecte à ce listener, et chaque commande tapée côté opérateur s’exécute sur la cible.

Ce sens de connexion a une raison pratique. La plupart des pare-feu filtrent strictement les connexions entrantes et laissent passer le trafic sortant. Sur un port courant comme 443 ou 53, le reverse shell emprunte un flux que le réseau autorise déjà.

Reverse shell et bind shell

Avec un bind shell, la cible ouvre un port et attend que l’opérateur s’y connecte. La mise en place est simple, mais le port doit être joignable depuis l’extérieur, ce qui est rare derrière un NAT ou un pare-feu entrant. Le reverse shell inverse le sens de la connexion et contourne ce problème. En contrepartie, l’opérateur doit exposer une IP et un port joignables depuis la cible, et le filtrage sortant de la cible doit laisser passer la connexion.

Stabiliser le shell obtenu

Un reverse shell brut n’a ni complétion ni historique, Ctrl+C coupe la session, et les programmes interactifs comme ssh, su ou vim se comportent mal. On le stabilise en lui attachant un pseudo-terminal (PTY). Sous Linux, la séquence habituelle commence par python3 -c 'import pty; pty.spawn("/bin/bash")' ou script -qc /bin/bash /dev/null. On suspend ensuite le shell avec Ctrl+Z, on passe son propre terminal en mode brut avec stty raw -echo; fg, puis on exporte TERM=xterm-256color et on règle la taille avec stty rows 38 cols 116 (valeurs à reprendre de stty size sur votre terminal). socat et pwncat-cs font cette bascule automatiquement.

Détecter et prévenir les reverse shells

Côté défense, un reverse shell signale presque toujours une compromission déjà réussie : une injection de commande, un upload de fichier ou un service vulnérable a permis d’exécuter du code. Deux leviers s’appliquent : empêcher la connexion de sortir, et repérer le comportement quand il se produit.

Filtrage sortant et durcissement

Le filtrage sortant (egress) est la mesure la plus efficace. Un serveur applicatif a rarement besoin d’ouvrir des connexions arbitraires vers Internet. En limitant les flux sortants aux destinations connues (proxy, dépôts de paquets, API partenaires), on coupe le canal de retour même quand l’exploitation réussit.

Le reste du durcissement réduit les options de l’attaquant. Les services tournent sous des comptes dédiés sans shell interactif, dans des conteneurs au système de fichiers en lecture seule. Sous Windows, AMSI et les règles ASR de Defender bloquent une partie des payloads PowerShell. Sous Linux, retirer de la production les interpréteurs et outils inutiles (compilateurs, nc avec -e, socat) limite les variantes utilisables.

Filiation des processus et télémétrie

Le signal le plus fiable est une filiation de processus anormale. Un serveur web ne lance pas de shell en fonctionnement normal. w3wp.exe qui démarre cmd.exe ou powershell.exe sous IIS, ou httpd, nginx ou java qui démarre bash, sh, python ou nc sous Linux justifient une alerte.

Sous Windows, Sysmon fournit les deux événements utiles. L’Event ID 1 (création de processus) donne la ligne de commande complète et le processus parent, y compris les arguments -EncodedCommand de PowerShell, qu’il suffit de décoder. L’Event ID 3 (connexion réseau) rattache une connexion sortante au processus qui l’a ouverte. Un powershell.exe ou un binaire Office qui se connecte à une IP externe inconnue est un cas classique.

Sous Linux, auditd journalise les appels execve et connect. Des règles sur ces appels font apparaître l’usage de /dev/tcp, de nc ou d’un interpréteur avec redirection des descripteurs 0, 1 et 2. La création d’une FIFO avec mkfifo dans /tmp juste avant une connexion sortante correspond à la variante netcat la plus courante.

Pris un par un, ces indicateurs restent faibles. La détection devient fiable quand on corrèle la filiation du processus, sa ligne de commande et la connexion réseau qu’il ouvre, sur la même machine et dans la même fenêtre de temps.

?Questions fréquentes

Est-ce légal d’utiliser un reverse shell ?

Oui, dans un cadre autorisé : test d’intrusion couvert par un mandat écrit, CTF, ou laboratoire qui vous appartient. Sans autorisation, l’accès et le maintien frauduleux dans un système de traitement automatisé de données sont punis par les articles 323-1 et suivants du Code pénal.

Les payloads sont-ils envoyés à un serveur ?

Non, les commandes sont générées en JavaScript dans votre navigateur. L’IP, le port et le payload ne quittent pas votre machine, et la page continue de fonctionner hors ligne une fois chargée.

Pourquoi le reverse shell ne se connecte pas ?

Vérifiez dans cet ordre : le listener écoute sur le bon port, l’IP d’écoute est joignable depuis la cible, aucun filtrage sortant ne bloque la connexion, et l’interpréteur choisi existe sur la cible (bash avec /dev/tcp, python3, nc avec -e).

Quelle différence entre reverse shell et bind shell ?

Avec un reverse shell, la cible ouvre la connexion vers votre machine, ce qui passe la plupart des pare-feu qui ne filtrent que l’entrant. Avec un bind shell, la cible ouvre un port et attend votre connexion, ce qui échoue dès qu’un pare-feu ou un NAT bloque les connexions entrantes.

Comment stabiliser un shell ?

Lancez un pseudo-terminal avec python3 -c 'import pty; pty.spawn("/bin/bash")', suspendez le shell avec Ctrl+Z, passez votre terminal en mode raw avec stty raw -echo; fg, puis exportez TERM et réglez la taille avec stty rows et cols. Le panneau TTY de l’outil reprend chaque commande.

Pourquoi encoder un payload en Base64 ou en URL ?

Pour qu’il traverse un contexte qui interprète certains caractères, comme un paramètre d’URL ou un champ de formulaire. PowerShell attend aussi une commande en Base64 d’UTF-16LE avec -EncodedCommand. Un EDR décode ces formats sans difficulté, l’encodage ne sert donc pas à se cacher.

+Autres outils