Skip to main content

21-phase automated reconnaissance framework for security researchers

Project description

ReconNinja

21-phase automated reconnaissance framework for authorized security testing.

Version Python Tests License Author Docs

โš  Use only against targets you own or have explicit written permission to test.

๐Ÿ“„ Documentation at doc.emonpersonal.xyz Changelog


What it does

ReconNinja automates every phase of a reconnaissance engagement into a single command. Point it at a domain or IP and it drives the full pipeline โ€” passive OSINT, port scanning, web discovery, vulnerability scanning, cloud intelligence, credential hunting, and AI-powered threat analysis โ€” then generates HTML, JSON, and Markdown reports.


Install

# From GitHub (always latest)
pip install git+https://github.com/ExploitCraft/ReconNinja.git

# From PyPI
pip install ReconNinja

# From source (recommended)
git clone https://github.com/ExploitCraft/ReconNinja.git
cd ReconNinja && chmod +x install.sh && ./install.sh

# With optional dependencies
pip install "ReconNinja[full]"    # AI providers + Shodan + dnspython
pip install "ReconNinja[ai]"      # AI providers only
pip install "ReconNinja[dns]"     # dnspython for zone transfer

Quick start

# Interactive mode โ€” guided setup
ReconNinja

# Standard scan
ReconNinja -t example.com

# Full 21-phase pipeline
ReconNinja -t example.com --profile full_suite -y

# v5 intelligence (no keys needed)
ReconNinja -t example.com --whois --wayback --ssl -y

# v6 new modules (no keys needed)
ReconNinja -t example.com --github-osint --js-extract \
  --cloud-buckets --dns-zone --waf --cors -y

# Full v6 with notifications
ReconNinja -t example.com --profile full_suite \
  --shodan --shodan-key KEY --vt --vt-key KEY \
  --ai --ai-provider groq --ai-key KEY \
  --github-osint --github-token TOKEN \
  --notify slack://hooks.slack.com/services/xxx \
  -y

# Compare two scans
ReconNinja --diff reports/example.com/20260101/report.json \
                  reports/example.com/20260301/report.json

Scan profiles

Profile What runs
fast Top 100 ports, no scripts
standard Top 1000 ports, scripts + versions (default)
thorough All ports, OS detection, aggressive scripts
stealth SYN scan, low timing, no banners
web_only httpx + dir scan + nuclei
port_only RustScan + Masscan + Nmap
full_suite All 21 phases
custom Interactive builder

Pipeline โ€” 21 phases

Phase 1    Passive Recon         subdomain enum (amass, subfinder, crt.sh)
Phase 2    RustScan              ultra-fast port discovery (all 65535 ports)
Phase 2b   Async TCP             pure-Python fallback, no root required
Phase 3    Masscan               optional SYN sweep (root required)
Phase 4    Nmap                  deep service / version / script analysis
Phase 4b   CVE Lookup            NVD API CVE matching on detected services
Phase 5    httpx                 live web detection + tech fingerprint
Phase 5b   WAF Detection         passive headers + wafw00f (v6 NEW)
Phase 5c   CORS Scanner          misconfiguration probe (v6 NEW)
Phase 6    Dir Scan              feroxbuster โ†’ ffuf โ†’ dirsearch fallback
Phase 6b   JS Extraction         endpoint + secret extraction from JS (v6 NEW)
Phase 7    WhatWeb               technology fingerprinting
Phase 8    Nikto                 classic web vulnerability scanner
Phase 9    Nuclei                template-based vulnerability detection
Phase 10   Screenshots           aquatone โ†’ gowitness fallback
Phase 11   AI Analysis           Groq / Ollama / Gemini / OpenAI
Phase 12   Intelligence          WHOIS ยท Wayback ยท SSL ยท VirusTotal ยท Shodan
Phase 13a  GitHub OSINT          secret / config file exposure (v6 NEW)
Phase 13b  Cloud Buckets         AWS S3 / Azure / GCS enumeration (v6 NEW)
Phase 13c  DNS Zone Transfer     AXFR vulnerability check (v6 NEW)
Phase 14   Plugins               drop .py into plugins/ to extend
Phase 15   Reports               HTML ยท JSON ยท Markdown

What's new in v6.0.0

8 bugs fixed

# Severity Fix
1 Critical subdomains.py โ€” _dns_brute args passed in wrong order; BUILTIN_SUBS landing in out_file slot โ†’ TypeError at runtime
2 High orchestrator.py โ€” rustscan ports not persisted; on --resume all_open_ports was empty โ†’ Nmap skipped entirely
3 High updater.py โ€” backup variable referenced before assignment on fresh install โ†’ UnboundLocalError
4 High orchestrator.py โ€” AI fallback _generate_ai_analysis was dead code; condition always True โ†’ users with no key got raw error object in report
5 Medium ports.py โ€” banner grabber sent HEAD / HTTP/1.0 to every port immediately; SSH/FTP/SMTP/Redis disconnected โ†’ banner capture failed on all non-HTTP ports
6 Medium orchestrator.py โ€” aquatone received sub_file (bare hostnames) instead of url_file (full URLs) โ†’ screenshots broken
7 Medium cve_lookup.py โ€” NVD rate-limit delay only fired on hits; no-result queries burst past 5 req/30s โ†’ silent 403s
8 Low utils/updater.py โ€” stale duplicate, never imported, missing timeout=300 on pip subprocess โ†’ deleted

6 new recon modules

Module Flag Description
GitHub OSINT --github-osint Search GitHub for exposed secrets, API keys, config files
JS Extraction --js-extract Crawl live pages, download JS files, extract endpoints + secrets
Cloud Buckets --cloud-buckets Probe AWS S3, Azure Blob, GCS for public/authenticated buckets
DNS Zone Transfer --dns-zone AXFR vulnerability check against all nameservers
WAF Detection --waf Passive header + wafw00f fingerprinting
CORS Scanner --cors Crafted Origin probe for ACAO misconfiguration

2 new utilities

Utility Flag Description
Scan Diff --diff A.json B.json Compare two scan reports โ€” new ports, new vulns, new subdomains
Notifications --notify URL Mid-scan alerts to Slack, Discord, or any webhook

All flags

Target
  -t, --target           Domain, IP, CIDR, or path to list file
  -p, --profile          Scan profile (see above)
  -y, --yes              Skip confirmation (CI/automation)

Port scanning
  --all-ports            Scan all 65535 ports
  --top-ports N          Top N ports (default: 1000)
  --timing T1-T5         Nmap timing (default: T4)
  --rustscan             Enable RustScan pre-scan
  --masscan              Enable Masscan sweep (root)
  --masscan-rate N       Masscan pps (default: 5000)
  --async-concurrency N  Async TCP concurrency (default: 1000)
  --async-timeout N      Async TCP timeout seconds (default: 1.5)

Web & discovery
  --httpx                Live service detection
  --whatweb              WhatWeb fingerprinting
  --ferox                Feroxbuster directory scan
  --nikto                Nikto scanner
  --nuclei               Nuclei vulnerability templates
  --aquatone             Screenshots
  --subdomains           Subdomain enumeration
  --wordlist-size        small | medium | large

Vulnerability intelligence
  --cve                  NVD CVE lookup for detected services
  --nvd-key KEY          NVD API key (50 req/30s vs 5)

v5 integrations
  --shodan               Shodan host intelligence
  --shodan-key KEY       Shodan API key
  --vt                   VirusTotal reputation
  --vt-key KEY           VirusTotal API key
  --whois                WHOIS lookup (no key)
  --wayback              Wayback Machine URL discovery (no key)
  --ssl                  SSL/TLS certificate analysis (no key)

v6 new modules
  --github-osint         GitHub secret/config exposure search
  --github-token KEY     GitHub token (raises rate limit 60โ†’5000/hr)
  --js-extract           JS endpoint and secret extraction
  --cloud-buckets        Cloud bucket enumeration (AWS/Azure/GCS)
  --dns-zone             DNS zone transfer (AXFR) check
  --waf                  WAF detection
  --cors                 CORS misconfiguration scanner

AI analysis
  --ai                   Enable AI threat analysis
  --ai-provider          groq | ollama | gemini | openai (default: groq)
  --ai-key KEY           API key for AI provider
  --ai-model MODEL       Override default model

Output & notifications
  --output DIR           Output directory (default: reports/)
  --output-format FMT    all | html | json | md | txt (default: all)
  --exclude PHASES       Comma-separated phases to skip
  --notify URL           Webhook alerts: slack://... discord://... https://...
  --timeout N            Global per-op timeout seconds (default: 30)
  --rate-limit N         Seconds between requests (default: 0)

Scan management
  --resume FILE          Resume from state.json checkpoint
  --diff A.json B.json   Compare two scan reports
  --update               Check GitHub for updates
  --force-update         Update even if already latest
  --check-tools          Show tool availability

Output

Each scan creates a timestamped folder:

reports/
โ””โ”€โ”€ example.com_20260320_120000/
    โ”œโ”€โ”€ report.html         โ† dark-mode dashboard
    โ”œโ”€โ”€ report.json         โ† full machine-readable results
    โ”œโ”€โ”€ report.md           โ† markdown summary
    โ”œโ”€โ”€ scan_config.json    โ† exact config used
    โ”œโ”€โ”€ scan.log            โ† full execution log
    โ”œโ”€โ”€ state.json          โ† resume checkpoint
    โ”œโ”€โ”€ subdomains/
    โ”œโ”€โ”€ nmap/
    โ”œโ”€โ”€ nuclei/
    โ”œโ”€โ”€ js_extract/         โ† v6: downloaded JS files
    โ”œโ”€โ”€ cloud_buckets/      โ† v6: bucket findings
    โ”œโ”€โ”€ dns_zone/           โ† v6: zone transfer records
    โ”œโ”€โ”€ waf/                โ† v6: WAF detection output
    โ””โ”€โ”€ cors/               โ† v6: CORS findings

Scan diff

# Run a baseline scan
ReconNinja -t example.com -y

# Run again after changes
ReconNinja -t example.com -y

# See exactly what changed
ReconNinja --diff reports/example.com/20260101_120000/report.json \
                  reports/example.com/20260320_120000/report.json

Output: new open ports, closed ports, new subdomains, new vulnerabilities, new technologies, changed service versions.


Notifications

# Slack
ReconNinja -t example.com --notify slack://hooks.slack.com/services/T.../B.../xxx -y

# Discord
ReconNinja -t example.com --notify discord://discord.com/api/webhooks/xxx/yyy -y

# Generic JSON webhook
ReconNinja -t example.com --notify https://your-server.com/webhook -y

Fires alerts mid-scan for: critical ports found, critical vulnerabilities, public cloud buckets, CORS issues, GitHub exposures, zone transfer vulnerabilities, and scan completion.


Resume interrupted scans

# Scan crashes after Phase 9 โ€” resume from last checkpoint
ReconNinja --resume reports/example.com_20260320_120000/state.json

All results (ports, findings, v5 intelligence, v6 new module data) are checkpointed after every phase and fully restored on resume.


Plugin system

Drop a .py file into plugins/ to extend the pipeline after all phases complete.

# plugins/my_check.py
PLUGIN_NAME    = "my_check"
PLUGIN_VERSION = "1.0"

def run(target, out_folder, result, cfg):
    print(f"Custom: {len(result.github_findings)} GitHub findings")
    print(f"Custom: {len(result.bucket_findings)} bucket findings")

Tool dependencies

Only rich is required. All external tools are optional โ€” ReconNinja detects availability and falls back gracefully.

ReconNinja --check-tools

Optional tools: nmap, rustscan, masscan, amass, subfinder, httpx, feroxbuster, ffuf, dirsearch, whatweb, nikto, nuclei, aquatone, gowitness, wafw00f, dig

Optional Python packages: dnspython (zone transfer), shodan, groq, openai, google-generativeai


Development

git clone https://github.com/ExploitCraft/ReconNinja.git
cd ReconNinja
chmod +x install.sh && ./install.sh

# Run tests
python3 -m pytest tests/ -v
python3 -m pytest tests/test_orchestrator.py -v
python3 -m pytest tests/test_models.py -v

License

MIT โ€” see LICENSE


ExploitCraft ยท Bangladesh ยท Building tools that matter

๐Ÿ“„ Full documentation at doc.emonpersonal.xyz

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

reconninja-6.0.0.tar.gz (105.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

reconninja-6.0.0-py3-none-any.whl (93.1 kB view details)

Uploaded Python 3

File details

Details for the file reconninja-6.0.0.tar.gz.

File metadata

  • Download URL: reconninja-6.0.0.tar.gz
  • Upload date:
  • Size: 105.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for reconninja-6.0.0.tar.gz
Algorithm Hash digest
SHA256 f4e62a7c49789a16269615a5f591fedbad751a7af2d11c85d1cc0aaa314616fc
MD5 29d451260840f74e39f08fc56d75ac8f
BLAKE2b-256 0ca329fb4a163d597a71d1bcdedbb8de1dba316eab6cfa182f72008418509125

See more details on using hashes here.

Provenance

The following attestation bundles were made for reconninja-6.0.0.tar.gz:

Publisher: release.yml on ExploitCraft/ReconNinja

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file reconninja-6.0.0-py3-none-any.whl.

File metadata

  • Download URL: reconninja-6.0.0-py3-none-any.whl
  • Upload date:
  • Size: 93.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for reconninja-6.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 cf090190ae8f77f0cbf6b8c3dc7643610c823fe74973af316e17cfef11087aad
MD5 e3d53dca284fe1e400738f8f1a22e15e
BLAKE2b-256 f6783990e0ba9a0c5b4e5a5ba0ef301d0e4ef8a42f8e8e4d6544b5aab0752af5

See more details on using hashes here.

Provenance

The following attestation bundles were made for reconninja-6.0.0-py3-none-any.whl:

Publisher: release.yml on ExploitCraft/ReconNinja

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page