Перевод: JWT Общие атаки

Перевод: JWT Общие атаки

@Ent_TranslateIB

Что такое JWT 🤔?

JSON Web Tokens (JWT) используется для авторизации вошедших в систему пользователей, поэтому после входа пользователя в систему иногда веб-серверу необходимо проверить, авторизован ли этот пользователь (имеет ли он доступ) к данной системе/информации.

JWT не использует старые добрые cookies и сессии для авторизации, вместо этого он использует JSON веб-токены.

файлы cookie против токенов

Структура JWT

JWT состоит из 3 основных частей:

1. Заголовок (Header)

- Заголовок является самой верхней частью токена JWT и определяет, какой алгоритм будет использоваться в части сигнатуры для генерации сигнатуры (подробнее об этом в сигнатуре).

Алгоритм может быть одним из следующих: None (без кодировки), HS256, RS256.

2. Полезная нагрузка (Payload)

Это основное сообщение в токене, которое содержит важную информацию о пользователе/организации, которая будет авторизована или нет.

Одним из статических полей полезной нагрузки является "iat", который представляет собой временную метку сгенерированного JWT, другие элементы полезной нагрузки варьируются в зависимости от используемого веб-приложения.

{

"sub": "1234567890",

"name": "John Doe",

"admin": true

}

3. Сигнатура (Signature)

Эта часть является основной для нас как пентестеров, поскольку она содержит практически все предыдущее сообщение, но закодированное для обеспечения конфиденциальности.

Сигнатура состоит из следующей комбинации:

1. Заголовок в формате base64.

2. Полезная нагрузка в формате base64.

3. Секретный ключ для генерации сигнатуры (в соответствии с алгоритмом, указанным в заголовке), а иногда это 2 ключа (закрытый+открытый) для ассиметричных алгоритмов, таких как RS256).

Токен JWT (декодированный)

Вероятно, вы сейчас ломаете голову, задаваясь вопросом, какие атаки могут быть на такой сильный асимметричный алгоритм, как RS256, но на самом деле у нас есть множество обходных путей, чтобы обойти сигнатурную часть.

Мы расскажем о четырех основных атаках, которые могут быть проведены с помощью JWT.

1. Атака RSA на HMAC

Как мы уже говорили, у нас есть два основных алгоритма шифрования, RS256 и HS256, и, конечно, мы все знаем, что RS256 является асимметричным, поэтому его гораздо сложнее взломать, так как он использует комбинацию закрытого и открытого ключа.

- Обратитесь к этой ссылке, чтобы узнать больше о RSA и HMAC: https://connect2id.com/products/nimbus-jose-jwt/algorithm-selection-guide.

  • Перехватите запрос с помощью (Burp suite) или любого знакомого вам прокси и отправьте его в repeater для изменения запроса.
  • Первым шагом будет изменение алгоритма заголовка с "RS256" на "HS256".
  • Получите открытый ключ веб-сайта (который может быть найден в его сертификате или просочиться в интернет). Вы можете поискать такие каталоги, как .well-known, общие каталоги или файл jks.json.
  • также обратитесь к этому замечательному сайту: https://connect2id.com/products/nimbus-jose-jwt/examples/jwk-retrieval
  • После сохранения открытого ключа нам нужно сгенерировать новую сигнатуру с тем же ключом (открытым ключом), потому что, помните, сейчас мы используем HS256, а он использует тот же ключ для подписи/шифрования.
  • Для генерации новой сигнатуры обратитесь к следующему фрагменту кода:
import hashlib
import base64
import hmac

file=open('key.pem')

key = file.read()

#Change Header and payload to the one you intercepted and alter it#
header = '{"alg":"HS256",
           "typ": "jwt"}'
payload = '{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}'

#encoding Header
encodedHBytes = base64.urlsafe_b64encode(header.encode("utf-8"))
encodedHeader = str(encodedHBytes, "utf-8").rstrip("=")

#Encoding payload
encodedPBytes = base64.urlsafe_b64encode(payload.encode("utf-8"))
encodedPayload = str(encodedPBytes, "utf-8").rstrip("=")

complete_jwt = (encodedHeader + "." + encodedPayload)

#Creating the whole Signature
#try:
signature = base64.urlsafe_b64encode(hmac.new(bytes(key, "UTF-8"),complete_jwt.encode('utf-8'),hashlib.sha256).digest()).decode('UTF-8').rstrip("=")

print(complete_jwt + "." + signature)
  • Измените сигнатуру на ту, которую вы только что сгенерировали, отправьте измененный запрос с помощью burp и надейтесь на лучшее.

Отказ от ответственности: Этот метод работает только в том случае, если внутренний сервер имеет уязвимость RS-HS, которая позволяет изменить алгоритм, и, как бы ни была известна эта атака, сейчас она работает только на некоторых сайтах 😢.

2. Атака на недействительную сигнатуру

Эта атака намного проще, чем первая, вы просто перехватываете сообщение, отправляете его в repeater, а затем удаляете всю сигнатуру и надеетесь на лучшее.

* Этот вид атаки является ошибкой безопасности высокой степени тяжести и обычно встречается только в небольших/средних организациях с плохой практикой безопасности.

3. Атака на отсутствие алгоритма

Этот тип атаки очень похож на первый и второй.

  • Вы перехватываете сообщение и изменяете заголовок, на этот раз изменив значение "algorithm" на "none" и изменив полезную нагрузку на любую, которую вы хотите (вы можете оставить сигнатуру как есть).
  • Некоторые веб-серверы не имеют правила, которое не принимает алгоритм, отличный от одного (слабая практика управления).
  • Эта атака была очень известна в течение последних нескольких лет, и до момента написания этой статьи она встречается во многих ведущих компаниях.
  • Обратитесь к моему другу здесь для ознакомления с дистиллированной атакой None-algorithm: https://blog.pentesteracademy.com/hacking-jwt-tokens-the-none-algorithm-67c14bb15771.

4. Перебор сигнатуры

Хотя эта атака не считается уязвимостью и вы не получите за нее вознаграждение, но она иногда полезна для обнаружения других уязвимостей.

Эта атака работает только с HS256 и не сработает для асимметричного шифрования (если только у вас нет квантового компьютера).

Говоря о бэкенде, некоторые ключи шифрования не так хороши, как должны быть, поэтому они не полностью случайны, и я сам видел, как сигнатуры взламывались за очень короткое время из-за отсутствия случайности в генерируемых ключах.

Существует множество инструментов, но я рекомендую сначала изучить сигнатуру самостоятельно, а затем решить, какой инструмент использовать. В любом случае, это наиболее распространенные инструменты, которые я предпочитаю использовать (вы также можете использовать расширение burp).

https://github.com/lmammino/jwt-cracker

https://github.com/x1sec/gojwtcrack

JWT брутфорс в действии

Ссылки

  1. https://www.thehacker.recipes/web/inputs/insecure-json-web-tokens
  2. https://www.youtube.com/watch?v=4V3GXPViXxQ&t=2024s
  3. https://blog.intigriti.com/2021/07/27/hacker-tools-jwt_tool/
  4. https://infosecwriteups.com/attacks-on-json-web-token-jwt-278a49a1ad2e

Оригинал статьи - здесь.
Поддержите автора хлопками на Medium.


Перевод статьи был выполнен проектом перевод энтузиаста:

  • 📚 @Ent_TranslateIB - Телеграмм канал с тематикой информационной безопасности
  • 🔥 @Ent_Translate - Инстаграм проекта

Report Page