Hace ya casi un año que escribí este post. Existen diferentes motivos por los que no lo publiqué antes pero ahí está tal cual lo escribí:
Durante esta semana he estado participando en el reto hacking Infiltrados organizado por informatica64. Se trata de un reto un tanto atípico ya que las pruebas son client-side, por lo que para superar las diferentes pruebas tienes que esperar a que un administrador las revise y apruebe, en caso de ser correctas.
Durante esta semana he estado participando en el reto hacking Infiltrados organizado por informatica64. Se trata de un reto un tanto atípico ya que las pruebas son client-side, por lo que para superar las diferentes pruebas tienes que esperar a que un administrador las revise y apruebe, en caso de ser correctas.
Además, al estilo browser school del año pasado, cada administrador utilizará un navegador diferente para revisar las incidencias. Esto nos obliga a pelearnos con las diferentes opciones de seguridad que tiene cada uno de los tres navegadores involucrados Internet Explorer, Chrome y Firefox. Así que voy a ir describiendo el proceso que seguí en cada navegador.
Lo primero de todo, antes de meternos con los navegadores, fue descubrir la página vulnerable a la inyección. Esto resultó sencillo y en unos segundos estaba claro que estaba aquí:
http://rhinfiltrados.informatica64.com/inicioReto.aspx?idUsuario=<ID>
Y todo lo que pusiéramos a partir de idUsuario= acabaría reflejándose en la página web, permitiéndonos de este modo ejecutar javascript, o cualquier otra cosa.
Firefox
El primer navegador que utilicé fue el de Mozilla principalmente porque al saber que carece de filtro XSS pensé que sería el más sencillo.
Lo primero que se me ocurrió fue intentar robar la cookie de sesión del administrador pero tras consultar múltiples fuentes por el mundo de internet llegué a la conclusión de que, al ser la cookie httpOnly, no iba a haber manera de atacar por ahí, por lo menos en navegadores modernos.
El siguiente paso fue analizar un poco más en profundidad que hacía el formulario de envío. En este existía un campo oculto que enviaba el ID del usuario. Este campo no se modificaba al cambiar la URL por lo que parecía que la clave estaba en conseguir, mediante javascript, modificar este valor y hacer un submit del formulario. Así que nada, me puse manos a la obra con ello y acabé con el siguiente código, poco elegante y muy "de prueba" pero aun así decidí mandarlo.
//esto va donde hemos dicho antes que estaba la inyección
El único problema que tenía esto es que cada segundo hacia el submit, pero aún así decidí mandarlo... y funciono!
Chrome
Aquí ya vinieron los problemas con el maldito filtro XSS, estuve buscando un rato como saltarlo pero no encontré nada útil, así que imaginé que debía de existir algún modo "sencillo".
La pregunta en este momento fue ¿Como lo hago en html? así que tras pensar un ratillo decidí que podía crear otro formulario con los mismos datos, y poner la imagen encima. El código resultante fue este
El resultado no era perfecto, y se notaba que había dos imágenes sobre todo cuando se cambiaba la resolución y eso. Así que decidí poner un mensaje en la incidencia en plan usuario despistado a ver si colaba.
Hola, tengo un problema con esta web http://bit.ly/... me salen más imágenes de las que deberían y al darle a la de Chrome hace cosas raras. Puedes ver que pasa? Gracias.
Total que al final también funcionó así que fui a por IE.
Internet Explorer
Había varios motivos por los que decidí ponerme con Internet Explorer el último de todos los navegadores. El primero de ellos es que tiene el mejor filtro Anti-XSS de los tres. Otro de los grandes motivos fue que no tenía, ni iba a tener, acceso a ninguna máquina con IE 9 por lo que en ningún momento pensé que fuera a resolverlo, pero como era el último pues intenté hacer las pruebas con IE8.
En primer lugar probé con el mismo sistema que en Chrome pero el filtro modificaba las etiquetas form e img por lo que no parecía que fuera a funcionar de ningún modo. Pero como no se me ocurría ninguna otra idea me puse a simplificar el ataque de Chrome todo lo posible, así que quite la parte del formulario y dejé solo la imagen y el id oculto. El comportamiento era extraño porque en primer lugar no cargaba la imagen, si no que mostraba una x roja, pero si se pinchaba en ella parece que al llamarse a si misma entonces si que cargaba la imagen y funcionaba correctamente. El problema venía de que esto es un comportamiento demasiado extraño, pero bueno les escribí un mensaje en la incidencia a ver que pasaba:
Hola, no se que le pasa a vuestra página http://bit.ly/... pero aparece una X cerca de la puerta de IE, si le das ya funciona bien, bueno aparecen dos imagenes pero no se porque, ¿puedes mirarlo? Muchas gracias
Total que casi cuela, pero no coló. Aunque el administrador si que me respondió diciendo que estaba cerca pero que IE le informaba de la presencia de un script.
En ese momento se me ocurrió pasar completamente de la imagen y meter solo el id oculto, porque, ¿Qué pasará con el servidor cuando reciba dos campos iguales? Pues parece que el servidor coge uno de ellos, probablemente el primero que le llega, que en este caso era el mío. Así que conseguido!. El script quedaría así:
En ese momento se me ocurrió pasar completamente de la imagen y meter solo el id oculto, porque, ¿Qué pasará con el servidor cuando reciba dos campos iguales? Pues parece que el servidor coge uno de ellos, probablemente el primero que le llega, que en este caso era el mío. Así que conseguido!. El script quedaría así:
Y bueno de este modo quedan resueltos los tres problemas y tenemos acceso a la fase 2. Pero sobre eso ya escribiré otro día.
Sí que me gustaría destacar que fue un reto muy interesante ya que es de los pocos donde tenemos la oportunidad de probar los ataques client-side. Y comentar que después de este concurso aquella conferencia que dió Raúl Siles en la RootedCon donde propuso el cambio de nombre de XSS a WCI (Web Content Injection) cobra mucho sentido, ya que como hemos visto en los ataques a Chrome e IE, ni hay cross-domain, ni hay javascript, sino simplemente etiquetas html.