SolomonSmith-dev/DossierForge
GitHub: SolomonSmith-dev/DossierForge
基于 Flask 的多用户 OSINT 档案构建 SaaS,将 WHOIS、端口扫描和社交媒体侦察整合到带审计追踪的结构化目标档案中,解决安全团队初期侦察信息零散难以管理的问题。
Stars: 0 | Forks: 0
# DossierForge
  
一个基于 Flask 的多用户 OSINT 档案 SaaS,用于聚合关于特定目标的侦察数据。注册账号,为每个目标创建档案,并运行 WHOIS 查询、nmap 端口扫描以及社交媒体/电子邮件搜索。所有内容都会以结构化的、基于用户的档案形式存储,以供查阅。创建每个档案都需要经过授权使用声明,并且每一个侦察动作都会被写入审计追踪记录中。
## 问题
安全研究人员和渗透测试人员在执行任何任务时,都会在第一个小时用于运行相同的五个工具,将输出结果粘贴到笔记文件中,并在同时处理多个任务时努力理清目标背景。DossierForge 将这些整合到一个 Flask 应用中:选择一个目标,启动你需要的模块,然后在一个针对特定目标的档案中查阅所有收集到的工件。
## 功能
- 多用户账号:注册、登录,并保持各用户档案相互隔离
- 协作:以查看者(只读)或编辑者(可运行侦察)的身份将档案分享给团队成员
- 组织:创建团队工作区,管理成员(管理员/成员),并以特定角色与整个团队共享档案
- 邀请:在协作者/组织成员创建账号前通过电子邮件邀请他们;可通过注册或邀请链接领取
- 授权使用声明:创建档案需要确认授权;声明和范围将被记录
- 审计追踪:每个档案动作和侦察运行都会按档案单独记录日志
- WHOIS 查询:域名注册数据、注册商、域名服务器、到期时间
- nmap 扫描:包含服务检测和开放端口摘要的端口扫描
- OSINT 模块:社交媒体搜索、电子邮件枚举、数据泄露检查、GitHub 信息
- 异步扫描:侦察任务将作为持久化的 `ScanJob` 行排队;进程内轮询器会认领它们(支持重启后恢复),并提供实时的扫描任务状态面板
- 笔记与标签:附加调查员笔记并使用标签对档案进行分类
- 搜索:从仪表板按名称、组织或标签筛选档案
- 档案管理:通过 Web UI 创建、编辑元数据、浏览、导出和删除目标配置文件
- 报告:将档案(包含笔记和标签)导出为 Markdown 报告或原始 JSON
## 技术栈
- Python 3.8+,Flask(`create_app()` 中的应用工厂)
- Flask-Login(认证),Flask-SQLAlchemy(ORM),Flask-Migrate(Alembic)
- 数据库:开发环境下使用 SQLite(`instance/dossierforge.db`),通过 `DATABASE_URL` 支持 Postgres
- Schema 由 `migrations/` 目录下的 Alembic 迁移管理(启动时自动应用)
- `python-whois`,`nmap`(系统二进制文件),`requests`
- Jinja2 模板;侦察工件存储在磁盘上的 `instance/dossier_data//` 目录中
- 生产环境使用 gunicorn 提供服务
## 快速开始
需要 Python 3.8+ 并在系统上安装 `nmap` 二进制文件(`brew install nmap` 或 `apt install nmap`)。
```
git clone https://github.com/SolomonSmith-dev/DossierForge
cd DossierForge
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
cp .env.example .env
# 编辑 .env:至少设置 SECRET_KEY
```
### 环境变量
| 变量 | 必需 | 描述 |
|---|---|---|
| `SECRET_KEY` | 是 | 用于签名 Flask 会话的随机字符串 |
| `DATABASE_URL` | 否 | SQLAlchemy 数据库 URL(默认为 `instance/` 下的 SQLite。使用 `postgresql://...` 连接 Postgres) |
| `DOSSIER_DATA_DIR` | 否 | 侦察工件的存储目录(默认为 `instance/dossier_data`) |
| `SCAN_JOBS_EAGER` | 否 | 如果为 `true`,则内联运行扫描,而不是通过持久化的数据库轮询器执行(测试中使用此项) |
| `SCAN_WORKER_ENABLED` | 否 | 如果为 `false`,则不启动后台轮询器(任务将保持 `queued` 状态直到被处理) |
| `SCAN_WORKER_POLL_SECONDS` | 否 | 持久化扫描 worker 的轮询间隔(默认为 `0.5`) |
| `GITHUB_TOKEN` | 否 | 用于提高 API 速率限制的 GitHub PAT(在 GitHub 查询中使用) |
| `NMAP_PATH` | 否 | 如果 `nmap` 不在 `$PATH` 中,则指定其绝对路径 |
有关模板,请参阅 `.env.example`。
### 运行
```
# 从 .env 加载环境变量并启动开发服务器
set -a
. ./.env
set +a
python app.py
# 或者使用辅助脚本(遵守你当前活动的 virtualenv)
bash start_app.sh
```
在浏览器中打开 `http://localhost:5001`。数据库将在启动时通过 Alembic 迁移(`migrations/`)自动创建/升级。Schema 变更:
```
# 编辑 models.py 后:
SKIP_DB_UPGRADE=1 flask --app "app:create_app" db migrate -m "describe change"
flask --app "app:create_app" db upgrade
```
在生产环境中,使用 gunicorn 为应用工厂提供服务:
```
gunicorn "app:create_app()" --bind 0.0.0.0:5001
```
## 用法
1. 注册账号(或登录)。档案对您的账号是私有的。
2. 创建新档案。输入目标名称、别名和组织,并确认授权使用声明(带有可选的范围/参考)。
3. 针对目标运行模块(WHOIS、nmap、OSINT)。每个模块都会将其结果附加到档案中,并在审计追踪中记录一条日志。
4. 在档案概览页面查看汇总结果和审计追踪。
## 模块
| 模块 | 功能描述 |
|---|---|
| `modules/whois.py` | WHOIS 查询与摘要提取 |
| `modules/nmap.py` | 端口扫描、服务检测、开放端口列表 |
| `modules/osint.py` | 社交媒体搜索、电子邮件搜索、数据泄露检查、GitHub 信息 |
## 项目结构
```
.
├── app.py # Flask app factory, auth, routes
├── models.py # SQLAlchemy models (User, Dossier, AuditLog)
├── modules/ # WHOIS, nmap, OSINT recon modules
├── templates/ # Jinja2 templates (base, auth, dossier views)
├── instance/ # SQLite DB + recon artifacts (gitignored)
├── tests/
├── start_app.sh
├── requirements.txt
└── README.md
```
## 路线图
- [x] 具有基于用户隔离的多用户账号
- [x] 档案的 Markdown/JSON 导出
- [x] 支持 Postgres 的后端(`DATABASE_URL`)
- [x] 具有查看者/编辑者角色的档案共享
- [x] 调查员笔记、标签和仪表板搜索
- [x] 用于长时间运行扫描的后台任务队列
- [x] 组织/团队级档案
- [x] 数据库迁移(Alembic / Flask-Migrate)
- [x] 面向组织/共享的待处理电子邮件邀请
- [ ] 用于多 worker 部署的持久化任务队列(Celery/RQ + Redis)
- [ ] 基于组织的按席位计费
## 许可证
MIT。请参阅 `LICENSE`。
## 作者
Solomon Smith. solomonsmithdev@gmail.com
标签:ESC4, Flask, GitHub, HTTPX, OSINT, SaaS, 多用户系统, 实时处理, 测试用例, 逆向工具