1. Введение

В наше время растет популярность децентрализованных альтернатив современным подходам к маршрутизации трафика в вычислительных сетях (например, для обхода санкционных блокировок недружественных стран и анонимизации трафика). Одним из примеров такого подхода является Yggdrasil. Новые подходы обещают нам инновации, децентрализации и конечно же гарантии безопасности. Но так ли это на самом деле? И хотя многие опытные пользователи и так знают о проблемах безопасности подобных сетей, мне бы хотелось подсветить их сильнее на одном конкретном примере, не претендуя на звание создателя rocket science.

ПРЕДУПРЕЖДЕНИЕ. Все совпадения вымышлены. Автор не ставил своей целью просканировать весь Yggdrasil и проэксплуатировать все уязвимости безопасности.

2. Немного теории

Сперва разберемся с терминологией. Существует несколько фундаментальных типов сетей:

  • Централизованные (centralized) - один центр и одна точка управления;

  • Децентрализованные (Decentralized) - единого центра нет;

  • Распределенные (Distributed) - узлы могут существовать независимо.

Графическое отображение топологии сетей
Графическое отображение топологии сетей

Yggdrasil является представителем децентрализованных сетей. Про плюсы и минусы Yggdrasil уже написано множество статей, приведенных ниже:

  1. Yggdrasil Network: Заря бытовых меш-сетей, или Интернет будущего;

  2. Новый виток развития Yggdrasil;

  3. Криптографическое образование адреса IPv6 в Yggdrasil;

  4. Yggdrasil Network.

Скриншот с официального сайта Yggdrasil
Скриншот с официального сайта Yggdrasil

Как видно, технология предлагает множество преимуществ. Казалось бы, что могло пойти не так? Давайте разбираться.

3. Безопасность Yggdrasil де-факто

3.1 Принцип построение карты соседей

Протокол Yggdrasil использует выделенную подсеть IPv6 адресов с маской сети 200::/7. Меня, как пентестера, сейчас не особо интересует процесс маршрутизации в сети, поэтому пойдем дальше.

Ниже скриншот из оффициальной wiki страницы проекта. Можно собрать (crawl) все узлы сети в удобный списочек:

Подтверждение возможности сбора узлов в сети
Подтверждение возможности сбора узлов в сети

В сети Yggdrasil используется протокол DHT (Distributed Hash Table) для поиска соседей. Можно построить целую карту сети и визуализировать её:

Публичная карта сети Yggdrasil
Публичная карта сети Yggdrasil

Следовательно, существует реальная возможность получения всех доступных IPv6 адресов участников сети. Это нам пригодится.

3.2 Краулинг сети

Грамотные люди уже написали краулеры сети Yggdrasil на Go и Python для построения карты сети. Раньше они работали стабильно и выдавали IPv6 адреса, но теперь выдают публичные ключи. Я нашел готовый сервис внутри Yggdrasil сети (скриншот выше) по адресу http://[316:c51a:62a3:8b9::2]/

Сервис предлагает возможность скачать все узлы Yggdrasil
Сервис предлагает возможность скачать все узлы Yggdrasil

Воспользуемся наработками и скачаем актуальный список узлов Yggdrasil c вышеупомятой карты (можно выкачать по прямой ссылке json файл :)). Получили 4831 адрес со всей сети.

Список ipv6 адресов узлов сети Yggdrasil
Список ipv6 адресов узлов сети Yggdrasil

Выше, с помощью инструмента jq распарсили json файл и извлекли ipv6 адреса узлов Yggdrasil и поместили в файлик ipv6-addr-list.txt.

В привычных нам IPv4 и IPv6 интернетах лучшей практикой считается настройка межсетевого экрана для ограничения внешних подключений. Вместе с поднятием службы Yggdrasil поднимается и tun0 интерфейс (виртуальный интерфейс для маршрутизации, как VPN) с IPv6 адресом:

Системный интерфейс tun0 с IPv6 адресом сети Yggdrasil
Системный интерфейс tun0 с IPv6 адресом сети Yggdrasil

Действительно, получается так, что при подключении к сети Yggdrasil все пользователи помещаются в одну большую виртуальную частную сеть (a.k.a.  VPN). И все локальные службы на узлах становятся доступны на tun0 интерфейсе, то есть доступны всем участникам Yggdrasil сети. И, если в привычных нам сетях сетях, внутреннюю инфраструктуру обычно защищает маршрутизатор и технология NAT (Network Address Translation), то в Yggdrasil NAT отсутствует как класс!

Небольшая графическая шпаргалка как работает механизм NAT. Маршрутизатор находится на границе сети и выступает посредником между локальной и внешней сетью. В частности, ограничивает подключения из вне с помощью межсетевого экрана.
Небольшая графическая шпаргалка как работает механизм NAT. Маршрутизатор находится на границе сети и выступает посредником между локальной и внешней сетью. В частности, ограничивает подключения из вне с помощью межсетевого экрана.

В Yggdrasil подключение осуществляется «напрямую» (Peer-to-peer):

Вольная графическая иллюстрация работы сети Yggdrasil. Две разных сети (красная и зеленая) логически объединяются в одну (синюю) через внешний интернет.
Вольная графическая иллюстрация работы сети Yggdrasil. Две разных сети (красная и зеленая) логически объединяются в одну (синюю) через внешний интернет.

Но в официальных руководствах по настройке я не увидел надписи: “ПОЖАЛУЙСТА, НАСТРОЙТЕ МЕЖСЕТЕВОЙ ЭКРАН СРАЗУ”. И тут мне закралась мысль: если я спокойно могу ходить по IPv6 адресам Yggdrasil на WEB, то какие еще порты могут быть открыты?

Вспоминаем классику мемов.

Приветствовать. Я простой русский пентестер CuriV из города Пермь. Смотреть на карта Yggdrasil, много хостов мало файрволов.

Сперва поглядим открытый 80 порт с помощью nmap, с поддержкой IPv6 адресов и отключенной проверкой доступности:

Проверка доступности порта 80/tcp
Проверка доступности порта 80/tcp

Получаем примерно 900 узлов с открытым 80 портом. Неплохо.

Извлекаем строку "80/open" из результатов работы nmap
Извлекаем строку "80/open" из результатов работы nmap

Теперь попробуем пройтись с найденным узлам с помощью Aquatone (сформируем скриншоты web-страниц). Перенаправляем содержимое ранее полученного с помощью nmap .xml файла.

Упс, столкнулись с ошибкой. URL для IPv6 адресов должен содержать в себе [..]
Упс, столкнулись с ошибкой. URL для IPv6 адресов должен содержать в себе [..]

Aquatone не умеет по умолчанию ходить по IPv6, а я не хотел писать форк. Поэтому в качестве Proof Of Concept я обрамил IPv6 адреса в XML файле в квадратные скобки [ ] руками с помощью VIM.

Написал макрос:

  1.  Идем в начало строки;

  2. Ищем первое вхождение двойной кавычки;

  3. Пишем [;

  4. Снова ищем первое вхождение двойной кавычки;

  5. Пишем ];

Таким образом выглядит IPv6 адрес с открытым 80 портом в .xml файле
Таким образом выглядит IPv6 адрес с открытым 80 портом в .xml файле

Записываем макрос и применяем его с помощью такой конструкции :g/ipv6/norm @q - к каждой строчке, содержащей вхождение «ipv6» применяется записанный ранее макрос. И происходит магия. В итоге все ipv6 адреса обрамлены квадратными скобочками как надо.

Модифицированный с помощью макроса файл. Теперь URL выглядит как надо.
Модифицированный с помощью макроса файл. Теперь URL выглядит как надо.

Теперь, инструмент Aquatone работает как надо и мы начали получать скриншоты страниц:

Успешное выполнение работы инстурмента
Успешное выполнение работы инстурмента

В нашем эксперименте получили 593 скриншотов WEB-приложений на 80 порту.

Но, что если рассмотреть другой популярный протокол. Например, SMB. Вы удивитесь.

Успешное подключение к машинам по SMB протоколу внутри сети Yggdrasil
Успешное подключение к машинам по SMB протоколу внутри сети Yggdrasil

К сожалению, здесь присуще все проблемы SMB протокола и его старых версий, также имеются и сетевые шары с анонимным доступом на чтение и запись. Другие порты я смотреть не стал, исчерпать все уязвимости не было целью моего исследования.

4. Курьезный случай

Владелец ресурса был предупрежден. Уязвимость закрыта, благодарность получена.

На одном из узлов нашелся вот такой WEB-ресурс с коллекцией каких-то файлов:

На другом порту находилась WEB-морда торрент клиента Transmission без аутентификации, то есть можно было поставить закачку любого торрент клиента. Иных способов обратить внимание на брешь в безопасности у меня не было. Поэтому я залил шуточную картинку с говорящим названием:

Торрент файл был добавлен по magnet-ссылке через web-интерфейс
Торрент файл был добавлен по magnet-ссылке через web-интерфейс

Кстати, вот так выглядела сама картинка. Тоже говорила сама о себе:

Никакого хака, только этичный пентест
Никакого хака, только этичный пентест

Спустя пару минут на мой залитый торрент отстучался IPv4 адрес из интернета. Проверив скачанные торренты на общеизвестном ресурсе IKnowWhatYouDownload, я понял, что IP-адрес был определен верно:

Список скачанных торрентов с IP-адреса
Список скачанных торрентов с IP-адреса

Спустя несколько дней владелец адреса сам вышел на связь :)

Сообщение в одном из чатиков
Сообщение в одном из чатиков

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

Сложно назвать отсутствующий межсетевой экран уязвимостью самого Yggdrasil. То же самое происходит с возможностью сканирования открытых портов в интернете, является возможностью протоколов TCP/IP by design.

Из-за невнимательности пользователей и отсутствующих настроек классических инструментов безопасности типа межсетевого экрана, через Yggdrasil для сканирования становятся доступны узлы во внутренней сети пользователя, злоумышленник легко проходит периметр и попадает во внутрь, получая доступ к чувствительным ресурсам из-за P2P природы работы самого протокола.

И получается, что пользователь надеется, что безопасный Yggdrasil его защитит, а в результате оказывается даже в более уязвимом положении, чем те, кто не думает о безопасности и взаимодействуют с интернетом в режиме «по умолчанию». И даже предупреждение большими красными буквами о необходимости ручной настройки межсетевого экрана не спасет нас от «человеческого фактора», ведь кто-то не станет его читать. Возможно блокировка внешних подключений по умолчанию (как это сделано в Tor Hidden Services) будет неплохим шагом в повышении безопасности системы.

Мораль всей статьи: не избегайте использования простых и очевидных инструментов - настраивайте межсетевые экраны и спите спокойно.

На правах автора статьи, оставлю полезные ссылки на свой телеграм-блог PathSecure и блог кооператива RAD COP.

Комментарии (13)


  1. MAXH0
    03.11.2023 14:09
    +1

    Спасибо вам за работу...

    Проблема в том, что конечный пользователь не обладает должными компетенциями, а люди компетентные берут за работу денюжку. И мало коробочных решений для конечного пользователя.

    Ну вот не все понимают, что поднять узел Yggdrasil все равно что админить свой сервер без прикрытия провайдера.


    1. dartraiden
      03.11.2023 14:09

      Ну вот не все понимают, что поднять узел Yggdrasil все равно что админить свой сервер без прикрытия провайдера.

      Вроде, даже на серверах порты по умолчанию закрыты после установки ОС.


      1. MiraclePtr
        03.11.2023 14:09
        +1

        в Debian точно нет.


  1. uuger
    03.11.2023 14:09

    например, для обхода санкционных блокировок недружественных стран и анонимизации трафика

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


    1. enamchuk
      03.11.2023 14:09
      +6

      Месяц назад (или около того) заметил в логах Apache попытки подключиться с неизвестного yggdrasil-адреса и попытки сканирования.
      Про настройку файрволла для Yggdrasil тоже иногда забывал, т.к. раньше считал, что подобный адрес вряд ли кто сможет узнать (пользователей мало, а адресов - много).
      Больше не забываю :-)
      Самим yggdrasil пользуюсь регулярно, на всех своих домашних серверах и компьютерах установлен. Даже SIP-транк успешно работает.


  1. pvsur
    03.11.2023 14:09

    Там в самой игдрасилевой конфигурашке вроде можно указать список ключей, который может к вам подключаться... А вот фаерволл в винде это конечно жесть ...

    И кстати, вышла новая версия 0.5 без dht вроде


    1. pvsur
      03.11.2023 14:09
      +1

      Проверил белый список ключей - не работает, или я неправильно его понял...

      Сеть yggdrasil в win10 по-умолчанию рассматривается как общественная сеть и брандмауер блокирует все входящие, только что у себя проверил.


      1. enamchuk
        03.11.2023 14:09
        +1

        Список ключей ограничивает подключение к вашему серверу, который взаимодействует с другими серверами для обмена yggdrasil-траффиком.
        Но это не ограничивает доступ с адресов 200::/7, и если ваш клиент имеет связность с "большой" сетью yggdrasil, то и ваш адрес (и ресурсы) будут доступны всем членам сети.
        Если я верно понял ваш вопрос.


        1. pvsur
          03.11.2023 14:09

          Вы правы, скорее всего.


  1. RichardBlanck
    03.11.2023 14:09
    +2

    Во-первых, явное указание на то, что Yggdrasil -- это одна сеть и нужен межсетевой экран, имеется в документации.
    Во-вторых, IKnowWhatYouDownload - это немного смешно.

    В целом: где тут пентест? Кто что выставил штатным образом, то и видно. Не выставленное - не видно.
    (Надеюсь, Вы просмотрели скриншоты и мой хомяк Вам понравился.)


  1. 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. Фаерволл настроен аналогичным образом, чтобы не пропускать входящий трафик в домашнюю подсеть.


    1. 13werwolf13
      03.11.2023 14:09
      +1

      У самого Yggdrasil настроен на роутере (OPNsense), адреса с маршрутами раздаются оттуда же через radvd, как и обычный IPv6.

      между прочем сие уже повод для написания небольшой статьи, и как инструкции по настройке, и как небольшой "ответ" на эту статью


      1. typ6o0jiehb
        03.11.2023 14:09

        статью по использованию radvd ? там же все просто.