stxkxs/recon
GitHub: stxkxs/recon
一个快速、模块化的基础设施侦察工具包,通过27个模块收集域名和IP的DNS、SSL、HTTP、WHOIS等信息并生成安全评分报告。
Stars: 0 | Forks: 0
# 侦察
一个快速、模块化的基础设施侦察工具包,专为 SRE 和安全团队设计。
```
_ __ ___ ___ ___ _ __
| '__/ _ \/ __/ _ \| '_ \
| | | __/ (_| (_) | | | |
|_| \___|\___\___/|_| |_|
```
[](LICENSE)
[](https://www.gnu.org/software/bash/)
## 概述
Recon 对域名和 IP 地址执行被动侦察,收集 DNS 记录、SSL 证书、HTTP 标头、WHOIS 数据、技术指纹、端口状态、CORS 配置、WAF/CDN 检测、证书透明度日志等信息。它与 Shodan、VirusTotal 和 SecurityTrails 集成以获取丰富的情报,生成安全态势评分,并能生成自包含的 HTML 报告。专为以下场景设计:
- **事件响应**:快速收集可疑域名的上下文信息
- **基础设施审计**:验证 DNS、SSL 和安全标头配置
- **安全评估**:通过可操作的建议对安全态势进行评分
- **竞争分析**:了解技术栈和基础设施选择
- **资产发现**:查找子域名、开放端口和相关基础设施
## 功能特性
- **模块化架构** - 27 个模块,可运行特定模块或一次性全部运行
- **安全评分** - A-F 字母等级及可操作的建议
- **HTML 报告** - 导出自包含的深色主题 HTML 报告
- **CORS 分析** - 检测 CORS 配置错误和源反射
- **端口扫描** - 扫描 20 个常见服务端口的 TCP 状态
- **WAF/CDN 检测** - 对 Web 应用防火墙和 CDN 进行被动指纹识别
- **DNSSEC 验证** - 链条验证和配置分析
- **接管检测** - 子域名接管漏洞扫描
- **API 集成** - Shodan, VirusTotal, SecurityTrails, Wayback Machine
- **邮件安全** - SPF, DMARC, DKIM 和 BIMI 分析
- **JS 分析** - 从 JavaScript 中提取 secrets、endpoint 和依赖项
- **目录发现** - 敏感文件和路径枚举
- **双重输出** - 人类可读的终端输出或用于自动化的 JSON
- **批量处理** - 并行执行数百个目标的扫描
- **检查点/恢复** - 中断的任务可以恢复
- **配置驱动** - YAML 配置,支持环境变量覆盖
- **Charm/gum UI** - 安装 [gum](https://github.com/charmbracelet/gum) 后增强终端输出
- **Docker 支持** - 容器化以保持环境一致性
## 快速开始
```
# Clone the repo
git clone https://github.com/stxkxs/recon.git
cd recon
# 针对域名运行
./bin/recon example.com
# 用于自动化的 JSON 输出
./bin/recon --json example.com | jq .
# 仅特定模块
./bin/recon -m dns,ssl example.com
# 安全评分
./bin/recon -s example.com
# HTML 报告
./bin/recon --report report.html example.com
# 仅端口扫描
./bin/recon -m ports example.com
# CORS 分析
./bin/recon -m cors example.com
# WAF/CDN 检测
./bin/recon -m waf example.com
# 邮件安全分析
./bin/recon -m emailsec -s example.com
# IP 侦察
./bin/recon 8.8.8.8
# 批处理
./bin/recon --batch targets.txt --parallel 4
```
## 安装
### 前置条件
| 必需 | 可选 |
|----------|----------|
| bash 4+ | yq (YAML config) |
| dig | timeout (coreutils) |
| curl | flock (batch locking) |
| openssl | gum (enhanced UI) |
| whois | nc (banner grabbing) |
| jq | nmap (enhanced port scanning) |
**macOS:**
```
# bash 4+ (macOS 自带 bash 3.2)
brew install bash
# 其他依赖
brew install bind curl openssl whois jq yq
# 可选:Charm gum 用于增强终端 UI
brew install gum
```
**Ubuntu/Debian:**
```
apt-get install bash dnsutils curl openssl whois jq yq
# 可选:gum
mkdir -p /etc/apt/keyrings
curl -fsSL https://repo.charm.sh/apt/gpg.key | gpg --dearmor -o /etc/apt/keyrings/charm.gpg
echo "deb [signed-by=/etc/apt/keyrings/charm.gpg] https://repo.charm.sh/apt/ * *" | tee /etc/apt/sources.list.d/charm.list
apt-get update && apt-get install gum
```
### 安装
```
# 验证依赖
make check-deps
# 安装到 /usr/local (需要 sudo)
sudo make install
# 或者安装到 ~/.local (用户安装,无需 sudo)
make install-local
# 验证安装
recon --version
```
### Docker
```
# 构建镜像
make docker-build
# 运行
docker run --rm -it recon:latest example.com
docker run --rm -it recon:latest --json example.com
# 使用 docker-compose
cd docker
docker-compose run --rm recon example.com
```
## 使用方法
```
Usage: recon [options]
recon --batch [options]
Arguments:
Domain or IP address to scan
Options:
-h, --help Show this help message
-v, --version Show version information
-j, --json Output results as JSON
-o, --output FILE Write output to file
-m, --modules LIST Comma-separated list of modules to run
-c, --config FILE Use custom config file
-q, --quiet Suppress banner and progress output
-s, --score Run security scoring after scan
-r, --report FILE Generate HTML report to file
--list-modules List available modules
Batch Processing:
-b, --batch FILE Process multiple targets from file
-p, --parallel N Number of parallel workers (default: 4)
--resume Resume interrupted batch
--list-batches List recent batch runs
```
## 模块
| 模块 | 描述 | 收集的数据 |
|--------|-------------|----------------|
| `dns` | DNS 枚举 | A, AAAA, MX, TXT, NS, CAA, DMARC, DKIM 记录 |
| `subdomain` | 子域名发现 | 来自 80+ 条目词典的常见子域名 |
| `crt` | 证书透明度 | 搜索 CT 日志以查找子域名和证书 |
| `ssl` | SSL/TLS 分析 | 证书链、有效期、SANs、TLS 版本 |
| `http` | HTTP 标头 | 安全标头、服务器信息、重定向 |
| `whois` | WHOIS 查询 | 组织、网络名称、国家、CIDR |
| `files` | 常见文件 | robots.txt, security.txt, sitemap.xml, well-known |
| `tech` | 技术检测 | 前端框架、分析工具、CDN/基础设施 |
| `ip` | IP 侦察 | 反向 DNS, ASN, 地理位置提示 |
| `ports` | 端口扫描 | 20 个常见 TCP 端口及服务识别 |
| `cors` | CORS 分析 | 配置错误检测、源反射、风险等级 |
| `waf` | WAF/CDN 检测 | 通过标头指纹识别防火墙和 CDN |
| `dnssec` | DNSSEC 验证 | DNSSEC 链验证和配置状态 |
| `takeover` | 子域名接管 | 悬空 CNAME 和接管漏洞检测 |
| `shodan` | Shodan 情报 | 开放端口、服务、漏洞、OS 指纹识别 |
| `virustotal` | VirusTotal 信誉 | 域名/IP 信誉、检测到的 URL、威胁类别 |
| `wayback` | Wayback Machine | 历史 URL 发现和端点枚举 |
| `securitytrails` | SecurityTrails | DNS 历史、关联域名、子域名 |
| `reverseip` | 反向 IP 查询 | 托管在同一 IP 地址上的域名 |
| `asn` | ASN 扩展 | ASN 详情、IP 前缀枚举、对等网络 |
| `axfr` | 区域传送测试 | DNS AXFR 区域传送漏洞检测 |
| `methods` | HTTP 方法 | 每个端点允许的 HTTP 方法枚举 |
| `dirs` | 目录发现 | 敏感文件、管理面板、备份文件、配置文件 |
| `jsanalysis` | JS 分析 | JavaScript 文件中的 secrets、API endpoint、依赖项 |
| `favicon` | Favicon 哈希 | Favicon 哈希指纹识别以进行技术识别 |
| `emailsec` | 邮件安全 | SPF, DMARC, DKIM, BIMI 验证和分析 |
| `score` | 安全评分 | A-F 字母等级、类别细分、建议 |
**默认模块:**
- 域名:`dns`, `subdomain`, `crt`, `ssl`, `http`, `whois`, `files`, `tech`, `ports`, `cors`, `waf`, `dnssec`, `shodan`, `virustotal`, `wayback`, `securitytrails`, `axfr`, `methods`, `dirs`, `jsanalysis`, `favicon`
- IP:`ip`, `ports`, `shodan`, `virustotal`, `reverseip`, `asn`
- 扫描后:`score`, `takeover`, `emailsec`(使用 `-s` 标志或显式运行)
## 安全评分
使用 `-s` 运行以获取安全态势评分:
```
recon -s example.com
```
评分评估:
| 类别 | 权重 | 检查项 |
|----------|--------|--------|
| 传输安全 | 25 分 | HTTPS, HSTS, HTTP 重定向 |
| 邮件安全 | 15 分 | SPF, DMARC, DKIM |
| 证书健康 | 15 分 | 有效 SSL, CAA 记录 |
| 安全标头 | 25 分 | CSP, X-Frame-Options, XCTO, Referrer-Policy, Permissions-Policy |
| 基础设施 | 10 分 | 多个 nameserver, security.txt |
等级:**A** (90%+), **B** (80%+), **C** (70%+), **D** (60%+), **F** (<60%)
## HTML 报告
生成自包含的 HTML 报告:
```
recon --report report.html example.com
```
报告包含所有扫描数据,采用深色主题、响应式布局,并包含评分可视化、颜色编码的发现结果和结构化表格。
## 示例
### 基础侦察
```
# 带终端输出的完整扫描
recon example.com
# 快速 DNS 检查
recon -m dns example.com
# SSL 和 HTTP 安全分析
recon -m ssl,http example.com
# 保存结果到文件
recon --json example.com -o results.json
# 安静模式 (无 banner)
recon -q example.com
```
### 安全评估
```
# 带安全评分的完整扫描
recon -s example.com
# 生成带评分的 HTML 报告
recon --report audit.html -s example.com
# 检查 CORS 配置
recon -m cors example.com
# 仅端口扫描
recon -m ports example.com
# 组合安全检查
recon -m http,ssl,cors,ports -s example.com
# 子域名接管检查
recon -m subdomain,crt,takeover example.com
# JavaScript secrets 扫描
recon -m jsanalysis example.com
# 完整邮件安全审计
recon -m dns,emailsec -s example.com
```
### 使用 JSON 输出
```
# 美观打印完整结果
recon --json example.com | jq .
# 提取 A 记录
recon --json example.com | jq '.results.dns.data.a'
# 获取所有发现的子域名
recon --json example.com | jq '.results.subdomain.data.found[].fqdn'
# 检查安全头
recon --json example.com | jq '.results.http.data.urls[0].security_headers'
# 获取安全评分
recon --json -s example.com | jq '.results.score.data | {grade, percentage, recommendations}'
# 获取开放端口
recon --json example.com | jq '.results.ports.data.open[] | {port, service}'
# 检查 CORS 风险等级
recon --json example.com | jq '.results.cors.data | {risk, findings}'
# 构建摘要报告
recon --json -s example.com | jq '{
domain: .target,
grade: .results.score.data.grade,
ips: .results.dns.data.a,
nameservers: .results.dns.data.ns,
open_ports: [.results.ports.data.open[].port],
cors_risk: .results.cors.data.risk,
subdomains: [.results.subdomain.data.found[].fqdn],
ssl_issuer: .results.ssl.data.certificates[0].issuer,
technologies: .results.tech.data
}'
```
### 批量处理
```
# 创建目标文件 (每行一个)
cat > targets.txt << 'EOF'
example.com
github.com
cloudflare.com
EOF
# 使用 8 个并行 worker 处理
recon --batch targets.txt --parallel 8
# 恢复中断的批处理
recon --resume
# 查看批处理历史
recon --list-batches
# 结果保存至 ~/.local/share/recon/results/
```
### 输入归一化
Recon 自动对输入进行归一化:
```
# 所有这些都是等效的:
recon example.com
recon EXAMPLE.COM
recon https://example.com
recon https://example.com/path/to/page
recon " example.com "
```
## 配置
### 配置文件
创建 `~/.config/recon/recon.yaml` 或 `./recon.yaml`:
```
global:
output_dir: "~/.local/share/recon/results"
output_format: "terminal" # terminal | json
color: "auto" # auto | always | never
retention_days: 30
timeouts:
dns: 5
http: 10
ssl: 5
whois: 15
ports: 2
batch:
max_parallel: 4
checkpoint_interval: 10
resume_on_start: true
rate_limits:
requests_per_second: 2
whois_delay: 1
modules:
dns:
enabled: true
record_types: [A, AAAA, MX, TXT, NS, CAA]
subdomain:
enabled: true
wordlist: "" # empty = use built-in
ssl:
enabled: true
http:
enabled: true
whois:
enabled: true
files:
enabled: true
tech:
enabled: true
ip:
enabled: true
ports:
enabled: true
cors:
enabled: true
crt:
enabled: true
waf:
enabled: true
dnssec:
enabled: true
takeover:
enabled: true
shodan:
enabled: true
virustotal:
enabled: true
wayback:
enabled: true
securitytrails:
enabled: true
reverseip:
enabled: true
asn:
enabled: true
axfr:
enabled: true
methods:
enabled: true
dirs:
enabled: true
wordlist: "" # empty = use built-in
request_delay: 0.2
jsanalysis:
enabled: true
max_files: 20
max_file_size: 2097152
favicon:
enabled: true
emailsec:
enabled: true
score:
enabled: true
# 用于增强情报的 API keys
api_keys:
shodan: ""
securitytrails: ""
virustotal: ""
```
参阅 [`etc/recon.yaml.example`](etc/recon.yaml.example) 获取完整模板。
### 环境变量
环境变量会覆盖配置文件中的值:
```
export RECON_OUTPUT_FORMAT=json
export RECON_COLOR=never
export RECON_TIMEOUT_DNS=10
export RECON_TIMEOUT_HTTP=20
export RECON_PARALLEL=8
export RECON_API_SHODAN=your_api_key
export RECON_API_VIRUSTOTAL=your_api_key
export RECON_API_SECURITYTRAILS=your_api_key
```
## JSON Schema
```
{
"meta": {
"version": "2.1.0",
"run_id": "20240201-143022-a1b2c3",
"started_at": "2024-02-01T14:30:22Z",
"ended_at": "2024-02-01T14:31:45Z",
"target_original": "https://example.com",
"target_normalized": "example.com"
},
"target": "example.com",
"results": {
"dns": {
"status": "success",
"data": {
"a": ["93.184.216.34"],
"aaaa": ["2606:2800:220:1:248:1893:25c8:1946"],
"mx": [{"priority": 10, "host": "mail.example.com."}],
"txt": ["v=spf1 -all"],
"ns": ["ns1.example.com.", "ns2.example.com."],
"caa": ["0 issue \"letsencrypt.org\""],
"dmarc": "v=DMARC1; p=reject",
"dkim": {"google": "v=DKIM1; ..."}
}
},
"ports": {
"status": "success",
"data": {
"open": [
{"port": 80, "service": "http", "state": "open", "banner": null},
{"port": 443, "service": "https", "state": "open", "banner": null}
],
"closed": [22, 21, 3306],
"total_scanned": 20
}
},
"cors": {
"status": "success",
"data": {
"url": "https://example.com",
"tests": [],
"findings": [],
"risk": "none"
}
},
"waf": {
"status": "success",
"data": {
"detected": true,
"provider": "Cloudflare",
"confidence": "high"
}
},
"shodan": {
"status": "success",
"data": {
"ip": "93.184.216.34",
"ports": [80, 443],
"vulns": [],
"os": "Linux"
}
},
"score": {
"status": "success",
"data": {
"score": 85,
"max_score": 100,
"percentage": 85,
"grade": "B",
"passed": 12,
"failed": 3,
"checks": [],
"recommendations": ["Add Content-Security-Policy header"]
}
}
},
"errors": [],
"conflicts": [],
"summary": {
"modules_run": 27,
"modules_success": 27,
"modules_partial": 0,
"modules_failed": 0,
"total_errors": 0,
"total_conflicts": 0
}
}
```
## 项目结构
```
recon/
├── bin/
│ └── recon # Main entry point
├── lib/
│ ├── core/
│ │ ├── common.sh # Colors, logging, utilities
│ │ ├── config.sh # YAML config loading
│ │ ├── input.sh # Input normalization & validation
│ │ ├── output.sh # JSON formatters
│ │ ├── state.sh # Checkpoint/resume state
│ │ ├── ui.sh # Charm/gum UI integration
│ │ └── report.sh # HTML report generation
│ ├── modules/
│ │ ├── dns.sh # DNS enumeration
│ │ ├── subdomain.sh # Subdomain discovery
│ │ ├── crt.sh # Certificate Transparency
│ │ ├── ssl.sh # SSL/TLS analysis
│ │ ├── http.sh # HTTP header analysis
│ │ ├── whois.sh # WHOIS lookups
│ │ ├── files.sh # Common files check
│ │ ├── tech.sh # Technology detection
│ │ ├── ip.sh # IP-specific recon
│ │ ├── ports.sh # TCP port scanning
│ │ ├── cors.sh # CORS misconfiguration detection
│ │ ├── waf.sh # WAF/CDN detection
│ │ ├── dnssec.sh # DNSSEC validation
│ │ ├── takeover.sh # Subdomain takeover detection
│ │ ├── shodan.sh # Shodan intelligence
│ │ ├── virustotal.sh # VirusTotal reputation
│ │ ├── wayback.sh # Wayback Machine discovery
│ │ ├── securitytrails.sh # SecurityTrails intelligence
│ │ ├── reverseip.sh # Reverse IP lookup
│ │ ├── asn.sh # ASN expansion
│ │ ├── axfr.sh # Zone transfer testing
│ │ ├── methods.sh # HTTP methods enumeration
│ │ ├── dirs.sh # Directory discovery
│ │ ├── jsanalysis.sh # JavaScript analysis
│ │ ├── favicon.sh # Favicon hash fingerprinting
│ │ ├── emailsec.sh # Email security analysis
│ │ └── score.sh # Security posture scoring
│ └── batch/
│ ├── runner.sh # Batch orchestration
│ └── progress.sh # Progress tracking
├── etc/
│ ├── recon.yaml.example # Config template
│ └── subdomains.txt # Default wordlist (82 entries)
├── docker/
│ ├── Dockerfile
│ └── docker-compose.yaml
├── tests/
│ ├── test_input.sh # Input normalization tests
│ ├── test_output.sh # JSON output tests
│ ├── test_modules.sh # Module unit tests (all 27 modules)
│ ├── test_crt.sh # Certificate Transparency tests
│ ├── test_shodan.sh # Shodan module tests
│ ├── test_virustotal.sh # VirusTotal module tests
│ ├── test_waf.sh # WAF detection tests
│ ├── test_dnssec.sh # DNSSEC validation tests
│ ├── test_takeover.sh # Subdomain takeover tests
│ ├── test_wayback.sh # Wayback Machine tests
│ ├── test_securitytrails.sh # SecurityTrails tests
│ ├── test_reverseip.sh # Reverse IP tests
│ ├── test_asn.sh # ASN expansion tests
│ ├── test_axfr.sh # Zone transfer tests
│ ├── test_methods.sh # HTTP methods tests
│ ├── test_dirs.sh # Directory discovery tests
│ ├── test_jsanalysis.sh # JavaScript analysis tests
│ ├── test_favicon.sh # Favicon hashing tests
│ ├── test_emailsec.sh # Email security tests
│ └── test_integration.sh # End-to-end tests
├── Makefile
├── LICENSE
└── README.md
```
## 开发
```
# 运行所有测试
make test
# 运行特定测试套件
bash tests/test_input.sh # Input normalization
bash tests/test_output.sh # JSON output
bash tests/test_modules.sh # All 27 modules
bash tests/test_integration.sh # End-to-end
bash tests/test_shodan.sh # Individual module tests
# ... 20 个测试文件,共 873 个测试
# 使用 shellcheck 进行 Lint
make lint
# 检查依赖
make check-deps
# 演示运行
make demo # Terminal output
make demo-json # JSON output
```
### 添加新模块
1. 创建 `lib/modules/mymodule.sh`:
```
#!/usr/bin/env bash
[[ -n "${_RECON_MODULE_MYMODULE_LOADED:-}" ]] && return 0
_RECON_MODULE_MYMODULE_LOADED=1
# 运行模块 - 返回 JSON
mymodule_run() {
local target=$1
# ... gather data ...
echo '{"key": "value"}'
}
# 打印终端输出
mymodule_print() {
local json=$1
local target=$2
header "MY MODULE - $target"
# ... format output ...
}
# 检查依赖
mymodule_check() {
check_dependencies mytool
}
```
2. 在 `bin/recon` 中注册:
```
MODULES[mymodule]="mymodule_run:mymodule_print:mymodule_check"
DOMAIN_MODULES+=(mymodule)
```
3. 在 `bin/recon` 中引入:
```
source "${PROJECT_ROOT}/lib/modules/mymodule.sh"
```
## 安全注意事项
- **仅被动模式**:Recon 仅执行被动/半被动侦察
- **无认证**:不尝试进行身份验证或登录
- **速率限制**:针对 WHOIS 和其他有速率限制的服务配置了延迟
- **遵守 robots.txt**:仅检查其是否存在,不爬取禁止的路径
## 路线图
- [x] API 集成 (Shodan, SecurityTrails, VirusTotal, Wayback Machine)
- [x] 邮件安全分析 (SPF, DMARC, DKIM, BIMI)
- [x] WAF/CDN 检测和 DNSSEC 验证
- [x] 子域名接管检测
- [x] JavaScript 分析和目录发现
- [ ] AWS 集成 (Route53, EC2 metadata)
- [ ] 可选增强工具 (subfinder, httpx)
- [ ] 历史比较 / 变更检测
- [ ] 用于监控的 Webhook 通知
- [ ] Web UI 仪表板
## 贡献
欢迎贡献!请:
1. Fork 本仓库
2. 创建功能分支 (`git checkout -b feature/amazing-feature`)
3. 进行更改
4. 运行测试 (`make test`)
5. 提交 (`git commit -m 'Add amazing feature'`)
6. 推送 (`git push origin feature/amazing-feature`)
7. 打开一个 Pull Request
## 许可证
MIT 许可证 - 详见 [LICENSE](LICENSE)。
## 致谢
- 灵感来源于安全社区中的各种侦察工具
- 使用标准 Unix 工具构建,以实现最大的可移植性
- 在可用时使用 [Charm](https://charm.sh) 工具进行增强
标签:Ask搜索, Bash 脚本, C2日志可视化, CDN 检测, Cloudflare, CORS 分析, DNS 分析, GitHub, HTML 报告, HTTP/HTTPS抓包, JS 分析, MITRE ATT&CK, SRE, SSL 证书, Talos规则, VirusTotal, WAF 检测, 主动扫描, 侦察工具, 偏差过滤, 动态插桩, 反取证, 域名信息收集, 基础设施审计, 子域名接管, 安全评估, 实时处理, 密码管理, 库, 应急响应, 应用安全, 态势感知, 指纹识别, 插件系统, 数据统计, 电子邮箱安全, 端口扫描, 请求拦截