Published April 10, 2026 · 18 min read
Subdomain Enumeration Tools in 2026: The Complete Practitioner's Guide
Subdomain enumeration is the foundation of every serious security assessment. Forgotten staging servers, exposed admin panels, and orphaned API endpoints hide behind subdomains that the organization doesn't even know exist. The right tools find them. This guide compares every major subdomain enumeration tool in 2026, shows you how to chain them into an effective workflow, and explains where SecurityClaw fits into the picture.
Key Takeaways
- No single tool finds all subdomains — combine passive sources (subfinder, crt.sh) with active brute-forcing (amass, knockpy) for maximum coverage
- Subfinder is the fastest passive enumerator; Amass provides the deepest results when configured with API keys
- Certificate Transparency logs alone can reveal subdomains that DNS brute-forcing misses entirely
- SecurityClaw automates the full enumeration-to-vulnerability pipeline, chaining discovery with targeted scanning
- Always resolve and probe discovered subdomains — enumeration without validation wastes time on dead hosts
Why Subdomain Enumeration Matters
Every subdomain is a potential entry point. Organizations accumulate subdomains over years — staging servers spun up for a demo and never decommissioned, internal tools exposed to the internet during a migration, acquired company domains that nobody inventoried. The attack surface grows silently.
In bug bounty programs, subdomain enumeration is where the money is. The main application at app.example.com has been tested by hundreds of hunters. But legacy-api.example.com running an unpatched service? That's where you find critical vulnerabilities. A 2025 HackerOne report found that 68% of critical findings came from assets discovered through subdomain enumeration rather than the primary application.
For defenders, the calculus is simple: you can't secure what you don't know exists. If your asset inventory doesn't include every subdomain, your vulnerability management program has blind spots. Subdomain enumeration closes those gaps.
Passive vs. Active Enumeration
Before diving into tools, you need to understand the two fundamental approaches:
Passive enumeration queries third-party data sources — Certificate Transparency logs, search engine caches, DNS aggregation databases, and threat intelligence feeds. You never touch the target's infrastructure. It's fast, stealthy, and legal without authorization. The downside: you only find subdomains that have been indexed somewhere.
Active enumeration sends DNS queries directly to the target's nameservers, typically brute-forcing subdomain names from a wordlist. It finds subdomains that aren't indexed anywhere — internal names, recently created hosts, non-standard naming conventions. The downside: it's noisy, slower, and requires authorization in most contexts outside of bug bounty programs with explicit scope.
The best practitioners use both. Passive first (fast, broad coverage), then active to fill gaps. Here's how the tools break down:
Tool Comparison Table
| Tool | Type | Speed | Depth | API Keys Needed | Best For |
|---|---|---|---|---|---|
| Subfinder | Passive | ⚡ Very Fast | Good | Optional (improves results) | Quick initial sweep |
| Amass | Passive + Active | 🐢 Slow | Deepest | Optional (significantly improves results) | Comprehensive assessments |
| Assetfinder | Passive | ⚡ Very Fast | Moderate | No | Lightweight scripting |
| Knockpy | Active (brute-force) | 🔄 Medium | Good (wordlist-dependent) | No | DNS brute-forcing |
| DNSRecon | Active | 🔄 Medium | Good | No | DNS record analysis + zone transfers |
| crt.sh | Passive (CT logs) | ⚡ Fast | Moderate | No | CT log discovery |
Subfinder — Speed King of Passive Enumeration
Subfinder by ProjectDiscovery is the tool most practitioners reach for first. It queries dozens of passive data sources in parallel — Shodan, Censys, VirusTotal, SecurityTrails, and more — and returns deduplicated results fast. On a typical target, subfinder finishes in seconds.
Installation
go install -v github.com/projectdiscovery/subfinder/v2/cmd/subfinder@latest
Basic Usage
# Single domain
subfinder -d example.com -o subdomains.txt
# Multiple domains from a file
subfinder -dL domains.txt -o all-subdomains.txt
# Silent mode (subdomains only, no banner)
subfinder -d example.com -silent
Configuring API Keys
Subfinder works without API keys, but results improve dramatically with them. Create ~/.config/subfinder/provider-config.yaml:
shodan:
- YOUR_SHODAN_API_KEY
censys:
- YOUR_CENSYS_API_ID:YOUR_CENSYS_API_SECRET
securitytrails:
- YOUR_SECURITYTRAILS_KEY
virustotal:
- YOUR_VT_API_KEY
In our testing, configuring API keys for Shodan, Censys, and SecurityTrails increased unique subdomain discovery by 40-60% compared to running without keys. Free tiers of these services are sufficient for most targets.
When to Use Subfinder
Use subfinder as your first pass on every engagement. It's fast enough to run against hundreds of domains in a pipeline, and the passive-only approach means zero risk of triggering IDS alerts. Pipe the output directly into your recon workflow for resolution and probing.
Amass — The Deep Enumerator
Amass by OWASP is the most comprehensive subdomain enumeration tool available. It combines passive data sources with active DNS brute-forcing, zone transfers, NSEC walking, and certificate scraping. When you need maximum coverage and don't mind waiting, amass is the answer.
Installation
go install -v github.com/owasp-amass/amass/v4/...@master
Key Modes
# Passive only (no DNS queries to target)
amass enum -passive -d example.com -o amass-passive.txt
# Active enumeration (includes DNS brute-forcing)
amass enum -active -d example.com -o amass-active.txt
# Full enumeration with brute-forcing and a custom wordlist
amass enum -active -brute -w /path/to/wordlist.txt -d example.com -o amass-full.txt
The Amass Config File
Amass's power comes from its configuration. Create ~/.config/amass/config.yaml to add API keys, define scope, and tune performance. With a full config (Shodan, Censys, SecurityTrails, VirusTotal, PassiveTotal, and others), amass consistently finds 2-3x more subdomains than any single tool.
Performance Considerations
Amass is slow. A full active enumeration with brute-forcing against a large target can take hours. For time-constrained assessments, run amass in passive mode alongside subfinder, then use active mode only on high-value targets. The -timeout flag helps cap execution time:
# Cap at 30 minutes
amass enum -active -d example.com -timeout 30
When to Use Amass
Use amass for comprehensive assessments where coverage matters more than speed — penetration tests, red team engagements, and thorough bug bounty recon on a single high-value target. Its graph database also tracks subdomain relationships over time, which is valuable for ongoing monitoring.
Assetfinder — Lightweight and Fast
Assetfinder by Tom Hudson (tomnomnom) is a minimalist passive subdomain finder. It queries a handful of sources (crt.sh, Facebook CT, VirusTotal, and others) and outputs results immediately. No config files, no API keys required.
Installation
go install github.com/tomnomnom/assetfinder@latest
Usage
# Find subdomains (includes related domains by default)
assetfinder example.com
# Subdomains only (filter out unrelated domains)
assetfinder --subs-only example.com
When to Use Assetfinder
Assetfinder shines in shell pipelines. It's a single binary with zero configuration that reads from stdin and writes to stdout. Use it when you need a quick passive check or as one input in a multi-tool pipeline:
# Combine assetfinder + subfinder, deduplicate
(assetfinder --subs-only example.com; subfinder -d example.com -silent) | sort -u > all-subs.txt
Knockpy — DNS Brute-Force Specialist
Knockpy takes a different approach: instead of querying third-party databases, it brute-forces subdomain names by sending DNS queries with candidates from a wordlist. This finds subdomains that have never been indexed anywhere — internal naming conventions, recently created hosts, and non-standard names.
Installation
pip install knockpy
Usage
# Default wordlist
knockpy example.com
# Custom wordlist
knockpy example.com -w /path/to/wordlist.txt
# JSON output
knockpy example.com --json
Wordlist Selection
Your wordlist determines your results. The default knockpy wordlist is decent for common names, but serious practitioners use larger lists:
- SecLists dns-Jhaddix.txt (2.2M entries) — the gold standard for DNS brute-forcing
- SecLists subdomains-top1million-5000.txt — good balance of speed and coverage
- Custom wordlists — build from previous engagements, industry-specific terms, and target-specific patterns
When to Use Knockpy
Use knockpy after passive enumeration to find subdomains that aren't in any database. It's especially effective against organizations with predictable naming conventions (e.g., dev-*, staging-*, internal-*). Pair it with a good wordlist and you'll find hosts that subfinder and amass miss entirely.
DNSRecon — The Swiss Army Knife
DNSRecon by Carlos Perez goes beyond subdomain brute-forcing. It performs zone transfers, reverse lookups, SRV record enumeration, DNSSEC zone walking, and Google dorking — all in one tool. It's the most versatile DNS reconnaissance tool available.
Installation
pip install dnsrecon
Key Capabilities
# Standard enumeration (brute-force + zone transfer attempt)
dnsrecon -d example.com
# Brute-force with a custom wordlist
dnsrecon -d example.com -t brt -D /path/to/wordlist.txt
# Zone transfer attempt
dnsrecon -d example.com -t axfr
# Reverse lookup on a CIDR range
dnsrecon -r 192.168.1.0/24
# DNSSEC zone walking (NSEC records)
dnsrecon -d example.com -t zonewalk
When to Use DNSRecon
DNSRecon is your go-to when you need more than just subdomain names. Zone transfer attempts (still successful on a surprising number of misconfigured nameservers), reverse lookups on known IP ranges, and DNSSEC zone walking all reveal infrastructure that pure subdomain brute-forcing misses. Use it as a complement to subfinder/amass, not a replacement.
crt.sh — Certificate Transparency Queries
crt.sh is a free web interface and API that aggregates Certificate Transparency log data. Every SSL/TLS certificate issued by a participating CA is logged publicly — and those certificates contain subdomain names. We covered CT logs in depth in our Certificate Transparency Logs guide.
Quick API Query
# JSON output, pipe through jq for subdomain extraction
curl -s "https://crt.sh/?q=%25.example.com&output=json" | jq -r '.[].name_value' | sort -u
Why crt.sh Matters
CT logs reveal subdomains that DNS brute-forcing can't find — internal services with SSL certificates, wildcard certificate coverage, and historical subdomains that no longer resolve but indicate infrastructure patterns. A single crt.sh query often returns subdomains that none of the other tools discover, because the certificate was issued for an internal service that was never exposed to the internet.
Limitations
crt.sh only finds subdomains that have had SSL certificates issued. Services running on plain HTTP, or using IP-based certificates, won't appear. The API can also be slow during peak hours — rate limiting and timeouts are common. For production pipelines, consider running your own CT log monitor or using subfinder (which includes crt.sh as a data source).
SecurityClaw Integration
Individual tools find subdomains. SecurityClaw turns that discovery into actionable security findings. SecurityClaw's recon skills chain subdomain enumeration with targeted vulnerability scanning — when a new subdomain is discovered, SecurityClaw automatically probes it for open ports, identifies running services, and launches relevant security checks.
How SecurityClaw Handles Subdomain Enumeration
SecurityClaw's certificate-transparency-monitor skill continuously monitors CT logs for new certificates. When a new subdomain appears, it triggers the recon pipeline:
- Discovery — CT log monitoring + passive enumeration identifies new subdomains
- Resolution — DNS resolution confirms which subdomains are live
- Fingerprinting — Service detection identifies what's running on each host
- Scanning — Targeted vulnerability checks based on detected services (e.g., if it finds an Apache server, it runs Apache-specific checks from the OWASP Top 10 skill set)
This automation eliminates the manual gap between "I found a subdomain" and "I found a vulnerability on that subdomain." For organizations running continuous security programs, this pipeline runs on a schedule — new subdomains are discovered and tested within hours of certificate issuance.
Practical Workflow: Chaining Tools Together
Here's the workflow we recommend for thorough subdomain enumeration. This combines passive and active techniques for maximum coverage:
Step 1: Fast Passive Sweep
#!/bin/bash
TARGET="example.com"
OUTDIR="recon/$TARGET"
mkdir -p "$OUTDIR"
# Run passive tools in parallel
subfinder -d "$TARGET" -silent -o "$OUTDIR/subfinder.txt" &
assetfinder --subs-only "$TARGET" > "$OUTDIR/assetfinder.txt" &
curl -s "https://crt.sh/?q=%25.$TARGET&output=json" | jq -r '.[].name_value' | sort -u > "$OUTDIR/crtsh.txt" &
wait
# Merge and deduplicate
cat "$OUTDIR"/*.txt | sort -u > "$OUTDIR/passive-all.txt"
echo "[+] Passive enumeration complete: $(wc -l < "$OUTDIR/passive-all.txt") unique subdomains"
Step 2: Active Enumeration on High-Value Targets
# DNS brute-force with a targeted wordlist
knockpy "$TARGET" -w /path/to/dns-wordlist.txt > "$OUTDIR/knockpy.txt"
# DNSRecon for zone transfers and DNSSEC walking
dnsrecon -d "$TARGET" -t axfr >> "$OUTDIR/dnsrecon.txt"
dnsrecon -d "$TARGET" -t zonewalk >> "$OUTDIR/dnsrecon.txt"
# Merge active results with passive
cat "$OUTDIR/passive-all.txt" "$OUTDIR/knockpy.txt" "$OUTDIR/dnsrecon.txt" | \
grep -oP '[a-zA-Z0-9._-]+\.'"$TARGET" | sort -u > "$OUTDIR/all-subdomains.txt"
Step 3: Resolution and Probing
# Resolve subdomains to live hosts
cat "$OUTDIR/all-subdomains.txt" | httpx -silent -o "$OUTDIR/live-hosts.txt"
# Or use dnsx for DNS resolution only
cat "$OUTDIR/all-subdomains.txt" | dnsx -silent -a -resp -o "$OUTDIR/resolved.txt"
This three-step workflow typically takes 5-15 minutes for passive enumeration and 30-60 minutes for active brute-forcing, depending on target size and wordlist. The result is a comprehensive, deduplicated list of live subdomains ready for vulnerability scanning.
Post-Enumeration: What to Do With Your Subdomains
A list of subdomains is just the beginning. Here's what comes next:
1. HTTP Probing
Use httpx (ProjectDiscovery) to identify which subdomains serve HTTP/HTTPS content. This filters out mail servers, DNS-only hosts, and dead entries:
cat all-subdomains.txt | httpx -silent -status-code -title -tech-detect -o live-web.txt
2. Screenshot Capture
Visual inspection catches things automated tools miss — login pages, default installations, error messages leaking stack traces. Tools like gowitness or aquatone automate screenshots across hundreds of hosts.
3. Technology Fingerprinting
Identify the tech stack on each subdomain. Different technologies have different vulnerability profiles. A subdomain running WordPress gets different tests than one running a Node.js API.
4. Vulnerability Scanning
Feed your live subdomains into Nuclei or your scanner of choice. Target-specific templates based on the technology fingerprint dramatically reduce false positives and increase finding quality. This is where SecurityClaw's automated pipeline excels — it handles steps 1-4 automatically.
5. Continuous Monitoring
Subdomain enumeration isn't a one-time activity. New subdomains appear constantly as organizations deploy new services, spin up environments, and acquire companies. Run your enumeration pipeline on a schedule (daily or weekly) and diff the results against your baseline. New subdomains deserve immediate attention — they're often the least hardened.
Common Mistakes to Avoid
1. Using only one tool. No single tool finds everything. Subfinder misses what amass finds. Amass misses what crt.sh reveals. Always combine at least two passive sources and one active technique.
2. Skipping resolution. A subdomain that doesn't resolve to a live host is noise. Always resolve and probe before spending time on vulnerability scanning. Dead subdomains waste your time and pollute your reports.
3. Ignoring wildcard DNS. Some domains use wildcard DNS records (*.example.com resolves to a catch-all server). This makes every brute-force attempt "succeed," flooding your results with false positives. Detect wildcards early by resolving a random subdomain — if thissubdomaindoesnotexist.example.com resolves, you have a wildcard. Filter accordingly.
4. Running active enumeration without authorization. DNS brute-forcing sends thousands of queries to the target's nameservers. In a bug bounty context with explicit scope, this is fine. In other contexts, get written authorization first. Passive enumeration has no such restriction.
5. Not tracking results over time. A single enumeration snapshot tells you what exists now. Tracking changes over time reveals patterns — new services being deployed, old services being decommissioned, shadow IT appearing. Amass's graph database and SecurityClaw's continuous monitoring both support this.
6. Using default wordlists for brute-forcing. Default wordlists are a starting point, not an endpoint. Build custom wordlists from your passive enumeration results — extract naming patterns (e.g., dev-*, *-staging, *-api) and generate permutations. Tools like altdns and gotator automate this permutation generation.