the_open_door
café
ESEN
← Volver al índice

Kerberos user enumeration

ATT&CKT1087.002

En un dominio Active Directory, el KDC (puerto 88) responde de forma distinta según si una cuenta existe o no, antes de comprobar la contraseña. Cuando se solicita un AS-REQ sin pre-autenticación para un usuario inexistente, el error es KDC_ERR_C_PRINCIPAL_UNKNOWN; para uno válido, el KDC pide pre-auth (KDC_ERR_PREAUTH_REQUIRED). Esa diferencia permite separar usuarios válidos sin generar logons fallidos, así que es mucho más sigiloso que un spray contra SMB.

La herramienta de referencia es kerbrute:

kerbrute userenum --dc <ip> -d <domain> userlist.txt

De dónde sale la lista de candidatos. Sin credenciales, los nombres reales suelen estar a la vista: una página «Team»/«About» de la web, firmas de correo, PDFs con metadatos. Esos nombres se convierten en formatos de login plausibles (j.smith, john.smith, smithj...) con username-anarchy:

./username-anarchy --input-file nombres.txt > userlist.txt

Otras vías de enumerar cuentas del dominio:

# el mismo kerbrute encadena spray de contrasena una vez validados los usuarios
kerbrute passwordspray --dc <ip> -d <domain> userlist.txt '<pass>'
# netexec: validar por kerberos (sin logons fallidos)
netexec smb <ip> -u userlist.txt -p '' -k
# RID cycling si hay sesion nula o guest
lookupsid.py <domain>/guest@<ip> -no-pass | grep SidTypeUser

El resultado de kerbrute es una lista corta de cuentas que existen de verdad, base para password spraying o, si alguna no exige pre-auth, para AS-REP Roasting. No confirma contraseñas, solo existencia.

Matiz. La técnica depende de que el dominio no fuerce mecanismos que oculten la diferencia y de que el reloj esté sincronizado (Kerberos rechaza tickets con mucho desfase). Generar miles de AS-REQ sigue siendo detectable por volumen aunque no produzca eventos de logon fallido.

Cómo detectarlo. Aunque no genera logons fallidos, cada AS-REQ deja un Event ID 4768 (se solicitó un ticket de autenticación Kerberos) en el DC; para usuarios inexistentes, el KDC responde con KDC_ERR_C_PRINCIPAL_UNKNOWN, que aparece como un 4768 con código de resultado 0x6. Una avalancha de 4768 con 0x6 desde una sola IP, con nombres de usuario que no existen, es la firma inequívoca del kerbrute userenum: nadie teclea cientos de usuarios inexistentes por error. La detección eficaz cuenta 4768 fallidos por origen, no por cuenta. En red, el pico de AS-REQ al puerto 88 desde un host que no es una estación unida al dominio refuerza el indicio.

Defensa. Usar nombres de cuenta no derivables del nombre real y no publicar plantillas de usuario, para que la lista de candidatos del atacante no acierte. Relacionado con la fuerza bruta y la enumeración de usuarios por SMTP.

Máquinas donde se aplica