
PolarDNS — это специализированный авторитативный DNS-сервер, подходящий для тестирования на проникновение и исследования уязвимостей.
PolarDNS — это специализированный авторитативный DNS-сервер, написанный на Python 3.x, изначально разработанный как инструмент для тестирования безопасности DNS-резолверов со стороны сервера.
_
PolarDNS можно использовать для тестирования:
Он поддерживает как UDP, так и TCP протоколы, и предоставляет оператору полный контроль над уровнем протокола DNS.
Сервер PolarDNS может создавать множество нестандартных и несоответствующих спецификациям DNS-ответов, ответов, нарушающих RFC, включая крайне аномальные и искажённые DNS-ответы.
Это может быть полезно для:
Доступны три способа установки PolarDNS.
PolarDNS требует Python 3.11 или новее и не имеет дополнительных зависимостей.
Это самый простой способ установить и запустить PolarDNS:
pip install polardns
polardns
Вы также можете склонировать репозиторий и запустить PolarDNS напрямую:
git clone https://github.com/oryxlabs/PolarDNS.git
cd PolarDNS
python polardns.py
Этот способ рекомендуется, если вы планируете отлаживать или изменять код, либо добавлять новые функции.
Вы также можете запустить PolarDNS в Docker-контейнере:
docker run -p 53:53/tcp -p 53:53/udp oryxlabs/polardns
Сервер PolarDNS настраивается через файл конфигурации polardns/polardns.toml.
При запуске PolarDNS вы должны увидеть вывод, похожий на следующий:
python polardns.py
1741599804.9039893 | PolarDNS v1.6.1 server starting up
1741599804.9039893 | Using '/path/to/your/polardns/polardns.toml' config file
1741599804.9039893 | Starting listener at tcp://0.0.0.0:53
1741599804.9039893 | Starting listener at udp://0.0.0.0:53
Это означает, что сервер запущен и работает.
По умолчанию сервер начинает прослушивание всех интерфейсов на UDP и TCP порту 53 (0.0.0.0:53), готовый отвечать на DNS-запросы.
Вы можете проверить его локально, задав следующий тестовый запрос, который всегда должен разрешаться во что-то.
Запрос в режиме UDP:
dig always.yourdomain.com @127.0.0.1
Запрос в режиме TCP:
dig always.yourdomain.com @127.0.0.1 +tcp
Вы должны получить запись A с IP-адресом 2.3.4.5, как на этом скриншоте:
Это означает, что сервер работает корректно.
Запрашивая у сервера PolarDNS разрешение чего-либо, вы фактически даёте ему инструкции, как он должен вам ответить. Это означает, что вы (клиент) диктуете серверу PolarDNS, какой именно ответ он должен для вас сгенерировать.
Например, рассмотрим следующий запрос:
dig always.ttl2000000000.slp1500.yourdomain.com @127.0.0.1
Вы снова должны получить запись A с IP-адресом 2.3.4.5, но на этот раз со значением TTL 2 000 000 000 (63,4 года) и после задержки в 1,5 секунды:
В приведённом выше примере мы использовали базовую функцию always (которая всегда разрешается во что-то) и объединили её с модификатором ttl для настройки значения TTL и модификатором slp для ожидания перед отправкой ответа.
PolarDNS имеет следующие основные функциональные возможности:
В настоящее время реализовано более 70 различных функций и 19 модификаторов ответов. Используя разные функции и комбинируя их с различными модификаторами ответов, можно создать бесчисленное множество вариантов ответа.
Смотрите прилагаемый каталог всех реализованных функций и модификаторов ответов.
Это даёт PolarDNS возможность создавать крайне необычные, аномальные и даже искажённые DNS-ответы, позволяя оператору увидеть, как принимающая сторона обрабатывает такие ситуации и насколько она технически устойчива и зрела.
Некоторые примеры DNS-ответов, которые может генерировать PolarDNS, включают:
Это может привести к обнаружению различных уязвимостей, таких как:
Смотрите презентации BlackHat MEA 2023 (включая слайды BONUS) для получения более подробной информации, дополнительных примеров и сценариев использования.
Вот общий обзор того, что вам нужно для начала тестирования рекурсивных DNS-серверов.
example123.com, у вашего любимого регистратора доменов.polardns/polardns.toml на каждом экземпляре, изменив имя вашего домена и IP-адреса серверов имён соответствующим образом — одинаковая конфигурация на обоих.Теперь ваша инфраструктура готова для тестирования любого рекурсивного DNS-резолвера по вашему выбору.
Чтобы начать тестирование целевого рекурсивного DNS-резолвера, вы должны направлять запросы целевому DNS-резолверу, например:
dig always.example123.com @<TARGET-RESOLVER-IP>
Например, для тестирования публичного DNS CloudFlare:
dig always.example123.com @1.1.1.1
Во время разрешения целевой DNS-резолвер свяжется с вашими авторитативными серверами имён PolarDNS (управляющими вашим тестовым доменом example123.com), чтобы разрешить запрос.
Один из ваших серверов PolarDNS ответит целевому DNS-резолверу. Резолвер получит, разберёт и обработает ответ от PolarDNS. После этого он вернёт окончательный ответ вам (клиенту).
Вот визуальное представление процесса тестирования:

Давая DNS-резолверу инструкции разрешать различные поддомены вашего домена example123.com, вы можете эффективно тестировать поведение DNS-резолвера и наблюдать, как он обрабатывает различные неожиданные ситуации (ответы).
Например, как он справляется с ситуацией, когда получает искажённый DNS-ответ, ответ с вставленной записью или запись, содержащую недопустимые символы, и какой ответ он в конечном итоге отправляет вам, клиенту?
PolarDNS может быть интегрирован с различными DNS-резолверами для запуска комплексного набора сквозных (E2E) тестов DNS-серверов.
Эта интеграция осуществляется с помощью GitHub Actions, при этом эталонные шаблоны (рабочие процессы) в настоящее время доступны для следующих шести DNS-резолверов:
Когда GitHub Action запускается (например, при коммите или вручную), рабочие процессы выполняют следующие шаги:
Чтобы добавить свои собственные E2E-тесты, просто поместите их в каталог test-e2e/.
Ищете полнофункциональный набор E2E-тестов DNS-сервера? Свяжитесь с [email protected].
Добавление новых функций в PolarDNS необходимо для обнаружения действительно новых проблем DNS. И с PolarDNS вы можете сделать это относительно легко.
PolarDNS позволяет быстро добавить новую функцию, опробовать свои идеи или разработать PoC без необходимости создавать собственный DNS-сервер. Всё, что вам нужно, — это умение понимать код Python и любопытство экспериментировать с протоколом DNS.
Существует подробное пошаговое руководство по внесению вклада, которое поможет вам начать. Там вы найдёте не только информацию о добавлении новых функций, но и о том, как отлаживать PolarDNS, отправлять вопросы, делиться идеями и многое другое.
Вот несколько отличных ресурсов, которые полезны при работе с PolarDNS.
Ссылки, связанные с протоколом DNS:
DNS-серверы:
Спасибо всем, кто внёс вклад в PolarDNS! ❤️