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!
(&(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!
Muy buena la entrada.
ResponderEliminarSaludos!
Holap, sigo tu blog desde hace unos meses y me gustaria contactar contigo por email para proponerte una cosa, tienes algun email de contacto?
ResponderEliminarSiempre 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
"Sin filtrar los asteristos"
ResponderEliminarChemaaaa, filtra las palabras!!! jaja.
Buenas, oye estoy leyendo esto en la Wikipia -Varible _NSAKEY_
ResponderEliminarY no me gusta lo que leo. Volvemos al misterio de las puertas traseras!?
Que coño es esto, alguen lo sabe??
Gracias un saludo.
@n0p, encontrar mi mail es fácil... usando la imaginación.... ;)
ResponderEliminar@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.
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.
ResponderEliminarEn todo caso este informe sigue siendo desalentador... Microsoft. la NSA y tu (usuario)
Y de todas formas el nombre de la variable, joder!!
goviernos -> gobiernos
ResponderEliminarDesde greenpeace solicitamos la liberacion de "LA FOCA".
ResponderEliminarConspirania, muy divertido :)
ResponderEliminarYa 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. ;)
¿Quereis oir una cospiracion que puede ser cierto o no?,
ResponderEliminarGoogle 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.
Mi post van dedicado pa tos los cosnpiratoios
ResponderEliminar@Jandro: Cuánta razón tienes, todo el mundo sabe que la publicidad no da un duro :D
ResponderEliminar@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?).
ResponderEliminarAdemas: 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.
¿Para cuando una entrada que explique cómo protegernos de estos peligros en vez de enseñarnos a atacar las vulnerabilidades?
ResponderEliminar@Jandro::
ResponderEliminarOk, ok el caso es que...
M$ pierde 500 millores de dolares en la red
maligno, no seas cruel, que estoy de examenes xD
ResponderEliminar