Natas Nivel 21 a 22

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

Este nivel introduce un patron de ataque que surge cuando dos aplicaciones comparten el mismo mecanismo de sesion y una de ellas asigna a la sesion cualquier parametro POST sin filtrar. La vulnerabilidad no esta en la sesion en si misma, sino en quien controla que se escribe en ella.

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

Conseguir que la sesion contenga admin=1 explotando el sitio cooperante natas21-experimenter, y reutilizar esa cookie en natas21 para obtener la contrasena de natas22.

Que aprendes

Concepto / ComandoPara que sirve
session_start() compartida entre appsDos dominios bajo la misma config de PHP comparten el mismo almacen de sesiones
Mass Assignment / Variable InjectionEl servidor escribe en la sesion todos los parametros POST que recibe, sin whitelist
curl -c / -bGuardar cookies de una peticion y enviarlas en la siguiente
Cabecera Cookie: PHPSESSID=...Identificador que el servidor usa para recuperar los datos de sesion del usuario
Herramientas de DevTools > Application > CookiesInspeccionar y copiar la cookie de sesion desde el navegador

Concepto clave: session sharing + mass assignment

La categoria de vulnerabilidad combina dos problemas:

  1. Sesion compartida entre aplicaciones: natas21 y natas21-experimenter estan desplegadas como apps separadas pero usan el mismo directorio de sesiones PHP (o el mismo session.save_path). Esto significa que si dos peticiones llevan la misma cookie PHPSESSID, ambas apps leen y escriben en el mismo objeto de sesion.

  2. Mass Assignment sin filtrar (relacionado con OWASP A04 - Insecure Design): el sitio experimenter tiene logica equivalente a:

foreach ($_POST as $key => $value) {
    $_SESSION[$key] = $value;
}

No hay whitelist de claves permitidas. Cualquier parametro POST se convierte en variable de sesion. Si mandas admin=1, la sesion queda con $_SESSION['admin'] = 1.

El patron de ataque es: usar el sitio vulnerable como escritura y el sitio principal como lectura del mismo objeto de sesion.

Paso a paso

1. Acceder al nivel y obtener una cookie de sesion valida

Abre http://natas21.natas.labs.overthewire.org con las credenciales de natas21. El servidor devuelve una cookie PHPSESSID. Copiala desde DevTools (Application > Cookies) o con curl:

curl -v -u natas21:<pass_natas21> http://natas21.natas.labs.overthewire.org/ 2>&1 | grep -i set-cookie

Apunta el valor, por ejemplo: PHPSESSID=abcdef1234567890.

2. Entender que hace el sitio experimenter

Abre http://natas21-experimenter.natas.labs.overthewire.org (mismas credenciales HTTP Basic). Veras un formulario de estilos CSS. Al enviarlo, el servidor asigna a la sesion los campos recibidos. El codigo fuente del nivel confirma que no hay ninguna comprobacion de que los campos sean solo parametros de estilo.

3. Inyectar admin=1 en la sesion a traves del experimenter

Envia un POST al experimenter incluyendo la cookie obtenida en el paso 1 y el parametro admin=1:

curl -u natas21:<pass_natas21> \
  -b "PHPSESSID=abcdef1234567890" \
  --data "admin=1&submit=Update" \
  http://natas21-experimenter.natas.labs.overthewire.org/

El servidor experimenter ejecuta su logica de asignacion masiva y escribe $_SESSION['admin'] = 1 en el almacen de sesiones bajo ese PHPSESSID.

4. Reutilizar la misma cookie en natas21

Ahora haz una peticion a natas21 enviando la misma cookie. Como la sesion ya tiene admin=1, el servidor la lee y te considera administrador:

curl -u natas21:<pass_natas21> \
  -b "PHPSESSID=abcdef1234567890" \
  http://natas21.natas.labs.overthewire.org/

La respuesta HTML contendra la contrasena de natas22.

5. Alternativa desde el navegador

Si prefieres no usar curl, puedes hacerlo todo desde el navegador con Burp Suite:

  1. Visita natas21 y copia el valor de PHPSESSID en las DevTools.
  2. Visita natas21-experimenter, activa Intercept en Burp, envia el formulario y anade &admin=1 al cuerpo del POST antes de hacer forward. Asegurate de que la cabecera Cookie lleva el mismo PHPSESSID.
  3. Vuelve a natas21 y recarga: la sesion ya tiene admin=1.

Por que funciona

PHP almacena las sesiones como archivos en disco (tipicamente en /var/lib/php/sessions/ o un path configurado en php.ini). Si dos aplicaciones comparten el mismo session.save_path y el mismo nombre de cookie (PHPSESSID), cualquier session_start() con el mismo identificador accede al mismo archivo de sesion.

El sitio experimenter no valida las claves POST antes de escribirlas en $_SESSION. Al enviar admin=1, introduces una clave arbitraria en el objeto de sesion compartido. Cuando natas21 llama a session_start() con la misma cookie y comprueba $_SESSION['admin'] == 1, la condicion se cumple aunque el usuario nunca se haya autenticado como admin.

Errores comunes

  1. Usar cookies distintas en los dos pasos: si el navegador o curl crea una sesion nueva al visitar el experimenter, el PHPSESSID cambia y no afecta a la sesion que natas21 esta leyendo. La clave es que ambas peticiones lleven exactamente el mismo identificador de sesion.

  2. Olvidar la autenticacion HTTP Basic en el experimenter: ambas apps requieren Authorization: Basic .... Sin ella obtienes un 401 y el POST nunca llega al codigo PHP.

  3. Enviar el parametro con nombre incorrecto: el campo que natas21 comprueba es admin (en minuscula). Cualquier variacion (Admin, ADMIN, is_admin) no satisfara la condicion del servidor principal.

  4. Recargar la pagina del experimenter sin la cookie: algunos navegadores no persisten la cookie entre pestanas si no se configura correctamente el dominio. Verifica en DevTools que la cookie esta presente antes de enviar el formulario.

Pasar al siguiente nivel

La contrasena obtenida en la respuesta de natas21 es la credencial para:

  • URL: http://natas22.natas.labs.overthewire.org
  • Usuario: natas22
  • Contrasena: <pass_natas22>

El nivel 22 introduce una redireccion HTTP incondicional hacia la pagina de resultado si se cumple una condicion de sesion. La tecnica cambia: hay que evitar que el cliente siga la redireccion para leer la respuesta del cuerpo de la primera peticion, donde ya aparece la contrasena.

Conexiones