vulnace/vuln-forge

GitHub: vulnace/vuln-forge

一个 Docker 化的一站式漏洞验证管道,自动化完成从子域名到漏洞利用的完整侦察到利用流程。

Stars: 0 | Forks: 0

# ⬡ VULN-FORGE ![Docker](https://img.shields.io/badge/docker-ready-2496ED?logo=docker&logoColor=white) ![Python](https://img.shields.io/badge/python-3.11-3776AB?logo=python&logoColor=white) ![Go](https://img.shields.io/badge/go-1.25-00ADD8?logo=go&logoColor=white) ![FastAPI](https://img.shields.io/badge/fastapi-web%20ui-009688?logo=fastapi&logoColor=white) ![Platform](https://img.shields.io/badge/platform-linux-FCC624?logo=linux&logoColor=black) ![License](https://img.shields.io/badge/license-educational-red) ![Status](https://img.shields.io/badge/status-active-10b981) ## 目录 - [演示](#demo) - [法律声明](#️-legal-disclaimer) - [管道架构](#pipeline-architecture) - [功能特性](#features) - [工具栈](#tool-stack) - [与手动方式对比](#vs-manual-approach) - [项目结构](#project-structure) - [前置条件](#prerequisites) - [快速开始](#quick-start) - [Docker Compose 服务](#docker-compose-services) - [CLI 参数参考](#cli-flags-reference) - [Web 仪表板](#web-dashboard) - [示例输出](#sample-output) - [数据库架构](#database-schema) - [管道常量](#pipeline-constants) - [环境变量](#environment-variables) - [数据卷与数据管理](#volume--data-management) - [重建与变更](#rebuilding-after-changes) - [故障排查](#troubleshooting) - [已知限制](#known-limitations) - [更新日志](#changelog) ## ⚠️ 法律声明 **本工具仅供授权安全测试使用。** 仅对您拥有或获得明确书面许可的目标运行 Vuln-Forge。 未经授权的使用是非法且不道德的。作者不对滥用行为承担任何责任。 ## 管道架构 ``` ┌─────────────────────────────────────────────────────────┐ │ VULN-FORGE │ └─────────────────────────────────────────────────────────┘ │ [ Domain ] │ ┌───────────────────────────────▼────────────────────────────┐ │ STAGE 1 — SUBDOMAINS │ │ crt.sh │ Amass │ Subfinder │ └───────────────────────────────┬────────────────────────────┘ │ ┌───────────────────────────────▼────────────────────────────┐ │ STAGE 2 — LIVE HOSTS │ │ httpx │ └───────────────────────────────┬────────────────────────────┘ │ ┌───────────────────────────────▼────────────────────────────┐ │ STAGE 3 — ENDPOINTS │ │ Katana │ gau │ └───────────────────────────────┬────────────────────────────┘ │ ┌───────────────────────────────▼────────────────────────────┐ │ STAGE 4 — PARAMETERS │ │ Arjun │ └───────────────────────────────┬────────────────────────────┘ │ ┌───────────────────────────────▼────────────────────────────┐ │ STAGE 5 — VULNERABILITY SCAN │ │ Nuclei │ Nikto │ SQLMap (conditional) │ Dalfox │ └───────────────────────────────┬────────────────────────────┘ │ ┌─────────────────────┴─────────────────────┐ │ │ ┌─────────▼──────────┐ ┌────────────▼────────────┐ │ Discord Alert │ │ Telegram Alert │ └────────────────────┘ └─────────────────────────┘ ``` ## 功能特性 - **完整管道** — 子域名 → 活跃主机 → 端点 → 参数 → 漏洞 - **多工具扫描** — Nuclei、Nikto、SQLMap(条件)、Dalfox,未来版本支持更多工具 - **智能 SQL 检测** — 仅在检测到 SQL 技术时才运行 SQLMap - **Web 仪表板** — 实时终端日志、管道状态、结果表格、PDF/CSV 导出 - **通知** — 发现漏洞时通过 Discord 和 Telegram 发送告警,按严重性排序 - **Docker 优先** — 所有服务均在容器中运行,无需本地安装工具 - **测试模式** — 将所有输入限制为 1,用于快速验证 - **组合服务** — 每个管道阶段均可通过 `docker compose` 独立运行 - **中止支持** — 可随时从 Web UI 终止正在运行的扫描 - **自动重连** — 刷新页面后 Web 仪表板会自动重新连接活动扫描 ## 工具栈 | 阶段 | 工具 | |---|---| | 子域名枚举 | crt.sh、Amass、Subfinder | | 活跃主机检测 | httpx | | 端点发现 | Katana、gau | | 参数发现 | Arjun | | 漏洞扫描 | Nuclei、Nikto、SQLMap、Dalfox | | 通知 | Discord Webhooks、Telegram Bot API | | Web UI | FastAPI、WebSocket、WeasyPrint | ## 与手动方式对比 | 任务 | 手动方式 | Vuln-Forge | |---|---|---| | 子域名枚举 | 3 个独立工具命令 | ✅ 自动 | | 结果去重 | 手动 grep/sort | ✅ 通过 SQLite UNIQUE 自动完成 | | 活跃主机过滤 | 手动运行 httpx | ✅ 自动 | | 端点爬取 | 手动运行 Katana + gau | ✅ 自动 | | 参数发现 | 每个 URL 手动运行 Arjun | ✅ 自动 | | SQL 技术检测 | 猜测并检查 | ✅ 智能自动检测 | | 运行所有漏洞工具 | 4 个独立命令 | ✅ 一个管道 | | 存储结果 | 手动文件/笔记 | ✅ 结构化的 SQLite 数据库 | | 通知 | 手动复制粘贴 | ✅ 自动 Discord + Telegram | | 查看结果 | 终端 grep | ✅ Web 仪表板 + PDF | | 重新运行单个阶段 | 重新输入完整命令 | ✅ `docker compose run --rm ` | ## 项目结构 ``` vuln-forge/ ├── main.py ← Full pipeline entrypoint ├── database.py ← SQLite helpers + schema ├── requirements.txt ← Python dependencies ├── pyproject.toml ← Python project config ├── Dockerfile ← Scanner image (golang:1.25 multi-stage) ├── docker-compose.yml ← All services ├── .env ← Secrets (gitignored) ├── .env.example ← Example env file ├── .gitignore │ ├── pipeline/ │ ├── subdomains.py ← Stage 1: crt.sh + Amass + Subfinder │ ├── live_hosts.py ← Stage 2: httpx │ ├── endpoints.py ← Stage 3: Katana + gau │ ├── parameters.py ← Stage 4: Arjun │ └── vulnerabilities.py ← Stage 5: Nuclei + Nikto + SQLMap + Dalfox │ ├── tools/ │ ├── amass.py │ ├── subfinder.py │ ├── httpx.py │ ├── katana.py │ ├── gau.py │ ├── crtsh.py │ ├── arjun.py │ ├── sqlmap.py │ ├── dalfox.py │ ├── nuclei.py │ └── nikto.py │ ├── notifier/ │ ├── discord.py │ └── telegram.py │ ├── utils/ │ └── view_vulnerabilities.py │ ├── web/ │ ├── app.py ← FastAPI backend │ ├── Dockerfile ← Web image (FROM vuln-forge:latest) │ ├── templates/ │ │ └── index.html │ └── static/ │ ├── css/style.css │ └── js/main.js │ ├── docs/ │ ├── demo-cli.gif ← CLI demo GIF │ └── demo-web.gif ← Web dashboard demo GIF │ └── data/ ← Scan databases (gitignored) └── example.com.db ``` ## 演示 ### CLI 管道

### Web 仪表板

## ⚙️ 前置条件 - Docker Engine 25.0+ - Docker Compose V2 插件 ### 检查是否已安装 Docker Compose ``` docker compose version ``` 如果输出显示 `Docker Compose version v2.x.x`,则表示已准备就绪。否则,请安装: ### 安装 Docker Compose V2 插件 ``` https://github.com/docker/compose ``` ## 快速开始 ### 1. 克隆仓库 ``` git clone https://github.com/vulnace/vuln-forge.git cd vuln-forge ``` ### 2. 配置环境变量 ``` cp .env.example .env ``` 编辑 `.env`: ``` DISCORD_WEBHOOK=https://discord.com/api/webhooks/YOUR_WEBHOOK_ID/YOUR_WEBHOOK_TOKEN TELEGRAM_BOT_TOKEN=XXXXXXXXXX:XXXXXXXXXXXXXX TELEGRAM_CHAT_ID=XXXXXXXXXXXXX ``` ### 3. 构建 Docker 镜像 ``` # 步骤 1 — 构建扫描器镜像(golang:1.25 多阶段,约 930MB,耗时约 10 分钟) sudo docker compose build scanner # 步骤 2 — 构建 Web 镜像(FROM vuln-forge:latest,约 960MB) sudo docker compose build web ``` ### 4. 启动 Web 仪表板 ``` sudo docker compose up -d web ``` 在浏览器中打开 `http://localhost:8000`。 ### 5. 运行首次扫描 ``` sudo docker compose run --rm scanner -d example.com ``` 在 `http://localhost:8000` 的 Web 仪表板中实时查看结果。 ## Docker Compose 服务 所有服务共享一个名为 `vf-scan-data` 的命名 Docker 卷和一个隔离的桥接网络 `vf-network`。数据在容器重启和移除后仍然持久化。 ### Web 仪表板 ``` # 后台启动(推荐) sudo docker compose up -d web # 前台启动以查看日志 sudo docker compose up web # 在后台运行时跟踪日志 sudo docker compose logs -f web # 停止仪表板 sudo docker compose down ``` 访问地址:`http://localhost:8000` ### 完整管道变体 | 服务 | 命令 | 描述 | |---|---|---| | `scanner` | `sudo docker compose run --rm scanner -d example.com` | 标准完整扫描 | | `scanner-fresh` | `sudo docker compose run --rm scanner-fresh -d example.com` | 清空数据库后完整扫描 | | `scanner-active` | `sudo docker compose run --rm scanner-active -d example.com` | 启用 Amass 活跃 DNS | | `scanner-test` | `sudo docker compose run --rm scanner-test -d example.com` | 将所有输入限制为 1 | | `scanner-silent` | `sudo docker compose run --rm scanner-silent -d example.com` | 跳过通知 | | `scanner-full` | `sudo docker compose run --rm scanner-full -d example.com` | 新鲜 + 活跃 + 静默 | ### 独立管道阶段 可对现有数据库运行单个阶段进行调试或重新执行: ``` # 仅子域名枚举 sudo docker compose run --rm subdomains -- -d example.com -db data/example.com.db # 仅活跃主机检测 sudo docker compose run --rm livehosts -- -db data/example.com.db # 仅端点发现 sudo docker compose run --rm endpoints -- -db data/example.com.db # 仅参数发现 sudo docker compose run --rm parameters -- -db data/example.com.db # 仅漏洞扫描 sudo docker compose run --rm vuln -- -db data/example.com.db # 漏洞扫描 — 测试模式(上限为 1) sudo docker compose run --rm vuln-test -- -db data/example.com.db # 对特定 URL 运行 Nikto sudo docker compose run --rm nikto -- -u https://example.com ``` ### 工具 ``` # 以 CLI 表格形式查看结果 sudo docker compose run --rm view -- -db data/example.com.db # 为扫描重新发送 Discord 通知 sudo docker compose run --rm notify-discord -- -db data/example.com.db # 为扫描重新发送 Telegram 通知 sudo docker compose run --rm notify-telegram -- -db data/example.com.db ``` ## CLI 参数参考 ``` python3 main.py -d [options] Required: -d, --domain Target domain Optional: --fresh Wipe existing scan data before starting --yes Auto-confirm fresh wipe (skip prompt) --active Enable Amass active DNS enumeration (noisier, more thorough) --test Cap all tool inputs to 1 (fast validation) --no-notify Skip Discord and Telegram notifications --debug Verbose debug logging ``` ### 组合参数 ``` # 新鲜 + 活跃 + 静默 sudo docker compose run --rm scanner -d example.com --fresh --yes --active --no-notify # 测试模式 + 调试(无干扰查看运行情况) sudo docker compose run --rm scanner -d example.com --test --debug # 全面激进扫描 sudo docker compose run --rm scanner -d example.com --fresh --yes --active # 仅漏洞阶段,调试,无通知 sudo docker compose run --rm vuln -- -db data/example.com.db --debug --no-notify ``` ## Web 仪表板 ### 功能特性 | 功能 | 描述 | |---|---| | **实时终端** | 来自运行中扫描的 WebSocket 实时日志流 | | **管道状态** | 可视化阶段跟踪 — 子域名 → 主机 → 端点 → 参数 → 漏洞 | | **结果表格** | 按严重性筛选、全文搜索、点击行查看详情弹窗 | | **统计卡片** | 危急 / 高 / 中 / 低 / 信息计数,带有动画递增效果 | | **PDF 报告** | 下载由 WeasyPrint 生成的完整扫描报告 | | **CSV 导出** | 客户端下载所有发现的 CSV 文件 | | **重新通知** | 重新发送 Discord/Telegram 告警 | | **历史记录** | 所有历史扫描,每张卡片提供 VIEW / PDF / CSV 按钮 | | **自动重连** | 页面刷新后自动重新连接活动扫描 | | **中止** | 可立即从 UI 终止正在运行的扫描 | ### 仪表板扫描开关 | 开关 | CLI 等效参数 | 描述 | |---|---|---| | FRESH DATABASE | `--fresh --yes` | 清空现有扫描数据 | | TEST MODE | `--test` | 将所有输入限制为 1 | | ACTIVE RECON | `--active` | 启用 Amass 活跃 DNS | | SILENT MODE | `--no-notify` | 跳过通知 | | DEBUG OUTPUT | `--debug` | 终端详细日志 | ## 示例输出 ### 终端(CLI) ``` [*] ══════════════════════════════════════ [*] TARGET: EXAMPLE.COM [*] ══════════════════════════════════════ [*] Initializing pipeline... [+] Stage 1: Subdomain Enumeration [+] crt.sh found 12 subdomains [+] Subfinder found 8 subdomains [+] 14 unique subdomains stored [+] Stage 2: Live Host Detection [+] httpx — 6 live hosts found [+] Stage 3: Endpoint Discovery [+] Katana crawled 342 endpoints [+] gau found 89 historical endpoints [+] 387 unique endpoints stored [+] Stage 4: Parameter Discovery [+] Arjun found 23 parameters across 8 URLs [+] Stage 5: Vulnerability Scan [+] Nuclei: 4 findings [+] Nikto: 7 findings [+] SQL technology detected — running SQLMap [+] SQLMap: 2 SQL injection findings [+] Dalfox: 3 XSS findings [+] ══════════════════════════════════════ [+] OPERATION COMPLETE — 16 FINDINGS [+] ══════════════════════════════════════ ``` ### 漏洞发现 ``` ┌─────────────────────────────────────────────────────────────────────────┐ │ VULN-FORGE // RESULTS — example.com — 16 findings │ ├────┬──────────┬─────────────────────┬──────────┬────────────────────────┤ │ # │ SEVERITY │ TYPE │ TOOL │ TARGET │ ├────┼──────────┼─────────────────────┼──────────┼────────────────────────┤ │ 1 │ CRITICAL │ SQL Injection │ sqlmap │ example.com │ │ 2 │ CRITICAL │ SQL Injection │ sqlmap │ example.com/search │ │ 3 │ HIGH │ XSS Reflected │ dalfox │ example.com/book │ │ 4 │ HIGH │ XSS Stored │ dalfox │ stg.examle.com │ │ 5 │ HIGH │ WordPress Vuln │ nuclei │ dev.example.com │ │ 6 │ MEDIUM │ Missing Headers │ nikto │ example.com │ │ 7 │ LOW │ Info Disclosure │ nuclei │ bookings.example.com │ └────┴──────────┴─────────────────────┴──────────┴────────────────────────┘ ``` ### Discord 通知 ``` 🔴 CRITICAL — SQL Injection Tool: sqlmap Target: sub.example.com/reserve?id=1 Details: parameter=id, payload=1' OR '1'='1 🟠 HIGH — XSS Reflected Tool: dalfox Target: example.com/book?name=test Details: parameter=name, payload= ``` ## 数据库架构 结果存储在 SQLite 中,路径为 `data/.db`。 ``` -- Discovered subdomains CREATE TABLE subdomains ( id INTEGER PRIMARY KEY, subdomain TEXT UNIQUE, source TEXT ); -- Live HTTP/HTTPS hosts CREATE TABLE live_hosts ( id INTEGER PRIMARY KEY, url TEXT UNIQUE, status INTEGER ); -- Crawled endpoints CREATE TABLE endpoints ( id INTEGER PRIMARY KEY, url TEXT UNIQUE ); -- Discovered parameters CREATE TABLE parameters ( id INTEGER PRIMARY KEY, url TEXT, parameter TEXT, UNIQUE(url, parameter) ); -- Vulnerability findings CREATE TABLE vulnerabilities ( id INTEGER PRIMARY KEY, type TEXT, target TEXT, severity TEXT, tool TEXT, details TEXT, UNIQUE(type, target, tool) ); ``` ## 管道常量 在 `pipeline/vulnerabilities.py` 中配置的可调节上限: ``` MAX_ENDPOINTS = 500 # Max endpoints sent to Nuclei MAX_PARAM_URLS = 100 # Max URLs sent to Dalfox MAX_TOOL_INPUTS = 20 # Max inputs per tool in normal mode MAX_NIKTO_HOSTS = 10 # Max hosts scanned by Nikto ``` `--test` 模式会将所有输入强制限制为 1,无视这些常量。 ## 环境变量 | 变量 | 描述 | 是否必需 | |---|---|---| | `DISCORD_WEBHOOK` | Discord 传入 Webhook URL | 否 | | `TELEGRAM_BOT_TOKEN` | Telegram 机器人 API 令牌 | 否 | | `TELEGRAM_CHAT_ID` | Telegram 聊天或频道 ID | 否 | ``` --- ## 卷与数据管理 Scan databases are stored in a named Docker volume `vf-scan-data`. ```bash # 检查主机上的卷位置 sudo docker volume inspect vf-scan-data # 列出所有卷 sudo docker volume ls # 移除卷(删除所有扫描数据) sudo docker volume rm vf-scan-data ``` ### 改用本地文件夹而非命名卷 如果希望扫描数据存储在主机上的 `./data/` 中,请更新 `docker-compose.yml` 中的每个卷条目: ``` volumes: - scan-data:/app/data ``` 改为: ``` volumes: - ./data:/app/data ``` 并删除文件底部的 `volumes:` 块。 如有必要,修复权限: ``` sudo chown -R $USER:$USER data/ ``` ## 重建与变更 ``` # 更改 pipeline/、tools/、notifier/ 或 main.py 后 sudo docker compose build scanner # 更改 web/app.py、模板或静态文件后 sudo docker compose build web # 同时重建两者 sudo docker compose build scanner web # 强制重建(无缓存,如遇阻塞) sudo docker compose build --no-cache scanner sudo docker compose build --no-cache web ``` ## 故障排查 ### Docker 守护进程未运行 ``` sudo systemctl restart docker sudo systemctl status docker ``` ### 数据目录权限被拒绝 ``` sudo chown -R $USER:$USER data/ # 或 sudo chmod 777 data/ ``` ### 端口 8000 已被占用 ``` # 查找占用它的进程 sudo lsof -i :8000 # 更改 docker-compose.yml 中的端口 ports: - "8080:8000" # use 8080 on host instead ``` ### Web 镜像构建失败 ``` # 确保扫描器镜像已存在 sudo docker images | grep vuln-forge # 如果缺失,先构建扫描器 sudo docker compose build scanner sudo docker compose build web ``` ### 页面刷新后显示“扫描已在运行” Web 仪表板会自动重连到活动扫描。如果卡住,请通过 ABORT 按钮或终端命令终止: ``` curl -X POST http://localhost:8000/api/scan/clear/example.com ``` ### SQLMap 未运行 SQLMap 仅在检测到 SQL 技术时运行。Vuln-Forge 会检查: - HTTP 响应中的数据库相关头部 - CMS 登录页面(WordPress、Joomla) - Nuclei 技术扫描结果 - 已知 SQL 相关端点 如果需要强制运行,请单独运行 SQLMap: ``` sudo docker compose run --rm vuln -- -db data/example.com.db --debug ``` ## 已知限制 - 无认证爬取 — 无法扫描需要登录的页面 - 无速率限制控制 — 在生产目标上使用时需谨慎 - Nikto 较慢 — 默认上限为 `MAX_NIKTO_HOSTS=10` - Amass 活跃模式会产生较多流量 — 可能触发 IDS/WAF 告警 - 无 JavaScript 渲染 — Katana 可爬取但不会执行 JS - SQLMap 仅使用安全默认设置 — 尚未支持 `--level` 或 `--risk` 调整 - 不支持 IPv6 ## 更新日志 ### v1.0.0 — 初始发布 - 完整的 5 阶段侦察到利用管道 - crt.sh、Amass、Subfinder 用于子域名枚举 - httpx 用于活跃主机检测 - Katana + gau 用于端点发现 - Arjun 用于参数发现 - Nuclei、Nikto、SQLMap(条件)、Dalfox 用于漏洞扫描 - 智能 SQL 技术检测 - Discord + Telegram 通知,按严重性排序 - FastAPI Web 仪表板,带有 WebSocket 实时日志 - 使用 WeasyPrint 生成 PDF 报告 - CSV 导出 - 扫描历史记录,每条扫描提供 PDF/CSV 按钮 - Docker 多阶段构建(golang:1.25 + python:3.11-slim) - 完整的 Docker Compose 服务套件(15 个服务) - 命名卷 + 隔离网络 - Web 仪表板自动重连(页面刷新) - 从 UI 中止运行中的扫描 - 测试模式(将所有输入限制为 1) - 活跃侦察模式(Amass 活跃 DNS) - 静默模式(跳过通知) - 调试模式(详细日志) ## 技术栈 | 层级 | 技术 | |---|---| | 语言 | Python 3.11 | | Go 工具 | Amass、Subfinder、httpx、Katana、Nuclei、gau、Dalfox | | Python 工具 | SQLMap、Arjun | | Perl 工具 | Nikto | | 数据库 | SQLite(WAL 模式、外键约束) | | Web 后端 | FastAPI + Uvicorn | | 实时通信 | WebSocket | | PDF 生成 | WeasyPrint | | 容器化 | Docker(golang:1.25 多阶段构建) | | 编排 | Docker Compose V2 | | 前端 | 原生 HTML / CSS / JavaScript | | 字体 | Fira Code、Rajdhani、DM Sans | ## 许可证 仅限教育和授权安全研究用途。 *为进攻性安全研究而构建 🤖*
标签:AV绕过, CI/CD安全, DevSecOps, Docker容器化, FastAPI, Go, LIDS, Linux平台, Llama, Python, Ruby工具, Web漏洞扫描, XML 请求, 上游代理, 子域名枚举, 安全工具集成, 安全开发, 安全扫描, 安全测试, 开源安全工具, 攻击性安全, 无后门, 日志审计, 时序注入, 系统安全, 自动化漏洞扫描, 请求拦截, 逆向工程平台