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 / Comando | Para que sirve |
|---|---|
session_start() compartida entre apps | Dos dominios bajo la misma config de PHP comparten el mismo almacen de sesiones |
| Mass Assignment / Variable Injection | El servidor escribe en la sesion todos los parametros POST que recibe, sin whitelist |
curl -c / -b | Guardar 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 > Cookies | Inspeccionar y copiar la cookie de sesion desde el navegador |
Concepto clave: session sharing + mass assignment
La categoria de vulnerabilidad combina dos problemas:
-
Sesion compartida entre aplicaciones:
natas21ynatas21-experimenterestan desplegadas como apps separadas pero usan el mismo directorio de sesiones PHP (o el mismosession.save_path). Esto significa que si dos peticiones llevan la misma cookiePHPSESSID, ambas apps leen y escriben en el mismo objeto de sesion. -
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-cookieApunta 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:
- Visita
natas21y copia el valor dePHPSESSIDen las DevTools. - Visita
natas21-experimenter, activa Intercept en Burp, envia el formulario y anade&admin=1al cuerpo del POST antes de hacer forward. Asegurate de que la cabeceraCookielleva el mismoPHPSESSID. - Vuelve a
natas21y recarga: la sesion ya tieneadmin=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
-
Usar cookies distintas en los dos pasos: si el navegador o curl crea una sesion nueva al visitar el experimenter, el
PHPSESSIDcambia y no afecta a la sesion que natas21 esta leyendo. La clave es que ambas peticiones lleven exactamente el mismo identificador de sesion. -
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. -
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. -
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.