recon-subdomain-tech-detection — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited recon-subdomain-tech-detection (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
This skill combines two powerful reconnaissance tools for comprehensive subdomain enumeration and technology detection:
Together, they form a complete reconnaissance workflow for discovering and analyzing web assets during penetration testing.
# Using Go
go install -v github.com/projectdiscovery/subfinder/v2/cmd/subfinder@latest
# Using Homebrew (macOS)
brew install subfinder
# Binary download
# Download from: https://github.com/projectdiscovery/subfinder/releases/latest
# Verify installation
subfinder -version# Using Go
go install -v github.com/projectdiscovery/httpx/cmd/httpx@latest
# Using Homebrew (macOS)
brew install httpx
# Binary download
# Download from: https://github.com/projectdiscovery/httpx/releases/latest
# Verify installation
httpx -version#### What Subfinder Does Subfinder performs passive subdomain enumeration by querying:
Key Advantages:
#### Simple Subdomain Discovery
# Basic subdomain enumeration
subfinder -d target.com
# With verbose output
subfinder -d target.com -v
# Silent mode (subdomains only, no banner)
subfinder -d target.com -silent
# Colored output
subfinder -d target.com -nC=false#### Multiple Domains
# Multiple domains via command line
subfinder -d target.com,example.com,test.com
# From a file (one domain per line)
subfinder -dL domains.txt
# Pipe domains
cat domains.txt | subfinder# Save to file
subfinder -d target.com -o subdomains.txt
# JSON output (includes metadata)
subfinder -d target.com -oJ -o results.json
# CSV output
subfinder -d target.com -oT -o results.csv
# Append to existing file (don't overwrite)
subfinder -d target.com -o subdomains.txt -nW
# Output with IP addresses resolved
subfinder -d target.com -oI#### Using Specific Sources
# List all available sources
subfinder -ls
# Use only specific sources
subfinder -d target.com -sources crtsh,virustotal,shodan
# Exclude specific sources
subfinder -d target.com -exclude-sources github
# Use all sources (default behavior)
subfinder -d target.com -all#### API Configuration Create ~/.config/subfinder/provider-config.yaml:
# Free sources (no API key needed)
# - crtsh, certspotter, hackertarget, dnsdumpster, and more
# Paid/API sources (better results)
binaryedge:
- 0bf8919b-aab9-42e4-9574-d3b639324597
censys:
- ac244e2f-b635-4581-878a-33f4e79a2c13:dd510d6e-1b6e-4655-83f6-f347b363def9
chaos:
- d23a554bbc1aabb208c9acfbd2dd41ce718f3e67e8c88a30e84557c90f4f01ab
github:
- ghp_lkyJGU3jv1xmwk4SDXavrLDJ4dl2pSJMzj4X
shodan:
- AAAAClP1bJJSRMEYJazgwhJKrggRwKA
securitytrails:
- example-api-key-here
virustotal:
- example-api-key-here
zoomeye:
- username:passwordPro Tip: Even without API keys, subfinder provides excellent results from free sources like crt.sh and certspotter.
# Only show subdomains matching regex
subfinder -d target.com -m '.*\.api\..*'
# Only show subdomains with specific words
subfinder -d target.com -match 'admin,dev,staging'
# Filter out subdomains matching pattern
subfinder -d target.com -f '.*\.cdn\..*'
# Remove wildcards
subfinder -d target.com -nW# Resolve IP addresses
subfinder -d target.com -rL resolvers.txt
# Use custom DNS resolvers
subfinder -d target.com -r 8.8.8.8,1.1.1.1
# Only active subdomains (with valid DNS records)
subfinder -d target.com -active
# Verify subdomains with custom resolvers
subfinder -d target.com -r 8.8.8.8 -nW -v# Limit concurrent requests per source (default: 10)
subfinder -d target.com -rl 5
# Set timeout for sources (seconds)
subfinder -d target.com -timeout 30
# Maximum enumeration time
subfinder -d target.com -max-time 10
# Number of recursive subdomain discoveries
subfinder -d target.com -recursive#### Recursive Enumeration
# Find subdomains of subdomains (one level)
subfinder -d target.com -recursive
# Example: finds dev.staging.target.com if staging.target.com exists#### Integration with Other Tools
# Pipe to httpx for live host detection
subfinder -d target.com -silent | httpx -silent
# Pipe to nuclei for vulnerability scanning
subfinder -d target.com -silent | httpx -silent | nuclei -t cves/
# Pipe to naabu for port scanning
subfinder -d target.com -silent | naabu -silent
# Chain with dnsx for DNS records
subfinder -d target.com -silent | dnsx -resp#### What Httpx Does Httpx is a multi-purpose HTTP toolkit that:
Key Advantages:
#### Simple HTTP Probing
# Probe a single URL
httpx -u https://target.com
# Probe multiple URLs from file
httpx -l urls.txt
# Probe from stdin (pipe)
cat urls.txt | httpx
# Silent mode (URLs only)
httpx -l urls.txt -silent
# Verbose output
httpx -l urls.txt -verbose#### Common Workflow with Subfinder
# Find subdomains and probe them
subfinder -d target.com -silent | httpx -silent
# With technology detection
subfinder -d target.com -silent | httpx -silent -tech-detect
# Save results
subfinder -d target.com -silent | httpx -silent -o live-hosts.txt#### Basic Tech Detection
# Detect web technologies
httpx -l urls.txt -tech-detect
# With specific tech output
httpx -l urls.txt -tech-detect -json -o results.json
# Silent mode with tech
subfinder -d target.com -silent | httpx -silent -tech-detectTechnologies Detected:
#### Comprehensive Tech Analysis
# Full tech stack with all details
httpx -l urls.txt -tech-detect -status-code -title -web-server -content-length -json
# Output format:
# {"url":"https://target.com","status-code":200,"title":"Example","webserver":"nginx/1.18","technologies":["nginx:1.18","php:7.4","wordpress:5.9"]}#### Status Codes and Responses
# Show status codes
httpx -l urls.txt -status-code
# Filter by status code
httpx -l urls.txt -status-code -mc 200,301,302
# Filter out status codes
httpx -l urls.txt -status-code -fc 404,403
# Match response content
httpx -l urls.txt -match-string "admin"
# Filter response content
httpx -l urls.txt -filter-string "404 not found"#### Headers and Metadata
# Extract response headers
httpx -l urls.txt -include-response-header
# Extract specific header
httpx -l urls.txt -include-response-header -match-header "server"
# Extract all headers in JSON
httpx -l urls.txt -json -include-response-header
# Show content type
httpx -l urls.txt -content-type
# Show content length
httpx -l urls.txt -content-length
# Show response time
httpx -l urls.txt -response-time#### Title and Content Extraction
# Extract page titles
httpx -l urls.txt -title
# Extract with regex
httpx -l urls.txt -extract-regex '(?i)api[_-]?key["\s:=]+([a-zA-Z0-9_\-]+)'
# Extract favicons
httpx -l urls.txt -favicon
# Extract favicon hashes (for Shodan/Censys)
httpx -l urls.txt -favicon -json | jq -r '.favicon'# Detect web server
httpx -l urls.txt -web-server
# Detect specific server versions
httpx -l urls.txt -web-server -tech-detect
# Method detection (allowed HTTP methods)
httpx -l urls.txt -method
# TLS/SSL information
httpx -l urls.txt -tls-probe
# TLS version and cipher detection
httpx -l urls.txt -tls-probe -json#### Protocol Detection
# Try both HTTP and HTTPS
httpx -l urls.txt -probe
# Force HTTPS only
httpx -l urls.txt -https-only
# Force HTTP only
httpx -l urls.txt -http-only
# Follow redirects
httpx -l urls.txt -follow-redirects
# Max redirect limit
httpx -l urls.txt -follow-redirects -max-redirects 5#### Port Scanning
# Probe specific ports
httpx -l domains.txt -ports 80,443,8080,8443
# Probe common ports
httpx -l domains.txt -ports 80,443,8000,8080,8443,9000,9090
# Large port range (with subfinder)
subfinder -d target.com -silent | httpx -ports 80,443,8080,8443,3000,5000 -silent# Take screenshots of all live hosts
httpx -l urls.txt -screenshot
# Screenshots with custom path
httpx -l urls.txt -screenshot -screenshot-path ./screenshots
# Screenshots in headless mode
httpx -l urls.txt -screenshot -system-chrome#### Content-Based Filtering
# Match specific content
httpx -l urls.txt -match-string "dashboard"
# Match multiple strings (OR)
httpx -l urls.txt -match-string "admin,login,dashboard"
# Match regex
httpx -l urls.txt -match-regex '(?i)password|secret|api[_-]key'
# Filter out content
httpx -l urls.txt -filter-string "404,not found,error"
# Filter by regex
httpx -l urls.txt -filter-regex '(?i)cdn|cloudflare'#### Size-Based Filtering
# Match specific content length
httpx -l urls.txt -match-length 1234
# Filter by content length
httpx -l urls.txt -filter-length 0,404
# Match content length range
httpx -l urls.txt -match-length 1000-5000#### Status Code Filtering
# Match specific status codes
httpx -l urls.txt -mc 200,301,302
# Filter out status codes
httpx -l urls.txt -fc 404,403,500
# Only successful responses
httpx -l urls.txt -mc 200# Set thread count (default: 50)
httpx -l urls.txt -threads 100
# Rate limit (requests per second)
httpx -l urls.txt -rate-limit 10
# Add delay between requests
httpx -l urls.txt -delay 1s
# Set timeout (default: 10s)
httpx -l urls.txt -timeout 5
# Retry failed requests
httpx -l urls.txt -retries 2# JSON output
httpx -l urls.txt -json -o results.json
# JSON with all fields
httpx -l urls.txt -json -tech-detect -status-code -title -web-server -content-length -response-time
# CSV output
httpx -l urls.txt -csv -o results.csv
# Specific fields only
httpx -l urls.txt -silent -status-code -title -tech-detect
# Store response bodies
httpx -l urls.txt -store-response -store-response-dir ./responses#### Pipeline Integration
# Full recon pipeline
subfinder -d target.com -silent | \
httpx -silent -tech-detect -status-code -title -web-server | \
tee live-hosts.txt
# With nuclei vulnerability scanning
subfinder -d target.com -silent | \
httpx -silent | \
nuclei -t cves/ -severity critical,high
# With custom filtering
subfinder -d target.com -silent | \
httpx -silent -tech-detect -mc 200 -match-string "admin,dashboard" | \
tee interesting-hosts.txt#### CDN Detection and Bypass
# Detect CDN usage
httpx -l urls.txt -tech-detect -cdn
# Extract real IP behind CDN
httpx -l urls.txt -probe -json | jq -r 'select(.cdn==false) | .url'
# Test for CDN bypass
httpx -l urls.txt -random-agent -follow-redirects#### Path Discovery
# Probe common paths
httpx -l domains.txt -path /admin,/login,/dashboard,/api
# With status code filtering
httpx -l domains.txt -path /admin,/login -mc 200,301,302
# Save interesting paths
httpx -l domains.txt -path /admin,/login,/.git,/backup -mc 200,403 -o interesting-paths.txt#### Request Customization
# Custom headers
httpx -l urls.txt -header "Authorization: Bearer TOKEN"
# Custom User-Agent
httpx -l urls.txt -random-agent
# Custom method
httpx -l urls.txt -method POST
# Custom body
httpx -l urls.txt -method POST -body '{"key":"value"}'
# Follow redirects with custom headers
httpx -l urls.txt -follow-redirects -header "X-Custom: Value"#### Common Security Checks
# Check for common vulnerabilities
httpx -l urls.txt -path /.git/config,/.env,/backup.sql -mc 200
# Check for exposed files
httpx -l urls.txt -path /.git/HEAD,/.env,.env.backup,/config.php.bak -mc 200
# Test for directory listing
httpx -l urls.txt -match-string "Index of"
# Check for default credentials pages
httpx -l urls.txt -path /admin,/login,/phpmyadmin -title#### Technology-Specific Testing
# WordPress detection and testing
httpx -l urls.txt -path /wp-admin,/wp-login.php -mc 200,302
# API endpoint discovery
httpx -l urls.txt -path /api,/api/v1,/api/v2,/graphql -mc 200
# Check for common frameworks
httpx -l urls.txt -tech-detect -match-string "Laravel,Django,Rails"# Step 1: Discover subdomains
subfinder -d target.com -o subdomains.txt
# Step 2: Probe for live hosts
cat subdomains.txt | httpx -silent -o live-hosts.txt
# Step 3: Get tech stack
cat live-hosts.txt | httpx -tech-detect -title -status-code -web-server# Single command pipeline
subfinder -d target.com -silent | \
httpx -silent -tech-detect -status-code -title -web-server -content-length -json -o recon-results.json
# Analyze results
cat recon-results.json | jq -r '.technologies[]' | sort -u# From domains file
cat domains.txt | while read domain; do
echo "[*] Scanning $domain"
subfinder -d $domain -silent | \
httpx -silent -tech-detect -status-code -title -o "$domain-results.txt"
done#!/bin/bash
DOMAIN=$1
# Step 1: Subdomain enumeration
echo "[+] Finding subdomains for $DOMAIN"
subfinder -d $DOMAIN -silent -o subs.txt
# Step 2: Live host detection
echo "[+] Probing for live hosts"
cat subs.txt | httpx -silent -threads 50 -o live.txt
# Step 3: Technology detection
echo "[+] Detecting technologies"
cat live.txt | httpx -tech-detect -title -status-code -web-server -json -o tech.json
# Step 4: Screenshots
echo "[+] Taking screenshots"
cat live.txt | httpx -screenshot -screenshot-path ./screenshots
# Step 5: Check for interesting paths
echo "[+] Checking common paths"
cat live.txt | httpx -path /admin,/login,/.git,/backup,/api -mc 200,403 -o interesting.txt
echo "[+] Recon complete! Results:"
echo " - Subdomains: $(wc -l < subs.txt)"
echo " - Live hosts: $(wc -l < live.txt)"
echo " - Interesting paths: $(wc -l < interesting.txt)"# Find API endpoints
subfinder -d target.com -silent | \
httpx -silent -path /api,/api/v1,/api/v2,/graphql,/rest -mc 200,401,403 | \
httpx -tech-detect -title -status-code -json -o api-endpoints.json
# Extract API technologies
cat api-endpoints.json | jq -r 'select(.technologies[] | contains("api")) | .url'# For massive scope
subfinder -dL domains.txt -all -recursive -o all-subdomains.txt
# Probe with high concurrency
cat all-subdomains.txt | httpx -threads 200 -rate-limit 100 -timeout 5 -silent -o live-massive.txt
# Get quick tech overview
cat live-massive.txt | httpx -tech-detect -title -status-code -silent | tee tech-overview.txtCombine subfinder and httpx for efficient workflows:
subfinder -d target.com -silent | httpx -silent -tech-detect -o results.txtAlways save results for documentation and analysis:
subfinder -d target.com -o subs.txt
cat subs.txt | httpx -tech-detect -json -o tech.jsonJSON output makes it easy to parse and analyze:
httpx -l urls.txt -tech-detect -json | jq -r '.technologies[]' | sort -uDon't overwhelm targets:
httpx -l urls.txt -rate-limit 10 -threads 20for domain in $(cat domains.txt); do
subfinder -d $domain -silent | httpx -silent -o "${domain}-live.txt"
doneCustom DNS resolvers improve accuracy:
subfinder -d target.com -r 8.8.8.8,1.1.1.1 -o subs.txt# Find all WordPress sites
httpx -l urls.txt -tech-detect -json | jq -r 'select(.technologies[] | contains("WordPress")) | .url'
# Find all PHP sites
httpx -l urls.txt -tech-detect -json | jq -r 'select(.technologies[] | contains("PHP")) | .url'
# Find specific versions
httpx -l urls.txt -tech-detect -json | jq -r 'select(.technologies[] | contains("nginx:1.18")) | .url'# Save baseline
subfinder -d target.com -silent | httpx -silent -o baseline.txt
# Compare later
subfinder -d target.com -silent | httpx -silent -o current.txt
diff baseline.txt current.txtsubfinder -d target.com -silent | httpx -silent -mc 200 -title -tech-detectsubfinder -d target.com -silent | httpx -tech-detect -json | jq -r '.technologies[]' | sort -usubfinder -d target.com -silent | httpx -path /admin,/login,/dashboard -mc 200,301,302 -titlesubfinder -d target.com -silent | httpx -tech-detect -status-code -title -web-server -o full-recon.txtsubfinder -d target.com -silent | httpx -silent -screenshot -screenshot-path ./screenshotssubfinder -d target.com -silent | httpx -tech-detect -json | jq -r 'select(.technologies[] | contains("WordPress")) | .url'subfinder -d target.com -silent | httpx -path /api,/api/v1,/graphql -mc 200 -titlecat domains.txt | xargs -I {} subfinder -d {} -silent | httpx -silent -tech-detect -o all-results.txtsubfinder -d target.com -silent | httpx -tech-detect -json | \
jq -r 'select(.technologies[] | test("admin|panel|dashboard|api|jenkins|gitlab")) | .url'httpx -l urls.txt -tech-detect -json | jq -r 'select(.cdn==true) | .url + " [CDN: " + .cdn_name + "]"'Create ~/.config/subfinder/config.yaml:
# API keys
resolvers:
- 8.8.8.8
- 1.1.1.1
sources:
- crtsh
- virustotal
- shodan
timeout: 30Create ~/.config/httpx/config.yaml:
threads: 50
timeout: 10
follow-redirects: true
status-code: true
tech-detect: true
title: trueNo Results Found:
-sources crtsh-v to see what's happeningToo Many False Positives:
-nW to remove wildcards-active to verify DNS records-f or -mSlow Performance:
-timeout 10-sources crtsh,virustotalMissing Live Hosts:
-probe-timeout 30-ports 80,443,8080Rate Limiting/Blocking:
-threads 10-rate-limit 5-random-agentTech Detection Missing:
-tech-detect flag is used-include-response-header# Extract all URLs
cat results.json | jq -r '.url'
# Extract URLs with specific status
cat results.json | jq -r 'select(.status_code==200) | .url'
# Extract unique technologies
cat results.json | jq -r '.technologies[]' | sort -u
# Find servers running specific tech
cat results.json | jq -r 'select(.technologies[] | contains("nginx")) | .url'
# Extract title and URL
cat results.json | jq -r '"\(.url) - \(.title)"'
# Count by technology
cat results.json | jq -r '.technologies[]' | sort | uniq -c | sort -rn
# Extract servers with errors
cat results.json | jq -r 'select(.status_code>=500) | .url'
# Find URLs with specific content
cat results.json | jq -r 'select(.body | contains("admin")) | .url'subfinder -d target.com -silent | httpx -silent | nuclei -t cves/subfinder -d target.com -silent | naabu -silent | httpx -silentsubfinder -d target.com -silent | dnsx -resp -a -aaaa -cnamesubfinder -d target.com -silent | httpx -silent | katana -d 3# Find live hosts, then fuzz
subfinder -d target.com -silent | httpx -silent -o live.txt
cat live.txt | xargs -I {} ffuf -w wordlist.txt -u {}/FUZZ -acFor path discovery with httpx:
| Task | Command Template | |
|---|---|---|
| Basic Subdomain Enum | subfinder -d target.com | |
| Save Subdomains | subfinder -d target.com -o subs.txt | |
| Multiple Domains | subfinder -dL domains.txt | |
| With Specific Sources | subfinder -d target.com -sources crtsh,virustotal | |
| Recursive Enum | subfinder -d target.com -recursive | |
| Active Verification | subfinder -d target.com -active | |
| Probe URLs | httpx -l urls.txt | |
| Tech Detection | httpx -l urls.txt -tech-detect | |
| With Screenshots | httpx -l urls.txt -screenshot | |
| Status + Title | httpx -l urls.txt -status-code -title | |
| JSON Output | httpx -l urls.txt -json -o results.json | |
| Path Testing | httpx -l urls.txt -path /admin,/api | |
| Filter Status | httpx -l urls.txt -mc 200,301,302 | |
| Rate Limited | httpx -l urls.txt -rate-limit 10 | |
| Full Pipeline | `subfinder -d target.com -silent \ | httpx -silent -tech-detect` |
#!/bin/bash
# recon.sh - Automated reconnaissance script
DOMAIN=$1
OUTPUT_DIR="recon_${DOMAIN}_$(date +%Y%m%d_%H%M%S)"
mkdir -p $OUTPUT_DIR
echo "[+] Starting reconnaissance for $DOMAIN"
# Subdomain enumeration
echo "[1/5] Subdomain enumeration..."
subfinder -d $DOMAIN -all -recursive -o $OUTPUT_DIR/subdomains.txt
echo " Found $(wc -l < $OUTPUT_DIR/subdomains.txt) subdomains"
# Live host detection
echo "[2/5] Probing for live hosts..."
cat $OUTPUT_DIR/subdomains.txt | httpx -silent -threads 100 -o $OUTPUT_DIR/live-hosts.txt
echo " Found $(wc -l < $OUTPUT_DIR/live-hosts.txt) live hosts"
# Technology detection
echo "[3/5] Detecting technologies..."
cat $OUTPUT_DIR/live-hosts.txt | httpx -tech-detect -title -status-code -web-server -json -o $OUTPUT_DIR/tech-detection.json
echo " Technology detection complete"
# Screenshots
echo "[4/5] Taking screenshots..."
cat $OUTPUT_DIR/live-hosts.txt | httpx -screenshot -screenshot-path $OUTPUT_DIR/screenshots -silent
echo " Screenshots saved"
# Interesting paths
echo "[5/5] Checking for interesting paths..."
cat $OUTPUT_DIR/live-hosts.txt | httpx -path /admin,/login,/api,/.git,/backup,/config -mc 200,403,401 -o $OUTPUT_DIR/interesting-paths.txt
echo " Found $(wc -l < $OUTPUT_DIR/interesting-paths.txt) interesting paths"
# Summary
echo ""
echo "========================================="
echo "Reconnaissance Summary for $DOMAIN"
echo "========================================="
echo "Total Subdomains: $(wc -l < $OUTPUT_DIR/subdomains.txt)"
echo "Live Hosts: $(wc -l < $OUTPUT_DIR/live-hosts.txt)"
echo "Interesting Paths: $(wc -l < $OUTPUT_DIR/interesting-paths.txt)"
echo ""
echo "Results saved in: $OUTPUT_DIR/"
echo "========================================="
# Extract technology summary
echo ""
echo "Top Technologies Detected:"
cat $OUTPUT_DIR/tech-detection.json | jq -r '.technologies[]' | sort | uniq -c | sort -rn | head -10#!/bin/bash
# multi-recon.sh - Scan multiple domains and generate report
INPUT_FILE=$1
REPORT_FILE="recon_report_$(date +%Y%m%d_%H%M%S).html"
echo "<html><head><title>Recon Report</title></head><body>" > $REPORT_FILE
echo "<h1>Reconnaissance Report</h1>" >> $REPORT_FILE
echo "<p>Generated: $(date)</p>" >> $REPORT_FILE
while read domain; do
echo "[+] Scanning $domain..."
# Subdomain enumeration
subs=$(subfinder -d $domain -silent | wc -l)
# Live hosts
live=$(subfinder -d $domain -silent | httpx -silent | wc -l)
# Tech detection
tech=$(subfinder -d $domain -silent | httpx -silent -tech-detect -json | jq -r '.technologies[]' | sort -u | tr '\n' ', ')
# Add to report
echo "<h2>$domain</h2>" >> $REPORT_FILE
echo "<ul>" >> $REPORT_FILE
echo "<li>Subdomains: $subs</li>" >> $REPORT_FILE
echo "<li>Live Hosts: $live</li>" >> $REPORT_FILE
echo "<li>Technologies: $tech</li>" >> $REPORT_FILE
echo "</ul>" >> $REPORT_FILE
done < $INPUT_FILE
echo "</body></html>" >> $REPORT_FILE
echo "[+] Report saved to $REPORT_FILE"#!/bin/bash
# monitor-recon.sh - Monitor for new subdomains and changes
DOMAIN=$1
BASELINE="baseline_${DOMAIN}.txt"
CURRENT="current_${DOMAIN}.txt"
DIFF_FILE="changes_${DOMAIN}_$(date +%Y%m%d_%H%M%S).txt"
# Create baseline if doesn't exist
if [ ! -f $BASELINE ]; then
echo "[+] Creating baseline for $DOMAIN"
subfinder -d $DOMAIN -silent | httpx -silent | sort > $BASELINE
echo "[+] Baseline created with $(wc -l < $BASELINE) hosts"
exit 0
fi
# Current scan
echo "[+] Scanning $DOMAIN for changes..."
subfinder -d $DOMAIN -silent | httpx -silent | sort > $CURRENT
# Compare
NEW=$(comm -13 $BASELINE $CURRENT)
REMOVED=$(comm -23 $BASELINE $CURRENT)
if [ ! -z "$NEW" ]; then
echo "[!] New hosts discovered:" | tee -a $DIFF_FILE
echo "$NEW" | tee -a $DIFF_FILE
# Tech detect new hosts
echo "$NEW" | httpx -tech-detect -title -status-code >> $DIFF_FILE
fi
if [ ! -z "$REMOVED" ]; then
echo "[!] Hosts removed:" | tee -a $DIFF_FILE
echo "$REMOVED" | tee -a $DIFF_FILE
fi
if [ -z "$NEW" ] && [ -z "$REMOVED" ]; then
echo "[+] No changes detected"
else
echo "[+] Changes saved to $DIFF_FILE"
fi
# Update baseline
cp $CURRENT $BASELINE#!/bin/bash
# extract-tech.sh - Extract and categorize technologies from httpx JSON output
JSON_FILE=$1
echo "=== Web Servers ==="
cat $JSON_FILE | jq -r '.technologies[]' | grep -i "nginx\|apache\|iis\|tomcat" | sort -u
echo ""
echo "=== Programming Languages ==="
cat $JSON_FILE | jq -r '.technologies[]' | grep -i "php\|python\|ruby\|node\|java\|asp" | sort -u
echo ""
echo "=== CMS ==="
cat $JSON_FILE | jq -r '.technologies[]' | grep -i "wordpress\|joomla\|drupal\|magento" | sort -u
echo ""
echo "=== Frameworks ==="
cat $JSON_FILE | jq -r '.technologies[]' | grep -i "laravel\|django\|rails\|react\|angular\|vue" | sort -u
echo ""
echo "=== CDN ==="
cat $JSON_FILE | jq -r '.technologies[]' | grep -i "cloudflare\|akamai\|fastly\|cloudfront" | sort -u
echo ""
echo "=== Security ==="
cat $JSON_FILE | jq -r '.technologies[]' | grep -i "waf\|firewall\|recaptcha" | sort -u#!/bin/bash
# find-vulnerable.sh - Find potentially vulnerable technology versions
JSON_FILE=$1
echo "[+] Searching for potentially vulnerable versions..."
echo ""
echo "=== Outdated PHP ==="
cat $JSON_FILE | jq -r 'select(.technologies[] | test("PHP:[0-5]|PHP:7.[0-3]")) | .url + " - " + (.technologies[] | select(test("PHP")))'
echo ""
echo "=== Outdated WordPress ==="
cat $JSON_FILE | jq -r 'select(.technologies[] | test("WordPress:[0-4]|WordPress:5.[0-8]")) | .url + " - " + (.technologies[] | select(test("WordPress")))'
echo ""
echo "=== Outdated jQuery ==="
cat $JSON_FILE | jq -r 'select(.technologies[] | test("jQuery:[0-2]")) | .url + " - " + (.technologies[] | select(test("jQuery")))'
echo ""
echo "=== Old Nginx ==="
cat $JSON_FILE | jq -r 'select(.technologies[] | test("nginx:1.[0-9]\.")) | .url + " - " + (.technologies[] | select(test("nginx")))'#!/bin/bash
# generate-fuzz-targets.sh - Create organized target lists for ffuf
LIVE_HOSTS=$1
OUTPUT_DIR="fuzz-targets"
mkdir -p $OUTPUT_DIR
echo "[+] Generating fuzzing target lists..."
# WordPress sites
cat $LIVE_HOSTS | httpx -tech-detect -json -silent | \
jq -r 'select(.technologies[] | contains("WordPress")) | .url' > $OUTPUT_DIR/wordpress-targets.txt
echo " WordPress targets: $(wc -l < $OUTPUT_DIR/wordpress-targets.txt)"
# Admin panels detected
cat $LIVE_HOSTS | httpx -path /admin -mc 200,401,403 -silent > $OUTPUT_DIR/admin-panels.txt
echo " Admin panels: $(wc -l < $OUTPUT_DIR/admin-panels.txt)"
# API endpoints
cat $LIVE_HOSTS | httpx -path /api,/api/v1,/graphql -mc 200,401 -silent > $OUTPUT_DIR/api-endpoints.txt
echo " API endpoints: $(wc -l < $OUTPUT_DIR/api-endpoints.txt)"
# PHP applications
cat $LIVE_HOSTS | httpx -tech-detect -json -silent | \
jq -r 'select(.technologies[] | contains("PHP")) | .url' > $OUTPUT_DIR/php-apps.txt
echo " PHP applications: $(wc -l < $OUTPUT_DIR/php-apps.txt)"
# Sites with exposed .git
cat $LIVE_HOSTS | httpx -path /.git/config -mc 200 -silent > $OUTPUT_DIR/git-exposed.txt
echo " Exposed .git: $(wc -l < $OUTPUT_DIR/git-exposed.txt)"
echo "[+] Target lists saved in $OUTPUT_DIR/"This skill includes supplementary materials in the resources/ directory to enhance reconnaissance workflows:
#### 1. CONFIG_TEMPLATES.md - Configuration & API Setup Comprehensive configuration templates for subfinder and httpx with API key setup.
Contents:
When to Reference:
Key Recommendations from CONFIG_TEMPLATES.md:
#### 2. WORKFLOWS.md - Pre-Built Reconnaissance Workflows Ready-to-use workflow templates for common reconnaissance scenarios.
Contents:
When to Reference:
Example Workflows to Suggest:
# Workflow 1: Basic subdomain to live hosts
subfinder -d target.com -silent | httpx -silent -tech-detect -o results.txt
# Workflow 4: Continuous monitoring
python3 recon_helper.py compare-subs baseline.txt current.txt -o changes.txt
# Workflow 5: API-focused reconnaissance
subfinder -d target.com -silent | \
httpx -path /api,/api/v1,/graphql -mc 200,401,403 -tech-detect
# Workflow 6: Integration with nuclei
subfinder -d target.com -silent | httpx -silent | \
nuclei -t cves/ -severity critical,high#### 3. WORDLISTS.md - Comprehensive Wordlist Guide Complete guide to wordlists for reconnaissance and path discovery.
Contents:
When to Reference:
Key Points from WORDLISTS.md:
-path flag accepts comma-separated paths, not wordlist filescommon.txt (4,600 entries) for quick scansCommon Path Probing Examples:
# Admin panels
httpx -l urls.txt -path /admin,/administrator,/login,/wp-admin -mc 200,401,403
# API endpoints
httpx -l urls.txt -path /api,/api/v1,/graphql,/swagger.json -mc 200,401
# WordPress paths
httpx -l wp-sites.txt -path /wp-admin,/wp-json,/xmlrpc.php -mc 200,403
# Sensitive files
httpx -l urls.txt -path /.git/config,.env,/backup.sql -mc 200,403A Python utility script that assists with analyzing httpx results, generating reports, and managing subdomain lists.
Location: Should be placed in the same directory as your reconnaissance results or in a dedicated tools directory.
Key Capabilities:
When Claude Should Use This Helper:
Enhanced Features:
--summary flag for quick triage (shows key metrics only)--json flag for programmatic parsing by Claude--quiet mode for cleaner piping to other tools--no-color for non-TTY environmentsExample Usage Patterns:
# Quick summary for fast triage
python3 recon_helper.py analyze results.json --summary
# Full analysis with HTML report
python3 recon_helper.py analyze results.json --report recon-report.html
# JSON output for Claude to parse
python3 recon_helper.py analyze results.json --json
# Extract WordPress sites for WPScan
python3 recon_helper.py extract results.json --tech wordpress -o wordpress-targets.txt
# Generate organized target lists for ffuf
python3 recon_helper.py generate-targets results.json --output-dir fuzz-targets/
# Compare with previous scan (monitoring)
python3 recon_helper.py compare-subs old-subs.txt new-subs.txt -o changes.txt
# Merge results from multiple domains
python3 recon_helper.py merge-subs domain1-subs.txt domain2-subs.txt -o all-subs.txt
# Quiet mode for piping
python3 recon_helper.py extract results.json --tech api -q -o api-targets.txt1. User asks about configuration/setup: → Reference CONFIG_TEMPLATES.md
2. User asks about workflows/how to do something: → Reference WORKFLOWS.md
3. User asks about wordlists/paths: → Reference WORDLISTS.md
4. User has httpx JSON results: → Use recon_helper.py
python3 recon_helper.py analyze results.json--report report.htmlpython3 recon_helper.py extract results.json --tech wordpresspython3 recon_helper.py generate-targets results.json#!/bin/bash
DOMAIN=$1
# Step 1: Use CONFIG_TEMPLATES.md recommendations
# Ensure subfinder is configured with API keys (GitHub, Chaos, VirusTotal)
# Step 2: Use WORKFLOWS.md - Workflow 2 (Comprehensive Recon)
echo "[+] Running comprehensive reconnaissance..."
subfinder -d $DOMAIN -all -recursive -o subdomains.txt
# Step 3: Probe with httpx
cat subdomains.txt | httpx -silent -tech-detect -json -o results.json
# Step 4: Use recon_helper.py to analyze
echo "[+] Analyzing results..."
python3 recon_helper.py analyze results.json --summary
python3 recon_helper.py analyze results.json --report report.html
# Step 5: Generate target lists
python3 recon_helper.py generate-targets results.json -o targets/
# Step 6: Use WORDLISTS.md for path discovery
echo "[+] Probing for admin panels..."
cat results.json | jq -r '.url' | \
httpx -path /admin,/login,/wp-admin,/phpmyadmin -mc 200,401,403 -title
# Step 7: Technology-specific testing (from WORKFLOWS.md)
python3 recon_helper.py extract results.json --tech wordpress -o wp-sites.txt
cat wp-sites.txt | httpx -path /wp-json,/xmlrpc.php -mc 200
# Step 8: Integration with ffuf (from WORKFLOWS.md)
cat targets/admin-panels.txt | while read url; do
ffuf -w ~/wordlists/admin-paths.txt -u $url/FUZZ -ac
done
echo "[+] Reconnaissance complete! Check report.html"When helping users with reconnaissance using subfinder and httpx:
The power of these tools is in combining them:
subfinder -d target.com -silent | httpx -silent -tech-detectAlways use -silent when piping between tools to avoid mixing output:
subfinder -d target.com -silent | httpx -silent -o results.txtAlways recommend saving output for documentation:
subfinder -d target.com -o subdomains.txt
httpx -l urls.txt -tech-detect -json -o tech.jsonAlways include -tech-detect with httpx for reconnaissance:
httpx -l urls.txt -tech-detect -title -status-code -web-serverJSON output makes parsing and analysis much easier:
httpx -l urls.txt -tech-detect -json | jq -r '.technologies[]' | sort -uAlways recommend rate limiting for production targets:
httpx -l urls.txt -rate-limit 10 -threads 20For multiple domains, organize results clearly:
for domain in $(cat domains.txt); do
subfinder -d $domain -silent | httpx -silent -o "${domain}-results.txt"
doneBasic Recon:
subfinder -d target.com -silent | httpx -silent -tech-detect -o results.txtComprehensive Recon:
subfinder -d target.com -all -recursive | \
httpx -tech-detect -screenshot -status-code -title -json -o full-recon.jsonAPI Discovery:
subfinder -d target.com -silent | \
httpx -path /api,/api/v1,/graphql -mc 200 -tech-detectQuick Tech Stack:
subfinder -d target.com -silent | httpx -silent -tech-detect -json | \
jq -r '.technologies[]' | sort -uAfter recon, suggest fuzzing interesting targets:
# 1. Find live hosts
subfinder -d target.com -silent | httpx -silent -o live.txt
# 2. Fuzz interesting ones
cat live.txt | while read url; do
ffuf -w wordlist.txt -u $url/FUZZ -ac
doneHelp users identify potential vulnerabilities from tech detection:
Help users analyze results effectively:
# Find unique technologies
cat results.json | jq -r '.technologies[]' | sort -u
# Find specific tech
cat results.json | jq -r 'select(.technologies[] | contains("WordPress")) | .url'
# Count by status code
cat results.json | jq -r '.status_code' | sort | uniq -c
# Find errors
cat results.json | jq -r 'select(.status_code >= 500) | .url'For sensitive targets, recommend:
-threads 10-rate-limit 5-random-agent-delay 1s"How do I find subdomains?"
subfinder -d target.com -o subdomains.txt"How do I check which are live?"
cat subdomains.txt | httpx -silent -o live.txt"How do I detect technologies?"
cat live.txt | httpx -tech-detect -title -status-code"How do I find WordPress sites?"
httpx -l urls.txt -tech-detect -json | \
jq -r 'select(.technologies[] | contains("WordPress")) | .url'"How do I take screenshots?"
httpx -l urls.txt -screenshot -screenshot-path ./screenshots"How do I find admin panels?"
httpx -l urls.txt -path /admin,/login,/dashboard -mc 200,301,302-threads 100)-timeout 30)-rate-limit and -delay-http-only or -https-only if you know the protocolCommon issues and solutions:
-all with subfinder-timeout-tech-detect flag is presentRecommend these outputs for pentest reports:
# JSON for detailed analysis
httpx -l urls.txt -tech-detect -json -o report.json
# HTML for visual presentation
httpx -l urls.txt -tech-detect -screenshot -screenshot-path ./screens
# CSV for client spreadsheets
subfinder -d target.com -oT -o subdomains.csvAlways suggest checking for:
/.git/config, /.env, /backup.sql/admin, /login, /phpmyadmin/api, /api/v1, /graphql/server-status, /phpinfo.phpGuide users on what to do with results:
After generating JSON results with httpx, ALWAYS use recon_helper.py to analyze them:
# Run recon and analyze
subfinder -d target.com -silent | httpx -silent -tech-detect -json -o results.json
python3 recon_helper.py analyze results.json --report report.htmlThe helper provides:
Critical: Don't just save JSON and move on - always analyze it to find interesting targets and potential vulnerabilities.
After analysis, generate organized target lists:
python3 recon_helper.py generate-targets results.json --output-dir targets/This creates organized lists (wordpress-targets.txt, admin-panels.txt, api-endpoints.txt, etc.) that can be directly fed into ffuf, WPScan, or other tools.
When running periodic scans, compare results:
python3 recon_helper.py compare-subs baseline.txt current.txt -o changes.txtAlert users to new subdomains (potential new attack surface) or removed ones (infrastructure changes).
User: "I need to find all subdomains for example.com"
Claude Response:
# Find all subdomains
subfinder -d example.com -o subdomains.txt
# Check which ones are live
cat subdomains.txt | httpx -silent -o live-hosts.txt
# Get a quick overview with tech detection
cat live-hosts.txt | httpx -tech-detect -title -status-codeUser: "How do I find all WordPress sites in my scope?"
Claude Response:
# First, get all live hosts
subfinder -d target.com -silent | httpx -silent -o live.txt
# Then detect WordPress
cat live.txt | httpx -tech-detect -json | \
jq -r 'select(.technologies[] | contains("WordPress")) | .url' > wordpress-sites.txt
# Or in one pipeline
subfinder -d target.com -silent | \
httpx -silent -tech-detect -json | \
jq -r 'select(.technologies[] | contains("WordPress")) | .url'User: "I have 50 domains to scan, how do I do this efficiently?"
Claude Response:
# Create a script for batch processing
cat > recon-all.sh << 'EOF'
#!/bin/bash
while read domain; do
echo "[+] Scanning $domain..."
subfinder -d $domain -silent | \
httpx -silent -tech-detect -json -o "${domain}-results.json"
echo " Completed $domain"
done < domains.txt
EOF
chmod +x recon-all.sh
./recon-all.sh
# Then aggregate results
cat *-results.json | jq -r '.technologies[]' | sort | uniq -c | sort -rnUser: "I need to find all API endpoints"
Claude Response:
# Discover subdomains and probe for API paths
subfinder -d target.com -silent | \
httpx -path /api,/api/v1,/api/v2,/graphql,/rest -mc 200,401,403 -tech-detect -json -o api-endpoints.json
# Extract API URLs
cat api-endpoints.json | jq -r '.url'
# Find API technologies
cat api-endpoints.json | jq -r '.technologies[]' | grep -i api | sort -u-o for all outputs-tech-detectEnd of Reconnaissance SKILL.md
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.