Ayberk-Irmak/reconowl
GitHub: Ayberk-Irmak/reconowl
一个渗透测试编排 CLI 工具,将被动侦察、主动扫描、漏洞检测和报告生成整合为一条命令,编排 nmap/nuclei/httpx/sqlmap 等引擎并提供原生安全检测。
Stars: 0 | Forks: 0
# reconowl
[](https://github.com/Ayberk-Irmak/reconowl/actions/workflows/ci.yml)
[](https://pypi.org/project/reconowl/)




**侦察 → 扫描 → 报告,一条命令搞定。** reconowl 是一个 CLI 渗透测试
编排器:将其指向一个目标,它就会运行被动 + 主动侦察、
详细的漏洞扫描,并生成 HTML/JSON/Markdown 报告。
它的设计目标是*真正产生结果*:在已有成熟引擎(nmap、nuclei、httpx、sqlmap)的地方**编排这些引擎**,而在没有的地方**回退到可靠的原生检查** —— 这样无论是在完整的 Kali 环境中,还是在纯净的 Python 安装环境下,扫描都能发挥作用。
```
reconowl example.com -y
```
## 功能
**阶段 1 — 被动侦察**(不向目标发送任何数据包)
- DNS 记录(A/AAAA/MX/NS/TXT/CNAME/SOA),带有 **DNS-over-HTTPS 回退**功能,因此
即使在阻止 UDP/53 的严格出网环境中也能正常解析。
- 通过 RDAP 获取的 WHOIS/注册数据。
- 通过证书透明度(crt.sh)进行子域名枚举。
- 通过 Wayback Machine 收集历史 URL。
**阶段 2 — 主动侦察**
- 使用 **nmap**(或在缺少 nmap 时使用内置的 TCP connect 扫描器)进行端口/服务/版本扫描。
- 使用 **httpx**(或原生探测器)进行 HTTP 探测 —— 状态、标题、服务器、技术。
- TLS/证书检查(颁发者、SAN、过期时间、信任状态、协议) —— 甚至可以读取
无效/自签名证书。
- 从 robots.txt 和 sitemap.xml 中发现内容,外加会跟踪链接并提取**表单参数**的**主动爬虫**(可选通过 `katana` 提供种子),从而使注入检查有真实的输入可供测试。
- **JavaScript 分析**:获取范围内的 JS bundle 并提取引用的**端点**(提供给注入检查)和**硬编码机密**(AWS、
Google、Slack、GitHub、Stripe、私钥、JWT 等),并在报告时进行脱敏处理。
- **SPA / JS 渲染**(`--render`,自动检测):当目标在客户端渲染其
链接/表单(React/Vue/Angular/Next/…)时,reconowl 会驱动无头
浏览器(Playwright)来渲染种子页面,从而收集渲染后的 DOM **以及**
应用程序调用的 **XHR/fetch API 端点** —— 然后将它们提供给检查。
仅在类似 SPA 的页面上自动触发;在未安装浏览器时退化为静态 + JS 端点
提取。
**阶段 3 — 漏洞扫描**
- 原生检查:缺失的安全标头、不安全的 cookie 标志、TLS 问题
(过期 / 自签名 / 不受信任 / 弱协议)、版本泄露,以及
暴露的敏感文件(`.git`、`.env`、备份、`phpinfo` 等),并带有 soft-404
过滤以减少误报。
- **暴露的服务**:标记面向互联网的数据库(MySQL、PostgreSQL、
MongoDB、Redis 等)、远程访问(RDP、VNC、SMB、Telnet、FTP)和管理
面板(Plesk、cPanel、Webmin、phpMyAdmin 等),并基于风险评定严重性。
- **WAF 检测与自适应限速**:指纹识别 WAF/CDN(或运行
`wafw00f`),并在目标开始进行速率限制/拦截时自动让步 —— 然后停止,并向您发出警告(使用 `--stealth` 进行礼貌扫描)。
- **电子邮件身份验证(SPF/DMARC/DKIM)**:评估可注册
域名的防欺骗 DNS —— 缺失/宽松(`+all`)/弱的 SPF,缺失或
仅监控(`p=none`)的 DMARC,以及跨常见选择器的 DKIM 存在情况 ——
从而捕获导致钓鱼攻击的漏洞(仅限 DNS,即使站点宕机也能工作)。
- **OpenAPI / Swagger 解析**:发现已发布的 API 规范(Swagger 2.0 /
OpenAPI 3.x,JSON 或 YAML),枚举每个操作的 path/query/body
参数,并将它们提供给注入检查(GET → query 点,
POST → form/JSON body 点) —— 将 API 文档转化为真实的测试覆盖率。
公开可访问的规范也会作为信息泄露进行报告。
- **已知 CVE 映射**:将检测到的软件版本(Server 标头、nmap
banner、技术指纹)与精选的离线 CVE 数据库进行匹配,并进行
版本范围比较,报告每个匹配项及其真实的 CVSS 和 NVD 链接。
- **目录/文件暴力破解**:内置字典(使用
`--wordlist` 覆盖)并进行 soft-404 基线测试,从而防止那些对所有请求都回答 200 的站点
淹没结果;标记目录列表、受保护的资源和
敏感路径,并将发现的内容反馈到后续检查中。
- **CORS 错误配置**:反射任意 origin、受信任的 `null` origin,
以及通配符策略 —— 当同时允许凭证(credentials)时会提升严重性。
- **开放重定向**:通过常见的重定向参数进行站外重定向,仅在实际发生到攻击者主机的 3xx `Location` / meta-refresh 时才确认。
- **Host 标头注入**:伪造的 `Host` / `X-Forwarded-Host` 被反射到
重定向或绝对 URL 中(缓存 / 密码重置中毒)。
- **CRLF 注入 / 响应拆分**:带有 `\r\n` 和标记的 payload,仅当注入的标头(或 cookie)实际出现在响应
标头中时才确认。
- **子域名接管**:将每个子域名的 CNAME 和页面与
包含 25+ 个第三方服务的指纹数据库进行匹配;唯一的指纹独立
存在,而通用的指纹则需要 CNAME 匹配,并且会标记悬空的 CNAME
—— 从而保持较低的误报率。
- **GraphQL 自省(Introspection)**:探测常见的 GraphQL 端点;标记已启用的
自省(完整 schema 泄露)和暴露的 GraphiQL/Playground IDE。
- **XXE**:向接受 XML 的端点发送外部实体 XML,并通过带内(in-band)读取 `/etc/passwd` 或带外(out-of-band)回调(重用 SSRF
监听器)进行确认 —— 从结构上实现零误报。
- **JWT 漏洞**:从 cookie/标头/正文中收集 token 并离线分析它们 ——
`alg:none`、暴力破解的弱 HMAC 密钥(可伪造的 token)、
缺失过期时间,以及 payload 中的敏感数据。
- **SSTI**:为多种引擎(Jinja2/Twig、FreeMarker/EL、ERB、Razor 等)注入算术模板表达式,仅在出现*被求值的*乘积时确认 —— 这是模板注入的强信号(通常是 RCE)。
- **LFI / 路径遍历**:将遍历 payload(多种深度和编码,Linux 和 Windows)注入类文件参数,仅当目标文件签名(`/etc/passwd`、`win.ini`)出现在响应中时才确认。
- **OS 命令注入**:基于输出的(`id` / 算术展开)和
盲时间基础的(`sleep`)检测 —— 仅在出现真实的命令输出
或测量到延迟时才确认,因此不会出现基于反射的误报。
- **服务端原型链污染**:Express 的 `json spaces` gadget ——
仅在污染 `__proto__` 明显改变了 JSON 端点的
格式时确认(并且这种表面的改变会在之后被还原)。
- **SSRF**:URL 形状的参数通过两种方式进行测试 —— 用于零误报确认的**带外(out-of-band)回调监听器**(非常适合目标可以访问扫描器的实验室/内部环境),外加用于云元数据和 `file://` 读取的**带内(in-band)签名检测**。使用 `--oob-host/--oob-port/--no-oob` 进行调优。
- **NoSQL 注入**:基于错误的(Mongo/Mongoose 错误签名)外加一个
运算符差异探测(`[$ne]` 对比 `[$eq]`),仅在
后端实际解析运算符时才触发。
- **默认 / 弱凭证**:针对 HTTP Basic Auth 领域(401→200 是确凿证据)和
发现的登录表单(提交的每一对凭证都保留了 CSRF/隐藏字段,
并与已知的错误基线进行比较以避免误报)尝试一小组、保守的已知凭证对。`--no-default-creds`。
- **CSRF(缺少 token)**:标记字段不携带防 CSRF token 的会话状态更改 POST 表单 —— 以 cookie 姿态作为前提,因此已经被
`SameSite=Strict/Lax` 会话 cookie 保护的表单将不会被报告(低误报)。
- **访问控制失效 / IDOR**:在没有会话的情况下重新请求敏感资源(受保护的内容可在未认证状态下访问 → BAC),篡改数字
ID(返回了不同的对象 → 可能是 IDOR),并且 —— 使用 `--second-cookie` ——
确认跨用户对象访问。
- 注入探测:基于错误的 **SQL 注入**和反射型 **XSS**
候选对象,带有可选的 **sqlmap** 确认。
- **GET / POST 表单 / JSON body 覆盖范围**:SQLi/XSS、SSTI、OS 命令注入、
NoSQL 和 LFI 会同样测试查询参数、`application/x-www-form-urlencoded` 表单
字段和 JSON body 字段 —— 表单参数来自爬虫。
- 跨发现端点的 **nuclei** 模板扫描。
**子域名深化**(`--subdomains`)
- 在被动侦察发现子域名之后,将对存活的域名进行完整的
Web 层检查套件(标头、cookie、TLS、暴露、CORS、开放
重定向、注入)扫描,并将它们的发现合并到一份报告中。每个子域名的端口扫描
和 nuclei 扫描会被跳过,以使广泛的扫描变得切实可行;可使用
`--max-subdomains` 进行限制。主动 payload 在**范围上被限制**于目标及其
兄弟子域名,绝不会波及从 sitemap 或归档中提取的不相关主机。
**阶段 4 — 报告**
- 独立且带有样式的 **HTML** 报告、用于自动化的完整 **JSON**、
用于 notes/GitHub 的 **Markdown**,以及用于 CI / GitHub code
scanning 的 **SARIF 2.1.0**(`--formats sarif`)。发现的问题会被标准化、去重,并进行
严重性评分。
- 每个发现上都有 **CVSS v3.1** 基础分、评级和向量(显示在
控制台和所有三种报告格式中);摘要报告会报告最高的 CVSS。
- 为每个确认的发现捕获**请求/响应证明**(确切的
触发请求和响应,cookie/token 已脱敏),显示在
HTML 和 Markdown 报告中并存储在 JSON 中。
- **跨扫描差异对比(diff)**:`--diff ` 显示自上次运行以来什么是新的、已修复的
和已更改的(控制台 + `diff.json`/`diff.md`);或者无需扫描,直接通过
`--diff-reports OLD.json NEW.json` 对比两份已保存的报告。
**认证扫描** — 一个 cookie、bearer token、basic auth 或自定义
标头(`--cookie / --bearer / --auth-basic / -H`)会被附加到每个请求,
以便检查能够触及已认证的攻击面 —— 或者让 reconowl **为您登录**
(`--login-url/--login-user/--login-pass`)并抓取 + 扫描会话。
## 要求
- Python 3.10+
- Python 包(`pip install -r requirements.txt`):rich、requests、
dnspython、jinja2、cryptography。
- `PATH` 上的可选外部工具(reconowl 会自动检测并在缺失时优雅降级):
`nmap`、`nuclei`、`httpx`、`katana`、`sqlmap`、`nikto`、`whatweb`、`wafw00f`、
`whois`。这些工具都随 Kali Linux 附带。
- 可选的用于 SPA/JS 渲染的**无头浏览器**:安装 `render 额外组件
(`pip install ".[render]"`),然后运行 `playwright install chromium`。如果没有它,
reconowl 将回退到静态抓取。
## 安装
```
pip install reconowl # from PyPI — installs the `reconowl` command
reconowl --help
```
可选的用于 SPA/JS 渲染的**无头浏览器**:
```
pip install "reconowl[render]" && playwright install chromium
```
从源码安装(用于开发):
```
git clone https://github.com/Ayberk-Irmak/reconowl.git && cd reconowl
pip install -e .
python -m reconowl --help
```
## 用法
以下示例使用 `reconowl` 命令;使用 `python -m reconowl` 是等效的。
```
# 完整 pipeline (recon + scan + report),行内确认授权:
reconowl example.com -y
# Web app 目标,aggressive 强度,仅 HTML 报告:
reconowl https://target.tld -y -i aggressive --formats html
# 仅 recon,无 active scanning:
reconowl target.tld -y --passive-only
# 仅 Native-only(不调用 nmap/nuclei/etc.):
reconowl target.tld -y --no-external
# 同时扫描发现的子域名:
reconowl target.tld -y --subdomains
# 使用 sqlmap 确认 SQLi 候选项,自定义 output dir:
reconowl "https://target.tld/item.php?id=1" -y --sqlmap -o ./engagement
# 将本次扫描与之前的运行进行 diff:
reconowl target.tld -y --diff ./engagement/report.json
# 在不扫描的情况下对两份已保存报告进行 diff:
reconowl --diff-reports old/report.json new/report.json
```
### 认证扫描
发送一个会话 cookie、bearer token 或任意标头,以便每个检查(原生
和编排的 `httpx`/`nuclei`/`sqlmap`)都在认证状态下运行:
```
reconowl https://app.tld -y --cookie "session=eyJ...; role=admin"
reconowl https://api.tld -y --bearer "eyJhbGciOi..."
reconowl https://app.tld -y -H "X-Api-Key: abc123" -H "X-Env: staging"
reconowl https://app.tld -y --auth-basic admin:s3cr3t
```
**自动化表单登录** — reconowl 会获取登录页面,填写表单
(保留 CSRF/隐藏字段),捕获会话,并抓取 + 扫描
已认证的区域(避开注销链接以保持会话存活):
```
reconowl https://app.tld -y \
--login-url https://app.tld/login --login-user admin --login-pass 's3cr3t'
# 字段会自动检测;使用 --login-user-field / --login-pass-field 覆盖,
# 并使用 --login-check "Dashboard" 确认成功。
```
关键选项:`-i/--intensity {light,normal,aggressive}`, `--formats html,json,md`,
`--no-nuclei`, `--sqlmap`, `--subdomains`, `--timeout`, `--concurrency`,
`--rate-limit`, `--doh`/`--no-doh`, `-q/--quiet`。请参阅 `--help` 了解所有选项。
## 输出
报告将被写入 `reconowl-report/`(或 `-o `):
```
reconowl-report/
report.html # styled, self-contained
report.json # full machine-readable result
report.md # Markdown summary
```
### CI / GitHub 代码扫描
生成 SARIF 并上传它,以便发现的问题出现在仓库的 Security 选项卡中:
```
reconowl https://staging.tld -y --formats sarif -o out
```
```
# .github/workflows/reconowl.yml(节选)
- run: reconowl "$TARGET" -y --formats sarif -o out
- uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: out/report.sarif
```
CVSS 分数会映射到 SARIF 的 `security-severity`,以便 GitHub 对警报进行排名。
## 工作原理
每个阶段都会写入到一个标准化结果模型中;报告完全基于
该模型进行渲染,因此添加检查或报告格式永远不会影响其他内容。
外部工具是可选的加速器,而不是硬性依赖 —— 当它们缺失时,同样的扫描
依然会运行(只是深度较浅)。网络构建旨在经受
限制性环境的考验:名称解析可以透明地回退到
DNS-over-HTTPS,并且 TLS/端口检查会通过解析出的 IP 进行连接,同时保留 SNI。
## 路线图
- 在报告中提供可选的 Nmap NSE 和 WhatWeb 丰富功能。
- 为发现的端点进行屏幕截图捕获。
- PyPI 发布。
## 许可证
按“原样”提供,用于授权的安全测试和教育。
标签:GitHub, Python, 实时处理, 密码管理, 无后门, 特征检测, 运行时操纵, 逆向工具