
Um resolvedor DNS stub de alto desempenho para consultas em massa e reconhecimento (enumeração de subdomínios)
MassDNS é um resolver stub DNS simples e de alto desempenho voltado para aqueles que buscam resolver uma quantidade massiva de nomes de domínio na ordem de milhões ou até bilhões. Sem configuração especial, o MassDNS é capaz de resolver mais de 350.000 nomes por segundo usando resolvers publicamente disponíveis.
Clone o repositório git e execute cd para a pasta raiz do projeto. Em seguida, execute make para compilar a partir do código-fonte. Se você não estiver no Linux, execute make nolinux. No Windows, os pacotes Cygwin gcc-core, git e make são necessários.
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.
Para uma descrição detalhada da interface de linha de comando, consulte a página de manual usando man ./doc/massdns.1.
Resolva todos os registros AAAA dos domínios em domains.txt usando os resolvers em resolvers.txt em lists e armazene os resultados em results.txt:
$ ./bin/massdns -r lists/resolvers.txt -t AAAA domains.txt > results.txt
Isso é equivalente a:
$ ./bin/massdns -r lists/resolvers.txt -t AAAA -w results.txt domains.txt
Por padrão, o MassDNS exibirá pacotes de resposta em formato de texto, semelhante ao seguinte:
;; 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.
O endereço IP do resolver é incluído para facilitar a filtragem da saída caso você detecte que alguns resolvers produzem resultados ruins.
O repositório inclui o arquivo resolvers.txt contendo um subconjunto filtrado dos resolvers fornecidos pelo projeto subbrute. Observe que o uso do MassDNS pode causar uma carga significativa nos resolvers usados e resultar em reclamações de abuso enviadas ao seu ISP. Observe também que os resolvers fornecidos não são garantidos como confiáveis. A lista de resolvers está atualmente desatualizada, com uma grande parcela de resolvers disfuncionais.
A implementação DNS personalizada e livre de malloc do MassDNS atualmente suporta apenas os registros mais comuns. Você é bem-vindo para ajudar a mudar isso colaborando.
O MassDNS inclui um script Python que permite resolver todos os registros PTR IPv4 imprimindo suas respectivas consultas na saída padrão.
$ ./scripts/ptr.py | ./bin/massdns -r lists/resolvers.txt -t PTR -w ptr.txt
Observe que os rótulos dentro de in-addr.arpa são invertidos. Para resolver o nome de domínio de 1.2.3.4, o MassDNS espera 4.3.2.1.in-addr.arpa como nome de consulta de entrada. Como consequência, o script Python não resolve os registros em ordem crescente, o que é uma vantagem, pois evita picos pesados repentinos nos servidores de nomes das sub-redes IPv4.
Realize varreduras de reconhecimento de forma responsável e ajuste o parâmetro -s para não sobrecarregar os servidores de nomes autoritativos.
Semelhante ao subbrute, o MassDNS permite que você force subdomínios por brute force usando o script subbrute.py incluído:
$ ./scripts/subbrute.py example.com lists/names.txt | ./bin/massdns -r lists/resolvers.txt -t A -o S -w results.txt
Como método adicional de reconhecimento, o script ct.py extrai subdomínios de logs de transparência de certificados, raspando os dados do crt.sh:
$ ./scripts/ct.py example.com | ./bin/massdns -r lists/resolvers.txt -t A -o S -w results.txt
Os arquivos names.txt e names_small.txt, copiados do projeto subbrute, contêm nomes de subdomínios comumente usados. Considere também usar a compilação de subdomínios de Jason Haddix com mais de 1.000.000 de nomes ou a wordlist do Assetnote com mais de 9.000.000 de nomes.
O MassDNS também inclui um script wrapper recon.py (status beta) na pasta scripts, que realiza enumeração de subdomínios diretamente contra servidores de nomes autoritativos e, portanto, não requer resolvers de terceiros. A concorrência é determinada automaticamente pelo MassDNS e suporta centenas de milhares de consultas por segundo, entregando resultados confiáveis. Em um servidor dedicado barato, a wordlist do Assetnote pode ser enumerada em menos de um minuto. Uma limitação atual é que a delegação de zona é tratada apenas até o ponto de delegação. Por exemplo, se example.org for enumerado e sub.example.org for delegado a outro servidor de nomes, abc.sub.example.org não será encontrado por este script se abc.sub estiver contido na wordlist. No entanto, o script relatará esse fato como ?.sub.example.org neste caso.
$ ./scripts/recon.py -d google.com -l lists/best-dns-wordlist.txt > google.txt

O MassDNS não requer privilégios de root e, portanto, reduzirá privilégios para o usuário chamado "nobody" por padrão quando executado como root. Se o usuário "nobody" não existir, o MassDNS se recusará a executar. Nesse caso, é recomendável executar o MassDNS como outro usuário não privilegiado. A redução de privilégios pode ser contornada usando o argumento --root, o que não é recomendado. Observe também que outras branches que não a master não devem ser usadas em produção.
O MassDNS é uma aplicação simples de thread única projetada para cenários em que a rede é o gargalo. Ele é projetado para ser executado em servidores com altas larguras de banda de upload e download. Internamente, o MassDNS utiliza um mapa hash que controla a concorrência das consultas. Definir o parâmetro de tamanho -s permite, portanto, controlar a taxa de consulta. Se você estiver enfrentando problemas de desempenho, tente ajustar o parâmetro -s para obter uma melhor taxa de sucesso.
Caso a limitação de taxa por resolvers IPv6 seja um problema, você pode usar --rand-src-ipv6 <seu_prefixo_ipv6>. O MassDNS usará então um socket bruto para enviar e receber pacotes DNS e escolherá aleatoriamente um endereço IPv6 de origem do prefixo especificado para cada consulta. Isso requer que o MassDNS seja executado com privilégios CAP_NET_RAW. Ao usar esse método, você deve configurar iptables ou nftables para descartar o tráfego DNS recebido pelo MassDNS para que nenhuma resposta ICMP Port unreachable seja gerada pelo sistema operacional, por exemplo, usando ip6tables -p udp --sport 53 -I INPUT -j DROP. Observe que esta regra é apenas exemplar e descartaria todo o tráfego DNS, incluindo tráfego de outras aplicações. Você pode querer adaptar a regra para ser mais granular e adequada ao seu caso de uso.
Se a autenticidade dos resultados for altamente essencial, você não deve confiar na lista de resolvers incluída. Em vez disso, configure um resolver unbound local e forneça ao MassDNS seu endereço IP. Caso esteja usando o MassDNS como ferramenta de reconhecimento, você pode executá-lo primeiro com a lista de resolvers padrão e depois executá-lo novamente nos nomes encontrados com uma lista de resolvers confiáveis para eliminar falsos positivos.
Caso esteja enumerando subdomínios para um único nome, por exemplo, para example.com, você pode simplesmente deixar de lado os resolvers de terceiros. Nesse caso, você pode sondar diretamente os servidores de nomes autoritativos da seguinte forma:
$ ./bin/massdns -r <(./scripts/auth-addrs.sh example.com) --norecurse -o Je example-com-subdomains.txt > results.txt