Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
zdns — Быстрая библиотека и CLI-утилита для поиска DNS | Kitploit
Инструменты/GitHubGitHub/zmap/zdns
РазведкаСбор информацииСетевая безопасностьУтилиты и фреймворкиАнализ DNS
GitHubzmap/zdns

zdns

Быстрая библиотека и CLI-утилита для поиска DNS

Репозиторий
1.1k1501 месяц назадПроверено Kitploit

Популярное

Смотреть все →

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

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

ZDNS

Go Report Card

ZDNS — это высокоскоростной DNS-резолвер и утилита командной строки для выполнения крупномасштабных DNS-измерений. ZDNS написан на Go и содержит собственный код рекурсивного разрешения и кэш, оптимизированный для выполнения запросов к разнообразному набору имен. Мы используем https://github.com/zmap/dns для создания и разбора сырых DNS-пакетов. Для получения дополнительной информации об архитектуре и производительности ZDNS ознакомьтесь со следующей статьей, представленной на конференции ACM Internet Measurement Conference '22.

[!TIP] ZDNS Wiki содержит дополнительную информацию о ZDNS, а также примеры использования и сценарии.

Установка

ZDNS можно установить, клонировав репозиторий и выполнив make install.

root@kitploit:~
git clone https://github.com/zmap/zdns.git
cd zdns
make install

Использование

ZDNS состоит из библиотеки рекурсивного разрешителя и CLI-обертки.

Библиотека состоит из структуры ResolverConfig, которая содержит все параметры конфигурации для всех выполняемых запросов. ResolverConfig используется для создания одной или нескольких структур Resolver, которые будут выполнять все запросы. Resolver должен выполнять только один запрос за раз (он не является потокобезопасным), а для параллелизма следует использовать несколько структур Resolver. Смотрите наши примеры по использованию библиотеки. Модули используются для определения поведения запросов.

ZDNS предоставляет несколько типов модулей:

  • Сырые DNS-модули предоставляют сырой DNS-ответ от сервера, аналогично dig, но в формате JSON. Существует модуль (почти) для каждого типа DNS-записи

  • Модули поиска предоставляют более полезные ответы, когда требуется несколько запросов (например, дополнительный A-запрос для IP-адресов, если получен NS в NSLOOKUP)

  • Прочие модули предоставляют другие дополнительные способы запроса серверов (например, bind.version)

Ниже мы описываем модули:

Сырые DNS-модули

Модули A, AAAA, AFSDB, ANY, ATMA, AVC, AXFR, BINDVERSION, CAA, CDNSKEY, CDS, CERT, CNAME, CSYNC, DHCID, DMARC, DNSKEY, DS, EID, EUI48, EUI64, GID, GPOS, HINFO, HIP, HTTPS, ISDN, KEY, KX, L32, L64, LOC, LP, MB, MD, MF, MG, MR, MX, NAPTR, NID, NINFO, NS, NSAPPTR, NSEC, NSEC3, NSEC3PARAM, NSLOOKUP, NULL, NXT, OPENPGPKEY, PTR, PX, RP, RRSIG, RT, SVCBS, MIMEA, SOA, SPF, SRV, SSHFP, TALINK, TKEY, TLSA, TXT, UID, UINFO, UNSPEC и URI предоставляют сырой DNS-ответ в формате JSON, аналогично dig.

Например, команда:

root@kitploit:~
echo "censys.io" | zdns A

возвращает:

root@kitploit:~
{
   "name": "censys.io",
   "results": {
      "A": {
         "data": {
            "additionals": [
               {
                  "flags": "",
                  "type": "EDNS0",
                  "udpsize": 512,
                  "version": 0
               }
            ],
            "answers": [
               {
                  "answer": "104.18.10.85",
                  "class": "IN",
                  "name": "censys.io",
                  "ttl": 300,
                  "type": "A"
               },
               {
                  "answer": "104.18.11.85",
                  "class": "IN",
                  "name": "censys.io",
                  "ttl": 300,
                  "type": "A"
               }
            ],
            "protocol": "udp",
            "resolver": "[2603:6013:9d00:3302::1]:53"
         },
         "duration": 0.285295416,
         "status": "NOERROR",
         "timestamp": "2024-08-23T13:12:43-04:00"
      }
   }
}

Модули поиска

Сырые DNS-ответы часто не содержат данных, которые вам нужны. Например, MX-ответ может не включать связанные A-записи в дополнительном разделе, что требует дополнительного запроса. Чтобы устранить этот пробел и предоставить более удобный интерфейс, мы также предлагаем несколько модулей поиска: alookup, mxlookup и nslookup.

alookup ведет себя аналогично nslookup и будет следовать за CNAME-записями. mxlookup дополнительно выполнит A-запрос для IP-адресов, соответствующих записи обмена. nslookup дополнительно выполнит A/AAAA-запрос для IP-адресов, соответствующих NS-записи.

Например,

root@kitploit:~
echo "censys.io" | zdns mxlookup --ipv4-lookup

возвращает:

root@kitploit:~
{
   "name": "censys.io",
   "results": {
      "MXLOOKUP": {
         "data": {
            "exchanges": [
               {
                  "class": "IN",
                  "ipv4_addresses": [
                     "209.85.202.27"
                  ],
                  "name": "alt1.aspmx.l.google.com",
                  "preference": 5,
                  "ttl": 300,
                  "type": "MX"
               },
               {
                  "class": "IN",
                  "ipv4_addresses": [
                     "142.250.31.26"
                  ],
                  "name": "aspmx.l.google.com",
                  "preference": 1,
                  "ttl": 300,
                  "type": "MX"
               }
            ]
         },
         "duration": 0.154786958,
         "status": "NOERROR",
         "timestamp": "2024-08-23T13:10:11-04:00"
      }
   }
}

Другие DNS-модули

ZDNS также поддерживает специальные «отладочные» DNS-запросы. Модули включают: BINDVERSION.

Форматы ввода

ZDNS поддерживает ввод в различных форматах в зависимости от желаемого поведения.

Базовый ввод

Самый базовый ввод — это список имен, разделенных переводами строк. Например:

Из stdin:

root@kitploit:~
echo "google.com\nyahoo.com" | zdns A
cat list_of_domains.txt | zdns A

Из файла:

root@kitploit:~
zdns A --input-file=list_of_domains.txt

Ввод в стиле dig

Если вам не нужно разрешать много доменов, для удобства поддерживается указание домена в качестве аргумента CLI, аналогично dig.

Например:

root@kitploit:~
zdns A google.com --name-servers=1.1.1.1

Эквивалентно dig -t A google.com @1.1.1.1

Серверы имен для каждого домена

Обычно ZDNS выбирает случайный сервер имен для каждого запроса домена из --name-servers. Если вместо этого вы хотите указать другой сервер имен для каждого домена, вы можете сделать это, передав пары domainName,serverIP, разделенные переводами строк. Это переопределит любые серверы имен, указанные с помощью --name-servers.

Например:

root@kitploit:~
echo "google.com,1.1.1.1\nfacebook.com,8.8.8.8" | zdns A

Вы можете видеть, что resolver указан для каждого домена в выводе (дополнительные/ответы сокращены для краткости):

root@kitploit:~
$ echo "google.com,1.1.1.1\nfacebook.com,8.8.8.8" | zdns A
{"name":"google.com","results":{"A":{"data":{"additionals":...,"answers":[...],"protocol":"udp","resolver":"1.1.1.1:53"},"duration":0.030490042,"status":"NOERROR","timestamp":"2024-09-13T09:51:34-04:00"}}}
{"name":"facebook.com","results":{"A":{"data":{"additionals":[...],"answers":[...],"protocol":"udp","resolver":"8.8.8.8:53"},"duration":0.061365459,"status":"NOERROR","timestamp":"2024-09-13T09:51:34-04:00"}}}

Файлы зон

Файлы зон (из ICANN CZDS или аналогичных) могут использоваться в качестве источника ввода для ZDNS с флагом --zone-file. Это позволяет анализировать файлы зон либо из stdin (по умолчанию), либо из файла с флагом --input-file.

По умолчанию ZDNS извлекает только имя из каждой записи файла зоны. Если вы также хотите разрешать имена, указанные в разделе ответов для таких типов записей, как CNAME или NS, вы можете использовать флаг CLI --zone-file-include-targets.

Например, с --zone-file-include-targets и этой записью файла зоны DNS:

root@kitploit:~
example.com. 3600 IN NS ns1.example.com

будут разрешены как example.com, так и ns1.example.com.

Триггеры для каждого модуля

ZDNS также поддерживает передачу «триггеров» для каждой строки ввода, которые сопоставляют строки ввода с определенными модулями. С их помощью вы можете указать, что определенные домены должны запрашиваться с помощью определенных модулей.

Формат ввода: domain_name,name_server,trigger,trigger_2,etc, где nameServer может быть пустым для использования серверов имен по умолчанию, и можно указать 1+ триггеров.

Пример файла input.csv:

root@kitploit:~
example.com,,a-trigger
google.com,,a-trigger,cname-trigger
example.com,1.1.1.1,aaaa-trigger
yahoo.com
apnews.com,1.1.1.1

И соответствующий multiple.ini:

root@kitploit:~
; Specify Global Options here
[Application Options]
iterative=true
prefer-ipv6-iteration="true"
; List out modules and their respective module-specific options here. A module can only be listed once
[A]
trigger = "a-trigger"
[AAAA]
trigger = "aaaa-trigger"
[CNAME]
trigger = "cname-trigger"

Это выполнит запросы:

  • example.com с модулем A, используя серверы имен по умолчанию
  • google.com с модулями A + CNAME, используя серверы имен по умолчанию
  • example.com с модулем AAAA, используя резолвер Cloudflare 1.1.1.1
  • yahoo.com со всеми указанными модулями, используя серверы имен по умолчанию
  • apnews.com со всеми указанными модулями, используя резолвер Cloudflare 1.1.1.1

Запуск команды:

root@kitploit:~
zdns MULTIPLE --multi-config-file="./multiple.ini" --input-file="input.csv"

Локальная рекурсия

ZDNS может работать либо с рекурсивным разрешителем (например, с DNS-сервером организации) [поведение по умолчанию], либо выполнять собственную рекурсию внутренне. Если вы выполняете небольшое количество запросов (то есть миллионы) и используете менее 10 000 горутин, обычно быстрее всего использовать один из распространенных рекурсивных разрешителей, таких как Cloudflare или Google. Cloudflare почти всегда быстрее Google. Это особенно актуально, если вы ищете популярные имена, потому что они кэшируются и могут быть обработаны за один обход. При использовании десятков тысяч параллельных потоков рассмотрите возможность внутреннего выполнения итерации, чтобы избежать DOS-атаки и/или ограничения скорости вашего рекурсивного разрешителя.

Для выполнения локальной рекурсии запустите zdns с флагом --iterative. При использовании этого флага ZDNS будет циклически перебирать опубликованные корневые серверы (например, 198.41.0.4). В итеративном режиме вы можете управлять размером локального кэша, указав --cache-size, и тайм-аутом для отдельных итераций, установив --iteration-timeout. Флаг --timeout управляет тайм-аутом всего разрешения для данного ввода (то есть суммой всех итеративных шагов).

Потоки, сокеты и производительность

Производительность ZDNS основана на массовой параллелизации с использованием легковесных Go-рутин. Эта архитектура имеет несколько особенностей:

  • Каждая Go-рутина использует свой собственный выделенный сетевой сокет. Таким образом, вам необходимо иметь возможность открывать столько сокетов (как с точки зрения максимального количества файловых дескрипторов, так и эфемерных портов), сколько у вас указано потоков (через --threads). По умолчанию ZDNS использует 1 000 потоков, что меньше максимального значения Linux по умолчанию (1024 открытых FD). Однако это больше, чем значение по умолчанию Mac OS (256). Вы можете просмотреть максимальное количество открытых FD (и, следовательно, сокетов), выполнив ulimit -n. Если вы хотите запустить с количеством потоков, превышающим это число, вам необходимо увеличить количество открытых файлов на уровне ОС. Если этого не сделать, вы получите фатальную ошибку, похожую на FATA[0000] unable to create socket listen udp <client IP address>:0: socket: too many open files. Если вы хотите запустить больше потоков, чем у вас доступно эфемерных портов, вам нужно будет использовать несколько IP-адресов клиента: --local-addr=A,B,C.

  • По умолчанию ZDNS «повторно использует» UDP-сокеты, создавая непривязанный UDP-сокет для каждой легковесной рутины при запуске и используя его для всех запросов (независимо от IP-адреса назначения). Это значительно повышает производительность, поскольку ZDNS и хостовая ОС не должны настраивать и закрывать сокет для отправки каждого отдельного пакета (так как DNS-запросы/ответы обычно представляют собой один пакет). Однако это означает, что ZDNS будет предварительно выделять сокет для каждого потока при запуске. Это может быть неоптимально, если вы ищете только небольшое количество имен. Например, если вам нужно найти всего 100 имен, но используется значение по умолчанию 1 000 потоков, вы привяжете, но никогда не будете использовать 900 UDP-сокетов. Вместо того чтобы беспокоиться о переработке сокетов, мы рекомендуем указать разумное количество потоков для вашего случая использования (поскольку это также отменяет любую работу по запуску этих потоков). Вот почему, однако, можно получить ошибку о невозможности открыть большое количество сокетов, даже если вы ищете только одно имя. Если важно создавать новый сокет для каждого запроса, вы можете отключить это повторное использование, указав .

threads_vs_runtime

Многое из производительности, которую вы увидите, зависит от вашего рабочего процесса, оборудования и количества серверов имен, на которые распределяется нагрузка. Если вы хотите максимизировать производительность для вашего рабочего процесса/оборудования, мы рекомендуем начать с 100 потоков и увеличивать до тех пор, пока не начнете замечать увеличение числа ошибок разрешения имен. Чтобы помочь в этом, вы можете использовать --output-file=output.jsonl и grep -v "NOERROR" output.jsonl | wc -l для подсчета количества имен, которые не удалось разрешить. Флаги, которые могут быть полезны для настройки производительности:

  • --timeout Максимальное время, которое ZDNS потратит на одно имя
  • --iteration-timeout Максимальное время, которое ZDNS потратит на один шаг итерации (например, разрешение google.com на уровне .com)
  • --network-timeout Максимальное время, которое ZDNS будет ждать ответа от сервера имен
  • --retries=N Если соединение с конкретным сервером имен не удается в --iterative, ZDNS повторит попытку с другим не опрошенным сервером имен на этом уровне. Повторные попытки выполняются для каждого имени, поэтому если --retries=1, то ZDNS повторит попытку для имени с новым сервером имен один раз в течение всего процесса итерации. Если все серверы имен были опрошены, будет выбран случайный сервер имен.
  • --name-servers Список серверов имен для использования в запросах, в основном полезен с --iterative=false

Уровень детализации вывода

DNS включает много посторонних данных, которые не всегда полезны. Существует четыре уровня детализации результатов: short (краткий), normal (обычный, по умолчанию), long (полный) и trace (трассировка):

  • short: Самый краткий вывод результатов. Содержит только информацию об ответах
  • normal: Предоставляет все, что включено в short, а также данные об отвечающем сервере
  • long: Выводит все, что сервер включил в DNS-пакет, включая флаги.
  • trace: Выводит все на каждом шаге процесса рекурсии

Пользователи также могут включать определенные дополнительные поля с помощью флага --include-fields и указания списка полей, например --include-fields=flags,resolver. Дополнительные поля: class, protocol, ttl, resolver, flags, dnssec.

Режим сервера имен

По умолчанию ZDNS ожидает получения списка имен для запроса к небольшому числу серверов имен. Например:

echo "google.com" | zdns A --name-servers=8.8.8.8,8.8.4.4

Однако бывают случаи, когда вы хотите запросить одно и то же имя у большого числа серверов. Это можно сделать с помощью режима сервера имен. Например:

echo "8.8.8.8" | zdns A --name-server-mode --override-name="google.com"

Здесь каждая строка, переданная в ZDNS, отправляет A-запрос для google.com. ZDNS также поддерживает смешивание обоих режимов путем передачи списка name,nameServer, разделенного запятыми. Например:

echo "google.com,8.8.8.8" | zdns A отправит A-запрос для google.com на 8.8.8.8 независимо от того, какие серверы имен указаны флагом --name-servers=. Строки, которые явно не указывают сервер имен, будут использовать серверы, указанные ОС или флагом --name-servers, как обычно.

Запрос всех серверов имен

Существует функция, позволяющая выполнить определенный DNS-запрос ко всем серверам имен. Например, вы можете захотеть получить A-записи от всех серверов имен определенного домена. Для этого вы можете сделать:

echo "google.com" | zdns A --all-nameservers

Несколько модулей поиска

ZDNS поддерживает использование нескольких модулей поиска в одном вызове. Например, предположим, вы хотите выполнить A, AAAA и MXLOOKUP для набора доменов и хотите выполнить их с итеративным разрешением. Вам нужно будет использовать модуль MULTIPLE и предоставить файл конфигурации с модулями и флагами, специфичными для модуля, которые вы хотите использовать.

Пожалуйста, смотрите zdns --help и zdns <MODULE_NAME> --help для глобальных и специфичных для модуля опций, которые можно использовать в файле конфигурации.

Например:

root@kitploit:~
cat 1000k_domains.txt | zdns MULTIPLE --multi-config-file="./multiple.ini"

Где multiple.ini — это файл, который выглядит так:

root@kitploit:~
; Specify Global Options here
[Application Options]
iterative=true
; List out modules and their respective module-specific options here. A module can only be listed once
[MXLOOKUP]
ipv4-lookup = true
; You can use default values and just list modules if you don't need to specify any options
[A]
[AAAA]

Пример файла multiple.ini предоставлен в src/cli/multiple.ini

Запуск ZDNS

По умолчанию ZDNS будет работать с 1 000 легковесных Go-рутин. Если вы не будете осторожны, это может перегрузить многих вышестоящих DNS-провайдеров. Мы рекомендуем пользователям согласовывать действия с локальными сетевыми администраторами перед проведением любых сканирований. Вы можете управлять количеством одновременных соединений с помощью аргументов командной строки --threads и --go-processes. Альтернативные серверы имен можно указать с помощью --name-servers. ZDNS будет циклически перебирать эти серверы при выполнении запросов. Мы успешно запускали ZDNS с десятками тысяч легковесных рутин.

Неподдерживаемые типы

Если zdns встречает тип записи, который он не поддерживает, он сгенерирует запись вывода с правильно установленным полем type и представлением базовой структуры данных в поле unparsed_rr. Не полагайтесь на наличие или структуру этого поля. Это поле (и его существование) может измениться в любое время по мере расширения поддержки дополнительных типов записей. Если вы обнаружите, что используете это поле, рассмотрите возможность отправки pull-запроса с добавлением поддержки парсера.

Бенчмарк для ZDNS

Доступен бенчмарк в benchmark/, который можно использовать для запуска ZDNS предсказуемым образом и вывода некоторой статистики о запуске. Это может быть полезно для сравнения производительности до и после изменений в ZDNS. Более подробную информацию смотрите в README бенчмарка.

Внесение вклада

Если вы заинтересованы в участии в разработке ZDNS, смотрите CONTRIBUTING.

Контакты

  • Пожалуйста, используйте Github issues для сообщения об ошибках.

Лицензия

ZDNS Copyright 2020 Regents of the University of Michigan

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See LICENSE for the specific language governing permissions and limitations under the License.

Скачать инструмент
--recycle-sockets=false
  • Go с радостью использует все доступные ему ядра ЦП и может потреблять огромное количество ЦП, если указано большое количество потоков. ЦП в основном используется для синтаксического анализа и кодирования JSON. Если вы хотите ограничить количество ядер ЦП, вы можете сделать это, включив флаг --go-processes=n или установив переменную окружения GOMAXPROCS.

  • Трудно порекомендовать точное количество --threads, так как это зависит от нескольких факторов. График ниже показывает, как время выполнения уменьшается, но частота ошибок разрешения имен увеличивается по мере увеличения количества потоков.