Инструмент для тестирования, подделки и взлома JSON Web Tokens: проверяет уязвимые реализации (alg=none, слабый секрет, path traversal в jku/kid), автоматизирует типовые атаки на JWT и брутфорсит HMAC-секреты. Практически обязательный инструмент при пентесте любого современного API.
git clone https://github.com/ticarpi/jwt_tool.git cd jwt_tool pip install -r requirements.txt python3 jwt_tool.py <JWT> -T # интерактивное тестирование токена python3 jwt_tool.py <JWT> -X a # атака alg=none
jwt_tool.py — это набор инструментов для проверки, подделки, сканирования и модификации JWT (JSON Web Tokens).

Его функциональность включает: * Проверка валидности токена * Тестирование на известные эксплойты: * (CVE-2015-2951) Уязвимость обхода подписи alg=none * (CVE-2016-10555) Уязвимость несоответствия открытого ключа RS/HS256 * (CVE-2018-0114) Уязвимость внедрения ключа * (CVE-2019-20933/CVE-2020-28637) Уязвимость пустого пароля * (CVE-2020-28042) Уязвимость нулевой подписи * (CVE-2022-21449) Уязвимость ECDSA Psychic Signature * Сканирование на неправильную конфигурацию или известные слабости * Фаззинг значений claims для вызова неожиданного поведения * Проверка валидности файла секрета/ключа/открытого ключа/JWKS-ключа * Выявление слабых ключей с помощью высокоскоростной атаки по словарю * Создание новой структуры заголовка и полезной нагрузки токена и формирование новой подписи с помощью ключа или через другой метод атаки * Модификация временных меток * Генерация и восстановление ключей RSA и ECDSA (из JWKS-файлов) * Ограничение частоты для всех атак * ...и многое другое!
Этот инструмент написан для пентестеров, которым нужно проверить прочность используемых токенов и их уязвимость к известным атакам. Доступен ряд опций для модификации, подписи и проверки, чтобы глубже изучить потенциальные слабости в некоторых JWT-библиотеках. Он также успешно используется участниками CTF-соревнований, поскольку в настоящее время JWT часто являются темой CTF. Он также может быть полезен разработчикам, которые используют JWT в своих проектах, но хотят проверить стабильность и уязвимости к известным уязвимостям при использовании поддельных токенов.
Этот инструмент написан нативно на Python 3 (версия 3.6+) с использованием стандартных библиотек, однако различные криптографические функции (и общая эстетичность/читаемость) требуют установки нескольких распространенных Python-библиотек. (Старая версия для Python 2.x доступна в ветке legacy для тех, кому это необходимо, хотя она больше не поддерживается и не обновляется)
Предпочтительный способ использования jwt_tool — через официальный образ Docker для jwt_tool, размещенный на Dockerhub.
Базовая команда для запуска выглядит следующим образом:
Базовая команда для запуска jwt_tool:
docker run -it --network "host" --rm -v "${PWD}:/tmp" -v "${HOME}/.jwt_tool:/root/.jwt_tool" ticarpi/jwt_tool
Используя приведенную выше команду, вы можете добавлять любые другие аргументы как обычно. Обратите внимание, что локальные файлы в вашей текущей рабочей директории будут отображены в директорию /tmp контейнера Docker, поэтому вы можете использовать их по этому абсолютному пути в ваших аргументах. Например: /tmp/localfile.txt
Установка заключается в скачивании файла jwt_tool.py (или выполнении git clone репозитория).
(Также выполните chmod для файла, если вы хотите добавить его в $PATH и вызывать из любого места.)
$ git clone https://github.com/ticarpi/jwt_tool
$ python3 -m pip install -r requirements.txt
При первом запуске инструмент сгенерирует файл конфигурации, некоторые вспомогательные файлы, файл журнала и набор открытых и закрытых ключей в различных форматах.
jwtconf.ini как значение "jwkloc".Чтобы исправить сломанные цвета в cmd/Powershell Windows: раскомментируйте две строки ниже в jwt_tool.py (удалите "# " в начале каждой строки).
Вам также потребуется установить colorama: python3 -m pip install colorama
# import colorama
# colorama.init()
Первым аргументом должен быть сам JWT (если только он не передается через заголовок или значение куки). Если не предоставлять дополнительных аргументов, вам будут показаны декодированные значения токена для просмотра.
$ python3 jwt_tool.py <JWT>
или базовая команда Docker:
$ docker run -it --network "host" --rm -v "${PWD}:/tmp" -v "${HOME}/.jwt_tool:/root/.jwt_tool" ticarpi/jwt_tool
Инструментарий проверит токен и выведет значения заголовка и полезной нагрузки.
Множество дополнительных аргументов позволят вам перейти к соответствующей функции и получить токен, готовый к использованию в ваших тестах.
Например, чтобы модифицировать существующий токен, выполните следующую команду:
$ python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.aqNCvShlNT9jBFTPBpHDbt2gBB1MyHiisSDdp8SQvgw -T
Для многих опций требуются дополнительные значения для настройки параметров.
Например, чтобы запустить определенный тип эксплойта, вам нужно выбрать опцию eXploit (-X) и указать уязвимость (здесь используется "a" для эксплойта alg:none):
$ python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.aqNCvShlNT9jBFTPBpHDbt2gBB1MyHiisSDdp8SQvgw -X a
Для некоторых опций, таких как проверка токенов, необходимо предоставить дополнительные параметры/файлы (здесь предоставляется открытый ключ в формате PEM):
$ python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.aqNCvShlNT9jBFTPBpHDbt2gBB1MyHiisSDdp8SQvgw -V -pk public.pem
Все режимы теперь позволяют отправлять токен напрямую в приложение.
Вам нужно указать:
* целевой URL (-t)
* вместо целевого URL вы можете поместить ваш HTTP-запрос в файл и сослаться на файл с помощью -r. Это АВТОМАТИЧЕСКИ заполняет заголовки, куки и данные POST, поэтому это рекомендуемый вариант
* заголовок запроса (-rh) или куки запроса (-rc), которые требуются приложению (как минимум один из них должен содержать токен)
* (опционально) любые данные POST (если запрос является POST)
* (опционально) любые дополнительные опции jwt_tool, такие как режимы или опции модификации/внедрения
* (опционально) значение «канарейки» (-cv) — текстовое значение, которое вы ожидаете увидеть при успешном использовании токена (например, "Welcome, ticarpi").
Пример запроса может выглядеть следующим образом (используя режим сканирования для forced-errors):
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -rh "Origin: null" -cv "Welcome" -M er
Отображаются различные ответы на запрос: * Код ответа * Размер ответа * Уникальный идентификатор отслеживания запросов (для использования в журналах) * Используемый режим/опции
Вот краткий обзор базовой оценки реализации JWT. Если эти опции не привели к успеху, углубитесь в другие режимы и опции, чтобы обнаружить новые уязвимости (или zero-day!).
Прочитайте значение токена, чтобы получить представление о claims/значениях, ожидаемых в приложении:
$ python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.aqNCvShlNT9jBFTPBpHDbt2gBB1MyHiisSDdp8SQvgw
Запустите Playbook Scan, используя предоставленный токен напрямую против приложения, чтобы выявить распространенные ошибки конфигурации:
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -M pb
Если обнаружены какие-либо успешные уязвимости, измените соответствующие claims, чтобы попробовать их эксплуатировать (здесь используется эксплойт Inject JWKS и внедряется новое имя пользователя):
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -X i -I -pc name -pv admin
Углубитесь, тестируя неожиданные значения и claims, чтобы выявить непредвиденное поведение приложения, или проводите атаки на логику программирования или обработку токенов:
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -I -hc kid -hv custom_sqli_vectors.txt
Просмотрите результаты любой успешной эксплуатации, запрашивая журналы для чтения дополнительных данных о запросе и:
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -X i -I -pc name -pv admin
Для списка опций вызовите функцию использования:
Некоторые опции, такие как верификация токенов, требуют предоставления дополнительных параметров/файлов:
$ python3 jwt_tool.py -h
Более подробное руководство пользователя можно найти на странице вики.

Перейдите к Чекбуку по атакам на JWT, чтобы получить подробное описание: что такое JWT, для чего они используются, а также полный рабочий процесс их всестороннего тестирования на наличие уязвимостей, распространенных слабостей и непреднамеренных ошибок в коде.
Регулярное выражение для поиска JWT в Burp Search
(убедитесь, что отмечены опции 'Case sensitive' и 'Regex')
[= ]eyJ[A-Za-z0-9_-]*\.[A-Za-z0-9._-]* - JWT версия, безопасная для URL
[= ]eyJ[A-Za-z0-9_\/+-]*\.[A-Za-z0-9._\/+-]* - все версии JWT (выше вероятность ложных срабатываний)
Чекбук по атакам на JWT (https://github.com/ticarpi/jwt_tool/wiki) - для тщательной методологии тестирования JWT
Многие из первоначальных идей для этого инструмента вдохновлены уязвимостями, обнаруженными Тимом Маклином.
Ознакомьтесь с его блогом о слабостях JWT здесь: https://auth0.com/blog/critical-vulnerabilities-in-json-web-token-libraries/
Целый набор упражнений для тестирования уязвимостей JWT предоставлен Pentesterlab (https://www.pentesterlab.com). Я бы настоятельно рекомендовал подписку PRO, если вы интересуетесь веб-пентестингом.
ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ: Этот набор инструментов решит большинство упражнений Pentesterlab по JWT за несколько секунд при правильном использовании, однако я бы настойчиво рекомендовал вам самостоятельно проработать эти упражнения, разобрав структуру и слабости. В конце концов, речь идет о обучении...