Reflected File Download with JSON Command Injection
Desde ayer que vi en Segu-Info la técnica de Reflected File Download publicada presentada en Black Hat Europe 2014 he estado jugando con ella. La verdad es que me parece un truco genial para ataques a clientes utilizando una inyección de comandos reflejada, en este caso, en las respuestas de un JSON o JSONP.
Figura 1: Reflected File Download presentada en BH EU 2014 |
Descripción del bug
La idea del bug inicialmente es sencilla, se pueden inyectar comandos en una URL que van a ser inyectados en una respuesta dada a través de un fichero JSON o JSONP. En ese entorno tendríamos ya inyectados los comandos en el cliente, conseguir la ejecución es otro truco añadido que os paso a contar cómo se hace.
El lugar donde se quieren ejecutar los comandos es en el propio sistema operativo, no en el navegador, para lo que es necesario que ese JSON inyectado salte del navegador al sistema operativo para lo que el investigador y descubridor de esta técnica se aprovecha de Content-Type especiales que fuerzan descargas directas de archivos.
Por ejemplo, si desde Google Chrome haces clic en un enlace a una URL con extensión .bat y el Content-Type lo cataloga como un attachment, entonces el fichero pasa automáticamente a ser descargado al sistema operativo. Esto sucede en muchos tipos de extensiones y en casi todos los navegadores.
El último paso es sencillo - o no - y es conseguir la ejecución del fichero BAT dentro del sistema operativo. Digo que esto es sencillo o no, porque realmente depende del sitio que sea vulnerable y en qué contexto de seguridad tenga catalogado el navegador ese sitio. Si lo tiene en un lugar de confianza, entonces lo ejecutará automáticamente.
Resumiendo, si tienes un fichero .BAT que se genera a partir de parámetros que puedes inyectar en un fichero JSON y que se encuentra en una ubicación de confianza, entonces puedes hacer este ataque de Reflected File Download.
¿Qué podría ser inyectar?
El truco es que cuando se ejecuta el fichero BAT se aprovecha del operador OR, escrito || en el interfaz de comandos Windows. Si pones el comando "mierda||calc.exe" resulta que el primer comando da FALSE así que se ejecuta el segundo, y como resultado tienes la calculadora.
Si por el contrario ejecutas "calc.exe||mierda" resulta que tienes la calculadora sin que se intente siquiera ejecutar el segundo comando.
Figura 3: Ejecución del segundo comando porque el primero da FALSE |
Si por el contrario ejecutas "calc.exe||mierda" resulta que tienes la calculadora sin que se intente siquiera ejecutar el segundo comando.
Figura 4: Ejecución de Calc.exe porque la primera parte del JSON da FALSE |
En el caso de que se lance la ejecución de un JSON con comandos inyectados directamente en el fichero, algo como lo siguiente, al usar el operador || hace que se ejecute el segundo comando gracias a que el primero ha fallado.
Lo mismo en el caso de un exploit completo con varios OR por medio. Este es un exploit complejo utilizando esta técnica para arrancar Google Chrome sin protección alguna.
Conclusiones
La técnica es muy curiosa y efectiva, en ataques a JSON y JSONP que habitualmente se quedan fuera de muchas auditorías. Ya con el ataque Rosetta se hacía abuso de este tipo de inyecciones, en este caso para generar ficheros SWF maliciosos y hacer un Cross-Site SWF Injection que se saltara todas las protecciones. Estos bugs de RFD para conseguir ejecución en el sistema en un entorno de Intranet tienen mucho peligro, ya que el contexto seguro que es alto en todos ellos.
Saludos Malignos!
1 comentario:
Voy a practicarlo un poco :-). Muy buen post!
Publicar un comentario