martes, 1 de abril de 2014

JPG File Inclusion

Buenas a tod@s!!!

Hoy vamos a ver un tipo de ataque que está enfocado en aplicaciones web.

Este tipo de ataque se le denomina JPG File Inclusion, y permite subir imágenes inyectadas con cógido a una página web saltando los filtros de protección para después poder ejecutar dicho código en el servidor remoto (donde está alojada dicha web) por medio de una inclusión a la imagen.

Bien, lo primero que se debe hacer es localizar una web que permita subir imagenes al servidor, y que dicha web trabaje con PHP, como por ejemplo los foros...

En mi caso utilizaré mi propio laboratorio como servidor web.

Las herramientas que necesitaremos son:

- Imagen con formato .jpg para subir al servidor víctima.
- edjpgcom: Programa para inyectar codigo dentro de un JPG.
- TamperData: Extensión de Firefox para ver y modificar cabeceras HTTP/HTTPS.
- Firefox.
- Servidor que permita subir imágenes JPG (Será nuestra víctima).


Lo primero que haremos será descargar edjpgcom para poder inyectar el codigo que queramos en nuestra imagen, yo utilizaré una imagen como si fuese mi foto de perfil.

Para ejecutar dicho programa tendremos que colocar nuestra imagen en la carpeta donde está ubicado el programa, después abrirmos la consola y ejecutamos la siguiente instrucción:
edjpgcom.exe "Filename.jpg"

Una vez ejecutemos dicha instrucción, se nos abrirá la siguiente ventana, que nos permitirá inyectar codigo dentro de la imagen:


Ahora debemos introducir el código que deseamos que se ejecute en el servidor víctima.
En este caso inyectaré un simple <?php phpinfo()?> que nos mostrará información sobre la configuración PHP en el servidor víctima.


Vale, ahora damos a OK y nuestra imagen contendrá dicho código en su interior.
Para eso abrimos la imagen con un editor de texto y veremos que tiene el siguiente aspecto:


Tenemos que cambiar el nombre de nuestra imagen y añadir ".php" antes de la extensión ".jpg".

Ejemplo: "Filename.php.jpg"

Una vez tenemos nuestra imagen preparada, nos vamos al servidor víctima donde esté alojado el Upload y ejecutamos la extensión TamperData para empezar a modificar las peticiones:


Subimos la imagen y modificamos la cabecera para indicarle que lo suba como perfil.php, y no como perfil.php.jpg:



Aceptamos la modificación y en la siguiente ventana damos a enviar para que envíe dicha modificación:



Ya tenemos subida nuestra imagen:





Pero esperar un segundo... ¿No hemos cambiado su extensión ".jpg" por ".php"?

Veámos que nos ha subido al servidor víctima:




Si nos hemos fijado bien, la ruta donde se ha alojado nuestro fichero es: archivos/perfil.php, así que vamos a acceder a dicha ruta para ver si se ejecuta correctamente nuestro codigo php...





Perfecto!!!

¿Qué pasaría si en vez de un simple phpinfo inyectásemos una pequeña shell? xD

Espero que les haya gustado, les dejo con un video-tutorial.






Saludos.


Referencias
http://pwnakil.blogspot.com.es/2012/09/backdorea-con-las-shell-web-mas-pequenas.html
http://websecuritydev.com/blog/creando-una-mini-shell-en-php/
http://calebbucker.blogspot.com.es/2012/07/subiendo-shell-explotando-lfi-via.html
http://antisec-security.blogspot.com.es/2012/10/vulnerabilidad-rfi-y-lfi-rfi-remote.html


 **No me hago responsable del mal uso que se de a la información presentada. Esta información es de carácter didáctico.**


4 comentarios:

  1. para mi falta explicar..., el porque pasa eso??.

    Y ademas falta decir que no hace falta usar el programa edjpgcom, ya que con el editor de texto tambien se puede hacer..

    por otro lado, no siempre funciona como dices, a vos te funciona porque falta validar extenciones en el php.

    Por ejemplo... si yo recibo lo que tu subiste, y antes de alojarlo en el servidor... compruebo la extencion, entonces tu metodo no va a funcionar y el archivo va a ser eliminado por mi codigo.

    Ademas, como dije es depende del upload, hay upload que verifican si el contenido de la imagen tiene el header de una imagen solamente, sin verificar si es una imagen realmente, por lo cual si yo en el codigo fuente de la imagen pongo el header de uan imagen jpg o gif o lo que sea, lo va a dar como valido, posteriormente pongo el codigo php a ejecutar.

    En fin, para mi falta aclarar la situacion que explicaste. Ya que hay muchas formas de bypassear un upload. Ademas para mi no es una inclusion de archivo jpg lo que hiciste..., hiciste un bypass en el upload para subir y ejecutar un php, por lo cual es un bypass de upload.

    suerte

    ResponderEliminar
  2. Hola amig@,

    lo primero, gracias por leer y comentar en el blog, siempre es un placer ver que la gente se interesa por lo que escribes.

    Tienes toda la razon, no he explicado el porqué pasa eso, lo he mostrado en los pantallazos en los que se vé (eso creo) que estamos eliminando la extensión .jpg, para que se guarde con la extension en .php. Pensé que eso sería suficiente y se entendería, sorry :S

    En cuanto a lo de comprobar la extensión antes de subir dicho archivo... cuantas más protecciones te topes por el camino evidentemente más dificil será realizar dicho ataque (o cualquier otro), no digo que dicho ataque sea la panacea y salte todo tipo de protecciones, solo trato de explicar lo que es el ataque en sí.

    En cuanto a mi upload, es bien simple, pero sí que verifica si es imagen o no, y si no es imagen "no permite subir dicho archivo".
    Te pongo el codigo del index utilizado para que lo veas. Evidentemente todo codigo se puede mejorar y sobretodo este, pero creo que vale como prueba de concepto.

    En cuanto al nombre, yo no soy quien bauticé dicho ataque, ni pongo el nombre que creo que podría ser, simplemente se han escrito en varias ocasiones refiriendose como JPG File Inclusion y por eso lo nombré así, puedes verlo en los siguientes enlaces:

    http://www.hackxcrack.es/forum/defacing/bypass-local-file-inclusion-(imagenes-jpg)/
    http://www.slideshare.net/jonbonachon/jpg-file-inclusion

    Como bien dices, se está haciendo un bypass al upload (más bien un bypass a las restricciones del upload) ya que este ataque se aprovecha de vulnerabilidades como la mencionada, o ataques RFI /LFI, pero aunque se aproveche de ellos, dicho ataque se le denomina JPG File Inclusion.

    Si me equivoco y eres tan amable de explicarmelo te lo agradeceré.

    Muchas gracias!!

    Codigo:
    0) {
    echo $_FILES["archivo"]["error"] . "<br /#";
    } else {
    // Si no hubo ningun error, hacemos otra condicion para asegurarnos que el archivo no sea repetido
    if (file_exists("archivos/" . $_FILES["archivo"]["name"])) {
    echo $_FILES["archivo"]["name"] . " ya existe. ";
    } else {
    // Si no es un archivo repetido y no hubo ningun error, procedemos a subir a la carpeta /archivos, seguido de eso mostramos la imagen subida
    move_uploaded_file($_FILES["archivo"]["tmp_name"],
    "archivos/" . $_FILES["archivo"]["name"]);
    echo "Archivo Subido <br /#";
    echo "<img src='archivos/".$_FILES["archivo"]["name"]."' /#";
    }
    }
    } else {
    // Si el usuario intenta subir algo que no es una imagen o una imagen que pesa mas de 20 KB mostramos este mensaje
    echo "Archivo no permitido";
    }
    }
    ?#
    </div#
    </body#
    </html#

    ResponderEliminar
  3. Hola, como subo la imagen si el sistema cambia el nombre de la imagen con números por ejemplo: Si subo una imagen avata.php.jpg el sistema lo cambia a 148786768485600.jpg, como ejecuto la shell?

    saludos.

    ResponderEliminar
    Respuestas
    1. Hola Diego,

      primero habría que revisar qué es lo que está realizando ese código y lo que está modificando. Si solamente está cambiando el nombre (eso incluye .php) pero no modifica el contenido, deberías poder ejecutarlo modificando las cabeceras como hemos visto en el post. Pero insisto, hay que verificar que la imagen que te muestra es exactamente la que hemos subido y no es copia, después, modifica las cabeceras HTTP.

      Un saludo.

      Eliminar