Jump to content

Remote code execution via polyglot web shell upload – PortSwigger Write Up

En este post vamos a estar resolviendo el laboratorio de PortSwigger: “Remote code execution via polyglot web shell upload”.

image 129

Para resolver el laboratorio tenemos que subir un archivo PHP que lea y nos muestre el contenido del archivo /home/carlos/secret. Ya que para demostrar que hemos completado el laboratorio, deberemos introducir el contenido de este archivo.

Además, el servidor está configurado para verificar si el archivo es una imagen fijándose en el contenido del mismo.

En este caso, el propio laboratorio nos proporciona una cuenta para iniciar sesión, por lo que vamos a hacerlo:

image 130
image 131

Una vez hemos iniciado sesión, nos encontramos con el perfil de la cuenta:

image 132

Como podemos ver, tenemos una opción para subir archivo, y concretamente parece ser que se trata de actualizar el avatar del perfil. Vamos a intentar aprovecharnos de esta opción para subir el siguiente archivo PHP:

image 133

Ojo, si nos fijamos, en este caso, además del propio código PHP. Estoy definiendo un string al principio del archivo. Esto ocurre porque para determinar el tipo de contenido de un archivo, se usan los primeros bytes, lo que se conoce como “magic numbers”. Estos primeros bytes de los archivos determinan de que tipo es o como se trataran, aunque el contenido sea totalmente distinto.

Como vemos, contiene un código PHP, pero el propio linux lo detecta como una imagen, esto ocurre por los magic numbers.

En el siguiente enlace os dejo una lista de los magic numbers asociados a los diferentes tipos de archivos:

  • https://gist.github.com/leommoore/f9e57ba2aa4bf197ebc5

Con esto entendido, configuramos el burp suite para que intercepte las peticiones:

image 134
image 135

Una vez tenemos Burp Suite listo junto al proxy, seleccionamos el archivo y lo subimos:

image 136
image 137
image 138

Burp suite interceptará la petición de la subida del archivo:

image 139

Para tratar mejor con la petición, la vamos a pasar el repeater y al mismo tiempo le vamos a dar a enviar para analizar la respuesta:

image 140

Parece que se ha subido sin problemas. Vamos a ver esta respuesta en el navegador:

image 141
image 142
image 143
image 144

Una vez aquí, ya no nos hará mas falta el burp suite, por lo que vamos a desactivar el proxy:

image 145

Con esto hecho, nos dirigimos a nuestro perfil:

image 146

Ahora, si nos fijamos en el perfil, podemos ver como el avatar ha cambiado, y ahora muestra un fallo de que no carga bien la imagen:

image 147

Esto seguramente es porque está intentando cargar nuestro archivo PHP como si fuera una imagen, y claro, falla al hacerlo. Para confirmar si se trata de nuestro archivo PHP, le damos click derecho para ir a la ruta exacta de “la imagen”:

image 148
image 149

Como vemos efectivamente se trata de nuestro archivo PHP, y, además del string colocado para establecer los magic numbers, podemos ver el contenido del archivo secret. Dicho de otra forma, la salida del código PHP interpretado.

Teniendo el contenido de secret, simplemente enviamos la respuesta:

image 150
image 151

Y de esta forma, resolvemos el laboratorio:

image 152
image 153

Además de la solución que hemos llevado a cabo, PortSwigger sugiere otra bastante curiosa y que vale la pena comentar:

  1. Creamos un archivo exploit.php el cual lea el contenido del archivo secret de Carlos, por ejemplo: <?php echo file_get_contents('/home/carlos/secret'); ?>
  2. Nos logueamos e intentamos subir nuestro archivo PHP en la parte de nuestro avatar. Como veremos, el servidor bloquea cualquier subida de archivo que no se trate de una imagen.
  3. Vamos a crear un archivo polyglot PHP/JPG. Es decir, un archivo que sea una imagen pero contenga código PHP en sus metadatos. Para ello, es tan sencillo como usar cualquier imagen y agregarle unos metadatos personalizados usando exiftool. Ejemplo: exiftool -Comment="<?php echo 'START ' . file_get_contents('/home/carlos/secret') . ' END'; ?>" <YOUR-INPUT-IMAGE>.jpg -o polyglot.php . Esto añadirá el payload PHP al campo de comentario de los metadatos. Con esto, guardaremos la imagen con extensión .php.
  4. Ahora, subimos este archivo, veremos que no tendremos ningún problema. Con esto hecho, volvemos a nuestro perfil.
  5. Si nos vamos al HTTP History del burp suite, podremos ver una petición GET a la supuesta imagen del avatar (esta petición se ha producido cuando hemos accedido a nuestro perfil y el avatar ha intentado cargar). Si cogemos esta petición y miramos su respuesta, podremos ver el contenido del archivo secret de Carlos.
  6. Enviamos la solución y habremos resuelto el laboratorio.

0 Comments

Recommended Comments

There are no comments to display.

Guest
Add a comment...