vulnace/vuln-forge
GitHub: vulnace/vuln-forge
一个 Docker 化的一站式漏洞验证管道,自动化完成从子域名到漏洞利用的完整侦察到利用流程。
Stars: 0 | Forks: 0
# ⬡ VULN-FORGE







## 目录
- [演示](#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 管道
[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 请求, 上游代理, 子域名枚举, 安全工具集成, 安全开发, 安全扫描, 安全测试, 开源安全工具, 攻击性安全, 无后门, 日志审计, 时序注入, 系统安全, 自动化漏洞扫描, 请求拦截, 逆向工程平台