XUT_ / COURSES / PENETRATION TESTER

Bypassing Server-Side Filtering - Magic Numbers

Ya hemos visto el filtrado de extensiones del lado del servidor, pero vamos a aprovechar para ver cómo se comprueban los magic numbers del lado del servidor también.

Los magic numbers se utilizan para identificar los archivos de manera más precisa. El magic number de un archivo es una string de dígitos hexadecimales y es siempre la primera parte de un archivo. De esta manera, leyendo los primeros bytes de un archivo y comparándolos con una whitelist o blacklist, podemos verificar si el archivo es o no legítimo para su subida.

IMPORTANT

Esta técnica puede ser efectiva contra servidores basados en PHP pero puede fallar contra otros tipos de servidores web.

Veamos un ejemplo. Como generalmente, tenemos una página de subida.

Bypassing Server-Side Filtering - Magic Numbers

Como es esperado, si subimos una shell.php, obtendremos un error. Sin embargo, si subimos un JPEG, el sitio web lo acepta.

Del intento anterior sabemos que los archivos JPEG son aceptados, por lo que le meteremos los magic numbers de JPEG a nuestro shell.php. Una vista rápida a la lista de firmas de la Wikipedia muestra que hay varias posibilidades de magic numbers para archivos JPEG. No debería importar cuál usemos aquí, así que elegiremos uno (FF D8 FF DB). Podríamos añadir la representación ASCII de estos caracteres (ÿØÿÛ) al principio del documento, pero es más fácil trabajar directamente en hexadecimal.

Antes de empezar, usaremos el comando file para comprobar el tipo de archivo de shell.php:

Bypassing Server-Side Filtering - Magic Numbers

Obviamente nos dice que es un archivo PHP. Ahora vamos a añadir 4 caracteres (porque el magic number que hemos seleccionado son 4 caracteres) al inicio del documento. No importa qué caracteres sean.

Bypassing Server-Side Filtering - Magic Numbers

Ahora vamos a abrirlo con hexeditor o cualquier otra herramienta que permita editar en hexadecimal.

Bypassing Server-Side Filtering - Magic Numbers

Por lo que se ve la "A" se representa como 41 en hezadecimal. Vamos a cambiar las 4 "A"s por magic numbers.

Bypassing Server-Side Filtering - Magic Numbers

Si ahora usamos el comando file:

Bypassing Server-Side Filtering - Magic Numbers

Ahora vamos a subir la shell.

Bypassing Server-Side Filtering - Magic Numbers

Ahí lo tenemos, hemos bypasseado el filtro basado en magic numbers del lado del servidor y obtenido una reverse shell.


Ve a magic.uploadvulns.thm y encuentra la flag en /var/www/.

  1. Vamos a la página dada. Bypassing Server-Side Filtering - Magic Numbers
  2. Vamos a escanear la página con gobuster. Bypassing Server-Side Filtering - Magic Numbers
  3. Vamos a probar a subir nuestra reverse shell del tirón. Bypassing Server-Side Filtering - Magic Numbers Parece que sólo admiten GIFs.
  4. Vamos a la página de firmas de la Wikipedia y buscamos por GIF. Bypassing Server-Side Filtering - Magic Numbers
  5. Abrimos nuestro archivo shell y le metemos 6 caracteres cualquiera. Bypassing Server-Side Filtering - Magic Numbers
  6. Abrimos el documento con hexeditor. Bypassing Server-Side Filtering - Magic Numbers
  7. Cambiamos los "42" por los caracteres seleccionados, por ejemplo 47 49 46 38 37 61. Bypassing Server-Side Filtering - Magic Numbers
  8. Guardamos y comprobamos con file. Bypassing Server-Side Filtering - Magic Numbers
  9. Subimos el archivo "GIF". Bypassing Server-Side Filtering - Magic Numbers
  10. Nos ponemos en escucha. Bypassing Server-Side Filtering - Magic Numbers
  11. Intentamos navegar a nuestra shell, que estará en /graphics. Bypassing Server-Side Filtering - Magic Numbers Hemos recibido la reverse shell.
  12. Vamos a leer la flag. Bypassing Server-Side Filtering - Magic Numbers