由 maverickaayush 构建。
一款本地托管、可离线隔离运行的 VAPT 工具:将其指向一个经授权的目标域名,它便会并行运行 8 个扫描模块,对每项发现进行确定性评分(CVSS v3.1),可选地通过本地 LLM 添加 AI 生成的通俗英语描述,并生成 PDF 报告和实时 Web 仪表板。无任何外部 API 调用——一切都在您自己的网络上运行。
运行 ONUS 的两种方式:
- 自托管(本仓库):
docker compose up→ 输入域名 → 勾选授权框 → 扫描。 无需账户、无需登录、无需邮箱验证——设计上即为单操作员使用,下文所有内容均围绕该方式展开。- 托管版: 托管的实例已在 tryonus.tech 上线。 它叠加了仅生产环境使用的功能(账户 / OAuth 登录、扫描队列、按用户划分的 历史记录),这些功能在本仓库中默认 关闭,因此自托管保持简单。参见 自托管与托管对比。
自托管的默认路径刻意保持简单:无需注册、无需邮箱验证、无需 OAuth。仅托管版才有的功能(身份认证、扫描队列)由默认 关闭 的配置标志控制(REQUIRE_AUTH=false、HOSTED_QUEUE_ENABLED=false;参见 配置),并且未在 docker-compose.yml 中设置——因此在本地运行 ONUS 绝不会让您被登录墙挡住。更喜欢零配置?请使用 tryonus.tech 上的托管站点。
| 新建扫描 | 实时扫描状态 |
|---|---|
![]() | ![]() |
| 报告仪表板 | 扫描发现 |
|---|---|
![]() | ![]() |
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(模式、契约、护栏)和 docs/QUICK_REF.md(常见更改的快速查阅)。
mem_limit: 4g),Postgres、Redis、API、worker 和前端还需与之同时运行。请先阅读上面的环境要求:约 8GB 磁盘和约 6GB 内存,并预计首次构建需要 10-15 分钟。
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**,输入一个域名,勾选授权框,然后开始扫描。
无需登录、注册或邮箱验证。 自托管的 ONUS 默认为单操作员模式——从打开仪表板到开始扫描之间没有任何账户步骤。
即使不安装 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 API 密钥——参见 provider-config.yaml.example 内的注释。
Ollama 直接运行在宿主机上(而非 Docker 内),以便直接使用宿主机的 GPU;容器通过 host.docker.internal 访问它。
ollama pull qwen2.5:7b127.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
curl http://localhost:11434/api/tagsdocker compose restart backend workercompose 文件还定义了 12 个故意存在漏洞的练习应用(Juice Shop、DVWA、bWAPP、Mutillidae、NodeGoat、位于 ModSecurity WAF 之后的 DVWP/WordPress、Metasploitable2、WebGoat),用于在无需准备自己授权目标的情况下试用扫描器。它们由 Compose profile 控制,因此默认不会构建/启动:
docker compose --profile targets up -d
警告:这些是故意存在漏洞的服务,其中一些确实留有后门(Metasploitable2 附带一个活跃的 vsftpd 后门)。只能在无法从互联网或共享网络访问的机器上运行 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 不发布宿主机端口(只能通过 Docker 内部网络从 backend/worker 访问),因为它暴露的是真实存在且留有后门/无需认证的网络服务。
通过 .env(从 .env.example 复制)设置的环境变量:
上面 POSTGRES_PASSWORD/SECRET_KEY 的默认值仅供演示——它们适用于本地/个人实例,但在部署到任何其他人可访问的环境中之前,请务必修改两者。这一点现在是强制的,而不只是建议:设置 ONUS_ENV=production(或启用托管版身份认证)后,只要两者之一仍是默认值/占位符,后端就拒绝启动。使用 python -c "import secrets; print(secrets.token_urlsafe(48))" 生成一个强密钥。
仅托管版才有的功能默认关闭。 REQUIRE_AUTH(账户 / OAuth 登录)和 HOSTED_QUEUE_ENABLED(扫描队列)均默认为 false,且未在 docker-compose.yml 中设置,因此自托管的 ONUS 绝不会让您被登录墙或队列挡住。除非您有意构建多用户的托管部署,否则请保持关闭——托管的 tryonus.tech 实例才是启用它们的那一个。
ONUS 默认不包含任何分析功能——不会加载任何内容,数据也不会离开浏览器。若要在您自己的部署上收集匿名的产品使用指标,只需设置一个 Google Analytics 4 的 Measurement ID:
NEXT_PUBLIC_GA_ID=G-XXXXXXXXXX
这是一个前端构建时变量,因此请在构建前端的环境中设置(Vercel/托管环境变量,或本地 npm run build 时使用 frontend/.env.local)。设置后,GA 仅在生产构建中加载,并跟踪页面浏览量以及少量产品事件(例如 scan_started、scan_completed、report_downloaded)。自定义事件通过 frontend/lib/analytics.ts 中的类型化辅助函数处理——trackEvent('scan_started')。
隐私: 只会发送匿名的、低基数的使用事件——绝不会发送被扫描的域名、扫描结果、发现项、报告内容、授权状态或任何个人数据。保持 NEXT_PUBLIC_GA_ID 不设置,ONUS 的行为与之前完全一致;分析功能完全是自愿开启的。
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
截至撰写本文时,共有 655 项自动化后端测试。除单元/集成测试套件外,该工具在开发过程中还经过了端到端演练:针对九个故意存在漏洞的练习应用(DVWA、Juice Shop、Mutillidae、NodeGoat、bWAPP、WebGoat、Metasploitable2、位于 WAF 之后的 DVWP/WordPress)外加一个经授权的公共目标(testphp.vulnweb.com),实际执行了 79 次真实扫描并生成了 124 份 PDF 报告——这些不是虚构的数字。请始终只扫描您获得明确授权测试的目标——开发过程中使用的练习目标参见 docs/test_findings.md。
ARCHITECTURE.md——完整架构、模式,以及任何更改都不应破坏的契约。在进行非平凡的更改之前,请先阅读本文档。docs/QUICK_REF.md——运行命令、目录职责、"我该在哪里做这项更改"。docs/scanners.md——每个扫描模块超时/标志设计背后的理由。docs/ai.md——Ollama 超时/上下文调优,以及为什么评分完全移出了 LLM。docs/docker.md——Docker 偏差说明和构建注意事项。docs/troubleshooting.md——如何单独手动测试任意模块/阶段。docs/roadmap.md——历史构建顺序(构建已完成)。CONTRIBUTING.md——开发环境搭建、测试、PR 规范。MIT——参见 LICENSE。
未经明确书面授权扫描目标,依据《信息技术法 2000》(印度)及相应的国际法规均属违法行为。本工具在每次扫描时都要求确认授权,并记录操作者 + 时间戳用于责任追溯。
| 自托管(本仓库) | 托管版(tryonus.tech) |
|---|
| 安装 | docker compose up | 无需安装——直接打开网站即可 |
| 登录 | 无——单操作员 | 账户 / Google / GitHub OAuth |
| 扫描流程 | 输入域名 → 勾选授权框 → 扫描 | 相同,登录后即可 |
| 附加功能 | - | 扫描队列、按用户划分的历史记录、托管邮件 |
| 运行于 | 您自己的网络,离线隔离 | 托管云 |
| 变量 | 默认值 | 用途 |
|---|
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 | 3 | 并发扫描上限(防止资源耗尽 / 对目标保持礼貌的防护,同时决定数据库连接池大小) |
ONUS_ENV | development | development(自托管 localhost——弱密钥仅发出警告)或 production(弱 SECRET_KEY/Postgres 密码将导致启动直接失败) |