jueves, enero 22, 2009

Or uno igual a uno ... en LDAP

Vamos a suponer que tenemos una aplicación Web que autentica contra un árbol LDAP. Para ello la aplicación realiza el proceso de BIND contra el servidor LDAP con un usuario y luego realiza búsquedas de objetos usuario que cuyo identificador y cuya contraseña correspondan con los introducidos en el formulario con una consulta mal construida y sin filtrar del tipo:

(&(uid=valor_usuario)(webpassword=valor_password))

¿Cómo conseguir acceso con un usuario sin saber la password?

Microsoft ADAM, OpenLDAP, SUN, etc...

En este servidor no se pueden generar dos filtros en la inyección así que, hay que conseguir que la inyección genere un único filtro. Para ello habría que introducir algo como:

Valor_usuario = admin)(!(&(|
Valor password = any))

El resultado tras esta inyección sería:

(&(uid= admin)(!(&(|)(webpassword= any))))

Este filtro es equivalente a recibir objetos con atributo uid=admin AND TRUE. Es decir, sólo se comprobará que el nombre del usuario sea Admin. Esta forma exige, como restricción, que los dos campos sean inyectables. Para entender bien lo que realiza esta inyección hay que tener en cuenta que en LDAP (|) es equivalente a Absolute FALSE y (&) es equivalente a Absolute TRUE según la RFC 4526

OpenLDAP y SUN

Este servidor, si recibe más de un filtro ejecuta sólo el primero, así que basta con construir con la inyección un filtro LDAP completo que se ejecute bien. Sin embargo, si existe comprobación sintáctica de filtros es recomendable que haya dos filtros correctamente construidos en lugar de uno “y algo”

Valor_usuario = admin))(|(|
Valor password = any

El resultado tras la inyección sería:

(&(uid= admin))(|(|)(webpassword= any))

Estos son dos filtros y OpenLDAP sólo ejecutará el primero. La ventaja es que basta con que el primer campo sea inyectable.

IPWorksASP.LDAP

Con este componente cliente, que se utiliza en las aplicacioens web, se desprecia todo carácter encontrado después del primer filtro LDAP bien construido, así que da igual si está o no bien cerrado el resto del LDAP Search filter.

Valor_usuario = admin)
Valor password = any

El resultado tras la inyección sería:

(&(uid= admin))(webpassword= any))

Sólo se ejecuta (&(uid=admin)), así que valdría esa inyección perfectamente.

Sin filtrar los asteriscos

Si diera la casualidad de que los * no estuvieran filtrados la cosa se simplifica mucho más, tanto como poner un * en la password o en el usuario, o en ambos para cambiar el acceso. Si se pudiera poner en la password, pues no es necesario inyectar, se pone el usuario y la password.

Si el asterísco se puede poner en el campo usuario pero no en el campo password sólo habría que sustituir "admin" en las inyecciones por "*".

Todo esto se basa en lo expuesto en el artículo Jugando con LDAP en el que se analizaba el comportamiendo de los servidores LDAP ante diferentes inyecciones. Y, si quieres practicar más puedes probar con el Reto Hacking IV.

Saludos Malignos!

16 comentarios:

  1. Muy buena la entrada.
    Saludos!

    ResponderEliminar
  2. Holap, sigo tu blog desde hace unos meses y me gustaria contactar contigo por email para proponerte una cosa, tienes algun email de contacto?

    Siempre puedes contactar conmigo dejando un comentario en mi blog, que al estar moderado, me llega directamente al correo.

    No te preocupes, no voy a pedirte que me saques la clave de mesenller de nadie xD

    Un saludo

    ResponderEliminar
  3. "Sin filtrar los asteristos"

    Chemaaaa, filtra las palabras!!! jaja.

    ResponderEliminar
  4. Buenas, oye estoy leyendo esto en la Wikipia -Varible _NSAKEY_

    Y no me gusta lo que leo. Volvemos al misterio de las puertas traseras!?

    Que coño es esto, alguen lo sabe??

    Gracias un saludo.

    ResponderEliminar
  5. @n0p, encontrar mi mail es fácil... usando la imaginación.... ;)

    @Asfafos, fixed.

    @eldelotrolado, la teoría de la conspiranoia...igual que si el bug de Debian SSL fue introducido por alguien del gobierno para poder sniffar el tráfico.... El código está auditado por los paises.

    ResponderEliminar
  6. Pos' a mi estas cosas no me gustan nada. Y lo que esta claro es que a los goviernos bien que les gustaria entrar en nuestros pc's, dado que fichar ya nos tienen fichados a traves de la red.

    En todo caso este informe sigue siendo desalentador... Microsoft. la NSA y tu (usuario)

    Y de todas formas el nombre de la variable, joder!!

    ResponderEliminar
  7. goviernos -> gobiernos

    ResponderEliminar
  8. Desde greenpeace solicitamos la liberacion de "LA FOCA".

    ResponderEliminar
  9. Conspirania, muy divertido :)

    Ya te he oído más de una vez decir que el código fuente lo tienen los gobiernos, y que en concreto el Español lo tiene.

    Vale. ¿Y?

    He oído decir muchas veces que el código fuente GPL y demases es más seguro porque todo el mundo lo puede auditar, ver, etc...

    Pues yo juraría que has usado alguna vez el chascarrillo de: ¿más seguro? ¿Y cómo los de Debian pasaron 2 años y nadie lo vió? No... la ingeniería se hace con unos controles...blablabla...y se paró 2 meses de producir una línea de código...blablabla... así es como funciona Microsoft, con mucho control y...

    Oye, que estos son funcionarios. ;)

    ResponderEliminar
  10. ¿Quereis oir una cospiracion que puede ser cierto o no?,

    Google si es posible que incluso sea la NSA. ¿Alguien a visto su codigo?. Si nadie lo ha visto, ¿porque utilizamos su mail y su buscador? aaa, pero es que el papa google es bueno y todo lo hace bien.

    ¿De donde le viene la pasta a google? ¿De unos simples anuncios?, aaa no, pero es que como nos lo da gratis pues nadie se queja.

    ResponderEliminar
  11. Mi post van dedicado pa tos los cosnpiratoios

    ResponderEliminar
  12. @Jandro: Cuánta razón tienes, todo el mundo sabe que la publicidad no da un duro :D

    ResponderEliminar
  13. @tayoken: Que se lo digan a las cadenas de television que cada vez estan metiendo mas minutos de publicidad, o equipos que cada vez se les esta llendo mas patrocinadores, Google ha rechazado estar tambien en la prensa escrita y segun las noticias ha despedido o va a despedir a tropecientas personas (acaso no era una empresa guay?).

    Ademas: cuando google pone: "Pague únicamente por los resultados

    Sólo pagará si alguien hace clic en su anuncio, no cada vez que este aparezca." y despues cuando le das a mas informacion te pone esto otro: "Coste mínimo por cada mil impresiones (CPM): €0,20 Ayuda" nose, me hace dudar de que sea una empresa guay.

    ResponderEliminar
  14. ¿Para cuando una entrada que explique cómo protegernos de estos peligros en vez de enseñarnos a atacar las vulnerabilidades?

    ResponderEliminar
  15. maligno, no seas cruel, que estoy de examenes xD

    ResponderEliminar