Inyecciones LDAP: Explicación y PoC

    LDAP son las siglas de Protocolo Ligero de Acceso a Directorio, o en inglés (Lightweight Directory Access Protocol). Se trata de un conjunto de protocolos de licencia abierta que son utilizados para acceder a la información que está almacenada de forma centralizada en una red. Este protocolo se utiliza a nivel de aplicación para acceder a los servicios de directorio remoto.

    Un directorio remoto es un conjunto de objetos que están organizados de forma jerárquica, tales como nombres, claves, direcciones, etc. Estos objetos estarán disponibles por una serie de cliente conectados mediante una red (interna o LAN), y proporcionarán las identidades y permisos para esos usuarios que los utilicen.

    De forma general, estos directorios se utilizan básicamente para contener información virtual de usuarios, para que otros usuarios accedan y dispongan de información acerca de los contactos que están aquí almacenados. Además es capaz de comunicarse de forma remota con otros directorios LDAP. De esta forma se crea una base de datos de información descentralizada y completamente accesible

    Las inyecciones LDAP son un tipo de ataque en el que se aprovechan las vulnerabilidades en las aplicaciones web que interactúan con un servidor LDAP. 

    La inyección LDAP funciona mediante la inserción de comandos LDAP maliciosos en los campos de entrada de una aplicación web, que luego son enviados al servidor LDAP para su procesamiento. Si la aplicación web no está diseñada adecuadamente para manejar la entrada del usuario, un atacante puede aprovechar esta debilidad para realizar operaciones no autorizadas en el servidor LDAP. y llegar a acceder a información de usuarios o recursos que no debería tener acceso, realizar cambios no autorizados en la base de datos del servidor LDAP o realizar operaciones maliciosas en la red, como lanzar ataques de phishing o instalar software malicioso en los sistemas de la red.

    Para evitar las inyecciones LDAP, las aplicaciones web que interactúan con un servidor LDAP deben validar y limpiar adecuadamente la entrada del usuario antes de enviarla al servidor LDAP. Esto incluye la validación de la sintaxis de los campos de entrada, la eliminación de caracteres especiales y la limitación de los comandos que pueden ser ejecutados en el servidor LDAP.




POC 1

    Nos encontramos ante una aplicación web, las cual nos pide un usuario y contraseña para entrar;


    Intentamos iniciar sesión con un nombre de usuario y una contraseña aleatorios, pero el resultado es negativo;


    La arquitectura de la aplicación que soporta LDAP incluye componentes tanto del lado del servidor como del lado del cliente. Las consultas LDAP enviadas al servidor se conocen como filtros de búsqueda LDAP, que se construyen utilizando notación prefijo. A continuación, se muestra un ejemplo de un filtro de búsqueda LDAP:

find("(&(cn=" + username +")(userPassword=" + pass +"))")

Esta notación de filtro prefijo instruye a la consulta a encontrar un nodo LDAP con el nombre de usuario y la contraseña dados. La cual busca entradas en el directorio LDAP que cumplan con ambas condiciones: cn (Common Name) sea igual a "algo" y userPassword (contraseña del usuario) sea igual a "algo".

    Si revisamos el codigo del aplicativo; 


    Podemos ver que el filtro se construye concatenando directamente el nombre de usuario y la contraseña en el filtro sin una adecuada sanitización. Si reemplazamos el nombre de usuario y la contraseña con un carácter especial, podemos eludir los controles de autenticación. Usar "*" como nombre de usuario y contraseña resultará en un inicio de sesión exitoso puesto que busca cualquier atributo que coincida con cualquier valor;

"(&(cn=" * ")(sn=" * "))";

    Esto altera significativamente la lógica de búsqueda y posiblemente nos permite el acceso no autorizado.



POC 2


Nuevamente  nos encontramos ante una aplicación web, las cual nos pide un usuario y contraseña para entrar;



    Revisemos el codigo de la aplicacion y vemos que es el mismo que vimos anteriormente;


    Pero el filtro el cual utilizamos para alterar la lógica esta vez no nos funciona;

"(&(cn=" * ")(sn=" * "))";



Y esto se debe a que para evitar la inyección LDAP verifica la longitud de la entrada del usuario. Si la longitud es menor a 2, la entrada del usuario es inválida.


    Pero podemos utilizar caracteres especiales distintos de "*" para crear consultas maliciosas y alterar la logica;

username = admin)(!(&(1=0 
password q))

    El filtro quedaría así;

(&(cn=admin)(!(&(1=0))(sn=q)))

    Donde en username busca resultados que sean igual a admin inviertiendo la condicion buscando donde 1=0 junto al operador NOT y en password busca entradas que sean igual a q




4 comentarios:

  1. El Pinguino de Mario25 mayo, 2024

    Pedazo de post!! Muchas gracias por compartir

    ResponderEliminar
    Respuestas
    1. Muchas gracias compañero, gracias a ti por apoyarlo ;)

      Eliminar
  2. Muy bueno compi. Gran articulo

    ResponderEliminar
    Respuestas
    1. Muchas gracias compañero, un placer tenerte por aquí ;)

      Eliminar