Omnitarium/scoptix
GitHub: Omnitarium/scoptix
SCOPTIX 是一款被动侦察和攻击面探索工具,整合 VirusTotal 与 Wayback Machine 的数据帮助安全分析师发现子域名、归档资产及潜在敏感信息暴露。
Stars: 131 | Forks: 43
# SCOPTIX
SCOPTIX 是一款被动侦察和攻击面探索工具,可帮助分析师识别暴露的内容、潜在的敏感信息,以及可能需要进一步调查的应用程序 endpoint。它从外部数据源聚合子域名、URL、IP 地址和归档的 Web 资产,以支持安全分析和暴露发现。
目前的数据来源为 **VirusTotal** 和 Internet Archive 的 **Wayback Machine**。

## 核心功能
* **资产发现:** 从多个外部数据源发现子域名、URL、IP 地址和归档的 Web 资产。IP 解析记录来自 VirusTotal 的被动 DNS(根域及所发现子域名的主机名 ↔ IP 历史)。每次扫描都会保留该次运行的观测 IP 列表;目标视图会聚合所有扫描中的相同地址,并提供主机名时间线和历史解析详情。
* **暴露发现:** 使用可自定义的检测规则,识别所发现资产中可能暴露的凭据、API key、token、云 secret 和配置文件。
* **资产分类:** 自动将发现的 URL 分组为您在“设置”中定义的扩展名类别——创建类别并映射路径后缀(例如 `.pdf`、`.js`、`.zip`),以便整理资产供后续审查。
* **深度扫描:** 可选择在启动扫描时下载 JavaScript 文件,并根据您的检测规则分析其内容,此外还会对每个 URL 应用 URL 字符串检查。
* **Endpoint 发现:** 探索参数、应用程序 endpoint、与认证相关的资源以及其他具有安全相关性的应用程序资产。
* **扫描对比:** 跟踪多次扫描之间的变化,并快速识别新发现的子域名、URL、IP 地址、归档资产和暴露发现。



## 真实案例
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代理, 信息泄露检测, 安全工具库, 实时处理, 密码管理, 搜索引擎查询, 测试用例, 自动化攻击, 被动侦察, 请求拦截