maverickaayush/ONUS
GitHub: maverickaayush/ONUS
一款本地托管、完全离线的自动化 VAPT 平台,通过八个并行扫描模块和确定性 CVSS 评分,为已授权目标提供从漏洞发现、验证到报告生成的完整安全审计流程。
Stars: 1 | Forks: 0
# ONUS - 自动化漏洞评估与渗透测试
[](LICENSE)
[](https://github.com/maverickaayush/ONUS/actions/workflows/ci.yml)
由 [maverickaayush](https://github.com/maverickaayush) 构建。
一款本地托管、物理隔离的 VAPT 工具:将其指向一个已授权的目标
域名,它将并行运行 8 个扫描模块,以确定性的方式评估
每一个发现(CVSS v3.1),通过本地 LLM 可选地添加 AI 生成的纯英文
描述,并生成 PDF 报告以及实时 Web
仪表板。无需任何外部 API 调用 - 一切都在您自己的网络中运行。
## 功能
- **8 个并行扫描模块** (Celery) - 网络侦察
(端口/服务/子域名/DNS/WHOIS)、Web 应用扫描 (ZAP + Nikto +
Katana)、SSL/TLS 配置、HTTP 安全标头、OWASP Top 10 检查、技术栈
指纹识别/WAF 检测、CVE 扫描 (Nuclei)、目录枚举
(FFUF)。
- **确定性的 CVSS v3.1 评分** - 严重程度、CVSS 分数/向量、
优先级和 OWASP 类别均通过规则目录计算得出,绝不
由 LLM 猜测。相同的两次扫描运行将产生字节级一致的
数字字段。
- **置信度验证** - 发现将被被动复核
(仅限非破坏性的重新观察),并标记为 confirmed(已确认) / probable(极可能) /
unverified(未验证),而不是被静默丢弃。
- **可选的本地 AI 分析** - Ollama + Qwen 2.5 7B 将评分后的
发现转化为纯英文描述和修复步骤。完全
物理隔离;该工具在没有它的情况下也能正常工作(参见下文的快速开始)。
- **PDF 报告 + Web 仪表板** - WeasyPrint 渲染的报告和 Next.js
仪表板,两者均由相同的已评分/已描述的发现驱动。
## 截图
| 新建扫描 | 实时扫描状态 |
|---|---|
|  |  |
| 报告仪表板 | 扫描发现 |
|---|---|
|  |  |
## 架构
```
domain → [recon | webscan | ssl_tls | headers | owasp | tech_fingerprint | nuclei | enumeration] (parallel, Celery)
→ any module failed/timed out? → pause for operator retry/continue/cancel
→ aggregator (dedup + OWASP-map + sort)
→ confidence verification (passive re-observation)
→ deterministic CVSS scoring
→ Ollama (Qwen 2.5 7B) AI analysis
→ WeasyPrint PDF + PostgreSQL
→ dashboard / PDF download
```
六层结构:Next.js 前端 → FastAPI → Celery/Redis → 8 个并行扫描
模块 → Ollama (Qwen 2.5 7B) → WeasyPrint PDF + 仪表板。完整详情见
[`ARCHITECTURE.md`](ARCHITECTURE.md)(schemas、contracts、guardrails)以及
[`docs/QUICK_REF.md`](docs/QUICK_REF.md)(常见更改的快速查询)。
## 前置条件
- Docker + Docker Compose v2
- 需约 6GB 可用磁盘空间用于核心镜像构建(后端镜像打包了 Nuclei
模板以及通过 Playwright 提供的无头 Chromium,在
基础 Python 镜像之上增加了约 1.5GB)
## 快速开始
```
cp .env.example .env
cp backend/subfinder-config/provider-config.yaml.example backend/subfinder-config/provider-config.yaml
docker compose up -d
docker compose ps # wait for zap to report healthy (~2 min)
```
打开 **http://localhost:3000**。
**这在不安装 Ollama 的情况下也能工作。** CVSS/严重程度/优先级评分始终
是确定性的 (`analysis/cvss_scorer.py`) - 如果没有运行 Ollama,
发现将仅获得基于规则的描述模板,而不是 AI 生成的
文本。请参阅下文的“可选:启用 AI 生成的描述”以开启该功能。
**运行此工具无需任何 API 密钥。** 它封装的所有扫描工具
(nmap, ZAP, Nikto, testssl.sh, Nuclei, Amass, Naabu, httpx, WhatWeb,
WAFW00F, FFUF) 以及 Ollama 本身在完全没有密钥的情况下即可运行。上方的
subfinder 配置复制步骤是唯一可选的例外 - 将其保留为
空模板即可,subfinder 将仅使用免费/公共来源运行。
为了加深子域名枚举,您可以在启动前向
该文件添加最多两个免费层级的密钥:
一个 GitHub 个人访问令牌和一个
[ProjectDiscovery Chaos](https://chaos.projectdiscovery.io) API 密钥 - 请参阅
`provider-config.yaml.example` 内的注释。
## 可选:启用 AI 生成的描述
Ollama **在宿主机上原生运行**(而非在 Docker 中),因此它可以直接使用
宿主机的 GPU;容器通过 `host.docker.internal` 访问它。
1. 在宿主机上安装 Ollama:https://ollama.com/install.sh
2. 拉取模型:`ollama pull qwen2.5:7b`
3. **使 Ollama 可从 Docker 容器访问**(Ollama 默认仅限
`127.0.0.1`,Docker 的桥接网络无法访问):
sudo systemctl edit ollama
在 `[Service]` 下添加:
[Service]
Environment="OLLAMA_HOST=0.0.0.0:11434"
保存,然后:
sudo systemctl daemon-reload && sudo systemctl restart ollama
注意:这会使 Ollama 可从您的本地网络访问,而不仅是
Docker - 在个人机器上没问题,但在共享机器上值得添加一条防火墙规则。
4. 验证:`curl http://localhost:11434/api/tags`
5. 重启 backend/worker 以便它们能识别它:`docker compose restart backend worker`
## 可选:练习目标
Compose 文件还定义了 12 个故意存在漏洞的练习应用
(Juice Shop, DVWA, bWAPP, Mutillidae, NodeGoat, DVWP/WordPress behind a
ModSecurity WAF, Metasploitable2, WebGoat),无需您自己的授权目标即可
对扫描器进行测试。它们受 Compose profile 控制,因此默认情况下从不构建/启动:
```
docker compose --profile targets up -d
```
**警告:这些是故意存在漏洞、甚至有些带有真正后门的服务**
(Metasploitable2 提供了实际的 vsftpd 后门)。仅在无法从 Internet 或
共享网络访问的机器上运行
`targets` profile - 切勿在公共云实例或暴露的主机上运行。
大多数应用从预构建的镜像运行,无需额外操作。其中两个 -
`nodegoat` 和 `dvwp-wordpress` - 从未在本文档仓库内置的
源代码构建,必须先进行克隆:
```
git clone https://github.com/OWASP/NodeGoat nodegoat-src
git clone https://github.com/vavkamil/dvwp dvwp-src
```
运行后发布的端口:Juice Shop `:3001`,DVWA `:8081`,bWAPP
`:8083`,Mutillidae `:8084`,NodeGoat `:8085`,DVWP (通过 WAF, TLS) `:8444`,
WebGoat `:8082`。Metasploitable2 不发布任何主机端口(仅能从
`backend`/`worker` 通过 Docker 的内部网络访问),因为它暴露了真实的
带后门/未经身份验证的网络服务。
## 配置
环境变量,通过 `.env` 设置(从 `.env.example` 复制):
| 变量 | 默认值 | 用途 |
|---|---|---|
| `POSTGRES_PASSWORD` | `vapt_secure_2025` | 数据库密码 |
| `SECRET_KEY` | `change_me_to_a_long_random_string` | 后端密钥 |
| `ALLOWED_HOSTS` | `localhost,127.0.0.1` | FastAPI 允许的主机 |
| `OLLAMA_URL` | `http://host.docker.internal:11434` | 后端/worker 访问 Ollama 的地址 |
| `SCAN_TIMEOUT_MULTIPLIER` | `1.5` | 缩放每个模块的工具/Celery 超时时间 - 实际目标比实验室目标慢;在实验室调优时间下降至 `1.0` |
| `MAX_CONCURRENT_SCANS` | `5` | 并发扫描上限(资源耗尽保护,同时决定数据库连接池大小) |
**上方的 `POSTGRES_PASSWORD`/`SECRET_KEY` 默认值仅用于演示** -
它们适用于本地/个人实例,但在部署到
其他任何人都可以访问的环境之前,请务必更改这两项。
## API 文档
FastAPI 免费生成交互式的 Swagger 文档 - 一旦后端
运行,即可打开 **http://localhost:8000/docs**。
## 停止
```
docker compose down
```
## 日志
```
docker compose logs -f backend worker
```
## 测试与验证
```
pip install -r backend/requirements-dev.txt
pytest backend/tests
```
截至撰稿时共有 438 个自动化后端测试。除了单元/集成
测试套件外,该工具在开发期间还进行了端到端的测试:针对九个故意
存在漏洞的练习应用(DVWA, Juice Shop, Mutillidae, NodeGoat,
bWAPP, WebGoat, Metasploitable2, 位于 WAF 后的 DVWP/WordPress)外加一个
已授权的公共目标 (`testphp.vulnweb.com`) 执行了 79 次真实
扫描并生成了 124 份 PDF 报告 - 这并非假设性的数字。
仅对您被明确授权测试的目标进行扫描 - 请参阅
[`docs/test_findings.md`](docs/test_findings.md) 了解开发期间使用的
练习目标。
## 文档
- [`ARCHITECTURE.md`](ARCHITECTURE.md) - 完整的架构、schemas 以及
更改绝不应破坏的 contracts。在进行非
微小更改之前阅读此文档。
- [`docs/QUICK_REF.md`](docs/QUICK_REF.md) - 运行命令、文件夹
职责,“我该在哪里进行此更改。”
- [`docs/scanners.md`](docs/scanners.md) - 每个扫描模块
时间/标志设计背后的原因。
- [`docs/ai.md`](docs/ai.md) - Ollama 超时/上下文调优,为什么评分
完全脱离了 LLM。
- [`docs/docker.md`](docs/docker.md) - Docker 偏差说明和构建
陷阱。
- [`docs/troubleshooting.md`](docs/troubleshooting.md) - 如何手动
独立测试任何模块/阶段。
- [`docs/roadmap.md`](docs/roadmap.md) - 历史构建序列
(构建已完成)。
- [`CONTRIBUTING.md`](CONTRIBUTING.md) - 开发设置、测试、PR 规范。
## 许可证
MIT - 详见 [LICENSE](LICENSE)。
## 仅限授权使用
未经明确书面授权扫描目标在《IT Act 2000 (India)》
及相关的国际法规下属于违法行为。此工具
在每次扫描时都需要进行授权确认,并记录操作员 +
时间戳以明确责任。
六层结构:Next.js 前端 → FastAPI → Celery/Redis → 8 个并行扫描
模块 → Ollama (Qwen 2.5 7B) → WeasyPrint PDF + 仪表板。完整详情见
[`ARCHITECTURE.md`](ARCHITECTURE.md)(schemas、contracts、guardrails)以及
[`docs/QUICK_REF.md`](docs/QUICK_REF.md)(常见更改的快速查询)。
## 前置条件
- Docker + Docker Compose v2
- 需约 6GB 可用磁盘空间用于核心镜像构建(后端镜像打包了 Nuclei
模板以及通过 Playwright 提供的无头 Chromium,在
基础 Python 镜像之上增加了约 1.5GB)
## 快速开始
```
cp .env.example .env
cp backend/subfinder-config/provider-config.yaml.example backend/subfinder-config/provider-config.yaml
docker compose up -d
docker compose ps # wait for zap to report healthy (~2 min)
```
打开 **http://localhost:3000**。
**这在不安装 Ollama 的情况下也能工作。** CVSS/严重程度/优先级评分始终
是确定性的 (`analysis/cvss_scorer.py`) - 如果没有运行 Ollama,
发现将仅获得基于规则的描述模板,而不是 AI 生成的
文本。请参阅下文的“可选:启用 AI 生成的描述”以开启该功能。
**运行此工具无需任何 API 密钥。** 它封装的所有扫描工具
(nmap, ZAP, Nikto, testssl.sh, Nuclei, Amass, Naabu, httpx, WhatWeb,
WAFW00F, FFUF) 以及 Ollama 本身在完全没有密钥的情况下即可运行。上方的
subfinder 配置复制步骤是唯一可选的例外 - 将其保留为
空模板即可,subfinder 将仅使用免费/公共来源运行。
为了加深子域名枚举,您可以在启动前向
该文件添加最多两个免费层级的密钥:
一个 GitHub 个人访问令牌和一个
[ProjectDiscovery Chaos](https://chaos.projectdiscovery.io) API 密钥 - 请参阅
`provider-config.yaml.example` 内的注释。
## 可选:启用 AI 生成的描述
Ollama **在宿主机上原生运行**(而非在 Docker 中),因此它可以直接使用
宿主机的 GPU;容器通过 `host.docker.internal` 访问它。
1. 在宿主机上安装 Ollama:https://ollama.com/install.sh
2. 拉取模型:`ollama pull qwen2.5:7b`
3. **使 Ollama 可从 Docker 容器访问**(Ollama 默认仅限
`127.0.0.1`,Docker 的桥接网络无法访问):
sudo systemctl edit ollama
在 `[Service]` 下添加:
[Service]
Environment="OLLAMA_HOST=0.0.0.0:11434"
保存,然后:
sudo systemctl daemon-reload && sudo systemctl restart ollama
注意:这会使 Ollama 可从您的本地网络访问,而不仅是
Docker - 在个人机器上没问题,但在共享机器上值得添加一条防火墙规则。
4. 验证:`curl http://localhost:11434/api/tags`
5. 重启 backend/worker 以便它们能识别它:`docker compose restart backend worker`
## 可选:练习目标
Compose 文件还定义了 12 个故意存在漏洞的练习应用
(Juice Shop, DVWA, bWAPP, Mutillidae, NodeGoat, DVWP/WordPress behind a
ModSecurity WAF, Metasploitable2, WebGoat),无需您自己的授权目标即可
对扫描器进行测试。它们受 Compose profile 控制,因此默认情况下从不构建/启动:
```
docker compose --profile targets up -d
```
**警告:这些是故意存在漏洞、甚至有些带有真正后门的服务**
(Metasploitable2 提供了实际的 vsftpd 后门)。仅在无法从 Internet 或
共享网络访问的机器上运行
`targets` profile - 切勿在公共云实例或暴露的主机上运行。
大多数应用从预构建的镜像运行,无需额外操作。其中两个 -
`nodegoat` 和 `dvwp-wordpress` - 从未在本文档仓库内置的
源代码构建,必须先进行克隆:
```
git clone https://github.com/OWASP/NodeGoat nodegoat-src
git clone https://github.com/vavkamil/dvwp dvwp-src
```
运行后发布的端口:Juice Shop `:3001`,DVWA `:8081`,bWAPP
`:8083`,Mutillidae `:8084`,NodeGoat `:8085`,DVWP (通过 WAF, TLS) `:8444`,
WebGoat `:8082`。Metasploitable2 不发布任何主机端口(仅能从
`backend`/`worker` 通过 Docker 的内部网络访问),因为它暴露了真实的
带后门/未经身份验证的网络服务。
## 配置
环境变量,通过 `.env` 设置(从 `.env.example` 复制):
| 变量 | 默认值 | 用途 |
|---|---|---|
| `POSTGRES_PASSWORD` | `vapt_secure_2025` | 数据库密码 |
| `SECRET_KEY` | `change_me_to_a_long_random_string` | 后端密钥 |
| `ALLOWED_HOSTS` | `localhost,127.0.0.1` | FastAPI 允许的主机 |
| `OLLAMA_URL` | `http://host.docker.internal:11434` | 后端/worker 访问 Ollama 的地址 |
| `SCAN_TIMEOUT_MULTIPLIER` | `1.5` | 缩放每个模块的工具/Celery 超时时间 - 实际目标比实验室目标慢;在实验室调优时间下降至 `1.0` |
| `MAX_CONCURRENT_SCANS` | `5` | 并发扫描上限(资源耗尽保护,同时决定数据库连接池大小) |
**上方的 `POSTGRES_PASSWORD`/`SECRET_KEY` 默认值仅用于演示** -
它们适用于本地/个人实例,但在部署到
其他任何人都可以访问的环境之前,请务必更改这两项。
## API 文档
FastAPI 免费生成交互式的 Swagger 文档 - 一旦后端
运行,即可打开 **http://localhost:8000/docs**。
## 停止
```
docker compose down
```
## 日志
```
docker compose logs -f backend worker
```
## 测试与验证
```
pip install -r backend/requirements-dev.txt
pytest backend/tests
```
截至撰稿时共有 438 个自动化后端测试。除了单元/集成
测试套件外,该工具在开发期间还进行了端到端的测试:针对九个故意
存在漏洞的练习应用(DVWA, Juice Shop, Mutillidae, NodeGoat,
bWAPP, WebGoat, Metasploitable2, 位于 WAF 后的 DVWP/WordPress)外加一个
已授权的公共目标 (`testphp.vulnweb.com`) 执行了 79 次真实
扫描并生成了 124 份 PDF 报告 - 这并非假设性的数字。
仅对您被明确授权测试的目标进行扫描 - 请参阅
[`docs/test_findings.md`](docs/test_findings.md) 了解开发期间使用的
练习目标。
## 文档
- [`ARCHITECTURE.md`](ARCHITECTURE.md) - 完整的架构、schemas 以及
更改绝不应破坏的 contracts。在进行非
微小更改之前阅读此文档。
- [`docs/QUICK_REF.md`](docs/QUICK_REF.md) - 运行命令、文件夹
职责,“我该在哪里进行此更改。”
- [`docs/scanners.md`](docs/scanners.md) - 每个扫描模块
时间/标志设计背后的原因。
- [`docs/ai.md`](docs/ai.md) - Ollama 超时/上下文调优,为什么评分
完全脱离了 LLM。
- [`docs/docker.md`](docs/docker.md) - Docker 偏差说明和构建
陷阱。
- [`docs/troubleshooting.md`](docs/troubleshooting.md) - 如何手动
独立测试任何模块/阶段。
- [`docs/roadmap.md`](docs/roadmap.md) - 历史构建序列
(构建已完成)。
- [`CONTRIBUTING.md`](CONTRIBUTING.md) - 开发设置、测试、PR 规范。
## 许可证
MIT - 详见 [LICENSE](LICENSE)。
## 仅限授权使用
未经明确书面授权扫描目标在《IT Act 2000 (India)》
及相关的国际法规下属于违法行为。此工具
在每次扫描时都需要进行授权确认,并记录操作员 +
时间戳以明确责任。标签:AI风险缓解, CTI, MISP, 搜索引擎查询, 测试用例, 请求拦截, 逆向工具