Ayberk-Irmak/reconowl

GitHub: Ayberk-Irmak/reconowl

一个渗透测试编排 CLI 工具,将被动侦察、主动扫描、漏洞检测和报告生成整合为一条命令,编排 nmap/nuclei/httpx/sqlmap 等引擎并提供原生安全检测。

Stars: 0 | Forks: 0

# reconowl [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/Ayberk-Irmak/reconowl/actions/workflows/ci.yml) [![PyPI](https://img.shields.io/pypi/v/reconowl)](https://pypi.org/project/reconowl/) ![python](https://img.shields.io/badge/python-3.10%2B-blue) ![license](https://img.shields.io/badge/license-MIT-green) ![checks](https://img.shields.io/badge/native%20checks-28-8a2be2) ![tests](https://img.shields.io/badge/tests-209-brightgreen) **侦察 → 扫描 → 报告,一条命令搞定。** 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, 实时处理, 密码管理, 无后门, 特征检测, 运行时操纵, 逆向工具