T3rr0or/ScanR

GitHub: T3rr0or/ScanR

一款基于 Nmap 和 Nuclei 的自托管网络漏洞扫描平台,提供实时 Web 控制台、拓扑可视化、扫描差异对比和 PDF 报告导出等完整工作流。

Stars: 3 | Forks: 0

# ScanR 一款自托管网络漏洞扫描器。将其指向一个子网,即可获得关于开放端口、配置错误和 CVE 的结构化报告——附带实时控制台、网络拓扑图和 PDF 导出功能。 ![Dashboard](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/e7d83f3cc6160805.png) ## 功能特性 - **基于 Nmap 的主机发现**和端口扫描 - **50+ 安全插件**,涵盖 Web、SSH、SSL/TLS、服务和网络类别 - **实时扫描控制台**,支持实时流式传输(持久化——扫描完成后可重播) - **发现结果分类**——标记误报、接受的风险,添加分析师备注 - **网络拓扑图**——D3 力导向图,按严重程度着色 - **扫描对比(差异)**——对比两次扫描:新增/已解决/持续存在的发现、主机和端口变更 - **截图库**——使用 Playwright 自动对发现的 Web 服务进行截图 - **PDF 报告**——执行摘要 + 完整发现结果导出 - **扫描模板**——保存并重用扫描配置(Quick、Full、Web Audit 或自定义) - **计划扫描**——基于 cron 的定期扫描 - **API 密钥**——用于 CI/CD 流水线的机器可读访问 - **Webhooks**——在扫描完成或发现关键漏洞时通知外部系统 - **分布式代理**——从多个网络有利位置运行扫描 - **Nuclei 集成**——与原生插件一同运行 Nuclei 模板 ![New Scan](https://raw.githubusercontent.com/T3rr0or/ScanR/master/docs/screenshots/new-scan.png) ![Findings](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/3907cfeefa160815.png) ### 插件类别 | 类别 | 插件 | |---|---| | 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) | ![Plugins](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/62c5d12d8f160822.png) ![Settings](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/fbfd616a01160828.png) ## 快速开始 (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漏洞扫描, 上游代理, 分布式扫描代理, 子网扫描, 安全合规, 安全报告, 安全运维, 定时扫描任务, 实时控制台, 密码管理, 开放端口检测, 扫描对比, 指纹识别, 插件系统, 搜索引擎查询, 无线安全, 服务配置审计, 测试用例, 特征检测, 网络代理, 网络安全扫描, 网络拓扑图, 网络漏洞扫描器, 自托管安全工具, 虚拟驱动器, 误报标记, 请求拦截, 逆向工具