sanctum-sec/soc-day3-scout

GitHub: sanctum-sec/soc-day3-scout

一个面向SOC场景的轻量级威胁情报聚合与查询平台,从多个公开源自动摄取IOC并提供即时信誉查询和事件广播能力。

Stars: 0 | Forks: 0

# 团队 2 — 侦察兵:威胁情报聚合器 **您的 Lightsail:** `wic02.sanctumsec.com` (63.179.14.154) **您的 GitHub 仓库:** `https://github.com/sanctum-sec/soc-day3-scout` **请先阅读:** [`sanctum-sec/soc-protocol`](https://github.com/sanctum-sec/soc-protocol) — 这是您必须遵守的约定。 ## 1. 您的任务 您是 SOC 的**智库**。您从公共互联网中提取网络威胁情报,对其进行清洗并使其可查询,以便其他团队能在数秒内得到*“这是否有害?”*的答案。 到今天结束时,您将拥有: - 对 3 个以上免费公开的威胁情报源(URLhaus、ThreatFox、Firehol、Spamhaus、Tor exit list)进行定期拉取 - 带有信誉评分、标签和时间戳的本地 SQLite IOC(IP、域名、哈希、URL)数据库 - 供其他团队查询的 Query API,如:`GET /ioc/bad-ips`,`GET /enrich?ip=…` - 将高信誉度 IOC 以 SOC Protocol 的 `ioc` 事件形式广播给分析师和猎人的推送器 - 可以查看您的智库内容、已提取的数据以及谁在调用*您的* API 的管理员控制台 陷阱团队指望您将攻击者标记为已知有害。分析师指望您对警报进行评分。猎人指望您在评估异常时提供上下文。您是所有人的第二意见。 ## 2. 在真实 SOC 中的定位 摘自 MITRE 表 1《11 Strategies of a World-Class SOC》: - **网络威胁情报收集、处理与融合** — 您需要完成这三项工作。 - **网络威胁情报分析与生产** — 标签化、评分、趋势分析。 - **网络威胁情报共享与分发** — 您向同级工具发布数据。 这是每个成熟的 SOC 迟早都会构建的功能。今天,您将在八小时内构建一个最小可行版本。 ## 3. 访问权限与已安装环境 ``` ssh ubuntu@wic02.sanctumsec.com # 密码/пароль: 参见 https://wic-krakow.sanctumsec.com/wic-access-ghosttrace (Basic Auth: wic / stepup-krakow-2026) ``` 已安装:`git`、Python 3.10 + pip、Node.js LTS、`claude`、`codex`、AWS CLI 以及用于 `s3://wic-krakow-2026` 的凭证。 出站互联网访问不受限制 — 您可以自由拉取情报源。 ## 4. 数据流 ### 4.1 您的产出(输出) 两种输出形式: **(a) 按需查询 API** — 其他团队主动向您请求: | Endpoint | 调用者 | 返回内容 | | --------------------------------------------- | ------------------- | ------------------------------------------------------------ | | `GET /ioc/bad-ips?since=` | **陷阱** (polling) | 带有评分和标签的已知恶意 IP 的 JSON 列表 | | `GET /enrich?ip=1.2.3.4` | 任何人 | 单个 IP 的信誉记录(或 404) | | `GET /enrich?domain=example.com` | 任何人 | 单个域名的信誉记录 | | `GET /enrich?hash=` | 任何人 | 单个文件哈希的信誉记录 | | `GET /health` | 所有人 | `{"status":"ok","tool":"scout"}` | **(b) 推送事件** — 您将 `ioc` 事件 POST 到: | 目标 | Endpoint | 何时触发 | | ----------- | ------------------------------------------- | ----------------------------------------------------------------- | | **分析师** | `http://wic03.sanctumsec.com:8000/ingest` | 只要新提取的 IOC 信誉度 ≥ 70 | | **猎人** | `http://wic04.sanctumsec.com:8000/context` | 相同的触发条件 — 猎人使用此进行校准 | ### 4.2 您的输入(消费) **(a) 外部威胁情报源**(免费,公开 — 初始数据集无需密钥): | 来源 | 获取内容 | 方式 | | ------------------------------------------------------------------------------------------- | ------------------------------------------- | -------------------------------------- | | [URLhaus](https://urlhaus.abuse.ch/downloads/) | 恶意 URL | 通过 HTTPS 获取 CSV,每 5 分钟更新一次 | | [ThreatFox](https://threatfox.abuse.ch/export/) | 标记有恶意软件家族的 IOC | 通过 HTTPS 获取 JSON | | [Firehol Level 1](https://iplists.firehol.org/?ipset=firehol_level1) | 已知恶意 IP | 纯文本列表 | | [Spamhaus DROP](https://www.spamhaus.org/drop/drop.txt) | 垃圾邮件发送者网络 | 纯文本列表 | | [Tor exit list](https://check.torproject.org/torbulkexitlist) | 当前 Tor 出口节点 | 纯文本列表 | 作为加分项,获取免费的 API 密钥(注册只需 2 分钟): - [AbuseIPDB](https://www.abuseipdb.com/register) — 每天免费检查 1000 次 - [AlienVault OTX](https://otx.alienvault.com/) — 免费,宽松的速率限制 **(b) 同级可观察数据**(告诉您“我看到了这个”的团队): | 发送方 | Endpoint | 发送内容 | | ----------- | --------------------- | ---------------------------------------- | | **陷阱** | `POST /observe` | 攻击蜜罐的新 IP | | **猎人** | `POST /observe` | 猎人认为可疑的 IP/域名/哈希 | 您将它们录入,使用您拥有的数据进行富化,如果信誉评分超过阈值,就广播 `ioc` 事件。 ### 4.3 您发出的 IOC 事件示例 ``` { "schema_version": "1.0", "event_id": "", "event_type": "ioc", "timestamp": "2026-04-23T09:16:00Z", "producer": "scout", "severity": "high", "observables": { "source_ip": "203.0.113.42" }, "data": { "ioc_type": "ipv4", "reputation_score": 92, "first_seen": "2025-12-01T00:00:00Z", "last_seen": "2026-04-22T22:00:00Z", "tags": ["brute-force", "scanner", "tor-exit"], "sources": ["firehol", "tor-exit-list"], "confidence": "high" } } ``` ## 5. 架构 — 您要构建的三个部分 ### 5.1 情报引擎(提取 + 标准化) 每 15 分钟运行一次的调度器: 1. 拉取每个配置的情报源(HTTPS GET — 大多数是纯文本或 CSV) 2. 解析格式(每个情报源对应一个解析器) 3. 标准化为通用的 IOC 记录:`{ioc_value, ioc_type, source, first_seen, last_seen, tags, raw}` 4. 在本地 SQLite 中执行 Upsert(更新 `last_seen`,合并 `tags`,重新计算 `reputation_score`) 5. 检测到新的高信誉 IOC 并将其放入广播队列 ### 5.2 查询 API 运行在端口 **8000** 的 FastAPI 服务器,包含 4.1(a) 中的端点。底层只是读取 SQLite。如果需要,可以添加缓存。 ### 5.3 广播器 一个小型后台任务,耗尽广播队列并使用 SOC Protocol 信封将 `ioc` 事件 POST 给分析师和猎人。 ### 5.4 管理页面(端口 8001) **运营状况:** - 情报源状态:每个源最后一次成功拉取的时间,录入的记录数量 - 数据库中的 IOC 总数,按类型(IP / 域名 / 哈希 / URL)细分 - 入站请求统计:哪些同级在访问 `/enrich` 和 `/ioc/bad-ips`,频率如何 - 广播队列深度 **安全状况:** - 失败的身份验证 - 触发速率限制 - 因 Schema 验证在 `/observe` 上被拒绝的请求 - 查询了您所没有内容的同级(可能值得拉取的潜在有趣数据) ## 6. 推荐技术栈(非强制) | 组件 | 推荐 | 原因 | | -------------- | ------------------------------------------------ | ------------------------------------------------------------------------ | | 语言 | **Python 3.10** | requests、pandas、sqlite3 — 几乎都是标准库 | | HTTP | **FastAPI** + Uvicorn | 与所有团队一致 | | 调度器 | **APScheduler** 或小型 asyncio 循环 | 情报源每 15 分钟一次;不需要 Celery | | 存储 | **SQLite**,每种 IOC 类型一张表 | 单个文件,在 `ioc_value` 上建立索引 | | HTTP 客户端 | **httpx**(支持 async)或 **requests** | 取决于您是否想要异步 | | 管理 UI | FastAPI + Jinja + HTMX | 同上 | ## 7. 安全基础设施 — 毫不妥协 最低要求: - [ ] `/observe` 和任何写入端点上的 Bearer token(读取端点保持开放 — 这是设计意图 — 但需带有速率限制) - [ ] `/observe` 上的 Pydantic 验证 - [ ] 所有公共端点上的速率限制(每个 IP 200 次/分钟 — 对于查询 API 来说是合理的) - [ ] 管理界面上的 HTTP Basic 身份验证 - [ ] **情报源白名单** — 仅从硬编码列表中的主机名拉取数据。这可以防止在发生 SSRF 时潜在的枢纽攻击。 - [ ] **默认不信任来自 `/observe` 的数据作为 IOC** — 将其标记为 `community_submitted`,在提升至高信誉之前需要第二个来源的确认 - [ ] 仅追加的安全日志 请求 Claude: ``` Add a feed-source allowlist module. When fetching, check the hostname against a hardcoded set: urlhaus.abuse.ch, threatfox.abuse.ch, iplists.firehol.org, www.spamhaus.org, check.torproject.org. Reject anything else with a clear error in the security log. ``` ## 8. 管理页面规范 URL:`http://wic02.sanctumsec.com:8001/admin` — HTTP Basic 登录。 **运营状况:** - 情报源状态表:名称,最后一次获取时间,状态,记录数量增量 - IOC 总数:4 环图细分(IP / 域名 / 哈希 / URL) - 今日查询最多的 10 个 IOC(同级最感兴趣的内容) - 广播队列深度和错误 **安全状况:** - 最近 50 次失败的身份验证 - 触发的速率限制 - 被 Schema 拒绝的 `/observe` 有效载荷 - 对未知 IOC 的查询(可能很有趣;可能是针对您的侦察) ## 9. 您的一天 — 与 Claude 的各个阶段 ### 阶段 0 — 启动 (9:15–10:00) 与导师的共同会议。确定角色。 ### 阶段 1 — 脚手架 (10:00–10:45) ``` Start a FastAPI project in ~/app. Create: - main.py with /health and the read endpoints GET /ioc/bad-ips, GET /enrich. They can return empty lists / 404 for now. - /observe POST endpoint protected by bearer token validating the event envelope. - schemas/envelope.py — shared Pydantic model. - storage/db.py — SQLite connection + schema for ioc table (ioc_value TEXT PRIMARY KEY, ioc_type TEXT, source TEXT, first_seen TEXT, last_seen TEXT, tags TEXT JSON, reputation_score INTEGER). - systemd unit to run uvicorn on port 8000. - requirements.txt with fastapi, uvicorn, pydantic, httpx, apscheduler, slowapi. ``` 提交,推送。部署。测试 `curl /health`。`/ioc/bad-ips` 的桩代码返回 `[]`。 ### 阶段 2 — 情报摄取 (10:45–12:30) ``` Create ~/app/feeds/ with one parser module per source: - firehol.py: fetches https://iplists.firehol.org/files/firehol_level1.netset, parses out /32 IPs, returns list of (ip, "firehol_level1") tuples. - spamhaus.py: fetches https://www.spamhaus.org/drop/drop.txt, skips ; comments, extracts CIDR + description. - tor.py: fetches https://check.torproject.org/torbulkexitlist, returns list of IPs. - urlhaus.py: fetches https://urlhaus.abuse.ch/downloads/csv_recent/, parses CSV, returns list of URLs + their malware tags. - threatfox.py: fetches https://threatfox-api.abuse.ch/export/json/recent/, returns list of IOCs with their types. Then create ~/app/feeds/scheduler.py that runs all of these every 15 minutes, upserts results into the sqlite ioc table, and recalculates reputation_score: - In firehol/tor/spamhaus: 70 - In urlhaus: 85 - In threatfox: 85 - Appearing in 2+ sources: boost by 10 - Appearing in 3+ sources: boost by 15 (cap at 100) Tag each ioc with all source names. ``` 本地测试。首次运行应填入大约 300,000 条 Firehol 记录 + 来自其他每个来源的一些内容。 ### 阶段 3 — 查询 API + 广播器 (12:30–14:30) (包含午餐 — 去吃饭,别空着肚子写代码。) 实现: ``` Fill in GET /ioc/bad-ips — query all IPs with reputation_score >= 70, return a JSON list of objects {ip, score, tags, last_seen}. Support ?since= to only return IOCs whose last_seen is newer than that. Fill in GET /enrich — accepts ?ip= or ?domain= or ?hash=. Returns the full ioc record if found, else 404. Fill in POST /observe — accepts an event envelope. Extract the observable (source_ip / domain / hash), upsert into ioc table with source="community", reputation_score=40 (low-confidence), tag=["community_submitted"]. If the same ioc already exists from another source, bump last_seen. Create ~/app/broadcaster.py — runs every 30s. Queries ioc table for records where reputation_score >= 70 AND last_seen > 30 seconds ago AND NOT already_broadcast. For each, construct an "ioc" event envelope and POST to: - http://wic03.sanctumsec.com:8000/ingest - http://wic04.sanctumsec.com:8000/context Mark as broadcast. If POST fails, log to security.log and retry next tick. ``` ### 阶段 4 — 管理页面 + 加固 (14:30–16:30) ``` Create ~/app/admin/ on port 8001 with HTTP Basic auth, HTMX auto-refresh every 10s. - "Operational" tab: feed health table (query a feed_runs table you also need to create), IOC totals per type, top-10 queried IOCs today (from a query_log table), broadcast queue depth. - "Security" tab: last 50 entries from security.log parsed as JSON lines. Also add rate limiting to the public endpoints: 200 req/min per source IP. ``` ### 阶段 5 — 集成 + 演示准备 (16:30–17:30) - 检查陷阱的轮询是否成功访问了 `/ioc/bad-ips`(在管理界面中查看入站请求) - 确保您每分钟至少向分析师和猎人广播一个 `ioc` 事件 - 向 `/observe` 发送一个合成的可观察数据 — 必须端到端通过 - 编写 pytest:身份验证、Schema、enrich 查找 ## 10. 如何在 3-5 人之间分配工作 如果您有 **3** 人: | 角色 | 负责内容 | | ------------------- | ---------------------------------------- | | 情报源工程师 | 情报源解析器、调度器、存储 Schema | | API + 广播器 | FastAPI 路由、广播器、信封 | | 管理 + 部署 | 端口 8001 上的控制台、systemd、Actions | 如果您有 **4** 人: | 角色 | 负责内容 | | -------------------- | ---------------------------------------- | | 情报源工程师 | 情报源解析器 + 调度器 | | 存储 + API | SQLite Schema + 所有查询端点 | | 广播器 | 推送事件 + 重试 | | 管理 + 安全 | 控制台、身份验证、速率限制、日志 | 如果您有 **5** 人: 将“情报源工程师”拆分为“情报源-A”(Firehol、Spamhaus、Tor — 简单的文本格式)和“情报源-B”(URLhaus、ThreatFox — CSV/JSON)。 ## 11. “先出 Mock” 检查清单 在 11:00 之前: - [ ] `GET /health` 正常工作 - [ ] `GET /ioc/bad-ips` 返回一个包含 5 个虚假恶意 IP 的硬编码列表(以便陷阱团队可以据此进行开发) - [ ] `GET /enrich?ip=198.51.100.` 返回一个虚假的 IOC 记录 - [ ] 带有 Bearer 的 `POST /observe` 接受一个虚假信封并返回 202 这样,在您的真实情报源数据流入之前,陷阱和猎人就可以开始集成。 ## 12. 完成标准 **最低要求:** - [ ] 成功以 15 分钟的节奏拉取三个情报源 - [ ] SQLite 中填入了 ≥ 100 个真实的 IOC - [ ] `GET /ioc/bad-ips` 返回真实数据 - [ ] `GET /enrich` 对所有三种 IOC 类型都有效 - [ ] `POST /observe` 接收并保存社区提交的内容 - [ ] 广播器向分析师和猎人发送 `ioc` 事件 - [ ] 端口 8001 上包含两个标签页的管理界面 - [ ] systemd + GitHub Actions 部署 **加分项:** - [ ] 5 个活跃的情报源(添加了 URLhaus + ThreatFox) - [ ] 集成带有 API 密钥的 AbuseIPDB,用于在 `/enrich` 上进行实时查询 - [ ] IOC “衰减” — 降低 > 30 天未被看到的 IOC 的评分 - [ ] 按同级的审计日志:谁询问了哪些 IOC - [ ] 带有源 IP 地理定位的非常小的世界地图 ## 13. 进阶目标(如果您进度超前) - 类似 MISP 的 TAXII 源,以便外部平台可以使用您的智库 - 关联分析:“该 IP 在过去一小时内在同级提交中出现了 4 次” → 自动提高置信度 - 富化流水线:对于每个新的 IOC,自动执行 WHOIS 和地理定位,并将其附加到记录中 - 将每日快照存入 `s3://wic-krakow-2026/public/scout/snapshots/` 祝狩猎愉快。 ## 第 3 天的贯穿目标(AI-CTI 主题) 除了上述特定于团队的可交付成果之外,**第 3 天议程中的以下三个主题(模块 4-6)必须在您的工具、管理页面或学习产物中得到显著体现。** Claude Code — 这正是让您能在一天内完成这一切的关键 — 请善用它。 ### 目标 1 — AI 增强的 CTI 在您的工具*内部*使用 Claude(或任何 LLM)自动化 CTI 周期的至少一个步骤:提取、分类、关联或富化威胁情报。这是模块 4 的实际应用。 ### 目标 2 — TTP 和 AI 驱动的攻击模式 在将行为映射到 MITRE ATT&CK 时,还要识别 AI 驱动的攻击者会以不同方式生成的 TTP:LLM 生成的网络钓鱼、自动化的 OSINT 驱动侦察、机器生成的多态载荷、以异常时间间隔进行的脚本化信标通信。请在您的检测、假设、IOC 标签或操作手册中反映这一点。 ### 目标 3 — AI 社会工程学(攻击*与*防御) 真正的攻击者现在正在使用 AI 来扩大网络钓鱼、声音克隆、冒充的规模。您的工具必须至少触及这一点一次:捕获一个 SE 产物、对其进行标记、对其发出警报、对其进行富化 — 或者至少记录下来,面对 AI 驱动的 SE 尝试时,您的工具将*如何*反应。 ### 每个目标如何落实到您的具体工作中 - **AI 增强的 CTI:** 通过 Claude 处理每个录入的 IOC,并附带类似这样的提示:*“对于此 IOC(IP / 域名 / 哈希),用一句话描述最可能的战术和技术(MITRE ATT&CK)。”* 将 LLM 描述保存为 `data.llm_tag`;在 `/enrich` 响应中显示它。 - **TTP / AI 攻击模式:** 在拉取 URLhaus / ThreatFox 时,为引用了 `phishing-kit`、`generated-phishing` 或被情报源标记为自动化的活动的记录添加标签过滤器。公开一个专门列出这些内容的 endpoint `/ioc/ai-campaigns`。 - **AI 社会工程学:** 包含至少一个与 AI 生成的网络钓鱼域名相关的情报源。`ThreatFox` 已经对此进行了标记;在控制台的单独面板中显示它们。
标签:ESC4, Firehol, IOC数据库, IP 地址批量处理, Lambda架构, Lightsail, OSINT, REST API, SanctumSec, SOC协议, Spamhaus, SQLite, Team 2 Scout, ThreatFox, Tor出口节点, URLhaus, Web服务, WIC 2026, 信誉评分, 后端开发, 威胁情报, 威胁情报源, 威胁情报聚合器, 安全仪表板, 安全运营中心, 实时处理, 开发者工具, 恶意IP, 恶意URL, 恶意域名, 恶意软件哈希, 情报共享, 网络信息收集, 网络安全, 网络映射, 运行时操纵, 逆向工具, 隐私保护