Attacking LDAP
LDAP
(Lightweight Directory Access Protocol) es un protocolo usado para acceder y gestionar información de directorios. Un directory
es un almacén de datos jerárquico que contiene información sobre recursos de red como users
, groups
, computers
, printers
y otros dispositivos. LDAP proporciona algunas funcionalidades excelentes:
Funcionalidad | Descripción |
---|---|
Efficient |
Consultas y conexiones a servicios de directorio rápidas y eficientes, gracias a su lenguaje de consulta simple y almacenamiento de datos no normalizado. |
Global naming model |
Soporta múltiples directorios independientes con un modelo de nombres global que asegura entradas únicas. |
Extensible and flexible |
Esto ayuda a satisfacer requisitos futuros y locales permitiendo atributos y esquemas personalizados. |
Compatibility |
Es compatible con muchos productos de software y plataformas ya que opera sobre TCP/IP y SSL directamente, y es platform-independent , adecuado para uso en entornos heterogéneos con diversos sistemas operativos. |
Authentication |
Provee mecanismos de authentication que permiten a los users iniciar sesión una vez y acceder a múltiples recursos en el server de manera segura. |
Sin embargo, también enfrenta algunos problemas significativos:
Funcionalidad | Descripción |
---|---|
Compliance |
Los directory servers deben ser LDAP compliant para que el servicio se pueda desplegar, lo que puede limitar la elección de proveedores y productos. |
Complexity |
Difícil de usar y entender para muchos desarrolladores y administradores, que pueden no saber cómo configurar correctamente los LDAP clients o usarlo de manera segura. |
Encryption |
LDAP no encripta su tráfico por defecto, lo que expone datos sensibles a posibles interceptaciones y manipulaciones. LDAPS (LDAP sobre SSL) o StartTLS deben usarse para habilitar la encriptación. |
Injection |
Vulnerable a ataques de LDAP injection , donde users malintencionados pueden manipular consultas LDAP y obtener unauthorised access a datos o recursos. Para prevenir tales ataques, se debe implementar la validación de entrada y codificación de salida. |
LDAP es comúnmente usado para proporcionar una ubicación central para accessing
y managing
directory services
. Directory services
son colecciones de información sobre la organización, sus users
, y activos como usernames y passwords. LDAP permite a las organizaciones almacenar, gestionar y asegurar esta información de manera estandarizada. Aquí están algunos casos de uso comunes:
Caso de Uso | Descripción |
---|---|
Authentication |
LDAP se puede usar para central authentication , permitiendo a los users tener credenciales de inicio de sesión únicas a través de múltiples aplicaciones y sistemas. Este es uno de los casos de uso más comunes para LDAP. |
Authorisation |
LDAP puede manage permissions y access control para recursos de red como carpetas o archivos en una red compartida. Sin embargo, esto puede requerir configuración adicional o integración con protocolos como Kerberos. |
Directory Services |
LDAP proporciona una manera de search , retrieve , y modify data almacenados en un directory , lo que lo hace útil para gestionar grandes cantidades de users y dispositivos en una red corporativa. LDAP is based on the X.500 standard para directory services . |
Synchronisation |
LDAP se puede usar para mantener datos consistentes a través de múltiples sistemas replicando cambios realizados en un directory a otro. |
Hay dos implementaciones populares de LDAP: OpenLDAP
, un software de código abierto ampliamente utilizado y soportado, y Microsoft Active Directory
, una implementación basada en Windows que se integra sin problemas con otros productos y servicios de Microsoft.
Aunque LDAP y AD están related
, sirven diferentes propósitos. LDAP es un protocolo que especifica el método de acceso y modificación de directory services
, mientras que AD es un directory service
que almacena y gestiona datos de users
y computers
. Mientras que LDAP puede comunicarse con AD y otros directory services
, no es un directory service
en sí. AD ofrece funcionalidades adicionales como administración de políticas, single sign-on
, e integración con varios productos de Microsoft.
LDAP | Active Directory (AD) |
---|---|
Un protocolo que define cómo clients y servers se comunican entre sí para acceder y manipular datos almacenados en un directory service . |
Un directory server que utiliza LDAP como uno de sus protocolos para proporcionar authentication , authorisation , y otros servicios para redes basadas en Windows. |
Un protocolo abierto y multiplataforma que se puede usar con diferentes tipos de directory servers y aplicaciones. |
Software propietario que solo funciona con sistemas basados en Windows y requiere componentes adicionales como DNS (Domain Name System) y Kerberos para su funcionalidad. |
Tiene un esquema flexible y extensible que permite a los administradores o desarrolladores definir atributos y clases de objeto personalizados. | Tiene un esquema predefinido que sigue y extiende el estándar X.500 con clases de objeto y atributos adicionales específicos para entornos Windows. Las modificaciones deben hacerse con cautela y cuidado. |
Soporta múltiples mecanismos de authentication como simple bind, SASL, etc. |
Soporta Kerberos como su mecanismo de authentication primario pero también soporta NTLM (NT LAN Manager) y LDAP sobre SSL/TLS para compatibilidad con versiones anteriores. |
LDAP funciona utilizando una arquitectura client-server
. Un client
envía una solicitud LDAP a un server
, que busca en el directory service
y devuelve una respuesta al client
. LDAP es un protocolo más simple y eficiente que X.500, sobre el cual está basado. Utiliza un modelo client-server
, donde los clients
envían solicitudes a los servers
utilizando mensajes LDAP codificados en ASN.1 (Abstract Syntax Notation One) y transmitidos sobre TCP/IP (Transmission Control Protocol/Internet Protocol). Los servers
procesan las solicitudes y envían respuestas utilizando el mismo formato. LDAP soporta diversas solicitudes, como bind
, unbind
, search
, compare
, add
, delete
, modify
, etc.
Las solicitudes LDAP son messages
que los clients
envían a los servers
para realizar operaciones sobre datos almacenados en un directory service
. Una solicitud LDAP consta de varios componentes:
Session connection
: Elclient
se conecta alserver
a través de un puerto LDAP (generalmente 389 o 636).Request type
: Elclient
especifica la operación que desea realizar, comobind
,search
, etc.Request parameters
: Elclient
proporciona información adicional para la solicitud, como eldistinguished name
(DN) de la entrada a ser accedida o modificada, el alcance y filtro de la consulta de búsqueda, los atributos y valores a ser agregados o cambiados, etc.Request ID
: Elclient
asigna un identificador único para cada solicitud para coincidir con la respuesta correspondiente delserver
.
Una vez que el server
recibe la solicitud, la procesa y envía de vuelta un mensaje de respuesta que incluye varios componentes:
Response type
: Elserver
indica la operación que se realizó en respuesta a la solicitud.Result code
: Elserver
indica si la operación fue exitosa y por qué.Matched DN:
Si corresponde, elserver
devuelve el DN de la entrada existente más cercana que coincide con la solicitud.Referral
: Elserver
devuelve una URL de otroserver
que puede tener más información sobre la solicitud, si corresponde.Response data
: Elserver
devuelve cualquier dato adicional relacionado con la respuesta, como los atributos y valores de una entrada que fue buscada o modificada.
Después de recibir y procesar la respuesta, el client
se desconecta del puerto LDAP.
ldapsearch
Por ejemplo, ldapsearch
es una utilidad de línea de comandos utilizada para buscar información almacenada en un directory
utilizando el protocolo LDAP. Se utiliza comúnmente para consultar y recuperar datos de un directory service
LDAP.
ldapsearch -H ldap://ldap.example.com:389 -D "cn=admin,dc=example,dc=com" -w secret123 -b "ou=people,dc=example,dc=com" "(mail=john.doe@example.com)"
- Conéctate al servidor
ldap.example.com
en el puerto389
. - Realiza la autenticación como
cn=admin,dc=example,dc=com
con la contraseñasecret123
. - Busca bajo la base DN
ou=people,dc=example,dc=com
. - Usa el filtro
(mail=john.doe@example.com)
para encontrar entradas que tengan esta dirección de correo electrónico.
El servidor procesaría la solicitud y enviaría una respuesta, que podría verse algo así:
dn: uid=jdoe,ou=people,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
cn: John Doe
sn: Doe
uid: jdoe
mail: john.doe@example.com
result: 0 Success
Esta respuesta incluye el distinguished name (DN)
de la entrada que coincide con los criterios de búsqueda y sus atributos y valores.
LDAP Injection
LDAP injection
es un ataque que explota aplicaciones web que usan LDAP
(Lightweight Directory Access Protocol) para autenticación o almacenamiento de información de usuarios. El atacante puede inyectar código malicioso o caracteres en consultas LDAP para alterar el comportamiento de la aplicación, eludir medidas de seguridad y acceder a datos sensibles almacenados en el directorio LDAP.
Para probar LDAP injection
, puedes usar valores de entrada que contengan caracteres especiales u operadores que puedan cambiar el significado de la consulta:
Input | Descripción |
---|---|
* |
Un asterisco * puede coincidir con cualquier número de caracteres. |
( ) |
Los paréntesis ( ) pueden agrupar expresiones. |
\| |
Una barra vertical \| puede realizar una operación lógica OR. |
& |
Un ampersand & puede realizar una operación lógica AND. |
(cn=*) |
Valores de entrada que intentan eludir verificaciones de autenticación o autorización inyectando condiciones que siempre evalúan como verdaderas, como (cn=*) o (objectClass=*) , pueden ser usados en campos de nombre de usuario o contraseña. |
Los ataques de LDAP injection
son similares a los ataques de SQL injection
pero apuntan al servicio de directorio LDAP en lugar de una base de datos.
Por ejemplo, supongamos que una aplicación usa la siguiente consulta LDAP para autenticar usuarios:
(&(objectClass=user)(sAMAccountName=$username)(userPassword=$password))
En esta consulta, $username
y $password
contienen las credenciales de inicio de sesión del usuario. Un atacante podría inyectar el carácter *
en el campo $username
o $password
para modificar la consulta LDAP y eludir la autenticación.
Si un atacante inyecta el carácter *
en el campo $username
, la consulta LDAP coincidirá con cualquier cuenta de usuario con cualquier contraseña. Esto permitiría al atacante acceder a la aplicación con cualquier contraseña, como se muestra a continuación:
$username = "*";
$password = "dummy";
(&(objectClass=user)(sAMAccountName=$username)(userPassword=$password))
Alternativamente, si un atacante inyecta el carácter *
en el campo $password
, la consulta LDAP coincidirá con cualquier cuenta de usuario con cualquier contraseña que contenga la cadena inyectada. Esto permitiría al atacante acceder a la aplicación con cualquier nombre de usuario, como se muestra a continuación:
$username = "dummy";
$password = "*";
(&(objectClass=user)(sAMAccountName=$username)(userPassword=$password))
Los ataques de LDAP injection
pueden tener consecuencias graves, como el acceso no autorizado a información sensible, la elevación de privilegios e incluso el control total sobre la aplicación o el servidor afectado. Estos ataques también pueden afectar considerablemente la integridad y disponibilidad de los datos, ya que los atacantes pueden alterar o eliminar datos dentro del servicio de directorio, causando interrupciones en las aplicaciones y servicios que dependen de esos datos.
Para mitigar los riesgos asociados con los ataques de LDAP injection
, es crucial validar y sanitizar exhaustivamente las entradas del usuario antes de incorporarlas en consultas LDAP. Este proceso debe involucrar la eliminación de caracteres especiales específicos de LDAP, como *
, y el uso de consultas parametrizadas para asegurar que las entradas del usuario se traten únicamente como datos y no como código ejecutable.
Enumeration
La enumeración del objetivo nos ayuda a comprender los servicios y puertos expuestos. Un escaneo de servicios con nmap
es una técnica de escaneo de red utilizada para identificar y analizar los servicios que se ejecutan en un sistema o red objetivo. Al sondear puertos abiertos y evaluar las respuestas, nmap
puede deducir qué servicios están activos y sus respectivas versiones. El escaneo proporciona información valiosa sobre la infraestructura de red del objetivo, las posibles vulnerabilidades y las superficies de ataque.
nmap
nmap -p- -sC -sV --open --min-rate=1000 10.129.204.229
Starting Nmap 7.93 ( https://nmap.org ) at 2023-03-23 14:43 SAST
Nmap scan report for 10.129.204.229
Host is up (0.18s latency).
Not shown: 65533 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
|_http-server-header: Apache/2.4.41 (Ubuntu)
| http-cookie-flags:
| /:
| PHPSESSID:
|_ httponly flag not set
|_http-title: Login
389/tcp open ldap OpenLDAP 2.2.X - 2.3.X
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 149.73 seconds
nmap
detecta un servidor http
ejecutándose en el puerto 80
y un servidor ldap
ejecutándose en el puerto 389
.
Injection
Como OpenLDAP
se ejecuta en el servidor, es seguro asumir que la aplicación web que se ejecuta en el puerto 80
utiliza LDAP para la autenticación.
Intentar iniciar sesión usando un carácter comodín (*
) en los campos de nombre de usuario y contraseña permite el acceso al sistema, eludiendo efectivamente cualquier medida de autenticación que se haya implementado. Esto es un problema de seguridad significativo, ya que permite que cualquier persona con conocimiento de la vulnerabilidad obtenga acceso no autorizado al sistema y, potencialmente, a datos sensibles.