
Высокопроизводительный DNS-резолвер для массовых запросов и разведки (перебор поддоменов)
MassDNS — это простой высокопроизводительный DNS-резолвер-заглушка, предназначенный для тех, кому необходимо разрешить огромное количество доменных имён — порядка миллионов или даже миллиардов. Без специальной настройки MassDNS способен обрабатывать более 350 000 запросов в секунду, используя общедоступные резолверы.
Клонируйте git-репозиторий и выполните cd в корневую папку проекта. Затем запустите make для сборки из исходного кода.
Если вы работаете не на Linux, выполните make nolinux. В Windows потребуются пакеты Cygwin: gcc-core, git и make.
Usage: ./bin/massdns [options] [domainlist]
-b --bindto Bind to IP address and port. (Default: 0.0.0.0:0)
--busy-poll Use busy-wait polling instead of epoll.
-c --resolve-count Number of resolves for a name before giving up. (Default: 50)
--drop-group Group to drop privileges to when running as root. (Default: nogroup)
--drop-user User to drop privileges to when running as root. (Default: nobody)
--extended-input Input names are followed by a space-separated list of resolvers.
These are used before falling back to the resolvers file.
--filter Only output packets with the specified response code.
--flush Flush the output file whenever a response was received.
-h --help Show this help.
--ignore Do not output packets with the specified response code.
-i --interval Interval in milliseconds to wait between multiple resolves of the same
domain. (Default: 500)
-l --error-log Error log file path. (Default: /dev/stderr)
--norecurse Use non-recursive queries. Useful for DNS cache snooping.
-o --output Flags for output formatting.
--predictable Use resolvers incrementally. Useful for resolver tests.
--processes Number of processes to be used for resolving. (Default: 1)
-q --quiet Quiet mode.
--rand-src-ipv6 Use a random IPv6 address from the specified subnet for each query.
--rand-src-ipv6-file Use a random IPv6 address from the specified file.
--rcvbuf Size of the receive buffer in bytes.
--retry Unacceptable DNS response codes.
(Default: All codes but NOERROR or NXDOMAIN)
-r --resolvers Text file containing DNS resolvers.
--root Do not drop privileges when running as root. Not recommended.
-s --hashmap-size Number of concurrent lookups. (Default: 10000)
--sndbuf Size of the send buffer in bytes.
--status-format Format for real-time status updates, json or ansi (Default: ansi)
--sticky Do not switch the resolver when retrying.
--socket-count Socket count per process. (Default: 1)
-t --type Record type to be resolved. (Default: A)
--verify-ip Verify IP addresses of incoming replies.
-w --outfile Write to the specified output file instead of standard output.
Output flags:
L - domain list output
S - simple text output
F - full text output
B - binary output
J - ndjson output
Advanced flags for the domain list output mode:
0 - Include NOERROR replies without answers.
Advanced flags for the simple output mode:
d - Include records from the additional section.
i - Indent any reply record.
l - Separate replies using a line feed.
m - Only output reply records that match the question name.
n - Include records from the answer section.
q - Print the question.
r - Print the question with resolver IP address, Unix timestamp and return code prepended.
s - Separate packet sections using a line feed.
t - Include TTL and record class within the output.
u - Include records from the authority section.
Advanced flags for the ndjson output mode:
e - Write a record for each terminal query failure.
Подробное описание интерфейса командной строки приведено в man-странице: man ./doc/massdns.1.
Разрешить все AAAA-записи доменов из domains.txt, используя резолверы из resolvers.txt в каталоге lists, и сохранить результаты в results.txt:
$ ./bin/massdns -r lists/resolvers.txt -t AAAA domains.txt > results.txt
Эквивалентно следующему:
$ ./bin/massdns -r lists/resolvers.txt -t AAAA -w results.txt domains.txt
По умолчанию MassDNS выводит ответные пакеты в текстовом формате, который выглядит примерно так:
;; Server: 77.41.229.2:53
;; Size: 93
;; Unix time: 1513458347
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51298
;; flags: qr rd ra ; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 0
;; QUESTION SECTION:
example.com. IN A
;; ANSWER SECTION:
example.com. 45929 IN A 93.184.216.34
;; AUTHORITY SECTION:
example.com. 24852 IN NS b.iana-servers.net.
example.com. 24852 IN NS a.iana-servers.net.
IP-адрес резолвера включён для упрощения фильтрации вывода в случае, если вы обнаружите, что некоторые резолверы выдают некорректные результаты.
Репозиторий содержит файл resolvers.txt — отфильтрованное подмножество резолверов из проекта subbrute.
Обратите внимание, что использование MassDNS может создавать значительную нагрузку на используемые резолверы и приводить к жалобам на злоупотребление, направляемым вашему интернет-провайдеру.
Также учтите, что предоставленные резолверы не гарантируют доверия. Список резолверов в настоящее время устарел, большая часть резолверов неработоспособна.
Собственная реализация DNS в MassDNS, не использующая malloc, на данный момент поддерживает только самые распространённые типы записей. Вы можете помочь изменить это, участвуя в разработке.
MassDNS включает Python-скрипт, позволяющий разрешить все PTR-записи IPv4, выводя соответствующие запросы в стандартный поток вывода.
$ ./scripts/ptr.py | ./bin/massdns -r lists/resolvers.txt -t PTR -w ptr.txt
Имейте в виду, что метки в пространстве in-addr.arpa имеют обратный порядок. Чтобы разрешить доменное имя для 1.2.3.4, MassDNS ожидает 4.3.2.1.in-addr.arpa в качестве имени входного запроса.
Как следствие, Python-скрипт разрешает записи не в порядке возрастания, что является преимуществом, так как позволяет избежать внезапных резких пиков нагрузки на серверы имён подсетей IPv4.
Выполняйте разведывательное сканирование ответственно и настраивайте параметр -s, чтобы не перегружать авторитетные DNS-серверы.
Аналогично subbrute, MassDNS позволяет брутфорсить поддомены с помощью скрипта subbrute.py:
$ ./scripts/subbrute.py example.com lists/names.txt | ./bin/massdns -r lists/resolvers.txt -t A -o S -w results.txt
В качестве дополнительного метода разведки скрипт ct.py извлекает поддомены из журналов сертификатной прозрачности, собирая данные с crt.sh:
$ ./scripts/ct.py example.com | ./bin/massdns -r lists/resolvers.txt -t A -o S -w results.txt
Файлы names.txt и names_small.txt, скопированные из проекта subbrute, содержат имена часто используемых поддоменов. Также рассмотрите возможность использования компиляции поддоменов Джейсона Хэддикса с более чем 1 000 000 имён или список слов Assetnote с более чем 9 000 000 имён.
MassDNS также включает скрипт-обёртку recon.py (статус бета) в папке scripts, который выполняет перечисление поддоменов напрямую через авторитетные серверы имён и, таким образом, не требует сторонних резолверов. Степень параллелизма определяется автоматически и поддерживает сотни тысяч запросов в секунду, обеспечивая надёжные результаты. На недорогом выделенном сервере список слов Assetnote может быть перечислен менее чем за минуту. Текущее ограничение: делегирование зоны обрабатывается только до точки делегирования. Например, если перечисляется example.org, а sub.example.org делегирован другому серверу имён, то abc.sub.example.org не будет найден этим скриптом, если abc.sub содержится в списке слов. Однако скрипт сообщит об этом факте как ?.sub.example.org в данном случае.
$ ./scripts/recon.py -d google.com -l lists/best-dns-wordlist.txt > google.txt

MassDNS не требует привилегий root и поэтому по умолчанию понижает привилегии до пользователя «nobody» при запуске от root.
Если пользователь «nobody» не существует, MassDNS отказывается выполнять работу. В этом случае рекомендуется запускать MassDNS от другого непривилегированного пользователя.
Понижение привилегий можно обойти с помощью аргумента --root, что не рекомендуется.
Также обратите внимание, что ветки, отличные от master, не следует использовать в производственной среде ни при каких обстоятельствах.
MassDNS — это простое однопоточное приложение, предназначенное для сценариев, в которых узким местом является сеть. Оно рассчитано на работу на серверах с высокой пропускной способностью загрузки и выгрузки. Внутри MassDNS использует хеш-карту, которая управляет параллелизмом запросов. Установка параметра размера -s позволяет контролировать скорость запросов. Если вы испытываете проблемы с производительностью, попробуйте изменить параметр -s, чтобы добиться лучшего процента успешных запросов.
Если ограничение частоты запросов со стороны IPv6-резолверов является проблемой, вы можете использовать --rand-src-ipv6 <your_ipv6_prefix>. MassDNS будет использовать сырой сокет для отправки и получения DNS-пакетов и случайным образом выбирать исходный IPv6-адрес из указанного префикса для каждого запроса. Это требует, чтобы MassDNS запускался с привилегией CAP_NET_RAW. При использовании этого метода следует настроить iptables или nftables на отбрасывание DNS-трафика, получаемого MassDNS, чтобы операционная система не генерировала ICMP-ответы «Порт недоступен», например: ip6tables -p udp --sport 53 -I INPUT -j DROP. Обратите внимание, что это правило является лишь примерным и отбросит весь DNS-трафик, включая трафик других приложений. Возможно, вам потребуется адаптировать правило для более точного соответствия вашему сценарию использования.
Если достоверность результатов крайне важна, не следует полагаться на встроенный список резолверов. Вместо этого настройте локальный резолвер unbound и укажите его IP-адрес MassDNS. Если вы используете MassDNS в качестве инструмента разведки, возможно, стоит сначала запустить его со списком резолверов по умолчанию, а затем повторно запустить на найденных именах со списком доверенных резолверов, чтобы исключить ложные срабатывания.
Если вы перечисляете поддомены для одного имени, например, для example.com, возможно, вам вообще не нужны сторонние резолверы. В таком случае можно напрямую опрашивать авторитетные серверы имён следующим образом:
$ ./bin/massdns -r <(./scripts/auth-addrs.sh example.com) --norecurse -o Je example-com-subdomains.txt > results.txt