Yggdrasil-mesh глазами пентестера
1. Введение
В наше время растет популярность децентрализованных альтернатив современным подходам к маршрутизации трафика в вычислительных сетях (например, для обхода санкционных блокировок недружественных стран и анонимизации трафика). Одним из примеров такого подхода является Yggdrasil. Новые подходы обещают нам инновации, децентрализации и конечно же гарантии безопасности. Но так ли это на самом деле? И хотя многие опытные пользователи и так знают о проблемах безопасности подобных сетей, мне бы хотелось подсветить их сильнее на одном конкретном примере, не претендуя на звание создателя rocket science.
ПРЕДУПРЕЖДЕНИЕ. Все совпадения вымышлены. Автор не ставил своей целью просканировать весь Yggdrasil и проэксплуатировать все уязвимости безопасности.
2. Немного теории
Сперва разберемся с терминологией. Существует несколько фундаментальных типов сетей:
Централизованные (centralized) — один центр и одна точка управления;
Децентрализованные (Decentralized) — единого центра нет;
Распределенные (Distributed) — узлы могут существовать независимо.
Графическое отображение топологии сетей
Yggdrasil является представителем децентрализованных сетей. Про плюсы и минусы Yggdrasil уже написано множество статей, приведенных ниже:
1. https://habr.com/ru/articles/547250/;
2. https://habr.com/ru/articles/701200/;
3. https://habr.com/ru/articles/546034/;
4. https://yggdrasil-network.github.io/ .
Скриншот с официального сайта Yggdrasil
Как видно, технология предлагает множество преимуществ. Казалось бы, что могло пойти не так? Давайте разбираться.
3. Безопасность Yggdrasil де-факто
3.1 Принцип построение карты соседей
Протокол Yggdrasil использует выделенную подсеть IPv6 адресов с маской сети 200::/7. Меня, как пентестера, сейчас не особо интересует процесс маршрутизации в сети, поэтому пойдем дальше.
Ниже скриншот из оффициальной wiki страницы проекта. Можно собрать (crawl) все узлы сети в удобный списочек:
Подтверждение возможности сбора узлов в сети
В сети Yggdrasil используется протокол DHT (Distributed Hash Table) для поиска соседей. Можно построить целую карту сети и визуализировать её:
Публичная карта сети Yggdrasil
Следовательно, существует реальная возможность получения всех доступных IPv6 адресов участников сети. Это нам пригодится.
3.2 Краулинг сети
Грамотные люди уже написали краулеры сети Yggdrasil на Go и Python для построения карты сети. Раньше они работали стабильно и выдавали IPv6 адреса, но теперь выдают публичные ключи. Я нашел готовый сервис внутри Yggdrasil сети (скриншот выше) по адресу http://[316: c51a:62a3:8b9::2]/
Сервис предлагает возможность скачать все узлы Yggdrasil
Воспользуемся наработками и скачаем актуальный список узлов Yggdrasil c вышеупомятой карты (можно выкачать по прямой ссылке json файл :)). Получили 4831 адрес со всей сети.
Список ipv6 адресов узлов сети Yggdrasil
Выше, с помощью инструмента jq распарсили json файл и извлекли ipv6 адреса узлов Yggdrasil и поместили в файлик ipv6-addr-list.txt.
В привычных нам IPv4 и IPv6 интернетах лучшей практикой считается настройка межсетевого экрана для ограничения внешних подключений. Вместе с поднятием службы Yggdrasil поднимается и tun0 интерфейс (виртуальный интерфейс для маршрутизации, как VPN) с IPv6 адресом:
Системный интерфейс tun0 с IPv6 адресом сети Yggdrasil
Действительно, получается так, что при подключении к сети Yggdrasil все пользователи помещаются в одну большую виртуальную частную сеть (a.k.a. VPN). И все локальные службы на узлах становятся доступны на tun0 интерфейсе, то есть доступны всем участникам Yggdrasil сети. И, если в привычных нам сетях сетях, внутреннюю инфраструктуру обычно защищает маршрутизатор и технология NAT (Network Address Translation), то в Yggdrasil NAT отсутствует как класс!
Небольшая графическая шпаргалка как работает механизм NAT. Маршрутизатор находится на границе сети и выступает посредником между локальной и внешней сетью. В частности, ограничивает подключения из вне с помощью межсетевого экрана.
В Yggdrasil подключение осуществляется «напрямую» (Peer-to-peer):
Вольная графическая иллюстрация работы сети Yggdrasil. Две разных сети (красная и зеленая) логически объединяются в одну (синюю) через внешний интернет.
Но в официальных руководствах по настройке я не увидел надписи: «ПОЖАЛУЙСТА, НАСТРОЙТЕ МЕЖСЕТЕВОЙ ЭКРАН СРАЗУ». И тут мне закралась мысль: если я спокойно могу ходить по IPv6 адресам Yggdrasil на WEB, то какие еще порты могут быть открыты?
Вспоминаем классику мемов.
Приветствовать. Я простой русский пентестер CuriV из города Пермь. Смотреть на карта Yggdrasil, много хостов мало файрволов.
Сперва поглядим открытый 80 порт с помощью nmap, с поддержкой IPv6 адресов и отключенной проверкой доступности:
Проверка доступности порта 80/tcp
Получаем примерно 900 узлов с открытым 80 портом. Неплохо.
Извлекаем строку »80/open» из результатов работы nmap
Теперь попробуем пройтись с найденным узлам с помощью Aquatone (сформируем скриншоты web-страниц). Перенаправляем содержимое ранее полученного с помощью nmap .xml файла.
Упс, столкнулись с ошибкой. URL для IPv6 адресов должен содержать в себе […]
Aquatone не умеет по умолчанию ходить по IPv6, а я не хотел писать форк. Поэтому в качестве Proof Of Concept я обрамил IPv6 адреса в XML файле в квадратные скобки [ ] руками с помощью VIM.
Написал макрос:
Идем в начало строки;
Ищем первое вхождение двойной кавычки;
Пишем [;
Снова ищем первое вхождение двойной кавычки;
Пишем ];
Таким образом выглядит IPv6 адрес с открытым 80 портом в .xml файле
Записываем макрос и применяем его с помощью такой конструкции :g/ipv6/norm @q
— к каждой строчке, содержащей вхождение «ipv6» применяется записанный ранее макрос. И происходит магия. В итоге все ipv6 адреса обрамлены квадратными скобочками как надо.
Модифицированный с помощью макроса файл. Теперь URL выглядит как надо.
Теперь, инструмент Aquatone работает как надо и мы начали получать скриншоты страниц:
Успешное выполнение работы инстурмента
В нашем эксперименте получили 593 скриншотов WEB-приложений на 80 порту.
Но, что если рассмотреть другой популярный протокол. Например, SMB. Вы удивитесь.
Успешное подключение к машинам по SMB протоколу внутри сети Yggdrasil
К сожалению, здесь присуще все проблемы SMB протокола и его старых версий, также имеются и сетевые шары с анонимным доступом на чтение и запись. Другие порты я смотреть не стал, исчерпать все уязвимости не было целью моего исследования.
4. Курьезный случай
Владелец ресурса был предупрежден. Уязвимость закрыта, благодарность получена.
На одном из узлов нашелся вот такой WEB-ресурс с коллекцией каких-то файлов:
На другом порту находилась WEB-морда торрент клиента Transmission без аутентификации, то есть можно было поставить закачку любого торрент клиента. Иных способов обратить внимание на брешь в безопасности у меня не было. Поэтому я залил шуточную картинку с говорящим названием:
Торрент файл был добавлен по magnet-ссылке через web-интерфейс
Кстати, вот так выглядела сама картинка. Тоже говорила сама о себе:
Никакого хака, только этичный пентест
Спустя пару минут на мой залитый торрент отстучался IPv4 адрес из интернета. Проверив скачанные торренты на общеизвестном ресурсе IKnowWhatYouDownload, я понял, что IP-адрес был определен верно:
Список скачанных торрентов с IP-адреса
Спустя несколько дней владелец адреса сам вышел на связь :)
Сообщение в одном из чатиков
Вместо заключения
Сложно назвать отсутствующий межсетевой экран уязвимостью самого Yggdrasil. То же самое происходит с возможностью сканирования открытых портов в интернете, является возможностью протоколов TCP/IP by design.
Из-за невнимательности пользователей и отсутствующих настроек классических инструментов безопасности типа межсетевого экрана, через Yggdrasil для сканирования становятся доступны узлы во внутренней сети пользователя, злоумышленник легко проходит периметр и попадает во внутрь, получая доступ к чувствительным ресурсам из-за P2P природы работы самого протокола.
И получается, что пользователь надеется, что безопасный Yggdrasil его защитит, а в результате оказывается даже в более уязвимом положении, чем те, кто не думает о безопасности и взаимодействуют с интернетом в режиме «по умолчанию». И даже предупреждение большими красными буквами о необходимости ручной настройки межсетевого экрана не спасет нас от «человеческого фактора», ведь кто-то не станет его читать. Возможно блокировка внешних подключений по умолчанию (как это сделано в Tor Hidden Services) будет неплохим шагом в повышении безопасности системы.
Мораль всей статьи: не избегайте использования простых и очевидных инструментов — настраивайте межсетевые экраны и спите спокойно.