Subdomain enumeration is a critical phase of web reconnaissance that focuses on discovering subdomains and DNS infrastructure. This process reveals the attack surface by identifying additional hosts, services, and potential entry points that might not be immediately visible.
Key Objectives:
Discover hidden subdomains and services
Map DNS infrastructure and name servers
Identify cloud resources and third-party services
Analyze DNS security configurations
Enumerate zone transfers and DNS vulnerabilities
DNS Tools Overview
Tool
Key Features
Best Use Case
dig
Versatile DNS lookup tool supporting all record types with detailed output
Manual DNS queries, zone transfers, troubleshooting
dnsenum
Comprehensive DNS enumeration with zone transfers, brute-forcing, WHOIS
All-in-one automated DNS reconnaissance
fierce
DNS reconnaissance with recursive search and wildcard detection
User-friendly subdomain discovery
dnsrecon
Multi-technique DNS reconnaissance with custom output formats
Comprehensive enumeration with various methods
amass
Advanced subdomain discovery with 30+ data sources
Maximum subdomain coverage (passive + active)
assetfinder
Simple subdomain discovery using various techniques
Quick lightweight scans
subfinder
Passive subdomain enumeration from public sources
Stealth reconnaissance
puredns
High-performance DNS brute-forcer with wildcard filtering
Massive wordlist handling
theHarvester
OSINT tool gathering subdomains from search engines
Email addresses + subdomain discovery
Manual DNS Enumeration
The Domain Information Groper (dig)
The dig command is the most versatile DNS enumeration tool, essential for manual analysis:
Common dig Commands
Zone Transfer Attempts
Advanced dig Techniques
Automated DNS Enumeration
dnsenum - Comprehensive DNS Enumeration
dnsenum is a versatile Perl-based tool providing comprehensive DNS reconnaissance:
Key Features:
DNS Record Enumeration (A, AAAA, NS, MX, TXT)
Automatic zone transfer attempts
Subdomain brute-forcing with wordlists
Google scraping for additional subdomains
Reverse lookups and WHOIS integration
fierce - User-Friendly Subdomain Scanner
dnsrecon - Advanced DNS Reconnaissance
Advanced Subdomain Discovery
amass - Comprehensive Subdomain Discovery
amass is the most powerful subdomain discovery tool with extensive data sources:
Key Features:
30+ external data sources for passive enumeration
Active DNS brute-forcing and permutation
Integration with APIs and other tools
Network mapping and visualization
Continuous monitoring capabilities
Configuration Example:
puredns - High-Performance DNS Brute-Forcer
puredns excels at high-performance brute-forcing with smart filtering:
Key Features:
Handles massive wordlists efficiently
Wildcard detection and filtering
Custom DNS resolver configuration
Rate limiting to prevent server overload
Trusted domain validation
Passive Subdomain Discovery
Certificate Transparency
subfinder - Passive Subdomain Discovery
assetfinder - Quick Subdomain Enumeration
theHarvester - OSINT DNS Gathering
Tool Selection Guide
When to Use What
Scenario
Recommended Tool
Reason
Quick manual DNS queries
dig
Most versatile, detailed output
Comprehensive automated scan
dnsenum
All-in-one: zone transfers, brute-force, WHOIS
Passive reconnaissance only
amass (passive)
30+ data sources, stealth
Maximum subdomain coverage
amass (active)
Passive + active brute-forcing
High-performance brute-forcing
puredns
Massive wordlists, wildcard filtering
User-friendly quick scan
fierce
Simple interface, wildcard detection
Multi-technique approach
dnsrecon
Various techniques, custom outputs
Quick lightweight scan
assetfinder
Fast, simple discovery
Performance Comparison
Tool
Speed
Accuracy
Stealth
Wordlist Size
Resource Usage
dig
Manual
High
High
Manual
Low
dnsenum
Medium
High
Medium
Medium
Medium
amass
Medium-Fast
Very High
High (passive)
Large
High
puredns
Very Fast
High
Medium
Very Large
Medium
fierce
Fast
High
Medium
Medium
Low
dnsrecon
Medium
High
Medium
Medium
Medium
assetfinder
Fast
Medium
High
N/A
Low
subfinder
Fast
High
High
N/A
Low
Recommended Workflow
Phase 1: Quick Discovery
Phase 2: Passive Enumeration
Phase 3: Active Enumeration
Phase 4: High-Performance Brute-Forcing
HTB Academy Lab Examples
Lab 1: DNS Analysis
Security Considerations
Rate Limiting
Stealth Techniques
Defensive Measures
DNS Server Hardening
Monitoring and Detection
Key Takeaways
dig is essential for manual DNS analysis and troubleshooting
# Basic record queries
dig domain.com A # IPv4 addresses
dig domain.com AAAA # IPv6 addresses
dig domain.com MX # Mail servers
dig domain.com NS # Name servers
dig domain.com TXT # Text records
dig domain.com SOA # Start of authority
# Query specific DNS server
dig @1.1.1.1 domain.com A
# Trace full DNS resolution path
dig +trace domain.com
# Short output only
dig +short domain.com
# Reverse DNS lookup
dig -x 192.168.1.1
# Discover name servers
dig domain.com NS
# Attempt zone transfers
dig @ns1.domain.com domain.com AXFR
dig @ns2.domain.com domain.com AXFR
# Test all name servers
for ns in $(dig +short domain.com NS); do
echo "Testing $ns for zone transfer"
dig @$ns domain.com AXFR
done
# DNS server version detection
dig @dns-server version.bind CH TXT
# Check DNSSEC implementation
dig +dnssec domain.com
# TCP queries (for large responses)
dig +tcp domain.com TXT
# No recursion (direct authoritative query)
dig +norecurse @ns1.domain.com domain.com
# Basic enumeration with HTB Academy example
dnsenum --enum inlanefreight.com -f /usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt
# Complete enumeration with recursion
dnsenum --enum example.com -f /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt -r
# Custom DNS server
dnsenum --dnsserver 8.8.8.8 --enum example.com
# Without reverse lookups (faster)
dnsenum --noreverse example.com
# Advanced options
dnsenum --enum example.com \
-f /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt \
--dnsserver 1.1.1.1 \
--timeout 10 \
--threads 5 \
-r
# Basic subdomain enumeration
fierce --domain example.com
# Custom wordlist
fierce --domain example.com --wordlist custom_subdomains.txt
# Specific DNS server
fierce --domain example.com --dns-servers 8.8.8.8
# Output to file
fierce --domain example.com > fierce_results.txt
# Standard enumeration
dnsrecon -d example.com
# Brute force with custom wordlist
dnsrecon -d example.com -D /usr/share/wordlists/dnsmap.txt -t brt
# Zone transfer attempts
dnsrecon -d example.com -t axfr
# Reverse lookup on IP range
dnsrecon -r 192.168.1.0/24
# Google enumeration
dnsrecon -d example.com -t goo
# Basic subdomain enumeration
amass enum -d example.com
# Passive enumeration only (stealth)
amass enum -passive -d example.com
# Active enumeration with brute-forcing
amass enum -active -d example.com -brute
# Multiple domains
amass enum -d example.com,target.com,company.com
# Use all available data sources
amass enum -d example.com -src
# Output to file
amass enum -d example.com -o subdomains.txt
# JSON output for parsing
amass enum -d example.com -json subdomain_data.json
# Use specific resolvers
amass enum -d example.com -rf resolvers.txt
# Rate limiting
amass enum -d example.com -rps 10
# Advanced configuration
amass enum -d example.com -config /path/to/config.yaml
# Basic DNS enumeration
dig inlanefreight.htb A
dig inlanefreight.htb MX
dig inlanefreight.htb NS
dig inlanefreight.htb TXT
# Zone transfer attempts
for ns in $(dig +short inlanefreight.htb NS); do
echo "Attempting zone transfer with $ns"
dig @$ns inlanefreight.htb AXFR
done
# Automated enumeration
dnsenum --enum inlanefreight.htb -f /usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt
dnsrecon -d inlanefreight.htb
# Advanced subdomain discovery
amass enum -passive -d inlanefreight.htb
amass enum -active -d inlanefreight.htb -brute
# High-performance brute-forcing
puredns bruteforce /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt inlanefreight.htb --rate-limit 1000
# Avoid detection with delays
for sub in $(cat wordlist.txt); do
dig $sub.example.com
sleep 1
done
# Use multiple DNS servers
dns_servers=(8.8.8.8 1.1.1.1 9.9.9.9)
for server in "${dns_servers[@]}"; do
dig @$server example.com
done
# Passive enumeration only
amass enum -passive -d example.com
subfinder -d example.com
# Certificate transparency (no DNS queries)
curl -s https://crt.sh/\?q\=example.com\&output\=json | jq -r '.[].name_value'
# Restrict zone transfers
allow-transfer { trusted-servers; };
# Disable recursion for external queries
allow-recursion { internal-networks; };
# Hide DNS version
version "Not disclosed";
# Rate limiting
rate-limit {
responses-per-second 5;
window 5;
};