Вопрос или проблема
Можно ли взломать JSON Web Token (JWT) с использованием алгоритма HS-256 с помощью hashcat
на обычном ПК?
hashcat password.txt -m 16500 -a3
Как я могу рассчитать, сколько времени это займет?
Первая часть JWT, например: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.
Hashcat позволяет взламывать несколько форматов, включая упомянутый вами (JWT HS256
), и его сила зависит от секрета
.
Если веб-приложение использует сильный секрет, взлом может занять очень много времени. Вы можете оптимизировать вероятность успеха, создавая пользовательские словари, если у вас есть дополнительная информация о том, как был сгенерирован секрет.
Поскольку вы не знаете, насколько далеко или близко вы находитесь к правильному ответу, очень трудно определить, сколько времени займет взлом. Вы можете получить приблизительное время обработки определенного словаря или определенных правил.
Вот пример. Допустим, у нас есть следующий JWT HS256:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MiwiaWF0IjoxNTc0ODM1MzE0LCJleHAiOjE1Nzc0MjczMTR9.GXWX72f5PQi4unRvF3eh6oPziUUr_iVxMyUL5NFlulU
Как видно на изображении, указано Invalid Signature
, потому что у нас нет правильного секрета. Теперь мы попробуем взломать его с помощью hashcat
и john
с использованием словаря rockyou.txt
.
Hashcat:
jwt_token.txt:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MiwiaWF0IjoxNTc0ODM1MzE0LCJleHAiOjE1Nzc0MjczMTR9.GXWX72f5PQi4unRvF3eh6oPziUUr_iVxMyUL5NFlulU:9897
Команда Hashcat:
┌──(galoget㉿hackem)-[~]
└─$ hashcat -m 16500 -a 0 jwt_token.txt /usr/share/wordlists/rockyou.txt
hashcat (v6.2.5) стартует
Минимальная длина пароля, поддерживаемая ядром: 0
Максимальная длина пароля, поддерживаемая ядром: 256
Хэши: 1 дайджесты; 1 уникальный дайджест, 1 уникальная соль
Битовые карты: 16 бит, 65536 записей, 0x0000ffff маска, 262144 байта, 5/13 вращений
Правила: 1
Примененные оптимизаторы:
* Нулевой байт
* Неитерация
* Один хэш
* Одна соль
Наблюдатель: предел температуры для прерывания установлен на 90ºC
Объем памяти хоста, необходимый для атаки: 1 МБ
Кэш словаря создан:
* Имя файла: /usr/share/wordlists/rockyou.txt
* Пароли: 14344392
* Байты: 139921507
* Пространство ключей: 14344385
* Время выполнения: 2 сек
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MiwiaWF0IjoxNTc0ODM1MzE0LCJleHAiOjE1Nzc0MjczMTR9.GXWX72f5PQi4unRvF3eh6oPziUUr_iVxMyUL5NFlulU:9897
Сессия..........: hashcat
Статус...........: Взломан
Режим хэша......: 16500 (JWT (JSON Web Token))
Цель хэша......: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MiwiaW...NFlulU
Время начала.....: Вт, 18 июня 2022, 10:31:04 (15 сек)
Ожидаемое время..: Вт, 18 июня 2022, 10:31:19 (0 сек)
Особенность Ядра...: Чистое ядро
Основная догадка...: Файл (/usr/share/wordlists/rockyou.txt)
Очередь догадок....: 1/1 (100.00%)
Скорость.#1.........: 772.1 kH/s (1.77ms) @ Accel:512 Loops:1 Thr:1 Vec:8
Восстановлено........: 1/1 (100.00%) дайджестов
Прогресс.........: 11528192/14344385 (80.37%)
Отклонено.........: 0/11528192 (0.00%)
Точка восстановления....: 11526144/14344385 (80.35%)
Подзадача восстановления.#1...: Соль:0 Увеличитель:0-1 Итерация:0-1
Двигатель кандидатов.: Генератор устройства
Кандидаты.#1....: 98io98io -> 989197
Мониторинг оборудования.#1..: Использование: 72%
Начато: Вт, 18 июня 2022, 10:30:03
Остановлено: Вт, 18 июня 2022, 10:31:20
Из предыдущего вывода мы видим, что секрет
для этого JWT был взломан, и его значение: 9897
.
John The Ripper:
Давайте повторим упражнение с john
. Мы будем использовать тот же входной файл из предыдущей команды.
Команда John:
┌──(galoget㉿hackem)-[~]
└─$ john jwt_token.txt -w=/usr/share/wordlists/rockyou.txt --format=HMAC-SHA256
Используя кодировку по умолчанию: UTF-8
Загружен 1 хэш пароля (HMAC-SHA256 [пароль - это ключ, SHA256 256/256 AVX2 8x])
Будет запущено 4 потока OpenMP
Нажмите 'q' или Ctrl-C, чтобы прервать, почти любую другую клавишу для состояния
9897 (?)
1g 0:00:00:03 ЗАВЕРШЕНО (2022-06-18 10:34) 0.2597g/s 2995Kp/s 2995Kc/s 2995KC/s 98992243..985824
Используйте опцию "--show", чтобы надежно отобразить все взломанные пароли
Сессия завершена.
Опять же, секрет
был найден с помощью этого инструмента. Теперь мы можем установить секрет на сайте JWT, чтобы проверить подпись.
Мы видим, что страница показывает: Signature Verified
, что означает, что мы можем подделывать токены с его помощью.
Для нашего примера мы изменим id
. Предположим, что веб-приложение идентифицирует пользователя по этому id
.
id = 2 --> John Doe (Пользователь с низкими правами)
id = 1 --> Администратор
Выполнив это изменение, мы получаем следующий токен:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwiaWF0IjoxNTc0ODM1MzE0LCJleHAiOjE1Nzc0MjczMTR9.inohRq76BxY5pU3wML1YgiLc6rhs0Dz9fsbZ2DvnOpc
Как вы видите в этом примере, единственное, что препятствует атакующему захватить любую учетную запись, это секрет. Если секрет представляет собой случайную строку (заглавные + строчные буквы, цифры, символы). Единственным механизмом взлома будет перебор или создание пользовательского словаря, и даже с этим это может занять от нескольких секунд до многих лет, в зависимости от его значения.
Надеюсь, это поможет.
Может ли это быть сделано в теории? Да. Вы можете легко отформатировать подписанные части JWT и подпись в формате, который ожидает HashCat, указать алгоритм, а затем установить его на перебор ключа.
Является ли это практически осуществимым? Нет. Hashcat предназначен для взлома паролей, секретов, запоминаемых человеком, которые редко имеют более 40-50 бит энтропии (и часто намного меньше). Это не то, с чем вы имеете дело здесь.
JWT используются для общения машина-машина, без необходимости или применения для человека их запоминать; таким образом, они обычно используют криптографически безопасные случайные ключи с минимумом 128 бит энтропии (если нет, это, вероятно, уязвимость). Каждый дополнительный бит удваивает необходимое время. Каждые дополнительные десять бит увеличивают время на примерно 1000 раз. При 80+ битах, превышающих даже хороший пароль, Hashcat потребуется более 1 000 000 000 000 000 000 000 000 раз больше времени, чтобы методом перебора взломать хотя бы 128-битный секретный ключ, чем это сделает типичный пароль.
Это довольно очевидно, если вы подумаете, как работают JWT. JWT используются по всему интернету и в других частях Интернета. Они безгосударственные, что означает, что сервер не знает, какие JWT он выдавал или не выдавал ранее. Вместо этого сервер полагается на “является ли эта подпись действительной?” чтобы определить, был ли JWT легитимно создан. Если атакующий может взять любой действительный JWT (например, тот, который он только что получил для входа), подставить его в Hashcat и получить обратно секретный ключ… что ж, этот атакующий тогда сможет подделать JWT, утверждая, что он любой пользователь или имеет любой уровень привилегий, и (пере)подписать его доверенным ключом. Сервер бы доверял этому JWT, и вся аутентификация и контроль доступа на сервере могли бы быть обойдены. Этого не происходит, что логически подразумевает, что это не так легко.
Я предполагаю, что вы говорите об алгоритме HS256
, который использует HMAC-SHA-256. Как указано в этом ответе, возможно использовать hashcat для атаки HMAC-SHA-256. Вам нужно будет указать значение HMAC, используя формат, указанный в RFC 7515, который должен быть первыми двумя сегментами, закодированными в base64, с разделителем периода.
Как указано в этом вопросе, формат – это MAC:message
. MAC в этом случае должен быть закодирован в hex, поэтому вам нужно будет декодировать третий сегмент с разделителями по точкам в base64, закодировать его в hex, а затем добавить двоеточие и первые два сегмента, закодированных в base64, с их периодами.
Однако, по моему опыту, люди, как правило, выдают JWT и другие токены, используя случайно сгенерированные секреты из CSPRNG с 128 или более битами энтропии. Если секрет был сгенерирован таким образом, то взломать его будет вычислительно невозможно. hashcat будет эффективен только в том случае, если секрет легко угадываем, что не является типичным.
Также существует онлайн-инструмент для взлома вашего HS256 JWT с использованием словаря или методом перебора: https://jwt-cracker.online
Ответ или решение
Вопрос: Возможно ли взломать JWT с использованием алгоритма HS256 с помощью Hashcat на обычном ПК?
JWT (JSON Web Token) является стандартом для безопасной передачи информации между сторонами в виде JSON-объектов. Когда JWT использует алгоритм HS256 (HMAC с использованием SHA-256), для подделки токена требуется знание секретного ключа, который использовался для его подписи.
1. Возможность взлома
Да, в теории, можно взломать JWT, используя алгоритм HS256 с помощью Hashcat. Однако реальная практическая осуществимость такого подхода зависит от сложности и длины секретного ключа, который использован для подписи токена.
2. Использование Hashcat
Если у вас есть токен JWT, его подпись (третий компонент, закодированный в base64) можно обработать для использования в Hashcat.
Формат, который нужно использовать, соответствует спецификации RFC 7515, где MAC (подпись) формируется в следующем формате:
MAC:message
Здесь:
- MAC – это HMAC, записанное в шестнадцатеричном формате.
- message – это первые два компонента JWT, разделенные точкой.
Для примера, давайте разберем JWT:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MiwiaWF0IjoxNTc0ODM1MzE0LCJleHAiOjE1Nzc0MjczMTR9.GXWX72f5PQi4unRvF3eh6oPziUUr_iVxMyUL5NFlulU
В данном случае, нам нужно:
- Декодировать третий компонент из base64.
- Преобразовать его в шестнадцатеричный формат.
- Сформировать строку для Hashcat.
3. Оценка времени взлома
Работа с Hashcat требует некоторых вычислений для оценки времени взлома. Это очень трудно сделать, так как время зависит от длины и сложности секретного ключа. Если секрет был сгенерирован с использованием стойкого криптографического генератора случайных чисел (CSPRNG) и имеет длину 128 бит или больше, процесс взлома может занять невероятно долгий срок.
Например, если предположить, что секретный ключ не превышает 40-50 бит сложности, то Hashcat сможет его взломать за считанные минуты или часы. Однако, для ключей с 128 битами оно может занять миллионы лет.
4. Практика
Для практического использования можно запустить следующую команду Hashcat:
hashcat -m 16500 -a 0 jwt_token.txt /usr/share/wordlists/rockyou.txt
-m 16500
указывает на механизм HMAC-SHA256.-a 0
указывает, что будет использован простой режим атаки с словарем.
5. Заключение
Следует отметить, что большинство современных приложений используют секретные ключи, которые сложно поддаются взлому. Использование словарных методов работает только в случае, если секретный ключ был простым и предсказуемым. Если вы работаете с JWT токенами, убедитесь, что используете сложные, случайные секреты для защиты информации.
В конечном итоге, хотя теоретически возможно взломать JWT токен с использованием Hashcat, на практике это может оказаться крайне сложной задачей из-за высокой энтропии современных ключей.