massdns

Résolveur DNS stub haute performance pour les résolutions en masse. Résout des centaines de milliers de requêtes DNS par seconde, idéal pour l'énumération massive de sous-domaines. High-performance DNS stub resolver for bulk lookups. Resolves hundreds of thousands of DNS queries per second — ideal for massive subdomain enumeration.

↗ https://github.com/blechschmidt/massdns

Overview

massdns is a high-performance DNS resolver capable of resolving millions of DNS queries per minute. It’s used as a backend for subdomain brute-forcing — you provide a massive wordlist, massdns resolves all of them against multiple DNS servers in parallel, and filters live subdomains from the noise.

Installation

git clone https://github.com/blechschmidt/massdns
cd massdns
make

# Binary at: ./bin/massdns

Basic Usage

Resolve a list of domains

massdns -r resolvers.txt -t A -o S subdomains.txt

With specific output format

massdns -r resolvers.txt -t A -o J subdomains.txt > results.json

High-rate scanning

massdns -r resolvers.txt -t A -o S -s 10000 subdomains.txt

Save to file

massdns -r resolvers.txt -t A subdomains.txt -o S > resolved.txt

Resolvers File

# Use a list of public DNS resolvers
# Download pre-made list:
# https://github.com/janmasarik/resolvers

Or create your own:

cat > resolvers.txt << EOF
8.8.8.8
8.8.4.4
1.1.1.1
1.0.0.1
208.67.222.222
EOF
# Recommended: use a large list of resolvers to distribute load
# (massdns queries each resolver in rotation)

Subdomain Bruteforcing Workflow

Method 1: Direct subdomain brute-force Prepare wordlist with DOMAIN appended

sed 's/$/.example.com/' /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt > subdomains.txt

Then resolve

massdns -r resolvers.txt -t A subdomains.txt -o S > resolved.txt

Method 2: Use puredns (wrapper around massdns)

puredns bruteforce /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt example.com

Method 3: Use ShuffleDNS (subfinder’s massdns wrapper)

shuffledns -d example.com -w wordlist.txt -r resolvers.txt

Output Formats

Simple (one line per result)

massdns -r resolvers.txt -t A -o S subdomains.txt

JSON

massdns -r resolvers.txt -t A -o J subdomains.txt

Ndjson (newline-delimited JSON)

massdns -r resolvers.txt -t A -o J subdomains.txt
# Output example (Simple):
# dev.example.com. A 1.2.3.4
# api.example.com. A 1.2.3.5

Rate Control

massdns -r resolvers.txt -t A -s 5000 subdomains.txt   # 5000/sec
massdns -r resolvers.txt -t A -s 10000 subdomains.txt  # 10000/sec (fast)
# Default is unlimited — can cause issues with rate-limited resolvers
# Use a large resolver list to distribute the load

puredns uses massdns internally with wildcard filtering

pip3 install puredns

→ or: go install github.com/d3mondev/puredns/v2@latest

Bruteforce subdomains

puredns bruteforce wordlist.txt example.com -r resolvers.txt

Resolve a list of domains

puredns resolve domains.txt -r resolvers.txt
# puredns automatically handles wildcard DNS to reduce false positives

Tips

  • Always use a large resolver list (100+ resolvers) to avoid hitting rate limits
  • Wildcard DNS (*.example.com) makes all queries return hits — puredns handles this automatically
  • Combine with subfinder/amass passive results for comprehensive coverage
  • Pipe results into httpx to find live web services among discovered subdomains
Help / Man page
massdns [options] <domains>

-r FILE     Resolver list file (required)
-t TYPE     DNS record type (A, AAAA, CNAME, MX, NS, TXT)
-o FORMAT   Output format: S (simple), L (list), J (json)
-s N        Queries per second
-c N        Concurrent resolvers (default: 500)
--retry N   Retry count (default: 10)
-4          Use IPv4 only
-6          Use IPv6 only
-v          Verbose output

Vue d’ensemble

massdns est un résolveur DNS haute performance capable de résoudre des millions de requêtes DNS par minute. Il sert de moteur pour le brute-force de sous-domaines : on lui fournit une wordlist massive, massdns résout l’ensemble en parallèle contre plusieurs serveurs DNS, puis filtre les sous-domaines actifs dans le bruit.

Installation

git clone https://github.com/blechschmidt/massdns
cd massdns
make

# Binaire disponible ici : ./bin/massdns

Utilisation de base

# Résoudre une liste de domaines
massdns -r resolvers.txt -t A -o S subdomains.txt

# Avec un format de sortie spécifique
massdns -r resolvers.txt -t A -o J subdomains.txt > results.json

# Scan à haut débit
massdns -r resolvers.txt -t A -o S -s 10000 subdomains.txt

# Sauvegarder dans un fichier
massdns -r resolvers.txt -t A subdomains.txt -o S > resolved.txt

Fichier de résolveurs

# Utiliser une liste de résolveurs DNS publics
# Télécharger une liste toute faite :
# https://github.com/janmasarik/resolvers

Ou créer la sienne :

cat > resolvers.txt << EOF
8.8.8.8
8.8.4.4
1.1.1.1
1.0.0.1
208.67.222.222
EOF
# Recommandé : utiliser une grande liste de résolveurs pour répartir la charge
# (massdns interroge chaque résolveur à tour de rôle)

Workflow de brute-force de sous-domaines

# Méthode 1 : brute-force direct des sous-domaines
# Préparer la wordlist avec le DOMAINE ajouté
sed 's/$/.example.com/' /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt > subdomains.txt

# Puis résoudre
massdns -r resolvers.txt -t A subdomains.txt -o S > resolved.txt

# Méthode 2 : utiliser puredns (wrapper autour de massdns)
puredns bruteforce /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt example.com

# Méthode 3 : utiliser ShuffleDNS (wrapper massdns de subfinder)
shuffledns -d example.com -w wordlist.txt -r resolvers.txt

Formats de sortie

# Simple (une ligne par résultat)
massdns -r resolvers.txt -t A -o S subdomains.txt

# JSON
massdns -r resolvers.txt -t A -o J subdomains.txt

# Ndjson (JSON délimité par des sauts de ligne)
massdns -r resolvers.txt -t A -o J subdomains.txt

# Exemple de sortie (Simple) :
# dev.example.com. A 1.2.3.4
# api.example.com. A 1.2.3.5

Contrôle du débit

massdns -r resolvers.txt -t A -s 5000 subdomains.txt   # 5000/sec

massdns -r resolvers.txt -t A -s 10000 subdomains.txt  # 10000/sec (rapide)

# Par défaut illimité : peut poser problème avec des résolveurs à limitation de débit
# Utiliser une grande liste de résolveurs pour répartir la charge

puredns (wrapper recommandé)

# puredns utilise massdns en interne avec un filtrage des wildcards
pip3 install puredns
# ou : go install github.com/d3mondev/puredns/v2@latest

# Brute-force de sous-domaines
puredns bruteforce wordlist.txt example.com -r resolvers.txt

# Résoudre une liste de domaines
puredns resolve domains.txt -r resolvers.txt

# puredns gère automatiquement le DNS wildcard pour réduire les faux positifs

Conseils

  • Toujours utiliser une grande liste de résolveurs (100+) pour éviter les limitations de débit
  • Le DNS wildcard (*.example.com) fait que toutes les requêtes retournent un résultat positif : puredns gère cela automatiquement
  • Combiner avec les résultats passifs de subfinder/amass pour une couverture complète
  • Rediriger les résultats vers httpx pour trouver les services web actifs parmi les sous-domaines découverts
Aide / Page de manuel
massdns [options] <domains>

-r FILE     Resolver list file (required)
-t TYPE     DNS record type (A, AAAA, CNAME, MX, NS, TXT)
-o FORMAT   Output format: S (simple), L (list), J (json)
-s N        Queries per second
-c N        Concurrent resolvers (default: 500)
--retry N   Retry count (default: 10)
-4          Use IPv4 only
-6          Use IPv6 only
-v          Verbose output