# Puerto 389: LDAP

**LDAP (Lightweight Directory Access Protocol)** es un protocolo de aplicación que se utiliza para acceder y gestionar servicios de directorio de manera centralizada. Los directorios LDAP se utilizan comúnmente para almacenar información sobre usuarios, grupos, dispositivos y otros objetos en una red. LDAP generalmente opera sobre el puerto 389 para comunicaciones no cifradas y sobre el puerto 636 para comunicaciones cifradas mediante SSL/TLS (LDAPS).

## <mark style="color:green;">Descripción de LDAP</mark>

* <mark style="color:green;">**Protocolo**</mark><mark style="color:green;">:</mark> LDAP es un protocolo basado en TCP/IP que proporciona un método estándar para acceder y gestionar directorios distribuidos.
* <mark style="color:green;">**Puerto**</mark><mark style="color:green;">:</mark> El puerto 389 es el puerto estándar para LDAP en comunicaciones no cifradas.
* <mark style="color:green;">**Funcionalidad**</mark><mark style="color:green;">:</mark> LDAP permite realizar operaciones como la búsqueda, modificación y eliminación de entradas en un directorio. Es esencial para la autenticación y autorización en muchas aplicaciones empresariales y servicios de red.
* <mark style="color:green;">**Autenticación y Cifrado**</mark><mark style="color:green;">:</mark> Aunque LDAP sobre el puerto 389 no utiliza cifrado por defecto, puede configurarse para usar STARTTLS para asegurar las comunicaciones. Para conexiones seguras, se utiliza LDAPS sobre el puerto 636.

## <mark style="color:green;">Relevancia en Pentesting</mark>

### <mark style="color:green;">**Importancia de LDAP en Pentesting**</mark><mark style="color:green;">:</mark>

* <mark style="color:green;">**Enumeración de Usuarios y Grupos**</mark><mark style="color:green;">:</mark> Los pentesters utilizan LDAP para enumerar usuarios, grupos y otros objetos en el directorio, lo que puede proporcionar información crítica para la fase de reconocimiento.
* <mark style="color:green;">**Autenticación y Autorización**</mark><mark style="color:green;">:</mark> LDAP es a menudo una pieza central en la infraestructura de autenticación de una organización, y las debilidades en su configuración pueden permitir el acceso no autorizado.
* <mark style="color:green;">**Configuraciones Inseguras**</mark><mark style="color:green;">:</mark> La falta de cifrado y configuraciones de acceso inapropiadas pueden exponer información sensible. Los pentesters buscan configuraciones de enlace anónimo y otras configuraciones inseguras que puedan ser explotadas.

## <mark style="color:green;">Ejemplo de Escaneo de LDAP con Nmap</mark>

Para identificar servidores LDAP activos y recopilar información adicional sobre los servicios LDAP, se puede utilizar Nmap con scripts NSE específicos.

### <mark style="color:green;">**Comando Nmap**</mark>

```bash
nmap -p 389 --script ldap-rootdse,ldap-search,ldap-novell-getpass target-ip
```

### <mark style="color:green;">**Explicación del Comando**</mark>

* `nmap`: Ejecuta el comando Nmap.
* `-p 389`: Especifica que Nmap debe escanear el puerto 389, el puerto predeterminado para LDAP.
* `--script ldap-rootdse,ldap-search,ldap-novell-getpass`: Utiliza scripts NSE para detectar configuraciones y vulnerabilidades en el servicio LDAP.
  * `ldap-rootdse`: Recupera información del Root DSE (DSA-Specific Entry), que proporciona detalles sobre el servidor LDAP.
  * `ldap-search`: Realiza búsquedas LDAP en el servidor.
  * `ldap-novell-getpass`: Intenta recuperar contraseñas de usuarios en servidores Novell LDAP.
* `target-ip`: Especifica la dirección IP del objetivo.

## <mark style="color:green;">**Ejemplo de Salida de Nmap**</mark>

```plaintext
Starting Nmap 7.80 ( https://nmap.org ) at 2024-05-18 22:30 UTC
Nmap scan report for 192.168.1.200
Host is up (0.0021s latency).

PORT    STATE SERVICE
389/tcp open  ldap
| ldap-rootdse: 
|   LDAP Responses: 
|     currentTime: 20240518223000Z
|     subschemaSubentry: cn=Subschema
|     dsServiceName: cn=Directory Service,cn=Windows NT,c=US
|     namingContexts: DC=example,DC=com
|     defaultNamingContext: DC=example,DC=com
|     schemaNamingContext: CN=Schema,CN=Configuration,DC=example,DC=com
|     configurationNamingContext: CN=Configuration,DC=example,DC=com
|     rootDomainNamingContext: DC=example,DC=com
|     supportedLDAPVersion: 3
|     supportedLDAPVersion: 2
|     supportedControl: 1.2.840.113556.1.4.319
|     supportedControl: 1.2.840.113556.1.4.801
|_    supportedExtension: 1.3.6.1.4.1.1466.20037
| ldap-search:
|   Context: DC=example,DC=com
|     dn: DC=example,DC=com
|       dc: example
|       objectClass: top
|       objectClass: domain
|       distinguishedName: DC=example,DC=com
|     dn: CN=Users,DC=example,DC=com
|       cn: Users
|       objectClass: top
|       objectClass: container
|       distinguishedName: CN=Users,DC=example,DC=com
|     dn: CN=John Doe,CN=Users,DC=example,DC=com
|       cn: John Doe
|       sn: Doe
|       givenName: John
|       objectClass: top
|       objectClass: person
|       objectClass: organizationalPerson
|       objectClass: user
|       distinguishedName: CN=John Doe,CN=Users,DC=example,DC=com
| ldap-novell-getpass: 
|   Account 'admin' has password 'password123' (plaintext)
|_  Accounts found: 1

Nmap done: 1 IP address (1 host up) scanned in 10.23 seconds
```

## <mark style="color:green;">Interpretación de la Salida</mark>

* <mark style="color:green;">**Host is up**</mark><mark style="color:green;">:</mark> Indica que el sistema objetivo está en línea y responde.
* <mark style="color:green;">**389/tcp open ldap**</mark><mark style="color:green;">:</mark> El puerto 389 está abierto y el servicio LDAP está activo.
* <mark style="color:green;">**ldap-rootdse**</mark><mark style="color:green;">:</mark> Recupera información del Root DSE, que proporciona detalles sobre la configuración del servidor LDAP.
  * <mark style="color:green;">**currentTime**</mark><mark style="color:green;">:</mark> Hora actual del servidor LDAP.
  * <mark style="color:green;">**namingContexts**</mark><mark style="color:green;">:</mark> Contextos de nombres disponibles en el servidor (e.g., `DC=example,DC=com`).
  * <mark style="color:green;">**supportedLDAPVersion**</mark><mark style="color:green;">:</mark> Versiones de LDAP soportadas (v2 y v3).
* <mark style="color:green;">**ldap-search**</mark><mark style="color:green;">:</mark> Realiza una búsqueda LDAP en el contexto `DC=example,DC=com`.
  * <mark style="color:green;">**dn: DC=example,DC=com**</mark><mark style="color:green;">:</mark> Entrada de directorio para el dominio `example.com`.
  * <mark style="color:green;">**dn: CN=Users,DC=example,DC=com**</mark><mark style="color:green;">:</mark> Contenedor de usuarios.
  * <mark style="color:green;">**dn: CN=John Doe,CN=Users,DC=example,DC=com**</mark><mark style="color:green;">:</mark> Entrada de usuario para `John Doe`.
* <mark style="color:green;">**ldap-novell-getpass**</mark><mark style="color:green;">:</mark> Intenta recuperar contraseñas de usuarios en servidores Novell LDAP.
  * <mark style="color:green;">**Account 'admin' has password 'password123' (plaintext)**</mark><mark style="color:green;">:</mark> Indica que la cuenta `admin` tiene la contraseña `password123` en texto plano.
