T3rr0or/ScanR
GitHub: T3rr0or/ScanR
一款基于 Nmap 和 Nuclei 的自托管网络漏洞扫描平台,提供实时 Web 控制台、拓扑可视化、扫描差异对比和 PDF 报告导出等完整工作流。
Stars: 3 | Forks: 0
# ScanR
一款自托管网络漏洞扫描器。将其指向一个子网,即可获得关于开放端口、配置错误和 CVE 的结构化报告——附带实时控制台、网络拓扑图和 PDF 导出功能。

## 功能特性
- **基于 Nmap 的主机发现**和端口扫描
- **50+ 安全插件**,涵盖 Web、SSH、SSL/TLS、服务和网络类别
- **实时扫描控制台**,支持实时流式传输(持久化——扫描完成后可重播)
- **发现结果分类**——标记误报、接受的风险,添加分析师备注
- **网络拓扑图**——D3 力导向图,按严重程度着色
- **扫描对比(差异)**——对比两次扫描:新增/已解决/持续存在的发现、主机和端口变更
- **截图库**——使用 Playwright 自动对发现的 Web 服务进行截图
- **PDF 报告**——执行摘要 + 完整发现结果导出
- **扫描模板**——保存并重用扫描配置(Quick、Full、Web Audit 或自定义)
- **计划扫描**——基于 cron 的定期扫描
- **API 密钥**——用于 CI/CD 流水线的机器可读访问
- **Webhooks**——在扫描完成或发现关键漏洞时通知外部系统
- **分布式代理**——从多个网络有利位置运行扫描
- **Nuclei 集成**——与原生插件一同运行 Nuclei 模板


### 插件类别
| 类别 | 插件 |
|---|---|
| Web | HTTP headers, CORS, clickjacking, directory brute-force, sensitive files, open redirect, path traversal, JWT misconfig, GraphQL introspection, screenshots |
| SSL/TLS | Certificate inspection, cipher audit, protocol check, Heartbleed, POODLE/BEAST |
| SSH | Algorithm audit, version fingerprint, default credentials |
| Services | FTP anon, SMB signing/vulns, SNMP community strings, Redis/MongoDB/Elasticsearch/Docker/Kubernetes/Jupyter unauthenticated access, IPMI cipher zero, NTP monlist, VNC auth, Telnet, RDP |
| Network | ICMP info, open ports summary, NetBIOS |
| CVE | NVD-based CVE matching against detected service versions |
| Nuclei | Runs Nuclei template library (CVEs, exposures, misconfigs, default logins) |


## 快速开始 (Docker)
### 前置条件
- Docker Engine 24+
- Docker Compose v2 (`docker compose` 命令)
- 主机上 80 和 8000 端口可用
### 1. 克隆代码库
```
git clone https://github.com/T3rr0or/ScanR.git
cd ScanR
```
### 2. 配置环境
```
cp .env.example .env
```
编辑 `.env` 并填入所需的值:
```
# 使用以下命令生成:python3 -c "import secrets; print(secrets.token_urlsafe(32))"
SECRET_KEY=
# 使用以下命令生成:python3 -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
VAULT_KEY=
# PostgreSQL 密码
POSTGRES_PASSWORD=
# 管理员账号(首次启动时创建)
ADMIN_EMAIL=admin@example.com
ADMIN_PASSWORD=
```
如果未设置 `SECRET_KEY`、`ADMIN_PASSWORD` 或 `POSTGRES_PASSWORD`,应用程序将拒绝启动。
### 3. 启动所有服务
```
docker compose up -d --build
```
这将启动:
- **postgres** — 数据库
- **redis** — 任务队列和事件总线
- **api** — 运行在 8000 端口的 FastAPI 后端
- **worker** — Celery 扫描工作节点(运行 nmap 需要 `NET_RAW` / `NET_ADMIN` 权限)
- **frontend** — Nginx 在 80 端口提供 React UI 服务
首次启动将运行数据库迁移并自动植入系统扫描模板。
### 4. 打开界面
导航至 **http://localhost**,并使用您在 `.env` 中设置的管理员凭据登录。
## 使用方法
### 创建扫描
1. 前往 **Scans → New Scan**
2. 选择一个模板(Quick、Full、Web Audit)或手动配置
3. 输入目标 — 每行一个,支持:
- 单个 IP:`192.168.1.10`
- CIDR 范围:`192.168.1.0/24`
- IP 范围:`10.0.0.1-10.0.0.50`
- 主机名:`example.com`
4. 点击 **Create & Launch**
### 扫描配置
| 模板 | 端口 | 插件 |
|---|---|---|
| Quick Scan | Top 1 000 | 无暴力破解,无认证 |
| Full Scan | 所有 65 535 | 所有插件 |
| Web Audit | 80, 443, 8080, 8443 | 仅 Web + SSL |
| Custom | 自定义 | 自定义 |
### 查看结果
点击任意扫描行以进入扫描详情视图:
- **Console** — 扫描期间的实时日志流;已完成扫描的完整历史记录
- **Findings** — 可排序/过滤的漏洞表,带分类控制
- **Hosts** — 发现的主机及其开放端口和服务
- **Topology** — 按严重程度着色的 D3 力导向网络图;滚动缩放,拖动平移
- **Screenshots** — 由 Playwright 捕获的 Web 服务截图库
### 发现结果分类
- 点击任意发现行以打开详情抽屉
- 在抽屉中使用 **False Positive** / **Accept Risk** 按钮
- 添加分析师备注(失焦时自动保存)
- 按分类状态过滤:All / Open / False Positive / Accepted Risk
### 扫描对比
在扫描列表中,点击任意已完成扫描上的 **⎇ Compare** 图标以打开差异视图。选择一个基准扫描以查看:
- 自基准以来引入的新发现
- 已解决的发现
- 持续存在的发现
- 新增/移除的主机
- 每台主机的端口变更
### 报告
前往 **Reports → Generate**,以 HTML、PDF、JSON 或 CSV 格式导出任何已完成扫描的报告。包括执行摘要、严重程度细分和完整的发现列表。
### 计划扫描
前往 **Schedules** 使用 cron 语法创建定期扫描(例如,`0 2 * * 0` 表示每周日凌晨 2 点)。
### API 访问
前往 **Settings → API Keys** 生成用于自动化访问的密钥:
```
# 扫描列表
curl -H "X-API-Key: sk_..." http://localhost:8000/api/v1/scans
# 触发扫描
curl -X POST -H "X-API-Key: sk_..." -H "Content-Type: application/json" \
-d '{"name":"CI scan","targets":["10.0.1.0/24"],"profile":"custom","profile_json":"{}"}' \
http://localhost:8000/api/v1/scans
```
完整 API 文档:**http://localhost:8000/api/v1/docs**
## 配置参考
所有选项均可通过 `.env` 或环境变量设置:
| 变量 | 默认值 | 描述 |
|---|---|---|
| `SECRET_KEY` | *(必填)* | JWT 签名密钥 — 使用 `python3 -c "import secrets; print(secrets.token_urlsafe(32))"` 生成 |
| `VAULT_KEY` | *(可选)* | 用于凭据库的 Fernet 密钥 — 使用 `python3 -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"` 生成 |
| `POSTGRES_PASSWORD` | *(必填)* | PostgreSQL `scanr` 数据库用户的密码 |
| `ADMIN_EMAIL` | `admin@scanr.local` | 引导管理员账户的电子邮件(仅首次启动) |
| `ADMIN_PASSWORD` | *(必填)* | 引导管理员账户的密码(仅首次启动) |
| `ALLOWED_ORIGINS` | `http://localhost` | 允许调用 API 的 CORS 源,以逗号分隔 |
| `DATABASE_URL` | *(在 compose 中设置)* | PostgreSQL 连接字符串 |
| `REDIS_URL` | *(在 compose 中设置)* | Redis 连接 URL |
| `MAX_CONCURRENT_HOSTS` | `50` | 每次扫描并行扫描的最大主机数 |
| `MAX_CONCURRENT_PLUGINS` | `20` | 每台主机并行运行的最大插件数 |
| `DEFAULT_SCAN_TIMEOUT` | `3600` | 扫描超时时间(以秒为单位) |
## 架构
```
Browser
│
├── HTTP/WS ──► Nginx (port 80)
│ │
│ └── proxy ──► FastAPI (port 8000)
│ │
│ ├── PostgreSQL (data)
│ ├── Redis (events / task queue)
│ └── Celery worker
│ │
│ ├── nmap / masscan
│ ├── Playwright (screenshots)
│ ├── Nuclei
│ └── Python plugins
```
- **FastAPI** — async REST API + 用于实时控制台的 WebSocket
- **Celery** — 扫描任务在具有 nmap `NET_RAW` 权限的独立工作进程中运行
- **Redis** — 用于实时事件流的 pub/sub;用于控制台历史记录重播的持久化列表
- **PostgreSQL** — 所有扫描数据、发现、主机、端口、报告
- **React + Vite** — 由 Nginx 提供服务的 SPA 前端
## 更新
```
git pull
docker compose up -d --build
```
数据库迁移将在 API 启动时自动运行。
## 停止 / 移除
```
# 停止容器(保留数据)
docker compose down
# 停止并删除所有数据(扫描、发现、报告)
docker compose down -v
```
## 安全注意事项
- 工作容器需要 `NET_ADMIN` 和 `NET_RAW` Linux 权限才能进行 nmap 原始套接字扫描。请勿将其暴露给不受信任的网络。
- `SECRET_KEY`、`POSTGRES_PASSWORD` 和 `ADMIN_PASSWORD` 为必填项——若未设置,应用程序将无法启动。
- 对于本地主机以外的部署,请将 ScanR 置于反向代理(nginx, Caddy)之后,启用 TLS,并将 `ALLOWED_ORIGINS` 设置为您的域名。
- API 具有速率限制(登录限制为 10 次/分钟,扫描创建限制为 20 次/分钟,全局限制为 300 次/分钟)。
- 所有扫描数据均按用户划分范围——用户之间无法互相访问扫描结果。
- 失败的登录尝试将与 IP 地址一起在服务器端记录。
## 许可证
MIT
标签:C2日志可视化, Chrome Headless, CI/CD安全, CTI, D3.js, DevSecOps, Docker安全, Google, Kubernetes安全, Llama, Nmap, Nuclei, PB级数据处理, PDF报告导出, Playwright截图, SSH安全审计, SSL/TLS审计, Webhook通知, Web漏洞扫描, 上游代理, 分布式扫描代理, 子网扫描, 安全合规, 安全报告, 安全运维, 定时扫描任务, 实时控制台, 密码管理, 开放端口检测, 扫描对比, 指纹识别, 插件系统, 搜索引擎查询, 无线安全, 服务配置审计, 测试用例, 特征检测, 网络代理, 网络安全扫描, 网络拓扑图, 网络漏洞扫描器, 自托管安全工具, 虚拟驱动器, 误报标记, 请求拦截, 逆向工具