Sploitus

Exploit for CVE-2026-29000-pac4j-jwt

kitploit · 2026-08-27

Exploit Code

MARKDOWN117 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-STRIKODER-PREMIUM-CVE-2026-29000-PAC4J-JWT
# pac4j-jwe-forge (CVE-2026-29000)

Proof-of-concept для CVE-2026-29000. Нацелен на версии pac4j-jwt до 4.5.9, 5.7.9 и 6.3.3.

Уязвимость проста: библиотека принимает `PlainJWT` (без подписи, `alg=none`) при условии, что он обёрнут в валидный JWE. Поскольку сервер публикует свой открытый RSA-ключ через JWKS-эндпоинт, любой может зашифровать произвольный неподписанный JWT в JWE, которому сервер доверится — включая JWT с ролью `ROLE_ADMIN`.

* * *

## Как это работает

  1. Получите открытый RSA-ключ с JWKS-эндпоинта цели
  2. Создайте неподписанный JWT (`alg=none`) с любыми нужными claims
  3. Зашифруйте его открытым ключом сервера
  4. Отправьте полученный JWE как Bearer-токен



Сервер расшифровывает его, доверяет claims внутри и никогда не проверяет, что внутренний JWT не подписан.

* * *

## Требования

Python 3.13+ с uv, либо установите зависимости вручную:

root@kitploit:~
    
    
    pip install jwcrypto requests
    

* * *

## Использование

root@kitploit:~
    
    
    [uv run / python3] CVE-2026-29000.py --url <base_url> --jwks <jwks_path> [options]
    
    

**Обязательные:**

флаг| описание  
---|---  
`--url`| базовый URL цели, например `http://10.10.11.x:8080`  
`--jwks`| путь или полный URL до JWKS-эндпоинта  
  
**Необязательные:**

**Примеры:**

root@kitploit:~
    
    
    python3 exploit.py --url http://10.10.11.x:8080 --jwks /api/auth/jwks
    
    python3 exploit.py --url http://10.10.11.x:8080 --jwks /api/auth/jwks --user john --role ROLE_ADMIN
    
    python3 exploit.py --url http://10.10.11.x:8080 --jwks /.well-known/jwks.json --enc A128GCM
    

* * *

## Поиск JWKS-эндпоинта

Не всегда очевидно. Хорошие места для поиска:

  * `/robots.txt` — часто перечисляет ограниченные или внутренние пути
  * `/api/auth/jwks`
  * `/.well-known/jwks.json`
  * `/.well-known/openid-configuration`



* * *

## Поиск подходящих alg/enc

Если токен отклоняется, приложение может ожидать конкретный алгоритм шифрования. Проверьте `/static/js/app.js` на наличие чего-то вроде:

root@kitploit:~
    
    
    const JWE_ALG = "RSA-OAEP-256";
    const JWE_ENC = "A128GCM";
    

Затем запустите повторно с `--enc A128GCM`.

Способ хранения токена тоже обычно указан там:

root@kitploit:~
    
    
    class TokenManager {
        static getToken() {
            return sessionStorage.getItem('auth_token');
        }
    }
    

Если используется sessionStorage, замените токен напрямую в DevTools в разделе Application > Session Storage.

* * *

## Затронутые версии

  * pac4j-jwt < 4.5.9
  * pac4j-jwt < 5.7.9
  * pac4j-jwt < 6.3.3



Исправлено в версиях 4.5.9, 5.7.9 и 6.3.3.