Skip to content

Latest commit

 

History

History
39 lines (30 loc) · 6.68 KB

File metadata and controls

39 lines (30 loc) · 6.68 KB

Читаем описание таска, понимаем что перед нами что-то грандиозное и ранее невиданное - сервис для коротких паст. Переходим по-ссылке, видим подтверждение ранее прочитанному, дизаин и правда невероятный, а ник реально "хайпово сгенерируется".
Пробуем авторизоваться, создать пасту, всё работает, начинаем искать уязвимость.

Для начала обратим внимание, на интересную механику генерации ников, каждый новый юзер получает ник "HypeUser_N", где N - порядковый номер зарегистрированного юзера.
Screenshot 2022-11-25 at 16 03 13
Думаем, как можно это использовать... Придумали? Вот и я тоже не придумал.

Едем дальше, вспоминаем про ограничение в 140 символов:

Думаем, как можно это использовать... Придумали? Вот и я тоже не придумал.

Далее, замечаем интересную деталь, когда мы кликаем по созданной пасте, нас перенаправляет на ссылку ввида /paste/<base64>, где <base64>, какой-то base64, пробуем раздекодить. Так-как это base64 используется в url, значит некоторые символы, типа / и + в нем заменяются, поэтому декодим через Base64URL декодер.
Для заметки с названием lol и содержимым kek, получаем такое:
Screenshot 2022-11-25 at 16 10 07
Очевидно, это какие-то байты, крутим их вертим, ничего адекватного не получаем. Опять не то(((

Проехали, заглянем в куки, увидим интересный кук auth, равный чему-то в base64 с точками. Тут либо знаем, либо гуглим и узнаём, что это JWT. Кидаем этот JWT токен в декодер jwt.io:
Screenshot 2022-11-25 at 16 13 59

Видим интересное, в jwt токене хранится id юзера, пробуем его поменять на, например, "id": 1, кодируем, вставляем в куку и вуаля... Нас выбрасывает на страницу авторизации. Пытаемся выяснить, что же не так, читаем про структуру JWT, узнаем что оказывается, точками разделяются части токена, первая часть - метаданные о используемом алгоритме и типе токена, вторая - содержимое, третья - подпись токена, использующаяся для подтверждения подлинности.

Обращаем внимание на последнюю часть, на подпись. Узнаем, что HS256 - это HMAC-SHA256, алгоритм генерации подписи с помощью секретного ключа. На jwt.io замечаем поле VERIFY SIGNATURE, в котором написано каким образом генерируется подпись:
Screenshot 2022-11-25 at 16 19 58
Понимаем, что для того что-бы подменить токен, нам нужно знать secret. Гуглим, пытаемся узнать, как его можно вычислить, находим статью типа такой, в которой узнаем, что hashcat умеет ломать jwt. Можем попробовать использовать брутфорс в лоб из статьи, но вскоре мы поймем, что это не работает, поэтому гуглим дальше и узнаем о том, что hashcat умеет в атаку по словарю. Гуглим словарь популярных jwt секретов, либо популярных паролей.

Можно было использовать всем известный rockyou.txt, либо jwt.secrets.list(первая строчка при запросе jwt secrets).
Запускаем хэшкэт(команда есть на скрине) и достаточно быстр взламываем секрет(у меня заняло меньше секунды):
Screenshot 2022-11-25 at 16 30 12

Красная стрелка указывает на подобранный секрет. Далее, вставляем этот секрет в поле your-256-bit-secret с сайта jwt.io и подменяем id на 1. Вставляем сгенерированный JWT в куку auth, получаем доступ к первому юзеру и находим у него пасту с названием NE FLAG, открываем её, получаем флаг.
Screenshot 2022-11-25 at 16 33 48 Screenshot 2022-11-25 at 16 33 57

flag: surctf_jwt_is_rly_hyped_th1ng_swagXD