Zero-touch, purely passive external asset discovery platform
No probes sent to targets. No logs generated on their side. Just 15+ public data sources cross-validated.
Status: Actively maintained โ daily data source updates and CI runs on every commit.
Passive Recon is a purely passive OSINT/EASM/CTEM platform that discovers an organization's external assets by querying 15+ public data sources โ certificate transparency logs, DNS records, search engines, network mapping, GitHub, Wayback Machine, and more โ without ever touching the target's systems.
One command, any target:
pip install -r requirements.txt
python cli.py collect "Tsinghua University"
python cli.py collect --domain example.com "Acme Corp"The system auto-infers the target domain, runs all 15 sources in parallel, and produces a comprehensive asset report with risk findings.
| Capability | Description |
|---|---|
| Passive Asset Discovery | 15+ cross-validated data sources, auto domain inference |
| Subdomain Enumeration | crt.sh, HackerTarget, URLScan, Wayback, DNSDumpster, and more |
| IP & Port Mapping | C-segment clustering, exposed port detection |
| Risk Detection | VPN exposure, OA systems, weak ciphers, known vulnerabilities |
| Compliance Guardrail | R1 compliance check on every outbound call โ fail-closed |
| Rate Limiting | Per-IP sliding window โค95%, queue never drops tasks |
| Approval Workflow | High-risk outbound requires manual approval |
| Audit Trail | Full operation audit log |
| Static Guard | CI scan that blocks active-scan code from entering production |
| Web Dashboard | python cli.py serve โ one-click panel |
| Scheduled Tasks | python cli.py schedule --targets targets.txt โ daily auto-collection |
| Auto-save Reports | Markdown report saved to data/report_<target>_<domain>.md |
| ๐ค AI Domain Inference | DeepSeek-powered domain inference for any target (no lookup table needed) |
| ๐ค AI Risk Scoring | Automatic risk scoring (0-100) with false positive filtering |
| ๐ค AI Report Summary | Auto-generated analysis report after each collection |
| ๐ค AI Chat Query | python cli.py ask "What VPNs does Tsinghua have?" โ natural language asset search |
| ๐ CVE Vulnerability Intel | Auto-correlate discovered assets with NVD/OSV for known vulnerabilities |
| ๐ CVE Lookup | python cli.py cve CVE-2024-xxxx โ query CVE details from NVD + OSV |
| ๐ Change Tracking | Scheduled runs compare snapshots and flag new/changed assets |
Passive Recon integrates with DeepSeek (no additional cost, free tier available) to provide AI-powered enhancements:
| Feature | Command | Description |
|---|---|---|
| AI Domain Inference | python cli.py collect "any target" |
Auto-infers domain for any target via AI, not just lookup table entries |
| AI Risk Scoring | python cli.py collect "target" |
Scores each risk 0-100, filters false positives, suggests fixes |
| AI Report Summary | python cli.py collect "target" |
Generates a natural language analysis report after collection |
| AI Chat Query | python cli.py ask "question" |
Ask natural language questions about your asset database |
Examples:
# AI domain inference works for any target, not just known ones
python cli.py collect "some unknown company"
# AI risk scoring with severity visualization
python cli.py collect "Tsinghua University"
# Output: โโโโโโโโ 85 [P1] VPN entry exposed: vpn.tsinghua.edu.cn
# ๐ก Suggest restricting VPN entry to an IP allowlist and enabling MFA
# AI chat query โ ask questions in natural language
python cli.py ask "What VPNs does Tsinghua University have?"
python cli.py ask "List all discovered mail servers"
python cli.py ask "What are the most critical risks?"To skip AI processing (faster, no API call):
python cli.py collect "target" --no-aiEnvironment variable: Set DEEPSEEK_API_KEY (already configured if you have it) to enable AI features. The free DeepSeek tier is sufficient for personal use.
| Source | Key Required | Type |
|---|---|---|
| crt.sh | โ Free | Certificate Transparency |
| HackerTarget | โ Free | DNS / Subdomain |
| URLScan.io | โ Free | Historical Snapshots |
| AlienVault OTX | โ Free | Passive DNS / Threat Intel |
| Wayback Machine | โ Free | Historical URLs / Subdomains |
| DNSDumpster | โ Free | DNS Mapping / MX/NS Records |
| CommonCrawl | โ Free | Web Crawl Archive |
| GitHub | โ Free (rate-limited) | Code Leak Search |
| Hunter (Yingtu) | โ Required | Network Space Mapping |
| FOFA | โ Required | Network Space Search |
| SecurityTrails | โ Required | Subdomain / Passive DNS |
| Shodan | โ Required | Internet Device Search |
| VirusTotal | โ Required | Passive DNS / Subdomain |
| ZoomEye | โ Required | Network Space Mapping |
| Qichacha | โ Required | Chinese Enterprise Registry |
| NVD | โ Free | CVE Vulnerability Database |
| OSV.dev | โ Free | Open Source Vulnerability Database |
pip install -r requirements.txtOption A: Environment Variables (recommended โ never written to disk)
# Linux / macOS
export PASSIVE_API_KEYS='{"hunter":["key1","key2"],"qichacha":{"app_key":"xxx","secret_key":"xxx"}}'
# Windows PowerShell
$json='{"hunter":["key1","key2"],"qichacha":{"app_key":"xxx","secret_key":"xxx"}}'
[Environment]::SetEnvironmentVariable('PASSIVE_API_KEYS', $json, 'User')Option B: config.json
cp config.example.json config.json
# Edit config.json with your keysZero-config mode: run
python cli.py serve --demoto start with mock data โ no API keys needed for evaluation.
# One-shot: any target, auto domain inference
python cli.py collect "Tsinghua University"
python cli.py collect --domain example.com "Acme Corp"
# Batch mode
python cli.py batch targets.txt
# One-click web dashboard
python cli.py serve
# Daily scheduled collection (2:00 AM)
python cli.py schedule --targets targets.txtAfter running python cli.py collect "Tsinghua University":
๐ฏ Target: Tsinghua University
๐ Auto-inferred domain: tsinghua.edu.cn
# Tsinghua University Passive Asset Collection Report
> Main domain: tsinghua.edu.cn | Sources: 15
> Total: 285
## ๐ Asset Overview
| Type | Count |
|------|-------|
| subdomain | 270 |
| IP address | 178 |
| port | 2 |
| **Total** | **285** |
## ๐จ Risk Findings
- ๐ด [P1] VPN entry exposed: vpn.tsinghua.edu.cn
- ๐ด [P1] WebVPN remote access exposed: webvpn.tsinghua.edu.cn
| Variable | Type | Description | Required |
|---|---|---|---|
PASSIVE_API_KEYS |
JSON string | Data source API keys (see below) | โ For some sources |
PASSIVE_API_TOKENS |
Comma-separated | REST API auth tokens | Optional |
PASSIVE_API_KEY |
String | Single token fallback | Optional |
PASSIVE_DB_PATH |
Path | SQLite path (default: data/agent.db) |
Optional |
PASSIVE_LOG_PATH |
Path | Audit log path (default: data/audit.jsonl) |
Optional |
PASSIVE_PII_SALT |
String | PII de-identification salt | Optional |
PASSIVE_PII_KEY |
String | PII encryption key | Optional |
{
"hunter": ["key1", "key2"],
"qichacha": {
"app_key": "your_app_key",
"secret_key": "your_secret_key"
},
"shodan": "your_shodan_key",
"virustotal": "your_vt_key",
"zoomeye": "your_zoomeye_key"
}โโโ cli.py โ CLI entry point (one command to rule them all)
โโโ config.example.json โ Config template
โโโ requirements.txt โ Python dependencies
โ
โโโ passive_agent/ โ ๐ฏ Core source
โ โโโ main.py โ FastAPI app + dashboard API
โ โโโ config.py โ Config loader (env > config.json)
โ โโโ api/ โ REST API routes
โ โโโ collector/ โ 15 passive data source collectors
โ โโโ enumerator/ โ Subject enumeration engine
โ โโโ verifier/ โ DNS-only verification pipeline
โ โโโ compliance/ โ Compliance guardrail
โ โโโ gateway/ โ Proxy gateway + rate limiter
โ โโโ orchestrator/ โ Orchestration scheduler
โ โโโ approval/ โ Approval workflow
โ โโโ audit/ โ Audit logging
โ โโโ inventory/ โ Asset inventory
โ โโโ graph/ โ Knowledge graph (planned)
โ โโโ metrics/ โ Metrics (planned)
โ โโโ scheduler/ โ Daily scheduled tasks
โ โโโ storage/ โ SQLite + JSON persistence
โ โโโ common/ โ Shared components
โ โโโ static/ โ Frontend static files
โ
โโโ tests/ โ Test suite
โโโ scripts/ โ CI guard scripts
โโโ docs/ โ Design documents
โโโ data/ โ Runtime data (gitignored)
Full design docs live in
docs/โ system design, sequence diagrams, and class diagrams.
# Full test suite
pytest
# Passive egress guard (CI gate)
pytest tests/test_passive_egress.py -v
# Static guard โ ensures no active-scan code enters production
python scripts/guard_passive.pyThe passive egress guard and static guard run automatically in CI (
.github/workflows/ci.yml) and block any active-scan code from merging.
- Purely Passive โ Never send a single packet to the target
- Zero Logs โ Never touch the target's logging systems
- Compliant Egress โ Every outbound call must pass
compliance_client.check() - Fail-Closed โ If in doubt, deny; if misconfigured, deny; if no token, deny
- Auditable โ Every operation writes to the audit log (
data/audit.jsonl) for compliance review
PRs are welcome! Whether it's adding a new data source adapter, improving the dashboard, or fixing a bug โ all contributions help make passive recon more powerful.
MIT
Passive Recon โ Star โญ on GitHub
Made with โค๏ธ for the OSINT / EASM / CTEM community
Source-Available ยท All Rights Reserved
This project is source-available and all rights are reserved by the author. The code is provided for viewing and evaluation purposes only โ access does not grant any right to copy, modify, redistribute, use commercially, or create derivative works. Unauthorized reuse may carry legal risk. Contact the author for explicit written permission before any other use.
ๆฌไปๅบไธบใๆบ็ ๅฏๆฅใๆๅฉไฟ็ใ้กน็ฎ๏ผsource-available / all-rights-reserved๏ผใไปฃ็ ไป ไพๆฅ็ไธ่ฏไผฐ๏ผๆชๆๆไปปไฝๅคๅถใๅๅๅใไฟฎๆนใๅ็จๆ่ก็ๅไฝใๆ ่ชๅ็จไปฃ็ ๅญๅจๆณๅพ้ฃ้ฉ๏ผๅฆๆ้่ฆ่ฏทๅ ่็ณปไฝ่ ่ทๅๆ็กฎไนฆ้ข่ฎธๅฏใ