1. Введение
В наше время растет популярность децентрализованных альтернатив современным подходам к маршрутизации трафика в вычислительных сетях (например, для обхода санкционных блокировок недружественных стран и анонимизации трафика). Одним из примеров такого подхода является Yggdrasil. Новые подходы обещают нам инновации, децентрализации и конечно же гарантии безопасности. Но так ли это на самом деле? И хотя многие опытные пользователи и так знают о проблемах безопасности подобных сетей, мне бы хотелось подсветить их сильнее на одном конкретном примере, не претендуя на звание создателя rocket science.
ПРЕДУПРЕЖДЕНИЕ. Все совпадения вымышлены. Автор не ставил своей целью просканировать весь Yggdrasil и проэксплуатировать все уязвимости безопасности.
2. Немного теории
Сперва разберемся с терминологией. Существует несколько фундаментальных типов сетей:
Централизованные (centralized) - один центр и одна точка управления;
Децентрализованные (Decentralized) - единого центра нет;
Распределенные (Distributed) - узлы могут существовать независимо.
Yggdrasil является представителем децентрализованных сетей. Про плюсы и минусы Yggdrasil уже написано множество статей, приведенных ниже:
Как видно, технология предлагает множество преимуществ. Казалось бы, что могло пойти не так? Давайте разбираться.
3. Безопасность Yggdrasil де-факто
3.1 Принцип построение карты соседей
Протокол Yggdrasil использует выделенную подсеть IPv6 адресов с маской сети 200::/7. Меня, как пентестера, сейчас не особо интересует процесс маршрутизации в сети, поэтому пойдем дальше.
Ниже скриншот из оффициальной wiki страницы проекта. Можно собрать (crawl) все узлы сети в удобный списочек:
В сети Yggdrasil используется протокол DHT (Distributed Hash Table) для поиска соседей. Можно построить целую карту сети и визуализировать её:
Следовательно, существует реальная возможность получения всех доступных IPv6 адресов участников сети. Это нам пригодится.
3.2 Краулинг сети
Грамотные люди уже написали краулеры сети Yggdrasil на Go и Python для построения карты сети. Раньше они работали стабильно и выдавали IPv6 адреса, но теперь выдают публичные ключи. Я нашел готовый сервис внутри Yggdrasil сети (скриншот выше) по адресу http://[316:c51a:62a3:8b9::2]/
Воспользуемся наработками и скачаем актуальный список узлов Yggdrasil c вышеупомятой карты (можно выкачать по прямой ссылке json файл :)). Получили 4831 адрес со всей сети.
Выше, с помощью инструмента jq распарсили json файл и извлекли ipv6 адреса узлов Yggdrasil и поместили в файлик ipv6-addr-list.txt.
В привычных нам IPv4 и IPv6 интернетах лучшей практикой считается настройка межсетевого экрана для ограничения внешних подключений. Вместе с поднятием службы Yggdrasil поднимается и tun0 интерфейс (виртуальный интерфейс для маршрутизации, как VPN) с IPv6 адресом:
Действительно, получается так, что при подключении к сети Yggdrasil все пользователи помещаются в одну большую виртуальную частную сеть (a.k.a. VPN). И все локальные службы на узлах становятся доступны на tun0 интерфейсе, то есть доступны всем участникам Yggdrasil сети. И, если в привычных нам сетях сетях, внутреннюю инфраструктуру обычно защищает маршрутизатор и технология NAT (Network Address Translation), то в Yggdrasil NAT отсутствует как класс!
В Yggdrasil подключение осуществляется «напрямую» (Peer-to-peer):
Но в официальных руководствах по настройке я не увидел надписи: “ПОЖАЛУЙСТА, НАСТРОЙТЕ МЕЖСЕТЕВОЙ ЭКРАН СРАЗУ”. И тут мне закралась мысль: если я спокойно могу ходить по IPv6 адресам Yggdrasil на WEB, то какие еще порты могут быть открыты?
Вспоминаем классику мемов.
Приветствовать. Я простой русский пентестер CuriV из города Пермь. Смотреть на карта Yggdrasil, много хостов мало файрволов.
Сперва поглядим открытый 80 порт с помощью nmap, с поддержкой IPv6 адресов и отключенной проверкой доступности:
Получаем примерно 900 узлов с открытым 80 портом. Неплохо.
Теперь попробуем пройтись с найденным узлам с помощью Aquatone (сформируем скриншоты web-страниц). Перенаправляем содержимое ранее полученного с помощью nmap .xml файла.
Aquatone не умеет по умолчанию ходить по IPv6, а я не хотел писать форк. Поэтому в качестве Proof Of Concept я обрамил IPv6 адреса в XML файле в квадратные скобки [ ] руками с помощью VIM.
Написал макрос:
Идем в начало строки;
Ищем первое вхождение двойной кавычки;
Пишем [;
Снова ищем первое вхождение двойной кавычки;
Пишем ];
Записываем макрос и применяем его с помощью такой конструкции :g/ipv6/norm @q
- к каждой строчке, содержащей вхождение «ipv6» применяется записанный ранее макрос. И происходит магия. В итоге все ipv6 адреса обрамлены квадратными скобочками как надо.
Теперь, инструмент Aquatone работает как надо и мы начали получать скриншоты страниц:
В нашем эксперименте получили 593 скриншотов WEB-приложений на 80 порту.
Но, что если рассмотреть другой популярный протокол. Например, SMB. Вы удивитесь.
К сожалению, здесь присуще все проблемы SMB протокола и его старых версий, также имеются и сетевые шары с анонимным доступом на чтение и запись. Другие порты я смотреть не стал, исчерпать все уязвимости не было целью моего исследования.
4. Курьезный случай
Владелец ресурса был предупрежден. Уязвимость закрыта, благодарность получена.
На одном из узлов нашелся вот такой WEB-ресурс с коллекцией каких-то файлов:
На другом порту находилась WEB-морда торрент клиента Transmission без аутентификации, то есть можно было поставить закачку любого торрент клиента. Иных способов обратить внимание на брешь в безопасности у меня не было. Поэтому я залил шуточную картинку с говорящим названием:
Кстати, вот так выглядела сама картинка. Тоже говорила сама о себе:
Спустя пару минут на мой залитый торрент отстучался IPv4 адрес из интернета. Проверив скачанные торренты на общеизвестном ресурсе IKnowWhatYouDownload, я понял, что IP-адрес был определен верно:
Спустя несколько дней владелец адреса сам вышел на связь :)
Вместо заключения
Сложно назвать отсутствующий межсетевой экран уязвимостью самого Yggdrasil. То же самое происходит с возможностью сканирования открытых портов в интернете, является возможностью протоколов TCP/IP by design.
Из-за невнимательности пользователей и отсутствующих настроек классических инструментов безопасности типа межсетевого экрана, через Yggdrasil для сканирования становятся доступны узлы во внутренней сети пользователя, злоумышленник легко проходит периметр и попадает во внутрь, получая доступ к чувствительным ресурсам из-за P2P природы работы самого протокола.
И получается, что пользователь надеется, что безопасный Yggdrasil его защитит, а в результате оказывается даже в более уязвимом положении, чем те, кто не думает о безопасности и взаимодействуют с интернетом в режиме «по умолчанию». И даже предупреждение большими красными буквами о необходимости ручной настройки межсетевого экрана не спасет нас от «человеческого фактора», ведь кто-то не станет его читать. Возможно блокировка внешних подключений по умолчанию (как это сделано в Tor Hidden Services) будет неплохим шагом в повышении безопасности системы.
Мораль всей статьи: не избегайте использования простых и очевидных инструментов - настраивайте межсетевые экраны и спите спокойно.
На правах автора статьи, оставлю полезные ссылки на свой телеграм-блог PathSecure и блог кооператива RAD COP.
Комментарии (13)
uuger
03.11.2023 14:09например, для обхода санкционных блокировок недружественных стран и анонимизации трафика
А зачем потреблять контент из недружественных стран, если он такой расово неверный? Наоборот же, отгораживаться надо, чтобы враги не достали.
enamchuk
03.11.2023 14:09+6Месяц назад (или около того) заметил в логах Apache попытки подключиться с неизвестного yggdrasil-адреса и попытки сканирования.
Про настройку файрволла для Yggdrasil тоже иногда забывал, т.к. раньше считал, что подобный адрес вряд ли кто сможет узнать (пользователей мало, а адресов - много).
Больше не забываю :-)
Самим yggdrasil пользуюсь регулярно, на всех своих домашних серверах и компьютерах установлен. Даже SIP-транк успешно работает.
pvsur
03.11.2023 14:09Там в самой игдрасилевой конфигурашке вроде можно указать список ключей, который может к вам подключаться... А вот фаерволл в винде это конечно жесть ...
И кстати, вышла новая версия 0.5 без dht вроде
pvsur
03.11.2023 14:09+1Проверил белый список ключей - не работает, или я неправильно его понял...
Сеть yggdrasil в win10 по-умолчанию рассматривается как общественная сеть и брандмауер блокирует все входящие, только что у себя проверил.
enamchuk
03.11.2023 14:09+1Список ключей ограничивает подключение к вашему серверу, который взаимодействует с другими серверами для обмена yggdrasil-траффиком.
Но это не ограничивает доступ с адресов 200::/7, и если ваш клиент имеет связность с "большой" сетью yggdrasil, то и ваш адрес (и ресурсы) будут доступны всем членам сети.
Если я верно понял ваш вопрос.
RichardBlanck
03.11.2023 14:09+2Во-первых, явное указание на то, что Yggdrasil -- это одна сеть и нужен межсетевой экран, имеется в документации.
Во-вторых, IKnowWhatYouDownload - это немного смешно.В целом: где тут пентест? Кто что выставил штатным образом, то и видно. Не выставленное - не видно.
(Надеюсь, Вы просмотрели скриншоты и мой хомяк Вам понравился.)
dvrpd
03.11.2023 14:09+4>В сети Yggdrasil используется протокол DHT (Distributed Hash Table) для поиска соседей
В недавно вышедшем 0.5 заменили на фильтры Блума с CRDT, что заодно сломало подключение к пирам 0.4. По крайней мере, адреса остались те же, в отличие от перехода с 0.3 на 0.4.
У самого Yggdrasil настроен на роутере (OPNsense), адреса с маршрутами раздаются оттуда же через radvd, как и обычный IPv6. Фаерволл настроен аналогичным образом, чтобы не пропускать входящий трафик в домашнюю подсеть.
13werwolf13
03.11.2023 14:09+1У самого Yggdrasil настроен на роутере (OPNsense), адреса с маршрутами раздаются оттуда же через radvd, как и обычный IPv6.
между прочем сие уже повод для написания небольшой статьи, и как инструкции по настройке, и как небольшой "ответ" на эту статью
MAXH0
Спасибо вам за работу...
Проблема в том, что конечный пользователь не обладает должными компетенциями, а люди компетентные берут за работу денюжку. И мало коробочных решений для конечного пользователя.
Ну вот не все понимают, что поднять узел Yggdrasil все равно что админить свой сервер без прикрытия провайдера.
dartraiden
Вроде, даже на серверах порты по умолчанию закрыты после установки ОС.
MiraclePtr
в Debian точно нет.