In My Mind
← ciberseguridad

LDAP en Active Directory

LDAP (Lightweight Directory Access Protocol) es uno de los protocolos fundamentales utilizados por Active Directory (AD) para almacenar y consultar información sobre usuarios, grupos, computadoras, unidades organizativas y otros objetos del dominio.

Durante una auditoría de seguridad, LDAP puede proporcionar una gran cantidad de información sobre la estructura de un dominio. Una configuración incorrecta puede permitir que usuarios no privilegiados o incluso sesiones anónimas obtengan información que debería estar restringida.

En este artículo veremos cómo funciona LDAP dentro de Active Directory y cómo podemos enumerarlo y analizarlo en un laboratorio controlado.

Aviso: Los ejemplos deben ejecutarse únicamente contra laboratorios, máquinas propias o sistemas para los que tengas autorización.


1. ¿Qué es LDAP?

LDAP es un protocolo diseñado para acceder a servicios de directorio.

En Active Directory, LDAP permite consultar objetos almacenados dentro del directorio.

Por ejemplo:

Active Directory
│
├── Users
│   ├── Administrator
│   ├── Alice
│   └── Bob
│
├── Groups
│   ├── Domain Admins
│   └── Domain Users
│
├── Computers
│   ├── DC01
│   └── PC01
│
└── Organizational Units
    ├── IT
    ├── HR
    └── Management

Estos objetos contienen atributos que LDAP puede consultar.

Por ejemplo, un usuario puede tener:

cn
sAMAccountName
userPrincipalName
mail
memberOf
objectGUID
distinguishedName

2. LDAP y Active Directory

En un entorno Windows, normalmente tenemos:

             Active Directory
                    │
                    ▼
            Domain Controller
                    │
          ┌─────────┴─────────┐
          │                   │
        LDAP                Kerberos
          │                   │
          ▼                   ▼
    Directorio AD        Autenticación

LDAP se utiliza principalmente para consultar y modificar objetos del directorio, mientras que Kerberos se utiliza principalmente para la autenticación dentro del dominio.

No debemos confundir ambos protocolos.


3. Puertos utilizados por LDAP

Los puertos más importantes son:

PuertoServicio
389/TCPLDAP
636/TCPLDAPS
3268/TCPGlobal Catalog
3269/TCPGlobal Catalog sobre SSL/TLS

El puerto estándar de LDAP es:

389

Mientras que LDAP protegido mediante TLS normalmente utiliza:

636

4. Identificar LDAP

En un laboratorio podemos comenzar utilizando Nmap:

nmap -p 389,636,3268,3269 10.10.10.10

Un resultado podría ser:

PORT     STATE SERVICE
389/tcp  open  ldap
636/tcp  open  ldapssl
3268/tcp open  globalcatLDAP

Esto indica que el servidor está exponiendo servicios LDAP.

También podemos obtener información adicional:

nmap -sV -p 389,636 10.10.10.10

5. ¿Qué es un Distinguished Name?

Uno de los conceptos más importantes de LDAP es el DN (Distinguished Name).

El DN identifica de manera única un objeto dentro del directorio.

Por ejemplo:

CN=Alice,OU=IT,DC=corp,DC=local

Podemos interpretarlo como:

CN=Alice
    │
    └── Nombre del objeto

OU=IT
    │
    └── Unidad organizativa

DC=corp
DC=local
    │
    └── Dominio

Otro ejemplo:

CN=Administrator,CN=Users,DC=corp,DC=local

6. Base DN

El Base DN indica desde qué punto del árbol LDAP comenzaremos una búsqueda.

Para un dominio:

corp.local

normalmente tendríamos:

DC=corp,DC=local

Por ejemplo:

DC=corp,DC=local

Una consulta LDAP puede utilizar esta base para buscar todos los objetos debajo de ella.


7. Instalar herramientas LDAP

En Debian/Ubuntu:

sudo apt update
sudo apt install ldap-utils

En Arch Linux:

sudo pacman -S openldap

Podemos comprobar que ldapsearch está disponible:

ldapsearch --help

La herramienta principal que utilizaremos será:

ldapsearch

8. Primera consulta LDAP

Podemos realizar una consulta básica:

ldapsearch -x -H ldap://10.10.10.10 -b "DC=corp,DC=local"

Los parámetros significan:

-x
    Utilizar autenticación simple.

-H
    Especificar el servidor LDAP.

-b
    Especificar el Base DN.

El resultado puede contener una gran cantidad de información.


9. Buscar usuarios

Podemos utilizar un filtro LDAP para buscar objetos que sean usuarios:

ldapsearch -x \
-H ldap://10.10.10.10 \
-b "DC=corp,DC=local" \
"(objectClass=user)"

Una consulta más específica:

ldapsearch -x \
-H ldap://10.10.10.10 \
-b "DC=corp,DC=local" \
"(sAMAccountName=alice)"

Podemos solicitar únicamente determinados atributos:

ldapsearch -x \
-H ldap://10.10.10.10 \
-b "DC=corp,DC=local" \
"(sAMAccountName=alice)" \
sAMAccountName mail memberOf

Esto hace que la salida sea mucho más manejable.


10. Buscar grupos

Podemos buscar objetos de tipo grupo:

ldapsearch -x \
-H ldap://10.10.10.10 \
-b "DC=corp,DC=local" \
"(objectClass=group)"

También podemos buscar un grupo específico:

ldapsearch -x \
-H ldap://10.10.10.10 \
-b "DC=corp,DC=local" \
"(cn=Domain Admins)"

11. Buscar computadoras

Active Directory también almacena información sobre los equipos unidos al dominio.

Podemos buscarlos utilizando:

ldapsearch -x \
-H ldap://10.10.10.10 \
-b "DC=corp,DC=local" \
"(objectClass=computer)"

Podríamos obtener:

dn: CN=DC01,OU=Domain Controllers,DC=corp,DC=local
sAMAccountName: DC01$
objectClass: computer

dn: CN=PC01,OU=Computers,DC=corp,DC=local
sAMAccountName: PC01$
objectClass: computer

Esto permite identificar la infraestructura del dominio.


12. Enumeración de usuarios

Una de las tareas más interesantes durante un pentest es determinar qué información sobre usuarios está expuesta.

Podemos solicitar:

ldapsearch -x \
-H ldap://10.10.10.10 \
-b "DC=corp,DC=local" \
"(objectClass=user)" \
sAMAccountName

Una salida simplificada podría ser:

sAMAccountName: Administrator
sAMAccountName: alice
sAMAccountName: bob
sAMAccountName: svc_backup

Esta información puede ser relevante durante una auditoría porque permite conocer las cuentas existentes en el dominio.


13. Buscar cuentas de servicio

Las cuentas de servicio son especialmente interesantes en Active Directory porque algunas pueden tener configuraciones específicas relacionadas con servicios y Kerberos.

Podemos buscar nombres que contengan patrones comunes:

ldapsearch -x \
-H ldap://10.10.10.10 \
-b "DC=corp,DC=local" \
"(|(sAMAccountName=*svc*)(cn=*service*))" \
sAMAccountName

Ejemplo:

sAMAccountName: svc_backup
sAMAccountName: svc_sql
sAMAccountName: svc_web

Esto no significa que estas cuentas sean vulnerables. Simplemente son cuentas que merecen ser revisadas durante una auditoría.


14. Consultar grupos de un usuario

Podemos consultar el atributo memberOf:

ldapsearch -x \
-H ldap://10.10.10.10 \
-b "DC=corp,DC=local" \
"(sAMAccountName=alice)" \
memberOf

Podríamos encontrar:

memberOf: CN=Domain Users,CN=Users,DC=corp,DC=local
memberOf: CN=IT,OU=Groups,DC=corp,DC=local

Esto nos permite conocer la pertenencia del usuario a grupos.


15. Buscar miembros de un grupo

También podemos consultar directamente el atributo member.

Por ejemplo:

ldapsearch -x \
-H ldap://10.10.10.10 \
-b "DC=corp,DC=local" \
"(cn=Domain Admins)" \
member

La salida podría contener:

member: CN=Administrator,CN=Users,DC=corp,DC=local
member: CN=Alice,OU=IT,DC=corp,DC=local

Esto permite estudiar la estructura de privilegios del dominio.


16. LDAP anónimo

Una de las primeras comprobaciones durante una auditoría consiste en determinar si el servidor permite consultas sin autenticación.

Podemos probar:

ldapsearch -x \
-H ldap://10.10.10.10 \
-b "DC=corp,DC=local" \
-s base

Si el servidor permite consultas anónimas, puede devolver información sobre el directorio.

Por ejemplo:

dn: DC=corp,DC=local
objectClass: top
objectClass: domain
dc: corp

En una configuración segura, el acceso anónimo debería estar restringido según las necesidades del entorno.


17. Autenticación LDAP

Si necesitamos autenticarnos, podemos proporcionar un DN:

ldapsearch -x \
-H ldap://10.10.10.10 \
-D "alice@corp.local" \
-W \
-b "DC=corp,DC=local"

-W hace que LDAP solicite la contraseña.

También podemos utilizar el DN completo:

ldapsearch -x \
-H ldap://10.10.10.10 \
-D "CN=Alice,OU=IT,DC=corp,DC=local" \
-W \
-b "DC=corp,DC=local"

18. LDAP sobre TLS

LDAP sin cifrado utiliza normalmente:

ldap://

Mientras que LDAP protegido utiliza:

ldaps://

Podemos probar una conexión LDAPS:

ldapsearch -x \
-H ldaps://10.10.10.10 \
-b "DC=corp,DC=local"

También existe StartTLS:

ldapsearch -x \
-H ldap://10.10.10.10 \
-Z \
-b "DC=corp,DC=local"

En entornos reales es importante verificar correctamente los certificados y evitar transmitir credenciales mediante canales sin protección.


19. Buscar configuraciones potencialmente interesantes

Durante una auditoría podemos buscar determinados atributos.

Por ejemplo:

ldapsearch -x \
-H ldap://10.10.10.10 \
-b "DC=corp,DC=local" \
"(objectClass=user)" \
sAMAccountName userAccountControl

userAccountControl contiene diferentes flags relacionados con la configuración de la cuenta.

También podemos consultar:

ldapsearch -x \
-H ldap://10.10.10.10 \
-b "DC=corp,DC=local" \
"(objectClass=user)" \
pwdLastSet accountExpires

Estos datos pueden ayudar a identificar cuentas antiguas, configuraciones particulares o cuentas que requieren revisión.


20. Enumeración con NetExec

Además de ldapsearch, herramientas especializadas en Active Directory pueden facilitar la enumeración.

Por ejemplo:

nxc ldap 10.10.10.10

Con credenciales:

nxc ldap 10.10.10.10 \
-u alice \
-p 'Password'

Podemos consultar información del dominio:

nxc ldap 10.10.10.10 \
-u alice \
-p 'Password' \
--users

La sintaxis disponible puede variar según la versión de NetExec, por lo que conviene consultar:

nxc ldap --help

21. LDAP y Kerberos

LDAP y Kerberos trabajan conjuntamente dentro de Active Directory.

Una situación simplificada sería:

             Active Directory
                    │
          ┌─────────┴─────────┐
          │                   │
        LDAP                Kerberos
          │                   │
          ▼                   ▼
    Consultar AD        Autenticación
          │                   │
          └─────────┬─────────┘
                    ▼
             Domain Controller

LDAP puede permitirnos descubrir:

Usuarios
Grupos
Computadoras
SPNs
OU
Información del dominio

Mientras que Kerberos se vuelve especialmente importante para comprender técnicas como:

Kerberoasting
AS-REP Roasting
Pass-the-Ticket
Golden Ticket
Silver Ticket

Estos temas pueden tratarse en artículos separados.


22. LDAP en una auditoría de Active Directory

Un flujo básico podría ser:

          Descubrimiento
                │
                ▼
        Puerto 389 / 636
                │
                ▼
       ¿LDAP accesible?
                │
                ▼
      ¿Permite anonymous?
             /     \
           Sí       No
           │         │
           ▼         ▼
      Enumerar    Autenticarse
           │         │
           └────┬────┘
                ▼
          Enumerar AD
                │
       ┌────────┼────────┐
       ▼        ▼        ▼
    Usuarios  Grupos  Equipos
                │
                ▼
        Analizar permisos
                │
                ▼
       Identificar riesgos

La finalidad no es simplemente obtener una lista de usuarios, sino comprender cómo está estructurado el dominio y detectar configuraciones que puedan representar un riesgo.


23. Ejemplo de laboratorio

Supongamos que tenemos un Domain Controller:

IP:     10.10.10.10
Domain: corp.local
Base:   DC=corp,DC=local

Primero comprobamos LDAP:

nmap -p 389,636 10.10.10.10

Después probamos una consulta básica:

ldapsearch -x \
-H ldap://10.10.10.10 \
-b "DC=corp,DC=local" \
-s base

Buscamos usuarios:

ldapsearch -x \
-H ldap://10.10.10.10 \
-b "DC=corp,DC=local" \
"(objectClass=user)" \
sAMAccountName

Buscamos grupos:

ldapsearch -x \
-H ldap://10.10.10.10 \
-b "DC=corp,DC=local" \
"(objectClass=group)" \
cn

Buscamos computadoras:

ldapsearch -x \
-H ldap://10.10.10.10 \
-b "DC=corp,DC=local" \
"(objectClass=computer)" \
dNSHostName

Finalmente podemos utilizar las credenciales de un usuario autorizado:

ldapsearch -x \
-H ldap://10.10.10.10 \
-D "alice@corp.local" \
-W \
-b "DC=corp,DC=local" \
"(objectClass=user)" \
sAMAccountName

24. ¿Qué información podemos obtener?

Dependiendo de los permisos y configuración del servidor:

Usuarios
├── Nombre
├── Username
├── Email
├── Grupos
├── Estado de cuenta
└── Fechas relacionadas con la cuenta

Grupos
├── Nombre
├── Miembros
└── Relaciones

Computadoras
├── Hostname
├── Sistema
├── Dominio
└── Organización

Dominio
├── Base DN
├── OUs
├── Domain Controllers
└── Estructura del directorio

Esta información puede ser utilizada para construir un mapa del entorno de Active Directory.


25. Errores comunes

Confundir LDAP con Active Directory

LDAP es un protocolo.

Active Directory es un servicio de directorio de Microsoft que utiliza LDAP, entre otros protocolos.


Confundir LDAP con Kerberos

LDAP:

Consultas y operaciones sobre el directorio

Kerberos:

Autenticación basada en tickets

Ambos son importantes en Active Directory, pero cumplen funciones diferentes.


Asumir que LDAP anónimo significa compromiso

Encontrar LDAP anónimo no significa automáticamente que el dominio esté comprometido.

Lo importante es determinar:

¿Qué información está expuesta?
¿Quién puede acceder?
¿Qué operaciones están permitidas?
¿Puede modificarse información?

26. Cheat Sheet

Detectar LDAP

nmap -p 389,636 10.10.10.10

Consulta básica

ldapsearch -x \
-H ldap://10.10.10.10 \
-b "DC=corp,DC=local"

Buscar usuarios

ldapsearch -x \
-H ldap://10.10.10.10 \
-b "DC=corp,DC=local" \
"(objectClass=user)"

Buscar grupos

ldapsearch -x \
-H ldap://10.10.10.10 \
-b "DC=corp,DC=local" \
"(objectClass=group)"

Buscar computadoras

ldapsearch -x \
-H ldap://10.10.10.10 \
-b "DC=corp,DC=local" \
"(objectClass=computer)"

Buscar usuario específico

ldapsearch -x \
-H ldap://10.10.10.10 \
-b "DC=corp,DC=local" \
"(sAMAccountName=alice)"

Autenticarse

ldapsearch -x \
-H ldap://10.10.10.10 \
-D "alice@corp.local" \
-W \
-b "DC=corp,DC=local"

LDAPS

ldapsearch -x \
-H ldaps://10.10.10.10 \
-b "DC=corp,DC=local"

NetExec

nxc ldap 10.10.10.10

27. Conclusión

LDAP es una pieza fundamental de Active Directory y, desde el punto de vista de un pentester, constituye una de las principales fuentes de información durante la fase de reconocimiento y enumeración.

Comprender conceptos como:

LDAP
DN
Base DN
OU
CN
Attributes
Filters
LDAP queries
Anonymous Bind
Authenticated Bind
LDAPS

permite interpretar correctamente la estructura de un dominio.

Una vez dominada la enumeración LDAP, el siguiente paso natural es estudiar cómo esta información se relaciona con otros componentes de Active Directory, especialmente Kerberos, SMB, ACLs y BloodHound.

El objetivo de un pentest no es simplemente ejecutar comandos, sino entender cómo cada pieza de información puede revelar relaciones y configuraciones que aumentan o reducen la seguridad del dominio.