Skip to content

Subfinder Subdomain Enumeration Cheat Sheet

Overview

Subfinder is a powerful subdomain discovery tool developed by Project Discovery that discovers valid subdomains for websites using passive online sources. It has a simple modular architecture and is optimized for speed and efficiency. Subfinder uses various public and private sources to find subdomains, including search engines, DNS aggregators, and certificate transparency logs.

What sets Subfinder apart from other subdomain enumeration tools is its extensive source coverage and its ability to use API keys for enhanced results. By leveraging multiple data sources simultaneously, Subfinder can discover subdomains that might be missed by other tools. It's designed to be easily integrated into security workflows and can be used in combination with other tools for comprehensive reconnaissance.

Subfinder is widely used by security researchers, bug bounty hunters, and penetration testers as the first step in reconnaissance to map the attack surface of a target organization. Its passive approach means it doesn't generate suspicious traffic to the target, making it suitable for stealthy reconnaissance.

Installation

Using Go

bash
# Install using Go (requires Go 1.20 or later)
go install -v github.com/projectdiscovery/subfinder/v2/cmd/subfinder@latest

# Verify installation
subfinder -version

Using Docker

bash
# Pull the latest Docker image
docker pull projectdiscovery/subfinder:latest

# Run Subfinder using Docker
docker run -it projectdiscovery/subfinder:latest -h

Using Homebrew (macOS)

bash
# Install using Homebrew
brew install subfinder

# Verify installation
subfinder -version

Using PDTM (Project Discovery Tools Manager)

bash
# Install PDTM first if not already installed
go install -v github.com/projectdiscovery/pdtm/cmd/pdtm@latest

# Install Subfinder using PDTM
pdtm -i subfinder

# Verify installation
subfinder -version

On Kali Linux

bash
# Install using apt
sudo apt install subfinder

# Verify installation
subfinder -version

Basic Usage

Enumerating Subdomains

bash
# Enumerate subdomains for a single domain
subfinder -d example.com

# Enumerate subdomains for multiple domains
subfinder -d example.com,hackerone.com

# Enumerate subdomains from a list of domains
subfinder -dL domains.txt

Output Options

bash
# Save results to a file
subfinder -d example.com -o results.txt

# Output in JSON format
subfinder -d example.com -oJ -o results.json

# Output in JSONL format
subfinder -d example.com -oJ -nW -o results.jsonl

# Output in CSV format
subfinder -d example.com -oC -o results.csv

# Silent mode (only subdomains)
subfinder -d example.com -silent

Basic Filtering

bash
# Remove wildcard subdomains
subfinder -d example.com -nW

# Exclude specific subdomains
subfinder -d example.com -exclude-domains dev.example.com,stage.example.com

# Match specific subdomains
subfinder -d example.com -match-domain api.example.com

Advanced Usage

Source Selection

bash
# List all available sources
subfinder -ls

# Use specific sources
subfinder -d example.com -sources censys,shodan,virustotal

# Exclude specific sources
subfinder -d example.com -exclude-sources alienvault,threatcrowd

API Configuration

bash
# Set API keys interactively
subfinder -set-config

# Set specific API key
subfinder -set-config VirusTotal=APIKEY

# Use a custom configuration file
subfinder -d example.com -config config.yaml

Recursive Enumeration

bash
# Enable recursive subdomain discovery
subfinder -d example.com -recursive

# Set maximum recursion depth
subfinder -d example.com -recursive -max-depth 2

DNS Resolution

bash
# Resolve discovered subdomains
subfinder -d example.com -resolve

# Use custom resolvers
subfinder -d example.com -resolve -r resolvers.txt

Active Enumeration

bash
# Enable active enumeration
subfinder -d example.com -active

# Set timeout for active enumeration
subfinder -d example.com -active -timeout 10

Performance Optimization

Concurrency and Rate Limiting

bash
# Set source concurrency (default: 10)
subfinder -d example.com -sc 20

# Set host concurrency (default: 10)
subfinder -d example.com -hc 20

# Set rate limit
subfinder -d example.com -rate-limit 100

Timeout Options

bash
# Set timeout for passive sources
subfinder -d example.com -timeout 30

# Set timeout for active resolution
subfinder -d example.com -resolve -timeout-resolve 5

Optimization for Large Scans

bash
# Use all sources for comprehensive results
subfinder -d example.com -all

# Increase concurrency for faster scanning
subfinder -d example.com -sc 50 -hc 50

Integration with Other Tools

Pipeline with HTTPX

bash
# Find subdomains and probe for HTTP services
subfinder -d example.com -silent | httpx -silent

# Find subdomains, resolve them, and probe for HTTP services
subfinder -d example.com -silent -resolve | httpx -silent

Pipeline with Nuclei

bash
# Find subdomains and scan for vulnerabilities
subfinder -d example.com -silent | httpx -silent | nuclei -t cves/

# Find subdomains with specific patterns and scan for vulnerabilities
subfinder -d example.com -silent | grep api | httpx -silent | nuclei -t apis/

Pipeline with Naabu

bash
# Find subdomains and scan for open ports
subfinder -d example.com -silent | naabu -silent

# Find subdomains, scan for open ports, and probe for HTTP services
subfinder -d example.com -silent | naabu -silent | httpx -silent

Output Customization

Custom Output Format

bash
# Output only specific fields in JSON format
subfinder -d example.com -oJ | jq '.host'

# Count total subdomains
subfinder -d example.com -silent | wc -l

# Sort output alphabetically
subfinder -d example.com -silent | sort

Filtering Output

bash
# Filter subdomains by pattern
subfinder -d example.com -silent | grep api

# Filter out specific patterns
subfinder -d example.com -silent | grep -v dev

# Find unique root subdomains
subfinder -d example.com -silent | awk -F. '{print $(NF-1)"."$NF}' | sort -u

Advanced Filtering

bash
# Filter by subdomain level
subfinder -d example.com -silent | awk -F. 'NF==3'  # 2nd level subdomains
subfinder -d example.com -silent | awk -F. 'NF==4'  # 3rd level subdomains
subfinder -d example.com -silent | awk -F. 'NF>=5'  # Deep level subdomains

# Filter by specific patterns
subfinder -d example.com -silent | grep -E '(api|dev|stage|test)'

# Exclude common development subdomains
subfinder -d example.com -silent | grep -v -E '(dev|stage|test|uat)'

API Key Configuration

Configuring API Keys

Subfinder supports various API providers. Here's how to configure them:

bash
# Create a configuration file
mkdir -p $HOME/.config/subfinder
cat > $HOME/.config/subfinder/config.yaml << EOF
resolvers:
  - 1.1.1.1
  - 8.8.8.8
sources:
  - alienvault
  - censys
  - shodan
  - virustotal
binaryedge:
  - 0bf8919b-aab9-42e4-9574-d3b639324597
censys:
  - ac244e2f-b635-4581-878a-33f4e79a2c13:dd510d6e-1b6e-4655-83f6-f347b363def9
certspotter:
  - 0412e8d1-5a86-47b4-a1a6-2a3b4a104a1a
github:
  - ghp_16C7e42F292c6912E7710c838347Ae178B4a
passivetotal:
  - sample-email@user.com:sample-password
securitytrails:
  - 9e56ef28-540b-4e0c-a51e-aba1f0d2d4d3
shodan:
  - AAAAClP1bJJSRMEYJazgwhJKrggRwKA
virustotal:
  - 6f5e5b82a6b5a61951c6a659d4a4522b34b3950d1e35e93131a7f63a3c352553
EOF

Supported API Providers

ProviderDescription
BinaryEdgeSearch for internet-exposed devices
CensysSearch engine for internet-connected devices
CertspotterCertificate transparency monitoring
GitHubCode hosting platform
PassiveTotalThreat intelligence platform
SecurityTrailsDNS and domain data provider
ShodanSearch engine for internet-connected devices
VirusTotalFile and URL analysis service

Troubleshooting

Common Issues

  1. Rate Limiting by Sources

    bash
    # Reduce concurrency
    subfinder -d example.com -sc 5
    
    # Add delay between requests
    subfinder -d example.com -delay 2
  2. API Key Issues

    bash
    # Verify API key configuration
    cat $HOME/.config/subfinder/config.yaml
    
    # Test specific source
    subfinder -d example.com -sources censys
  3. DNS Resolution Issues

    bash
    # Use custom resolvers
    subfinder -d example.com -resolve -r resolvers.txt
    
    # Increase resolution timeout
    subfinder -d example.com -resolve -timeout-resolve 10
  4. Memory Issues

    bash
    # Process domains one by one
    for domain in $(cat domains.txt); do subfinder -d $domain -o "$domain-subs.txt"; done

Debugging

bash
# Enable verbose mode
subfinder -d example.com -v

# Show debug information
subfinder -d example.com -debug

# Check source statistics
subfinder -d example.com -stats

Configuration

Configuration File

Subfinder uses a configuration file located at $HOME/.config/subfinder/config.yaml. You can customize various settings in this file:

yaml
# Example configuration file
resolvers:
  - 1.1.1.1
  - 8.8.8.8
sources:
  - alienvault
  - censys
  - shodan
  - virustotal
# API keys for different providers
binaryedge:
  - API_KEY
censys:
  - API_ID:API_SECRET

Environment Variables

bash
# Set Subfinder configuration via environment variables
export SUBFINDER_CONFIG_PATH=/path/to/config.yaml
export SUBFINDER_SOURCES=censys,shodan,virustotal
export SUBFINDER_RESOLVERS=1.1.1.1,8.8.8.8

Reference

Command Line Options

FlagDescription
-d, -domainDomain to find subdomains for
-dL, -domain-listFile containing list of domains
-o, -outputFile to write output to
-oJWrite output in JSON format
-oCWrite output in CSV format
-silentShow only subdomains in output
-v, -verboseShow verbose output
-ls, -list-sourcesList all available sources
-s, -sourcesSources to use for enumeration
-es, -exclude-sourcesSources to exclude from enumeration
-recursiveRecursive subdomain discovery
-max-depthMaximum recursion depth
-nW, -no-wildcardsRemove wildcard subdomains
-exclude-domainsSubdomains to exclude from enumeration
-match-domainSubdomains to match in enumeration
-r, -resolversFile containing list of resolvers
-resolveResolve discovered subdomains
-activeEnable active subdomain enumeration
-timeoutTimeout for passive sources in seconds
-timeout-resolveTimeout for resolver requests in seconds
-sc, -source-concurrencyNumber of concurrent sources
-hc, -host-concurrencyNumber of concurrent hosts
-rate-limitMaximum number of HTTP requests per second
-allUse all sources for enumeration
-configPath to configuration file
-set-configSet configuration values
-versionShow Subfinder version

Available Sources

SourceDescriptionAPI Key Required
AlienvaultOpen Threat ExchangeNo
AnubisSubdomain data from AnubisNo
ArchiveisArchive.is URL archiveNo
BinaryedgeInternet scanning dataYes
BufferOverDNS dataNo
CensysInternet scanning dataYes
CertSpotterCertificate transparency logsYes (for better results)
ChaosProject Discovery's Chaos datasetYes
CommoncrawlWeb crawl dataNo
DNSDBPassive DNS databaseYes
DNSRepoDNS records repositoryNo
EntrustCertificate transparency logsNo
FacebookCTFacebook's certificate transparency logsNo
GitHubCode searchYes (for better results)
IntelxIntelligence X dataYes
PassiveTotalRiskIQ's passive DNS dataYes
RapiddnsDNS records databaseNo
RiddlerDNS records searchNo
SecurityTrailsDNS records databaseYes
ShodanInternet scanning dataYes
ThreatBookThreat intelligence dataYes
ThreatMinerThreat intelligence dataNo
URLScanURL scanning serviceNo
VirusTotalSecurity service for files and URLsYes
WaybackarchiveInternet Archive's Wayback MachineNo
ZoomEyeCyberspace search engineYes

Resources


This cheat sheet provides a comprehensive reference for using Subfinder, from basic enumeration to advanced filtering and integration with other tools. For the most up-to-date information, always refer to the official documentation.