Resolución del CTF The Voucher
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.117- -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.
Identificamos los puertos 22, 80 y 8080 abiertos. El servicio SSH no dispone de credenciales válidas ni vectores directos, por lo que centramos el análisis en los servicios web.
Enumeración Web
En el puerto 80 encontramos la página por defecto de Apache sin contenido relevante. El puerto 8080 expone una aplicación web con funcionalidades de autenticación y búsqueda.
Realizamos fuzzing de directorios para identificar recursos no enlazados.
wfuzz -c -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt --hc 404 http://192.168.0.117:8080/FUZZDetectamos el directorio /keys. Enumeramos archivos potenciales de claves públicas.
wfuzz -c -w extensions.txt --hc 404 http://192.168.0.117:8080/keys/FUZZObtenemos el archivo public.pem, correspondiente a una clave pública accesible sin autenticación.
Explotación
Utilizamos la clave pública para generar un JSON Web Token manipulando el algoritmo de firma. Forzamos el uso de HS256 firmando el token con la clave pública como secreto.
python3 jwt_forge.pyEl token generado es aceptado por la aplicación, permitiendo el acceso al endpoint interno de búsqueda.
curl -s -H "Authorization: Bearer <JWT>" "http://192.168.0.117:8080/api/courses.php?q=1"La respuesta devuelve errores SQL, confirmando que el parámetro q es vulnerable a inyección SQL.
Post-Explotación
Automatizamos la explotación de la inyección SQL utilizando sqlmap, incluyendo el token JWT válido en la cabecera Authorization.
sqlmap -u "http://192.168.0.117:8080/api/courses.php?q=1" --headers="Authorization: Bearer <JWT>" --dump --batchExtraemos el contenido completo de la base de datos, localizando en una tabla las flags correspondientes al usuario y a root.
