June 22, 2021

Немного о Bug Bounty, SSRF, CRLF и XSS

Немного о том, как были найдены пара простых уязвимостей в ходе Bug Bounty.

Я решил не соваться на HackerOne, а зарегистрировался на платформе попроще и поменьше, называется Intigriti, которая ориентирована на европейские компании. Выбрал цель и в первом же домене, который начал исследовать, нашел уязвимость.

Нашел SSRF, на тот момент даже не зная, что это такое.

Спойлер

ssrf.png

Как это получилось и почему это заслуживает интереса.

Я просто фаззил сначала директории, потом файлы, потом параметры в URL. Обычно при таком фаззинге выполняются GET-запросы. Если бы я при фаззинге выполнял только GET-запросы, то это ничего мне не дало бы. Не знаю, что меня сподвигло, но я решил пофаззить все тоже самое POST-запросами.

В том месте, где GET-запрос возвращал мне ответ от сервера 404, метод POST возвратил мне ответ 500. То есть если я запрашивал URL - http://domen.com/image, то приходил ответ, что такого файла или пути не существует. Если делал этот же запрос, но менял значение метода с GET на POST, то приходила ошибка Internal Server Error с кодом 500. Я начал копать в сторону поиска параметров для POST-запроса. Изфаззил кучу словарей, пробовал отправлять и XML, и JSON, и в них тоже фаззил параметры. Потратил на это несколько дней и ночей, и ничего не получил. Тогда я решил вернуться к запросу GET (вы помните, он возвращал ответ 404) и тоже стал фаззить его параметры. Я не помню (прошло уже больше года), как заметил, но таки заметил, что параметр url ведет себя не обычно. Поэтому далее я стал фаззить значения этого параметра. Оказалось, что если в значение подставить localhost, то ответ от сервера приходит значительно дольше, чем если значение параметра любое другое. При этом код ответа оставался 404(!). На этом моменте я полез в гугл и узнал от такой уязвимости, как SSRF. Тут можете посмотреть презентацию на Zeronights от нашего админа.

SSRF (server-side request forgery) - это подделка запросов от имени сервера. То есть атакующий может отправлять запросы на разные адреса в сети от имени уязвимого сервера. Иногда это может приводить к серьезным последствиям, но не в моем случае.

Я стал подставлять в значение параметра url разные ip-адреса и получил кое-какой результат (ниже скрины, которые я отправлял в репорте в программе BB. Уязвимость на сегодняшний день закрыта, поэтому не затираю адрес):

1. Если отправляем запрос на сервер с несуществующим IP, то ответ от сервера приходит через 21 секунду:

1.png

2. Если IP существует во внутренней сети, то ответ приходит значительно быстрее:

2.png

3. Можем сканировать порты, как будто бы мы находимся во внутренней сети. Если порт закрыт, то ответ приходит в течение 1.2-1.4 секунды:

3.png

4. Если порт открыт, ответ приходит быстро:

4.png

5. Можем поискать подсети:

5.png

6. Есть:

6.png

7. Можем сканировать порты в машинах, находящихся в подсетях. Тут порт закрыт:

7.png

8. Тут порт открыт:

8.png

Других возможностей эксплуатации этой уязвимости я не нашел в этом случае. Хотя, если вы немного почитаете о SSRF, то найдете, что уязвимость может привести к RCE.

Суть всей заметки выше не в самой уязвимости, а в том, как она была обнаружена. Если бы я не стал фаззить директории методом POST, то и не узнал бы о баге. Денег за это я не получил, так как уязвимость справедливо посчитали слабой, но накинули 5 баллов к рейтингу )

Затем, исследуя домены той же компании, я нашел у них такой адрес: https://domen.com/otrs/index,pl.

Запустил сканер уязвимостей в OWASP ZAP, на который особо и не расчитывал. Но он внезапно нашел там путь, по которому была уязвимость CRLF.

Спойлер

В тот момент я видел там только CRLF, поэтому снова полез в гугл, а заодно и во строенные инструменты браузера, чтобы понять, что происходит.

Если мы перейдем на страницу http://domen.com/installer.pl?action=xyz, и просмотрим заголовки запроса, то увидим в Content-Disposition почти тоже самое, что и в строке запроса:

crlf1.png

Только к нашему xyz добавляется расширение .html. Если попробуем добавить после xyz символы переноса строки и возврата коретки - \r\n\ - то получим немного другой ответ от сервера:

crlf2.png

\r\n в формате URL - %0D%0A

Это значит, что мы можем сами установить любые заголовки от имени сервера.

Чем может грозить, я выше приводил ссылку.

А что там внутри html?

crlf3.png

Наш текст помещается внутрь js-скрипта. Попробуем встроить туда свой код:

crlfxss3.png

Получилась XSS:

crlfxss2.png

Я, конечно, написал производителю ПО, но производитель ответил, что они скоро прекратят поддержку этой версии приложения, на том я и закончил )

otrs.png

А прежде, чем я сообщил об уязвимости компании, в BB которой я принимал участие, компания уже закрыла уязвимость своими силами, так что ничего я за это не получил. Только опыт ))

Всем пока.