Omnitarium/scoptix

GitHub: Omnitarium/scoptix

SCOPTIX 是一款被动侦察和攻击面探索工具,整合 VirusTotal 与 Wayback Machine 的数据帮助安全分析师发现子域名、归档资产及潜在敏感信息暴露。

Stars: 131 | Forks: 43

# SCOPTIX SCOPTIX 是一款被动侦察和攻击面探索工具,可帮助分析师识别暴露的内容、潜在的敏感信息,以及可能需要进一步调查的应用程序 endpoint。它从外部数据源聚合子域名、URL、IP 地址和归档的 Web 资产,以支持安全分析和暴露发现。 目前的数据来源为 **VirusTotal** 和 Internet Archive 的 **Wayback Machine**。 ![仪表盘 — 目标概览和扫描历史](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/45ee6574a1201255.png) ## 核心功能 * **资产发现:** 从多个外部数据源发现子域名、URL、IP 地址和归档的 Web 资产。IP 解析记录来自 VirusTotal 的被动 DNS(根域及所发现子域名的主机名 ↔ IP 历史)。每次扫描都会保留该次运行的观测 IP 列表;目标视图会聚合所有扫描中的相同地址,并提供主机名时间线和历史解析详情。 * **暴露发现:** 使用可自定义的检测规则,识别所发现资产中可能暴露的凭据、API key、token、云 secret 和配置文件。 * **资产分类:** 自动将发现的 URL 分组为您在“设置”中定义的扩展名类别——创建类别并映射路径后缀(例如 `.pdf`、`.js`、`.zip`),以便整理资产供后续审查。 * **深度扫描:** 可选择在启动扫描时下载 JavaScript 文件,并根据您的检测规则分析其内容,此外还会对每个 URL 应用 URL 字符串检查。 * **Endpoint 发现:** 探索参数、应用程序 endpoint、与认证相关的资源以及其他具有安全相关性的应用程序资产。 * **扫描对比:** 跟踪多次扫描之间的变化,并快速识别新发现的子域名、URL、IP 地址、归档资产和暴露发现。 ![扫描摘要 — 跨扫描对比结果](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/434e02c8b8201257.png) ![历史主机名 — 每个 IP 的被动 DNS 时间线](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/4e8141f48a201259.png) ![所有发现 — 暴露和检测结果](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/872bae65df201301.png) ## 真实案例 SCOPTIX 是基于 **Urwah Atiyat (OrwaGodFather)** 在以下演讲中演示的方法论构建的: * Art of VirusTotal Hacking – https://www.youtube.com/watch?v=Xosa-1o-01M * Essence of Recon in Bug Bounty and Pentesting – https://www.youtube.com/watch?v=CJnXjWXXB1Y 这些演讲中讨论的真实案例包括: * 识别隐藏在 WAF 后面的暴露的源站基础设施。 * 发现公开访问的敏感文档,包括身份记录、护照和其他个人信息。 * 找到被遗忘的备份归档(例如 `backup.7z`),这些归档暴露了源代码、凭据、配置文件或其他敏感的内部信息。 * 识别超过预期有效期仍然有效的密码重置 URL,这可能导致账户被接管。 ## 典型工作流 1. 从外部数据源发现子域名、URL 和 IP 解析历史。 2. 审查已识别的资产(包括目标上每个 IP 的主机名历史记录)和归档内容。 3. 分析 URL 和内容,以查找暴露的凭据、secret 和敏感文件。 4. 调查应用程序 endpoint 和其他具有安全相关性的发现。 5. 跨扫描比较结果,以识别新发现的暴露情况。 ## 重要提示 - **请勿用于生产环境:** 此工具侧重于功能而非严格的安全加固。请仅在隔离的、受信任的环境中使用。 - **无内置身份验证:** 任何具有网络访问权限的人都可以查看发现结果并触发扫描。在未配置您自己的访问控制(例如 VPN、反向代理)的情况下,请勿将 SCOPTIX 暴露在公共互联网上。 - **第三方 API 和数据:** VirusTotal 和 Internet Archive 施加了各自的使用条款、速率限制和可接受使用政策。此代码库仅负责编排查询并在本地存储结果;它并不重新分发上游数据集。 ## 反向代理 / Base Path 如果您需要在反向代理下的特定子路径(例如 `https://your-server.com/your-base-path/`)部署 SCOPTIX,您可以在 `.env` 文件中配置 `NEXT_PUBLIC_BASE_PATH` 环境变量。 ``` # .env NEXT_PUBLIC_BASE_PATH="/your-base-path" ``` **重要提示:** - Base path **必须**以斜杠开头,并且 **不得以**斜杠结尾。 - 因为 Next.js 会在构建时将此值固化,所以在更改它之后,您 **必须重新构建应用程序**。 - 如果您要部署到根域或子域(`https://scoptix.your-server.com/`),请不要配置此项。保持其为空或未定义状态。 ## 前置条件 - Node.js(推荐使用 LTS 版本)和 npm - Git(用于克隆代码仓库) - **要么**安装 Docker(推荐用于运行 Postgres + Redis),**要么**使用您自己的 PostgreSQL 和 Redis 实例 - 一个或多个 [VirusTotal](https://www.virustotal.com/) API key(VT 驱动的发现功能必需) **已测试平台:** Ubuntu 26.04(上述 Docker 和本地开发工作流)。其他 Linux 发行版和 macOS 可能适用,但未进行常规验证。 可选:SOCKS 代理(如果出站 API 或深度抓取流量必须通过代理路由) ## 入门指南 从两种工作流中选择一种: | 工作流 | 最适合 | 命令 | |----------|----------|---------| | **本地开发(热重载)** | 修改 UI/worker 代码 | `npm run dev:local` | | **完整 Docker** | 无需在宿主机上使用 Node 即可尝试类生产环境技术栈 | `bash docker-start.sh` | 两者在您的机器上开发时都使用相同的 `.env` 文件,并为 Postgres 和 Redis 使用 **localhost** URL。Docker Compose 将容器映射到 `localhost:5432` 和 `localhost:6379`。 ### 1. 克隆并安装 ``` git clone cd scoptix npm install ``` ### 2. 配置环境 ``` cp .env.example .env ``` 辅助脚本可以在首次运行时自动创建 `.env` 文件(`scripts/ensure-env.sh`)。 编辑 `.env` 并至少设置以下内容: | 变量 | 必需 | 用途 | |----------|----------|---------| | `DATABASE_URL` | 是 | PostgreSQL 连接字符串(使用 Docker 基础设施时为:`postgresql://recon:recon@localhost:5432/recon?schema=public`) | | `REDIS_URL` | 是 | Redis 连接字符串(使用 Docker 基础设施时为:`redis://127.0.0.1:6379`) | | `APP_ENCRYPTION_KEY` | 推荐 | 用于加密存储的 API key 的 32 字节密钥(base64 或 hex) | | `VT_SEED_API_KEY` | 可选 | 在运行 `npm run db:seed` 时注入一个 VirusTotal key(为开发提供便利) | 生成加密密钥 (Linux/macOS): ``` openssl rand -base64 32 ``` 如果省略了 `APP_ENCRYPTION_KEY`,应用程序可以在首次使用时在数据库中自动生成一个密钥——但建议明确设置它,以确保密钥在不同的部署之间保持可解密状态。 ### 3. 启动服务 #### 选项 A — 本地开发(推荐) 一条命令即可在 Docker 中启动 Postgres + Redis,在首次使用时运行数据库迁移,然后启动具有热重载功能的 Next.js 开发服务器和扫描 worker: ``` npm run dev:local ``` 或分步执行: ``` npm run docker:infra # Postgres + Redis only npm run docker:wait # wait until both are healthy npm run setup # first time: migrate + seed npm run dev:all # dev server + worker ``` 等效的 shell 包装器:`bash docker-start-infra.sh` 然后执行 `npm run dev:all`。 #### 选项 B — 在 Docker 中运行完整技术栈 在容器中构建并运行应用程序、worker、数据库设置、Postgres 和 Redis(无热重载): ``` bash docker-start.sh ``` 打开 [http://localhost:3000](http://localhost:3000)。 - 检查状态:`./docker-status.sh` - 日志:`npm run docker:logs` - 停止:`bash docker-stop.sh` 或 `npm run docker:down` #### 选项 C — 手动配置 Postgres / Redis 如果您已经在运行 Postgres 和 Redis(不是通过此代码库的 Compose 文件运行),请将 `.env` 中的 `DATABASE_URL` 和 `REDIS_URL` 指向您的实例,然后执行: ``` npm run setup npm run dev:all ``` ### 4. 首次扫描 1. 打开 **Settings → API & network** 并添加至少一个 VirusTotal API key(除非已通过 seed 注入)。 2. 确认在扫描引擎下启用了 **VirusTotal**(以及可选的 **Wayback Machine**)。 3. 转到 **Scans**,输入一个域名,可选择启用深度扫描,然后开始。 ## Docker 与权限 此代码库中的开发和 Docker 辅助脚本已在 **Ubuntu 26.04** 上验证。 - **Postgres 数据**存储在命名的 Docker 卷(`scoptix_pg`)中,而不是宿主机的绑定挂载中——因此您可以避免 `./data` 文件夹上的 UID/GID 权限问题。 - **Linux:** 将您的用户添加到 `docker` 用户组,这样您在使用 Compose 时就不需要 `sudo`:`sudo usermod -aG docker $USER`,然后重新登录。 - **端口:** 默认为 `5432` (Postgres) 和 `6379` (Redis)。如果这些端口已被占用,请在 `.env` 中使用 `POSTGRES_PORT` / `REDIS_PORT` 进行覆盖。 ## 常用 npm 脚本 | 脚本 | 用途 | |--------|---------| | `npm run dev:local` | Docker 基础设施 + 迁移(如果需要)+ `dev:all`(一键本地开发) | | `npm run docker:infra` | 仅启动 Postgres + Redis | | `npm run docker:infra:setup` | 基础设施 + 等待 + `setup` | | `npm run docker:up` / `docker:down` | 在 Docker 中运行完整技术栈 | | `npm run dev` | Next.js 开发服务器 | | `npm run worker` | BullMQ 扫描 worker(运行扫描必需) | | `npm run dev:all` | 通过 `concurrently` 运行开发服务器 + worker | | `npm run build` / `npm run start` | 生产环境构建和服务器 | | `npm run lint` | ESLint | | `npm run db:migrate` | 应用 Prisma 数据库迁移 | | `npm run db:push` | 推送 schema 而不生成迁移文件(开发快捷方式) | | `npm run db:seed` | 注入扩展名规则和默认设置 | | `npm run setup` | `db:migrate` + `db:seed` | ### 数据库迁移 schema 作为单个 Prisma 迁移发布:`prisma/migrations/0001_init`。全新安装(`npm run setup`, `bash docker-start.sh`)将自动应用该文件。 ## 扫描流水线(概述) 当为根域扫描启用两个引擎时,worker 大致遵循以下流程: 1. **VirusTotal — 根域:** 针对根域的域名报告、URL 收集和被动 DNS 解析。 2. **VirusTotal — 子域名:** 进行 BFS 扩展直至达到 `maxSubdomains`(获取每个主机名的 URL 和被动 DNS)。 3. **VirusTotal — IP 解析:** 持久化本次扫描观测到的 IP,并将主机名 ↔ IP 的观测记录合并到目标的全局 IP 目录中。 4. **Wayback — 根域:** 获取根域的 CDX URL 列表。 5. **Wayback — 子域名:** 获取每个发现的子域名的 CDX(受速率限制)。 6. **整合:** 对 URL 进行去重,分配扩展名类别,并更新目标缓存。 7. **分析:** 对 URL 字符串进行正则表达式扫描;对选定的类别进行可选的深度抓取 + 正文扫描。 仅针对子域名的扫描会跳过完整的根域扩展,但仍会针对输入的主机名运行已启用的引擎。 ## 贡献 欢迎以 issue 或 pull request 的形式提交改进、bug 报告和安全反馈。在针对实时 API 进行测试时,请遵守 VirusTotal 和 Internet Archive 的使用条款。
标签:GitHub, MITM代理, 信息泄露检测, 安全工具库, 实时处理, 密码管理, 搜索引擎查询, 测试用例, 自动化攻击, 被动侦察, 请求拦截