Перевод: JWT Общие атаки
@Ent_TranslateIBЧто такое JWT 🤔?
JSON Web Tokens (JWT) используется для авторизации вошедших в систему пользователей, поэтому после входа пользователя в систему иногда веб-серверу необходимо проверить, авторизован ли этот пользователь (имеет ли он доступ) к данной системе/информации.
JWT не использует старые добрые cookies и сессии для авторизации, вместо этого он использует JSON веб-токены.

Структура 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).

Вероятно, вы сейчас ломаете голову, задаваясь вопросом, какие атаки могут быть на такой сильный асимметричный алгоритм, как 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

Ссылки
- https://www.thehacker.recipes/web/inputs/insecure-json-web-tokens
- https://www.youtube.com/watch?v=4V3GXPViXxQ&t=2024s
- https://blog.intigriti.com/2021/07/27/hacker-tools-jwt_tool/
- https://infosecwriteups.com/attacks-on-json-web-token-jwt-278a49a1ad2e
Оригинал статьи - здесь.
Поддержите автора хлопками на Medium.
Перевод статьи был выполнен проектом перевод энтузиаста:
- 📚 @Ent_TranslateIB - Телеграмм канал с тематикой информационной безопасности
- 🔥 @Ent_Translate - Инстаграм проекта