Look, I love Nmap as much as the next person. It's been scanning ports since before some of you were born, and it does that job exceptionally well. But if your entire recon methodology is nmap -A -T4 target.com followed by manually poking at whatever pops up, you're leaving money on the table. Or bugs. Or whatever metric of success you're chasing.
The reality is that modern reconnaissance isn't about running individual tools — it's about orchestrating information gathering in a way that's repeatable, thorough, and doesn't make you want to throw your laptop out the window when you realize you forgot to enumerate that one subdomain that would've led to the jackpot.
This isn't another tutorial on using Nmap flags. This is about building reconnaissance pipelines that actually work for how you operate.
The Problem with Tool-Hopping
Here's the thing about security tools: they're all excellent at their specific job. Nmap scans ports. Amass finds subdomains. Nuclei checks for vulnerabilities. FFuF fuzzes directories. But stringing them together manually? That's where most people's workflows fall apart.
You finish an Amass run, export the results, feed them into httpx, take those live hosts, run them through various scanners, forget which subdomain you've already checked, lose track of your notes, and six hours later you're grep-ing through five different output files trying to remember if you already tested that admin panel you just found.
Sound familiar?
The solution isn't working harder or keeping better notes (though better notes help). The solution is building pipelines that handle the orchestration for you, so you can focus on the interesting part — actually exploiting what you find.
What Makes a Good Recon Pipeline
Before we get into the how, let's talk about what actually matters in a custom recon pipeline:
Modularity: You should be able to swap tools in and out without rewriting your entire workflow. Today you're using Subfinder, tomorrow there's a better tool, and you want to integrate it without breaking everything downstream.
State Management: Your pipeline needs to know what's been scanned, what's new, and what's changed. Running the same scans repeatedly on static targets wastes time. Missing new subdomains that appeared since your last scan loses opportunities.
Data Normalization: Every tool outputs data differently. Some give you JSON, some CSV, some just text vomit. Your pipeline needs to wrangle all of that into a consistent format you can actually work with.
Failure Resilience: Tools crash. APIs rate-limit you. Networks hiccup. Your pipeline should handle failures gracefully and pick up where it left off, not start from scratch every time something breaks.
Actionable Output: Raw data is useless. Your pipeline should surface interesting findings and prioritize what deserves your attention first.
The Foundation: Target Enumeration
Let's start with subdomain enumeration because it's the foundation of most web app recon. The goal isn't just to find subdomains — it's to find them efficiently, validate they're live, and organize them in a way that feeds the rest of your pipeline.
Here's a basic flow:
# Stage 1: Passive enumeration from multiple sources
subfinder -d target.com -all -o passive_subs.txt
amass enum -passive -d target.com -o amass_passive.txt
# Stage 2: Active enumeration (DNS brute-forcing)
puredns bruteforce wordlist.txt target.com -r resolvers.txt -o active_subs.txt
# Stage 3: Combine and deduplicate
cat passive_subs.txt amass_passive.txt active_subs.txt | sort -u > all_subs.txt
# Stage 4: Validate which are actually alive
httpx -l all_subs.txt -o live_hosts.txt -title -status-code -tech-detectSimple enough, right? But this is where most people stop. They've got a list of live hosts and… now what?
This is where the pipeline thinking comes in. That live_hosts.txt file isn't an end product—it's an input to the next stage. And the next stage. And the stage after that.
Chaining Intelligence: Port Scanning Done Right
Nmap is powerful, but running a full -p- scan against hundreds of subdomains is slow and noisy as hell. Here's where smart orchestration matters.
Instead of scanning everything equally, prioritize based on what you've already learned:
# Extract hosts that responded on HTTP/HTTPS
cat live_hosts.txt | grep "200\|301\|302\|403" | cut -d' ' -f1 > http_hosts.txt
# Run targeted Nmap scans based on service
nmap -iL http_hosts.txt -p 80,443,8080,8443 -sV -oA web_services
# Scan for common services on all hosts
nmap -iL all_subs.txt -p 22,21,3306,5432,6379,9200 --open -oA common_servicesBut here's where it gets interesting: parse those Nmap results programmatically and trigger different actions based on what you find.
# Parse Nmap XML and trigger service-specific enumeration
python parse_nmap.py -i web_services.xml | while read host port; do
case $port in
443)
# SSL/TLS enumeration
echo "$host" >> ssl_targets.txt
;;
8080|8000|8888)
# Alternative HTTP ports - might be APIs
echo "$host:$port" >> api_candidates.txt
;;
esac
doneThis is pipeline thinking. Each discovery triggers relevant follow-up actions automatically.
Content Discovery: Fuzzing With Context
Directory fuzzing is another area where most people waste time. Fuzzing every host with the same massive wordlist is inefficient. Better approach: fuzz intelligently based on what you know about each target.
# Identify technology stack from httpx output
cat live_hosts.txt | grep -i "wordpress" | cut -d' ' -f1 > wordpress_sites.txt
cat live_hosts.txt | grep -i "apache" | cut -d' ' -f1 > apache_sites.txt
# Use targeted wordlists
ffuf -w wordpress_wordlist.txt -u https://FUZZ.target.com -mc 200,301,302,403
# For API candidates, look for common endpoints
ffuf -w api_endpoints.txt -u https://api-target.com/FUZZ -mc all -fc 404Even better, build adaptive wordlists based on what you've already found. If you discover /api/v1/users, try /api/v2/users, /api/v1/admin, /api/internal/users, etc.
Automation & Scheduling: Continuous Reconnaissance
One-time scans are fine for point-in-time assessments, but if you're doing bug bounties or monitoring assets over time, you need continuous recon.
This is where cron jobs and differential analysis come in:
#!/bin/bash
# Daily recon job
DATE=$(date +%Y%m%d)
PREVIOUS_SCAN=$(ls -t scans/ | head -n 1)
# Run subdomain enumeration
subfinder -d target.com -all -o scans/${DATE}_subs.txt
# Compare with previous scan
comm -13 <(sort scans/${PREVIOUS_SCAN}) <(sort scans/${DATE}_subs.txt) > new_subs.txt
# Only scan new findings
if [ -s new_subs.txt ]; then
httpx -l new_subs.txt -o scans/${DATE}_new_live.txt
# Trigger notifications
notify_telegram "Found $(wc -l < new_subs.txt) new subdomains"
fiThis is the power of pipelines: they run while you sleep, notify you when something interesting appears, and let you focus on exploitation instead of enumeration.
Data Management: Making Sense of Chaos
After running these pipelines for a while, you'll have a mountain of data. Subdomain lists, port scan results, screenshots, vulnerability scan outputs — it becomes overwhelming fast.
This is where a proper data store matters. Whether it's a SQLite database, Elasticsearch, or even well-structured JSON files, you need a way to query your recon data efficiently.
# Simple example: SQLite for recon data
import sqlite3
conn = sqlite3.connect('recon.db')
c = conn.cursor()
# Store subdomain discoveries
c.execute('''CREATE TABLE IF NOT EXISTS subdomains
(domain TEXT, discovered_date TEXT, status_code INT,
title TEXT, tech_stack TEXT)''')
# Query for interesting patterns
c.execute('''SELECT domain, title FROM subdomains
WHERE title LIKE '%admin%' OR title LIKE '%dashboard%'
AND status_code NOT IN (404, 403)''')With structured data, you can answer questions like "show me all Jenkins instances" or "which new subdomains appeared in the last week?" without grep-ing through dozens of text files.
Integration: Pulling It All Together
The real magic happens when you integrate multiple tools into cohesive workflows. Here's a realistic pipeline flow:
- Discovery: Subfinder + Amass → all_subdomains.txt
- Validation: httpx → live_hosts.txt + metadata
- Categorization: Parse tech stacks → wordpress_hosts.txt, api_hosts.txt, etc.
- Targeted Scanning: Service-specific Nmap + vulnerability scanners
- Content Discovery: Context-aware fuzzing based on tech stack
- Continuous Monitoring: Diff against previous scans, alert on changes
- Reporting: Aggregate findings, prioritize by severity/interest
Each stage feeds the next. Each tool's output becomes another tool's input. And most importantly, it runs consistently every time without you needing to remember the sequence.
The Tools You'll Actually Use
Beyond the classics (Nmap, Subfinder, httpx), here are tools that integrate well into custom pipelines:
- nuclei: Template-based vulnerability scanning that's easy to automate
- dnsx: Fast DNS resolution with pipeline-friendly output
- notify: Multi-platform notifications (Slack, Discord, Telegram)
- anew: Append new lines to files, perfect for tracking deltas
- jq: JSON parsing — essential for working with tool outputs
- parallel: Run commands in parallel, speed up everything
Why This Matters
You might be thinking "this seems like a lot of work just to automate what I can do manually."
Sure. You can do it manually. You can also write assembly instead of using a compiler. But the question isn't whether you can — it's whether you should spend your time that way.
Custom recon pipelines aren't about being lazy. They're about being effective. They let you scale your methodology, ensure consistency, and spend your actual brain cycles on the interesting problems — not remembering which flags to pass to Nmap.
Plus, when you inevitably need to rescan everything because the scope expanded or you found a new attack vector, you just run the pipeline again instead of trying to reconstruct what you did three weeks ago.
Start Small, Scale Up
You don't need to build a perfect pipeline on day one. Start with automating the most tedious part of your workflow. Maybe that's subdomain enumeration. Maybe it's port scanning. Maybe it's just combining tool outputs into a single readable format.
Build that. Use it for a while. See what breaks. See what's missing. Then iterate.
Over time, you'll develop a reconnaissance methodology that's uniquely suited to how you work, built from battle-tested scripts that handle the grunt work while you focus on the exploitation that actually matters.
Want to skip the trial-and-error phase? I've packaged my field-tested automation scripts into a bundle that handles the orchestration, data management, and integration headaches. Check it out here.
PS I am experiencing a crisis, if you could check out my gumroad/payhip and buy something today, it could make a sincere difference in the circumstances I am currently facing. Best regards.