nabz0r/Xpose
GitHub: nabz0r/Xpose
一个生产级的 OSINT SaaS 平台,能够并行调度八个开源情报工具对邮箱或用户名进行聚合调查,并生成带置信度评分的统一报告。
Stars: 0 | Forks: 0
# Xpose — OSINT 调查平台
一个生产级 SaaS Web 应用程序,可针对电子邮件或用户名目标并行运行 8 个 OSINT 工具,通过跨工具去重和置信度评分汇总结果,并显示具有暗色网络主题 UI 的统一调查报告。
## 目录
- [快速入门(交互式安装程序)](#quick-start-interactive-installer)
- [架构概览](#architecture-overview)
- [技术栈](#tech-stack)
- [集成的 OSINT 工具](#osint-tools-integrated)
- [安装指南](#installation-guide)
- [前置条件](#prerequisites)
- [交互式安装程序(推荐)](#interactive-installer-recommended)
- [手动 Docker 部署](#manual-docker-deployment)
- [本地开发设置](#local-development-setup)
- [配置](#configuration)
- [使用](#usage)
- [安全与认证](#security--authentication)
- [两步验证 (2FA)](#two-factor-authentication-2fa)
- [单点登录 (SSO)](#single-sign-on-sso)
- [扫描工作流](#scan-workflow)
- [API 参考](#api-reference)
- [前端页面](#frontend-pages)
- [Token 与定价模型](#token--pricing-model)
- [GHunt 补丁](#ghunt-patch)
- [项目结构](#project-structure)
- [故障排除](#troubleshooting)
## 架构概览
```
┌─────────────────────────────────────────────────────────────────┐
│ CLIENT BROWSER │
│ (React + Tailwind CSS) │
│ Landing │ Dashboard │ Scan Results │ Admin │ Settings │ Auth │
└──────────────────┬─────────────────────┬────────────────────────┘
│ REST API (HTTPS) │ WebSocket (WSS)
┌──────────────────▼─────────────────────▼────────────────────────┐
│ NGINX REVERSE PROXY │
│ Serves frontend static files │
│ Proxies /api/* → backend:8000 │
│ Upgrades WebSocket connections │
└──────────────────┬─────────────────────┬────────────────────────┘
│ │
┌──────────────────▼─────────────────────▼────────────────────────┐
│ BACKEND (FastAPI) │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌───────────────────┐ │
│ │ Auth API │ │Scans API │ │Admin API │ │ WebSocket Handler │ │
│ │ JWT+SSO │ │CRUD+Export│ │Stats+Mgmt│ │ Live scan updates │ │
│ └──────────┘ └──────────┘ └──────────┘ └───────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Service Layer │ │
│ │ Token management · Scan orchestration · Result dedup │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ SQLAlchemy ORM (Async) + Pydantic Schemas │ │
│ └──────────────────────────────────────────────────────────┘ │
└─────────────┬─────────────────────────────┬─────────────────────┘
│ │
▼ ▼
┌─────────────────────┐ ┌─────────────────────────────────┐
│ PostgreSQL 16 │ │ Redis 7 │
│ │ │ │
│ users │ │ Celery broker (task queue) │
│ scans │ │ Celery backend (result store) │
│ scan_results │ │ Rate limiting cache │
│ accounts │ │ Session cache │
│ token_transactions │ │ │
│ api_keys │ └──────────┬──────────────────────┘
└─────────────────────┘ │
│ Task dispatch
┌──────────────────────────▼──────────────────────┐
│ CELERY WORKERS │
│ │
│ Orchestrator: run_full_scan() │
│ ┌─────────────────────────────────────────────┐ │
│ │ Parallel tool execution (8 concurrent) │ │
│ │ │ │
│ │ ┌─────────┐ ┌─────────┐ ┌──────────┐ │ │
│ │ │ GHunt │ │ Holehe │ │ Maigret │ │ │
│ │ │(patched)│ │(120+ ▓▓)│ │(2600+ ▓▓)│ │ │
│ │ └─────────┘ └─────────┘ └──────────┘ │ │
│ │ ┌─────────┐ ┌─────────┐ ┌──────────┐ │ │
│ │ │ h8mail │ │ Mosint │ │Blackbird │ │ │
│ │ │(breaches│ │(Go bin) │ │(600+ ▓▓▓)│ │ │
│ │ └─────────┘ └─────────┘ └──────────┘ │ │
│ │ ┌─────────┐ ┌─────────┐ │ │
│ │ │Sherlock │ │ HIBP │ │ │
│ │ │(300+ ▓▓)│ │(API) │ │ │
│ │ └─────────┘ └─────────┘ │ │
│ └─────────────────────────────────────────────┘ │
│ │
│ Deduplicator: deduplicate_accounts() │
│ Scheduler: reset_free_tokens() (daily) │
└──────────────────────────────────────────────────┘
```
### 数据流
1. 用户通过前端提交电子邮件/用户名
2. 后端验证请求,扣除 token,创建扫描记录
3. Celery 编排器分发 8 个并行工具任务
4. 每个工具独立运行,将结果保存到 PostgreSQL
5. 前端通过 WebSocket 接收实时进度(每 2 秒轮询一次)
6. 当所有工具完成后,去重器汇总并对结果进行评分
7. 用户查看带有置信度评分账户的统一报告
## 技术栈
| 层级 | 技术 | 版本 | 用途 |
|-------|-----------|---------|---------|
| **Frontend** | React | 18.3 | UI 框架 |
| | Tailwind CSS | 3.4 | 实用优先的样式 |
| | Framer Motion | 11.15 | 动画 |
| | Recharts | 2.15 | 仪表板图表 |
| | Axios | 1.7 | HTTP 客户端 |
| | Lucide React | 0.468 | 图标库 |
| **Backend** | FastAPI | 0.115 | REST API 框架 |
| | SQLAlchemy | 2.0 | 异步 ORM |
| | Pydantic | 2.10 | 数据验证 |
| | python-jose | 3.3 | JWT token |
| | Passlib + bcrypt | 1.7 | 密码哈希 |
| | Authlib | 1.4 | OAuth (Google, GitHub) |
| | pyotp | latest | TOTP 两步验证 |
| | qrcode | latest | 用于 2FA 设置的二维码生成 |
| | WeasyPrint | 63.1 | PDF 报告生成 |
| **Workers** | Celery | 5.4 | 任务队列 |
| | Redis | 7 | Broker + 缓存 |
| **Database** | PostgreSQL | 16 | 主数据存储 |
| **Infrastructure** | Docker Compose | 3.8 | 容器编排 |
| | Nginx | Alpine | 反向代理 |
## 集成的 OSINT 工具
| 工具 | 输入 | 站点/来源 | 发现内容 | 方法 |
|------|-------|---------------|---------------|--------|
| **GHunt** (已修补) | email | Google 服务 | Gaia ID, 个人资料照片, 地图评论, 日历, 云端硬盘, Play Games | Python 库 + gpsoauth |
| **Holehe** | email | 120+ 站点 | 邮箱是否在 Twitter, Snapchat, Instagram, Deliveroo 等注册 | Python 库 (异步) |
| **Maigret** | username | 2600+ 站点 | 社交媒体、论坛、平台上的用户名归属 | CLI 子进程 |
| **h8mail** | email | 泄露数据库 | 数据泄露和凭证泄露 (HIBP, Scylla 等) | CLI 子进程 → JSON |
| **Mosint** | email | 多种来源 | 泄露检查, 社交媒体, DNS 记录, Google dorking | Go 二进制 |
| **Blackbird** | email/username | 600+ 站点 | 通过 WhatsMyName 项目数据库检查账户是否存在 | Python 子进程 |
| **Sherlock** | username | 300+ 站点 | 社交媒体账户发现 | CLI 子进程 → JSON |
| **HIBP API** | email | Have I Been Pwned | 数据泄露及泄露日期、受影响的数据类别 | REST API (需要密钥) |
### 衍生情报
除了原始工具输出外,Xpose 还会自动执行:
- **用户名提取** — 提取电子邮件的本地部分(`@` 之前)并将其输入给基于用户名的工具(Maigret, Sherlock, Blackbird)
- **跨工具去重** — 多个工具发现的同一平台被合并为一个条目
- **置信度评分** — 如果 2 个以上工具确认则为 `HIGH`,如果 1 个工具则为 `MEDIUM`,不确定的匹配为 `LOW`
- **反向图片搜索链接** — 如果 GHunt 返回个人资料照片 URL,则会生成指向 Yandex/TinEye 的链接
## 快速入门(交互式安装程序)
部署 Xpose 的最快方式 —— 一条命令搞定一切:
```
git clone https://github.com/nabz0r/Xpose.git
cd Xpose
./setup
```
安装程序会引导您完成配置,构建所有容器,并显示实时进度部署完整技术栈。有关详细信息,请参阅 [交互式安装程序](#interactive-installer-recommended)。
## 安装指南
### 前置条件
| 要求 | 最低版本 | 检查命令 |
|-------------|----------------|---------------|
| **Docker** | 20.10+ | `docker --version` |
| **Docker Compose** | 2.0+ (v2 插件) | `docker compose version` |
| **Git** | 2.30+ | `git --version` |
| **磁盘空间** | 5 GB 可用空间 | `df -h` |
| **RAM** | 4 GB 最低 (推荐 8 GB) | `free -h` |
对于本地开发(不使用 Docker):
| 要求 | 版本 | 检查命令 |
|-------------|---------|---------------|
| **Python** | 3.11+ | `python3 --version` |
| **Node.js** | 20+ | `node --version` |
| **npm** | 9+ | `npm --version` |
| **Go** | 1.21+ (用于 Mosint) | `go version` |
| **PostgreSQL** | 16+ | `psql --version` |
| **Redis** | 7+ | `redis-server --version` |
### 交互式安装程序(推荐)
Xpose 包含一个完整的终端 UI 安装程序,可在单个引导流程中处理整个部署 —— 从配置到运行服务。
#### 运行
```
./setup
# 或
./install.sh
```
#### 安装程序的功能
安装程序按顺序运行 5 个屏幕:
```
┌─────────────────────────────────────────────────────────────┐
│ │
│ ██╗ ██╗██████╗ ██████╗ ███████╗███████╗ │
│ ╚██╗██╔╝██╔══██╗██╔══██╗██╔════╝██╔════╝ │
│ ╚███╔╝ ██████╔╝██║ ██║███████╗█████╗ │
│ ██╔██╗ ██╔═══╝ ██║ ██║╚════██║██╔══╝ │
│ ██╔╝ ██╗██║ ╚█████╔╝███████║███████╗ │
│ ╚═╝ ╚═╝╚═╝ ╚════╝ ╚══════╝╚══════╝ │
│ │
│ OSINT Investigation Platform │
│ │
└─────────────────────────────────────────────────────────────┘
```
**屏幕 1 — 预检检查**
在开始之前自动验证您的系统:
```
PREFLIGHT CHECKS
✓ Docker v27.3.1
✓ Docker Compose v2.30.3
✓ Docker daemon running
✓ Git 2.43.0
✓ Disk space 42GB available
✓ Memory 16GB RAM
✓ Port 3000 available
✓ Port 8000 available
✓ Port 5432 available
✓ Port 6379 available
✓ All checks passed
```
如果缺少任何要求,安装程序会准确告诉您需要修复什么并退出。
**屏幕 2 — 配置**
所有设置的交互式提示。安全默认值是自动生成的 —— 只需按 Enter 接受:
```
CONFIGURATION
─── Security (auto-generated — press Enter to accept) ───
▸ Secret key [a1b2c3d4e5f6...]: ↵
▸ Database password: ••••••••••
─── Ports ───
▸ Frontend port [3000]: ↵
▸ Backend port [8000]: ↵
─── Admin account ───
▸ Admin email: admin@example.com
▸ Admin password: ••••••••••
─── API keys (optional — press Enter to skip) ───
▸ HIBP API key: ••••••••••
▸ GHunt master token: ↵
▸ Configure OAuth (Google/GitHub login)? [y/N]: ↵
```
- **密钥 & 数据库密码** — 加密生成,只需按 Enter
- **管理员账户** — 可选,如果提供则自动创建并分配管理员角色
- **API 密钥** — 均为可选,按 Enter 跳过
- **OAuth** — 仅在您选择加入时提示
**屏幕 3 — 审核**
显示配置摘要,密钥已掩码:
```
REVIEW
│ Secret Key a1b2c3d4••••••••
│ DB Password ••••••••••••••••
│ Frontend http://localhost:3000
│ Backend API http://localhost:8000
│ Admin admin@example.com
│ HIBP API configured
│ GHunt skipped
│ Google OAuth skipped
│ GitHub OAuth skipped
▸ Proceed with installation? [Y/n]:
```
**屏幕 4 — 部署**
8 步部署,带有实时进度条和微调器:
```
DEPLOYING
████████████████████████████████████████████░░░░░░░░░░ 75%
✓ Environment file created
✓ Base images pulled
✓ Backend image built
✓ Frontend image built
✓ PostgreSQL & Redis healthy
✓ API server running
⣾ Starting Celery workers & scheduler...
```
每个步骤在继续之前都会等待健康检查:
1. 根据您的配置生成 `.env` 文件
2. 拉取基础 Docker 镜像
3. 构建后端镜像(FastAPI + 所有 OSINT 工具)
4. 构建前端镜像(React → Nginx)
5. 启动 PostgreSQL & Redis,等待直到健康
6. 启动 API 服务器,等待直到 `/api/health` 响应
7. 启动 Celery workers & Beat 调度器
8. 启动前端 Nginx 容器
如果配置了管理员电子邮件,安装程序会自动注册该账户并将其提升为管理员角色。
**屏幕 5 — 完成**
服务状态仪表板和访问信息:
```
═══════ INSTALLATION COMPLETE ═══════
SERVICE STATUS
● PostgreSQL :5432
● Redis :6379
● API Server :8000
● Workers
● Scheduler
● Frontend :3000
Access Your Instance
│ App http://localhost:3000
│ API http://localhost:8000
│ API Docs http://localhost:8000/docs
│ Admin Login admin@example.com
Commands
│ View logs docker compose logs -f
│ Stop docker compose down
│ Restart docker compose restart
│ Rebuild docker compose up -d --build
│ Reset DB docker compose down -v
```
#### 安装程序命令
| 命令 | 描述 |
|---------|-------------|
| `./setup` 或 `./install.sh` | 完整的交互式安装 |
| `./install.sh --status` | 显示当前服务状态(彩色健康指示器) |
| `./install.sh --uninstall` | 停止所有容器,删除镜像和卷 |
| `./install.sh --help` | 显示使用信息 |
#### 错误处理
- 如果 Docker 构建失败,安装程序会显示构建日志的最后 10 行
- 所有输出都记录到 `.install.log` 以供调试
- 安装程序在 Ctrl+C 时干净地退出(恢复光标,无孤立进程)
- 失败的预检检查会准确告诉您需要安装什么以及在哪里
### 手动 Docker 部署
如果您更喜欢手动配置所有内容而不是使用交互式安装程序。
#### 步骤 1:克隆仓库
```
git clone https://github.com/nabz0r/Xpose.git
cd Xpose
```
#### 步骤 2:创建环境文件
```
cp .env.example .env
```
#### 步骤 3:配置环境变量
在编辑器中打开 `.env` 并设置所需的值:
```
# 必填 — 在生产环境中更改此项
SECRET_KEY=your-random-secret-key-min-32-chars # Generate with: openssl rand -hex 32
DB_PASSWORD=your-secure-database-password # PostgreSQL password
# 可选 — 用于增强结果的 API keys
HIBP_API_KEY=your-hibp-api-key # https://haveibeenpwned.com/API/Key
GHUNT_MASTER_TOKEN=your-google-master-token # Required for GHunt to work
# 可选 — OAuth (用于 Google/GitHub 登录)
GOOGLE_CLIENT_ID=your-google-client-id
GOOGLE_CLIENT_SECRET=your-google-client-secret
GITHUB_CLIENT_ID=your-github-client-id
GITHUB_CLIENT_SECRET=your-github-client-secret
```
#### 步骤 4:构建并启动所有服务
```
# 构建镜像并在后台启动
docker compose up -d --build
# 查看构建进度
docker compose logs -f
```
这将启动 6 个服务:
- `frontend` — 通过 Nginx 在端口 3000 上提供的 React 应用
- `backend` — 端口 8000 上的 FastAPI 服务器
- `worker` — Celery worker(4 个并发工具执行)
- `scheduler` — Celery Beat(每日 token 重置 cron)
- `postgres` — PostgreSQL 16 数据库
- `redis` — Redis 7 消息 broker
#### 步骤 5:验证所有服务正在运行
```
docker compose ps
```
预期输出:
```
NAME SERVICE STATUS
xpose-frontend-1 frontend running (healthy)
xpose-backend-1 backend running
xpose-worker-1 worker running
xpose-scheduler-1 scheduler running
xpose-postgres-1 postgres running (healthy)
xpose-redis-1 redis running (healthy)
```
#### 步骤 6:验证后端健康
```
curl http://localhost:8000/api/health
# 预期: {"status":"ok","app":"Xpose"}
```
#### 步骤 7:访问应用程序
| 服务 | URL | 用途 |
|---------|-----|---------|
| **Frontend** | http://localhost:3000 | 主 Web 应用程序 |
| **API** | http://localhost:8000 | REST API |
| **API 文档** | http://localhost:8000/docs | Swagger UI(交互式) |
| **API 文档** | http://localhost:8000/redoc | ReDoc(可读) |
#### 步骤 8:创建您的第一个管理员用户
通过 UI 在 http://localhost:3000 注册,然后提升为管理员:
```
# 连接到数据库
docker compose exec postgres psql -U xpose -d xpose
# 将用户提升为管理员 (替换 email)
UPDATE users SET role = 'admin' WHERE email = 'your@email.com';
# 验证
SELECT email, role, plan FROM users;
# 退出
\q
```
#### 可选:启用 PgAdmin
```
docker compose --profile admin up -d
# 访问地址 http://localhost:5050
# 登录: admin@xpose.local / (您在 .env 中设置的 PGADMIN_PASSWORD)
```
### 本地开发设置
用于在前端和后端都启用热重载的开发。
#### 步骤 1:启动数据库服务
您仍然需要 PostgreSQL 和 Redis。最简单的方法是 Docker:
```
# 仅启动数据服务
docker compose up -d postgres redis
```
或原生安装:
```
# macOS
brew install postgresql@16 redis
brew services start postgresql@16
brew services start redis
# Ubuntu/Debian
sudo apt install postgresql-16 redis-server
sudo systemctl start postgresql redis
```
#### 步骤 2:创建数据库
```
# 如果使用 Docker:
docker compose exec postgres psql -U xpose -c "SELECT 1;"
# 如果使用原生 PostgreSQL:
createdb xpose
psql -d xpose -c "CREATE USER xpose WITH PASSWORD 'xpose_secret';"
psql -d xpose -c "GRANT ALL PRIVILEGES ON DATABASE xpose TO xpose;"
```
#### 步骤 3:设置后端
```
cd backend
# 创建虚拟环境
python3 -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# 安装 Python 依赖
pip install -r requirements.txt
# 为本地开发创建 .env (位于 backend/ 目录)
cat > .env << 'EOF'
DATABASE_URL=postgresql+asyncpg://xpose:xpose_secret@localhost:5432/xpose
REDIS_URL=redis://localhost:6379/0
SECRET_KEY=dev-secret-key-change-in-production
FRONTEND_URL=http://localhost:3000
EOF
# 应用 GHunt 补丁 (如果已安装 ghunt)
python patches/ghunt_auth_patch.py
# 启动带热重载的 API server
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
```
后端将在首次启动时自动创建所有数据库表。
#### 步骤 4:启动 Celery Workers
打开一个新终端:
```
cd backend
source venv/bin/activate
# 启动具有 4 个并发线程的 worker
celery -A app.workers.celery_app worker --loglevel=info --concurrency=4
```
打开另一个终端用于调度器:
```
cd backend
source venv/bin/activate
# 启动 beat 调度器 (每日 token 重置)
celery -A app.workers.celery_app beat --loglevel=info
```
#### 步骤 5:安装 OSINT 工具(用于 workers)
```
# Python tools (已在 requirements.txt 中)
pip install holehe maigret h8mail sherlock-project gpsoauth
# Go tool (Mosint)
go install github.com/alpkeskin/mosint/v3/cmd/mosint@latest
# Blackbird (克隆)
git clone https://github.com/p1ngul1n0/blackbird.git /opt/blackbird
```
#### 步骤 6:设置前端
打开一个新终端:
```
cd frontend
# 安装依赖
npm install
# 启动带热重载的开发服务器
npm start
```
前端将位于 http://localhost:3000 并将 API 请求代理到后端。
#### 步骤 7:验证一切正常
```
# 检查 backend
curl http://localhost:8000/api/health
# 检查 frontend
curl -s http://localhost:3000 | head -5
# 检查 Celery worker
celery -A app.workers.celery_app inspect ping
```
## 配置
### 环境变量参考
#### 必需
| 变量 | 描述 | 示例 |
|----------|-------------|---------|
| `SECRET_KEY` | JWT 签名密钥。必须是随机的,最少 32 个字符。 | `a1b2c3d4...` (64 个十六进制字符) |
| `DB_PASSWORD` | PostgreSQL 密码 | `strong-password-here` |
| `DATABASE_URL` | 完整的异步数据库连接字符串 | `postgresql+asyncpg://pose:pass@postgres:5432/xpose` |
| `REDIS_URL` | Redis 连接字符串 | `redis://redis:6379/0` |
#### 认证
| 变量 | 描述 | 默认值 |
|----------|-------------|---------|
| `JWT_ALGORITHM` | Token 签名算法 | `HS256` |
| `JWT_ACCESS_TOKEN_EXPIRE_MINUTES` | 访问 token 有效期 | `60` |
| `JWT_REFRESH_TOKEN_EXPIRE_DAYS` | 刷新 token 有效期 | `30` |
| `GOOGLE_CLIENT_ID` | Google OAuth 2.0 客户端 ID | (空) |
| `GOOGLE_CLIENT_SECRET` | Google OAuth 2.0 客户端密钥 | (空) |
| `GITHUB_CLIENT_ID` | GitHub OAuth 应用客户端 ID | (空) |
| `GITHUB_CLIENT_SECRET` | GitHub OAuth 应用客户端密钥 | (空) |
#### 外部 API 密钥
| 变量 | 描述 | 是否必需? |
|----------|-------------|-----------|
| `HIBP_API_KEY` | Have I Been Pwned API 密钥 ($3.50/月) | 可选 —— 没有它 HIBP 工具将跳过 |
| `HUNTER_API_KEY` | Hunter.io 电子邮件验证 | 可选 |
| `INTELX_API_KEY` | Intelligence X 搜索 API | 可选 |
| `GHUNT_MASTER_TOKEN` | 用于 GHunt 的 Google 主身份验证 token | 可选 —— 没有它 GHunt 将无法运行 |
#### 应用程序设置
| 变量 | 描述 | 默认值 |
|----------|-------------|---------|
| `APP_NAME` | 应用程序显示名称 | `Xpose` |
| `DEBUG` | 启用调试模式 | `False` |
| `FRONTEND_URL` | 前端来源,用于 CORS | `http://localhost:3000` |
| `FREE_DAILY_TOKENS` | 每日授予免费用户的 token | `5` |
| `PRO_MONTHLY_TOKENS` | Pro 计划的每月 token | `100` |
| `ENTERPRISE_MONTHLY_TOKENS` | Enterprise 计划的每月 token | `500` |
## 使用
### 运行扫描
1. 在 http://localhost:3000 **注册/登录**
2. 在仪表板的扫描输入框中**输入目标电子邮件**
3. **点击 "Start Scan"** — 这会消耗 1 个 token
4. **观看实时进度** — 每个工具通过 WebSocket 报告状态
5. **查看结果** — 查看确认的账户、泄露、工具详情
6. **导出** — 下载为 JSON、HTML 或 PDF(Pro+ 计划)
### 使用 API
```
# 1. 注册
curl -X POST http://localhost:8000/api/auth/register \
-H "Content-Type: application/json" \
-d '{"email": "user@example.com", "password": "securepass123"}'
# 响应: {"access_token": "eyJ...", "refresh_token": "eyJ...", "token_type": "bearer"}
# 2. 开始扫描
curl -X POST http://localhost:8000/api/scans \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"target_email": "target@example.com"}'
# 响应: {"id": "uuid", "status": "pending", "progress": 0, ...}
# 3. 检查扫描状态
curl http://localhost:8000/api/scans/SCAN_ID \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"
# 4. 导出结果
curl http://localhost:8000/api/scans/SCAN_ID/export/json \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"
```
## 安全与认证
### 两步验证 (2FA)
Xpose 支持基于 TOTP 的两步验证,兼容任何身份验证器应用(Google Authenticator, Authy, 1Password 等)。
**设置流程:**
1. 导航至 **Settings → Two-Factor Authentication**
2. 点击 **Enable 2FA** — 显示二维码和手动密钥
3. 使用您的身份验证器应用扫描二维码
4. 输入 6 位代码进行验证和激活
**使用 2FA 登录:**
1. 像往常一样输入电子邮件和密码
2. 如果启用了 2FA,系统将提示您输入 6 位 TOTP 代码
3. 输入来自身份验证器应用的代码以完成登录
**禁用 2FA:**
- 前往 Settings → Two-Factor Authentication → Disable
- 输入当前的 TOTP 代码以确认
### 单点登录 (SSO)
Xpose 支持使用 Google 和 GitHub 进行 OAuth 2.0 登录。在 `.env` 中或通过交互式安装程序配置您的 OAuth 凭证。
**Google OAuth 设置:**
1. 前往 [Google Cloud Console](https://console.cloud.google.com/apis/credentials)
2. 创建一个 OAuth 2.0 客户端 ID(Web 应用程序)
3. 将授权重定向 URI 设置为 `http://your-domain/api/auth/sso/google/callback`
4. 将 `GOOGLE_CLIENT_ID` 和 `GOOGLE_CLIENT_SECRET` 添加到 `.env`
**GitHub OAuth 设置:**
1. 前往 [GitHub Developer Settings](https://github.com/settings/developers)
2. 创建一个新的 OAuth App
3. 将授权回调 URL 设置为 `http://your-domain/api/auth/sso/github/callback`
4. 将 `GITHUB_CLIENT_ID` 和 `GITHUB_CLIENT_SECRET` 添加到 `.env`
SSO 用户在首次登录时自动创建。他们可以稍后选择设置密码,以启用除 SSO 之外的本地登录。
## 扫描工作流
```
User submits email
│
▼
┌─────────────────┐
│ Validate input │──→ Check token balance ──→ 402 if insufficient
│ Deduct 1 token │──→ Check concurrent limit ──→ 429 if exceeded
└────────┬────────┘
│
▼
┌─────────────────┐
│ Create scan │ status: "pending"
│ Create 8 result │ one per tool, all status: "pending"
│ entries │
└────────┬────────┘
│
▼
┌─────────────────┐
│ Dispatch to │ Celery: run_full_scan.delay(scan_id, email, username)
│ task queue │
└────────┬────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ PARALLEL TOOL EXECUTION │
│ │
│ Email-based: Username-based: │
│ ├── GHunt (Google) ├── Maigret (2600+ sites) │
│ ├── Holehe (120+) ├── Sherlock (300+ sites) │
│ ├── h8mail (breaches) └── Blackbird (username mode) │
│ ├── Mosint (multi) │
│ ├── Blackbird (email) │
│ └── HIBP (API) │
│ │
│ Each tool: │
│ 1. Sets status → "running" │
│ 2. Executes tool (library call or subprocess) │
│ 3. Normalizes output to {platform, url, exists} │
│ 4. Saves results + metadata to scan_results │
│ 5. Sets status → "completed" or "error" │
│ 6. Updates scan progress (N/8 × 100%) │
└────────────────────────┬────────────────────────────────┘
│
▼ (when progress reaches 100%)
┌─────────────────────────────────────────────────────────┐
│ DEDUPLICATION & SCORING │
│ │
│ 1. Gather all accounts_found from completed tools │
│ 2. Group by platform name (case-insensitive) │
│ 3. Merge URLs and metadata across sources │
│ 4. Score confidence: │
│ └── 2+ tools found it → HIGH │
│ └── 1 tool found it → MEDIUM │
│ └── Uncertain match → LOW │
│ 5. Insert into accounts table │
└────────────────────────┬────────────────────────────────┘
│
▼
┌─────────────────┐
│ Scan complete │ status: "completed", progress: 100
│ completed_at │ set to current timestamp
└─────────────────┘
```
## API 参考
### 认证
| 方法 | 端点 | 描述 | 认证 |
|--------|----------|-------------|------|
| `POST` | `/api/auth/register` | 注册新账户 | 否 |
| `POST` | `/api/auth/login` | 使用邮箱/密码登录(+ 可选 TOTP 代码) | 否 |
| `POST` | `/api/auth/refresh` | 刷新访问 token | 否 |
| `GET` | `/api/auth/me` | 获取当前用户资料 | 是 |
| `POST` | `/api/auth/logout` | 登出 | 是 |
| `POST` | `/api/auth/2fa/setup` | 生成 TOTP 密钥 + 二维码 | 是 |
| `POST` | `/api/auth/2fa/verify` | 验证代码并启用 2FA | 是 |
| `POST` | `/api/auth/2fa/disable` | 禁用 2FA(需要当前代码) | 是 |
| `GET` | `/api/auth/sso/google` | 重定向到 Google OAuth | 否 |
| `GET` | `/api/auth/sso/google/callback` | Google OAuth 回调 | 否 |
| `GET` | `/api/auth/sso/github` | 重定向到 GitHub OAuth | 否 |
| `GET` | `/api/auth/sso/github/callback` | GitHub OAuth 回调 | 否 |
### 扫描
| 方法 | 端点 | 描述 | 认证 |
|--------|----------|-------------|------|
| `POST` | `/api/scans` | 创建新扫描(消耗 1 个 token) | 是 |
| `GET` | `/api/scans` | 列出用户的扫描(分页) | 是 |
| `GET` | `/api/scans/:id` | 获取扫描结果 + 账户 | 是 |
| `DELETE` | `/api/scans/:id` | 删除扫描 | 是 |
| `GET` | `/api/scans/:id/export/:format` | 导出 | 是 |
| `WS` | `/api/scans/:id/live` | 用于实时进度的 WebSocket | 否 |
### Token
| 方法 | 端点 | 描述 | 认证 |
|--------|----------|-------------|------|
| `GET` | `/api/tokens/balance` | 获取 token 余额 + 计划信息 | 是 |
| `GET` | `/api/tokens/history` | 获取 token 交易历史 | 是 |
### 管理员(需要 `role: admin`)
| 方法 | 端点 | 描述 | 认证 |
|--------|----------|-------------|------|
| `GET` | `/api/admin/stats` | 系统范围统计(每日/每周/每月) | Admin |
| `GET` | `/api/admin/users` | 列出用户(搜索,按计划/角色筛选,分页) | Admin |
| `GET` | `/api/admin/users/:id` | 详细用户信息及扫描 + 交易 | Admin |
| `PATCH` | `/api/admin/users/:id` | 更新用户姓名/角色/计划/token | Admin |
| `DELETE` | `/api/admin/users/:id` | 删除用户 | Admin |
| `GET` | `/api/admin/scans` | 列出所有扫描(搜索,按状态筛选) | Admin |
| `POST` | `/api/admin/tokens/grant` | 向用户授予 token | Admin |
| `GET` | `/api/admin/tokens/history` | 全局 token 交易历史 | Admin |
| `GET` | `/api/admin/db/stats` | 数据库统计(大小,连接数,表) | Admin |
| `GET` | `/api/admin/workers/health` | Worker 健康状况,活动任务,已注册任务 | Admin |
### API 密钥(Pro+ 计划)
| 方法 | 端点 | 描述 | 认证 |
|--------|----------|-------------|------|
| `POST` | `/api/keys` | 创建新 API 密钥 | 是 |
| `GET` | `/api/keys` | 列出用户的 API 密钥 | 是 |
| `DELETE` | `/api/keys/:id` | 删除 API 密钥 | 是 |
## 前端页面
| 页面 | 路由 | 访问权限 | 描述 |
|------|-------|--------|-------------|
| **Landing** | `/` | 公开 | 带有扫描 CTA、8 工具功能网格、定价卡片、页脚 |
| **Login** | `/login` | 公开 | 邮箱/密码表单及注册切换,Google/GitHub SSO 按钮,TOTP 2FA 代码输入 |
| **Dashboard** | `/dashboard` | 需认证 | 快速扫描输入(邮箱 + 用户名),token 计数器,活动图表,最近扫描列表 |
| **Scan Results** | `/scan/:id` | 需认证 | 选项卡式界面(Overview/Accounts/Tools/Timeline),实时进度,平台卡片,导出按钮 |
| **Admin** | `/admin` | Admin | 5 标签仪表板:概览统计,用户管理(搜索/筛选/编辑/删除),扫描,数据库统计,Worker 监控 |
| **Settings** | `/settings` | 需认证 | 个人资料信息,2FA 设置/禁用及二维码,计划管理,API 密钥 CRUD (Pro+),危险区域 |
### UI 组件
| 组件 | 描述 |
|-----------|-------------|
| `Navbar` | 顶部导航栏,带有 logo,dashboard/admin 链接,token 计数器,用户下拉菜单 |
| `ScanProgress` | 总体进度条 + 每个工具的状态卡片,带有微调器/勾选/错误图标 |
| `ToolResultCard` | 每个工具的可展开卡片,显示发现的账户、元数据、执行时间 |
| `AccountTable` | 可排序的去重账户表格,带有置信度徽章和来源归属 |
| `TokenCounter` | 动画 token 余额,带有计划徽章和进度环 |
| `StatsCard` | 可重用的指标卡片,带有图标、数值、标签和趋势指示器 |
| `ScanTimeline` | 垂直扫描执行时间轴,带有工具状态图标和时间 |
| `PlatformCard` | 丰富的账户卡片,带有类别检测、置信度徽章和元数据 |
### 设计系统
- **背景**: 深黑色 `#0a0a0f` 带有微妙的径向渐变覆盖
- **强调色**: 霓虹绿 `#00ff88` 用于主要操作、边框和高光
- **次要色**: 霓虹蓝 `#00d4ff` 用于链接和次要元素
- **排版**: JetBrains Mono 用于数据/代码,Inter 用于 UI 文本
- **卡片**: 玻璃态,带有 `backdrop-blur-xl` 和半透明背景
- **动画**: Framer Motion 用于页面过渡、交错显示、展开/折叠
## Token 与定价模型
| 功能 | Free | Pro ($19/月) | Enterprise ($99/月) |
|---------|------|-------------|---------------------|
| **Token** | 每天 5 个(UTC 午夜自动重置) | 每月 100 个 | 每月 500 个 |
| **并发扫描** | 1 | 3 | 10 |
| **每次扫描工具数** | 全部 8 个 | 全部 8 个 | 全部 8 个 |
| **结果存储** | 7 天 | 永久 | 永久 |
| **导出格式** | 无 | JSON, HTML, PDF | JSON, HTML, PDF |
| **API 访问** | 否 | 是 (REST) | 是 (REST) |
| **Webhooks** | 否 | 否 | 是 |
### Token 机制
- **1 次扫描 = 1 个 token**,无论运行多少个工具
- 免费层通过 Celery Beat 计划任务在 UTC 午夜每日重置
- Token 交易记录在案以供审计(`token_transactions` 表)
- 管理员可以通过管理仪表板向任何用户授予 token
## GHunt 补丁
### 背景
GHunt 的 `android_master_auth()` 函数对**全球所有人**都已失效。Google 的 DroidGuard 认证拒绝了 GHunt 发送到 `android.googleapis.com/auth` 的原始 POST 请求。
### 修复方案
位于 `backend/patches/ghunt_auth_patch.py`,该补丁用 `gpsoauth.exchange_token()` 替失效的身份验证,后者能正确处理 DroidGuard 认证。
**补丁的作用:**
1. 定位 GHunt 安装 (`ghunt/helpers/auth.py`)
2. 检查是否已打补丁(幂等)
3. 将 `android_master_auth()` 函数替换为:
```
async def android_master_auth(as_client, oauth_token):
import gpsoauth
from uuid import getnode as getmac
android_id = hex(getmac())[2:]
resp = gpsoauth.exchange_token(
email=None,
token=oauth_token,
android_id=android_id
)
for keyword in ["Token", "Email", "services", "firstName", "lastName"]:
if keyword not in resp:
raise GHuntAndroidMasterAuthError(...)
return resp["Token"], resp["services"].split(","), resp["Email"], \
f'{resp["firstName"]} {resp["lastName"]}'
```
**关键依赖:** `pip install gpsoauth`
该补丁在 Docker 镜像构建期间自动应用。对于本地开发,请手动运行:
```
python backend/patches/ghunt_auth_patch.py
```
## 项目结构
```
Xpose/
├── install.sh # Interactive installer with terminal UI
├── setup # Shortcut → install.sh
├── docker-compose.yml # All services: frontend, backend, worker, postgres, redis
├── .env.example # Environment variable template
├── .gitignore
├── README.md # This file
├── docs/
│ ├── ARCHITECTURE.md # Deep-dive architecture documentation
│ └── API.md # Complete API reference with examples
│
├── backend/
│ ├── Dockerfile # Python 3.11 + Go + OSINT tools
│ ├── requirements.txt # Python dependencies
│ ├── alembic.ini # Alembic migration configuration
│ ├── alembic/
│ │ ├── env.py # Migration environment (imports all models)
│ │ ├── script.py.mako # Migration template
│ │ └── versions/ # Migration scripts
│ │ └── 001_add_totp_2fa_columns.py
│ ├── patches/
│ │ └── ghunt_auth_patch.py # GHunt DroidGuard attestation bypass
│ └── app/
│ ├── main.py # FastAPI app entry point, CORS, route registration
│ ├── core/
│ │ ├── config.py # Settings from env vars (Pydantic BaseSettings)
│ │ ├── database.py # Async SQLAlchemy engine + session factory
│ │ └── security.py # JWT create/decode, bcrypt hash/verify
│ ├── models/
│ │ ├── user.py # User model (auth, plan, tokens)
│ │ ├── scan.py # Scan, ScanResult, Account models
│ │ └── token.py # TokenTransaction, ApiKey models
│ ├── schemas/
│ │ ├── auth.py # Register/Login/2FA request, Token/User response
│ │ ├── scan.py # CreateScan request, Scan/Result/Account response
│ │ └── admin.py # AdminStats, UpdateUser, GrantTokens, DBStats
│ ├── api/
│ │ ├── deps.py # get_current_user, require_admin dependencies
│ │ ├── auth.py # /api/auth/* routes (login, register, 2FA, SSO)
│ │ ├── scans.py # /api/scans/* routes + export
│ │ ├── tokens.py # /api/tokens/* routes
│ │ ├── admin.py # /api/admin/* routes (stats, users, DB, workers)
│ │ ├── keys.py # /api/keys/* routes
│ │ └── websocket.py # WebSocket /api/scans/:id/live
│ ├── services/ # Business logic (extensible)
│ └── workers/
│ ├── __init__.py # Celery app config, beat schedule
│ ├── orchestrator.py # run_full_scan, deduplicate_accounts
│ ├── tools.py # 8 individual tool tasks
│ ├── helpers.py # DB helpers (sync), progress tracking
│ └── token_reset.py # Daily free tier token reset
│
└── frontend/
├── Dockerfile # Node 20 build → Nginx serve
├── nginx.conf # Reverse proxy + WebSocket upgrade
├── package.json
├── tailwind.config.js # Custom colors, fonts, animations
├── postcss.config.js
├── public/
│ └── index.html # HTML shell with Google Fonts
└── src/
├── index.js # React entry point
├── App.jsx # Router: public, private, admin routes
├── styles/
│ └── index.css # Tailwind layers + custom components
├── services/
│ └── api.js # Axios client + interceptors
├── hooks/
│ ├── useAuth.js # Auth context (user, login, register, logout)
│ └── useScanSocket.js # WebSocket hook for live scan progress
├── components/
│ ├── Navbar.jsx # Top navigation bar
│ ├── ScanProgress.jsx # Real-time scan progress display
│ ├── ToolResultCard.jsx # Expandable tool result card
│ ├── AccountTable.jsx # Sortable discovered accounts table
│ ├── TokenCounter.jsx # Animated token balance display
│ ├── StatsCard.jsx # Dashboard metric card
│ ├── ScanTimeline.jsx # Vertical timeline of scan execution
│ └── PlatformCard.jsx # Rich account card with category detection
└── pages/
├── Landing.jsx # Public landing page
├── Login.jsx # Auth (login/register + SSO)
├── Dashboard.jsx # User dashboard
├── ScanResults.jsx # Scan results report
├── Admin.jsx # Admin dashboard
└── Settings.jsx # User settings
```
## 数据库 Schema
```
┌──────────────────┐ ┌──────────────────┐
│ users │ │ scans │
├──────────────────┤ ├──────────────────┤
│ id (UUID, PK) │──┐ │ id (UUID, PK) │
│ email │ │ │ user_id (FK) │──→ users.id
│ password_hash │ │ │ target_email │
│ name │ │ │ target_username │
│ avatar_url │ │ │ status │
│ provider │ │ │ progress (0-100) │
│ provider_id │ │ │ tokens_cost │
│ totp_secret │ │ │ started_at │
│ totp_enabled │ │ │ completed_at │
│ role │ │ │ created_at │
│ plan │ │ └────────┬─────────┘
│ tokens_balance │ │ │
│ tokens_last_reset│ │ │ 1:N
│ created_at │ │
│ updated_at │ │
└──────────────────┘ │ ┌────────▼─────────┐ ┌──────────────────┐
│ │ scan_results │ │ accounts │
│ ├──────────────────┤ ├──────────────────┤
│ │ id (UUID, PK) │ │ id (UUID, PK) │
│ │ scan_id (FK) │ │ scan_id (FK) │──→ scans.id
│ │ tool_name │ │ platform │
│ │ status │ │ url │
│ │ raw_output (JSON)│ │ username │
│ │ accounts_found │ │ exists │
│ │ metadata (JSON) │ │ confidence │
│ │ execution_time_ms│ │ sources (array) │
│ │ error_message │ │ metadata (JSON) │
│ │ created_at │ │ created_at │
│ └──────────────────┘ └──────────────────┘
│
│ ┌──────────────────┐ ┌──────────────────┐
│ │token_transactions│ │ api_keys │
│ ├──────────────────┤ ├──────────────────┤
└──→ │ id (UUID, PK) │ │ id (UUID, PK) │
│ user_id (FK) │ │ user_id (FK) │──→ users.id
│ amount (+/-) │ │ key_hash │
│ reason │ │ name │
│ scan_id (FK) │ │ last_used_at │
│ created_at │ │ created_at │
└──────────────────┘ └──────────────────┘
```
## 故障排除
### 快速诊断
```
# 快速检查服务健康状态
./install.sh --status
# 如果部署失败,查看安装日志
cat .install.log
# 完全卸载并全新重装
./install.sh --uninstall
./setup
```
### 服务无法启动
```
# 查看特定服务的日志
docker compose logs backend
docker compose logs worker
# 从头构建
docker compose down -v
docker compose up -d --build
# 或者使用安装程序进行全新部署
./install.sh --uninstall
./setup
```
### 数据库连接错误
```
# 验证 PostgreSQL 健康状态
docker compose exec postgres pg_isready -U xpose
# 检查 .env 中的 DATABASE_URL 是否与 postgres 服务配置匹配
# Docker: postgresql+asyncpg://xpose:PASSWORD@postgres:5432/xpose
# 本地: postgresql+asyncpg://xpose:PASSWORD@localhost:5432/xpose
```
### 数据库迁移(现有安装)
如果您正在升级现有的 Xpose 安装,请运行 Alembic 迁移以添加新的 2FA 列:
```
# 通过 Docker
docker compose exec backend alembic upgrade head
# 本地开发
cd backend
alembic upgrade head
```
### Worker 未处理扫描
```
# 检查 worker 日志
docker compose logs worker
# 验证 Redis 正在运行
docker compose exec redis redis-cli ping
# 预期: PONG
# 检查 Celery worker 状态
docker compose exec worker celery -A app.workers.celery_app inspect ping
```
### 扫描卡在 "pending"
1. 检查 worker 是否正在运行: `docker compose ps worker`
2. 检查 Redis 连接: `docker compose exec redis redis-cli ping`
3. 检查 worker 日志是否有错误: `docker compose logs worker --tail=50`
4. 重启 worker: `docker compose restart worker`
### GHunt 不工作
1. 确保在 `.env` 中设置了 `GHUNT_MASTER_TOKEN`
2. 验证补丁是否已应用: `docker compose exec worker python -c "import ghunt; print('OK')"`
3. GHunt 需要有效的 Google 会话 token —— 这些会定期过期
### 前端显示空白页
```
# 检查 frontend 构建
docker compose logs frontend
# 重新构建 frontend
docker compose build frontend
docker compose up -d frontend
```
### 端口冲突
如果端口 3000、8000、5432 或 6379 被占用:
```
# 查找占用端口的进程
lsof -i :3000
# 交互式安装程序允许您选择自定义端口:
./setup
# → 当提示输入 "Frontend port" 时,输入一个可用端口 (例如, 3001)
# → 当提示输入 "Backend port" 时,输入一个可用端口 (例如, 8001)
```
对于手动设置,更改 `docker-compose.yml` 中的端口:
```
# 例如, "3001:80" 而不是 "3000:80"
```
### 安装日志
交互式安装程序将所有 Docker 输出记录到 `.install.log`。如果构建失败:
```
# 查看完整日志
cat .install.log
# 仅查看最后的错误
tail -50 .install.log
```
标签:2FA, CTF工具, DInvoke, Docker, ESC4, Flask, OSINT, Python, React, SaaS, SSO, Syscalls, 威胁情报, 安全防御评估, 开发者工具, 开源网络情报, 情报分析, 情报搜集, 搜索引擎查询, 数据去重, 无后门, 测试用例, 漏洞搜索, 用户名追踪, 用户画像, 网络安全, 网络探针, 网络诊断, 网络调查, 聚合平台, 自动化侦查, 自定义脚本, 请求拦截, 逆向工具, 邮箱侦查, 隐私保护