StandFast1/SMISHWATCH

GitHub: StandFast1/SMISHWATCH

面向短信钓鱼的防御性威胁情报平台,以严格被动的方式完成 URL 展开、沙箱捕获、工具包指纹识别、OSINT 富化与证据归档,帮助分析师安全地调查和归档诈骗活动。

Stars: 0 | Forks: 0

# SMISHWATCH [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/StandFast1/SMISHWATCH/actions/workflows/ci.yml) [![CodeQL](https://static.pigsec.cn/wp-content/uploads/repos/cas/53/539e9a6bf48ad24469a4363bff3aa68124154549e26592783d3d8577f2acbbfc.svg)](https://github.com/StandFast1/SMISHWATCH/actions/workflows/codeql.yml) [![Security](https://static.pigsec.cn/wp-content/uploads/repos/cas/11/116530ae2b0dfb0390d7e5d43e4b803c1d427fbd70342e6f6fee028ad54a6dac.svg)](https://github.com/StandFast1/SMISHWATCH/actions/workflows/security.yml) 专注于法国背景下短信诈骗 / 钓鱼(smishing)的防御性威胁情报平台: 假冒银行顾问、CPF诈骗、“您的包裹”、冒充 AMELI / 税务局等。 基于诈骗短信或可疑 URL,SMISHWATCH 会执行一个**被动**分析 pipeline: 提取并展开 URL,在沙箱中获取 landing page,对钓鱼工具包进行指纹识别,聚类为Campaign, 进行 OSINT 丰富化(WHOIS、Certificate Transparency、ASN、地理定位)并生成分析报告 + 带有时间戳的证据包。 ## 使用声明 SMISHWATCH 是一款**防御性分析师**工具,秉承了 URLhaus、PhishTank 或 Spamhaus 的理念。它观察**已存在且公开的**恶意基础设施; 它不会创建、攻击、绕过任何保护,也**绝不**提交任何凭据。 仅限于合法的研究、欺诈调查和防御。所有分析均限于公开可观察的内容。 架构中编码的保证: - **仅限被动分析** — 不提交表单,不向目标基础设施发送 POST 请求,只读 fetch。 - **沙箱化 Fetch** — 隔离的 headless 浏览器,无 credential store,无 持久化 cookies,受控的网络出口。 - 对所有由用户输入触发的传出请求实施 **SSRF guard**。 - **默认进行 Defang 处理**(`hxxp://`、`evil[.]com`、`1[.]2[.]3[.]4`); refang 需要分析师明确操作。 - **Rate limiting**、超时机制、最大响应大小限制、诚实的 User-Agent。 - **不绕过** WAF、captcha 或反机器人保护。 - **最小化 PII**:静态加密受害者数据,绝不以明文记录,绝不外泄。 - **证据链**(时间戳、hash)以保持可用性。 ## 技术栈 - **Backend**:Python 3.12、FastAPI、异步 (`httpx`, `asyncio`) - **数据库**:PostgreSQL + SQLAlchemy 2.0 (异步) + Alembic - **沙箱化 Fetch**:Playwright (Chromium headless),隔离的 `fetcher` 服务 - **Frontend**:Next.js (App Router, TypeScript) + Tailwind — 分析师 dashboard - **容器化**:Docker + docker-compose - **代码质量**:ruff、black、mypy (strict)、pytest ## 安装说明 ### 前置条件 - **Docker + Docker Compose**(推荐路径),**或者** - **Python 3.12+** 和一个 **PostgreSQL** 实例(本地/开发路径)。 - 使用 `git` 克隆仓库。 ``` git clone https://github.com/StandFast1/SMISHWATCH.git cd SMISHWATCH ``` ### 一键启动 (Docker) ``` make demo # Linux/macOS .\tasks.ps1 demo # Windows PowerShell ``` `demo` 会生成 `.env` + 一个 `PII_SECRET_KEY`,启动 `db` + `api` + `fetcher` + `web`,自动应用迁移并创建一个示例提交记录。 然后打开 **http://localhost:3000**。 ### 选项 A — Docker (逐步操作) ``` .\tasks.ps1 setup # crée .env + génère PII_SECRET_KEY (ou: make setup) docker compose up --build # db + api + fetcher + web ; migrations auto au démarrage curl http://localhost:8000/health # -> {"status":"ok"} ``` API 位于 `http://localhost:8000` · Swagger 位于 `http://localhost:8000/docs` · dashboard 位于 `http://localhost:3000`。Alembic 迁移会由 `api` 容器自动应用。 手动生成 PII 密钥:`docker compose run --rm api python -m smishwatch.security.vault`。 ### 选项 B — 本地无 Docker (Windows / 开发) 适合用于开发和运行测试。捕获 artifacts(`fetcher` 服务)还需要 Playwright; 其余功能在本地 Postgres 下即可运行。 ``` cd api python -m venv .venv .\.venv\Scripts\Activate.ps1 pip install -e ".[dev]" ``` 在 `.env` 中将 `DATABASE_URL` 指向您的本地 Postgres,例如: ``` DATABASE_URL=postgresql+asyncpg://smishwatch:changeme@localhost:5432/smishwatch ``` 应用迁移,然后启动 API: ``` alembic upgrade head uvicorn smishwatch.main:app --reload ``` 要在本地捕获 artifacts,请同时启动 `fetcher` 服务: ``` cd ..\fetcher pip install -r requirements.txt playwright install chromium uvicorn app:app --port 8080 # 然后在 API 的 .env 中:FETCHER_URL=http://localhost:8080 ``` ### Dashboard (Web) Next.js 的 dashboard 会调用 API。使用 Docker 时,它会通过 `docker compose up` 在 `http://localhost:3000` 启动。在本地运行: ``` cd web copy .env.local.example .env.local # NEXT_PUBLIC_API_URL=http://localhost:8000 npm install npm run dev # http://localhost:3000 ``` 完整流程(提交 -> 报告 -> Campaign)均可在 UI 中控制: 所有内容默认以 **defang** 形式显示,每个值都有一个明确的“refang”按钮; 没有任何指向恶意基础设施的可点击链接。 ## 使用说明 所有指标在存储和返回时均进行了 **defang** 处理(`hxxp://`、`evil[.]com`、 `1[.]2[.]3[.]4`);电话号码 (PII) 已被加密和掩码。您可以完全通过 `http://localhost:8000/docs` 或使用 `curl` 进行控制。 ### 1. 提交短信或 URL ``` curl -X POST http://localhost:8000/submissions \ -H "Content-Type: application/json" \ -d '{"raw_input": "votre colis https://exemple-colis.test/track 06 12 34 56 78", "source": "sms"}' ``` 提取指标(URL、域名、IP、手机号码),通过 SSRF guard 展开短链接, 并追踪重定向链。请注意返回的 `id`。 ### 2. 捕获 artifacts (沙箱化 Fetch) ``` curl -X POST http://localhost:8000/submissions//artifacts ``` 每个 URL 都会通过 SSRF guard 重新验证,然后由 `fetcher` 服务进行渲染 (隔离的 Chromium headless,只读,不提交任何表单,不使用持久化 cookies)。 我们会存储静态 HTML、屏幕截图和 favicon 及其哈希值 (SHA-256,用于 favicon 的 Shodan 风格 mmh3,用于截图的感知 dhash)。 受保护 / 无法访问的页面会被原样记录,不会进行任何绕过。 ### 3. OSINT 丰富化 ``` curl -X POST http://localhost:8000/submissions//enrich ``` 域名 -> WHOIS/RDAP(注册商,创建日期)+ Certificate Transparency (crt.sh)。IP -> ASN/托管商 (RIPEstat) + 地理定位。 每项数据都包含其**来源**及其 **Admiralty 评分** (可靠性 A–F,可信度 1–6)。查询绝不会触及恶意基础设施: 指标仅作为参数传递给第三方服务。 ### 4. 钓鱼工具包指纹识别 ``` curl -X POST http://localhost:8000/submissions//fingerprint ``` 将捕获的 HTML 和 favicon 哈希与可扩展的特征库进行比对 (`api/src/smishwatch/data/kit_signatures.json` — 法国特色家族:假冒 La Poste、AMELI、 税务、CPF、银行顾问)。在提交记录中填充 `kit_family` + 分数。 ### 5. 聚类至 Campaign ``` curl -X POST http://localhost:8000/submissions//cluster ``` 将提交记录归入共享相同工具包 + 基础设施 (ASN) 组合的 **Campaign**。 此操作是增量式的:具有相同工具包 + ASN 的新提交记录会加入现有的 Campaign。 ### 6. 查看报告和 Campaign ``` curl http://localhost:8000/submissions/ # fiche complète curl http://localhost:8000/submissions # 50 dernières soumissions curl http://localhost:8000/campaigns # campagnes curl http://localhost:8000/campaigns/ # timeline + indicateurs agrégés ``` 报告汇总了各项指标,包含展开链、已哈希的 artifacts、 带评分的丰富化信息以及识别出的工具包。Campaign 展示其提交时间线和聚合指标。 ### 7. 生成证据包 ``` curl -X POST http://localhost:8000/submissions//bundle # crée le bundle curl -OJ http://localhost:8000/bundles//download # télécharge le .zip curl -X POST http://localhost:8000/bundles//verify ``` 证据包是一个 ZIP 文件,包含 artifacts 以及一个 `manifest.json`,其中列出了每个 文件的 SHA-256 和指标,并附有时间戳。 验证过程会重新计算所有哈希值:如果检测到篡改 -> `ok: false`。 RFC 3161 时间戳是可选接入的 (TSA);如果未配置 TSA,证据包依然可以通过重新计算 哈希值进行自我验证。 ### 8. 导入 Feed (关联分析) ``` curl -X POST http://localhost:8000/feeds/urlhaus/ingest curl -X POST http://localhost:8000/feeds/openphish/ingest curl -X POST http://localhost:8000/feeds/phishtank/ingest # nécessite PHISHTANK_API_KEY ``` URLhaus / OpenPhish / PhishTank 的 **只读** 连接器: 每个条目都会创建一个提交记录,并通过共享的指标与现有的 Campaign 进行 **关联**。响应结果会指出导入的条目数量和所关联的 Campaign 数量。 ## 开发 通过 Docker 运行 Lint 和测试: ``` make lint make test ``` 在 Windows (PowerShell) 环境下,不使用 `make` (在 `api/` 目录下,已激活 venv): ``` ruff check src tests black --check src tests mypy src pytest ``` ## CI/CD 与安全 三个具有最小权限的 GitHub Actions 工作流 (`.github/workflows/`): - **`ci.yml`** — 强制性的质量门禁:backend (`ruff`、`black --check`、 `mypy --strict`、`pytest`) 和 frontend (`eslint`、`tsc`、`next build`)。 - **`codeql.yml`** — CodeQL Python + TypeScript 静态分析 (SAST),使用 `security-extended` 查询,在 push/PR 时以及每周一运行。 - **`security.yml`** — 密钥扫描 (**gitleaks**,强制性),依赖审计 (**pip-audit**、**npm audit**),以及 **Trivy**(漏洞、密钥、 配置错误),并在 *Security* 选项卡中输出 SARIF。 **`.github/dependabot.yml`** 会保持 pip、npm、Docker 和 GitHub Actions 依赖项的 更新(每周)。 ### 应用加固 - **CORS** 限制在 `CORS_ORIGINS`(默认为 `http://localhost:3000`),不使用 cookies。 - 在所有 API 响应上设置**安全响应头**(`X-Content-Type-Options`、 `X-Frame-Options: DENY`、`Referrer-Policy`、`Permissions-Policy`、 `Content-Security-Policy: frame-ancestors 'none'`),Next.js 端同样适用。 - 按 IP 进行 **Rate limiting**(`RATE_LIMIT_PER_MINUTE`,默认 120/min)-> `429`。 - **可选的 API Key 身份验证**:如果定义了 `API_KEY`,所有路由 (除 `/health` 外)都需要 `X-API-Key` 请求头(常数时间比较)。 默认不启用,以便于本地开发。 - 根目录包含 `LICENSE` (MIT) 和 `SECURITY.md`(披露政策)。 ## 环境变量 请参考 `.env.example`。`.env` 绝不会被提交。 | 变量 | 描述 | | ----------------- | -------------------------------------------- | | `APP_ENV` | `development` / `production` | | `LOG_LEVEL` | 日志级别 | | `DATABASE_URL` | DSN SQLAlchemy async (asyncpg) | | `USER_AGENT` | 诚实且可识别的 User-Agent | | `PII_SECRET_KEY` | 用于加密 PII 的 Fernet 密钥 | | `FETCH_TIMEOUT` | 传出请求的超时时间 (秒) | | `FETCH_MAX_REDIRECTS` | 最大跟随的重定向次数 | | `FETCH_MAX_BYTES` | 每次响应读取的最大大小 | | `FETCHER_URL` | Playwright fetcher 服务的内部 URL | | `FETCHER_TIMEOUT` | 页面渲染的超时时间 (秒) | | `ARTIFACT_DIR` | 存储 artifacts 的目录 | | `FETCH_MAX_URLS` | 每次提交捕获的最大 URL 数量 | | `KIT_SIGNATURES_PATH` | 工具包特征库 (覆盖) | | `BUNDLE_DIR` | 证据包的目录 | | `FEED_MAX_ENTRIES`| 每个 feed 导入的最大条目数 | | `PHISHTANK_API_KEY` | PhishTank API 密钥 (否则禁用 feed) | | `CORS_ORIGINS` | 允许的来源 (CSV),默认为 localhost:3000 | | `RATE_LIMIT_PER_MINUTE` | 请求限制/IP/分钟 (超出则返回 429) | | `API_KEY` | 如果定义,则要求提供 `X-API-Key` 请求头 | | `POSTGRES_*` | Postgres 容器参数 | ## 项目状态 - [x] **阶段 0** — 脚手架与基础 (FastAPI `/health`、Postgres、代码质量) - [x] **阶段 1** — 摄取与 SSRF 防护 (Defang 提取、PII 保险库、短链接展开) - [x] **阶段 2** — 沙箱化 Playwright Fetch 与 artifacts (HTML/截图/favicon、哈希值) - [x] **阶段 3** — OSINT 丰富化 (WHOIS/RDAP、CT、ASN、地理定位) + Admiralty 评分 - [x] **阶段 4** — 工具包指纹识别 (可扩展特征) + Campaign 聚类 - [x] **阶段 5** — Next.js Dashboard (提交、报告、Campaign、Defang/Refang) - [x] **阶段 6** — 可验证的证据包与 Feed 导入 (URLhaus/OpenPhish/PhishTank)
标签:ESC4, OSINT, 反钓鱼, 域渗透, 威胁情报, 安全沙箱, 开发者工具, 测试用例, 版权保护, 特征检测, 电子数据取证, 请求拦截, 逆向工具