--- name: re-hunting type: atomic description: > 威胁狩猎方法论:假设驱动、遥测源选择、基线对比与验证闭环。 触发词:威胁狩猎、狩猎、hunting、假设驱动、遥测分析、异常检测。 capabilities: [threat-intel] --- # 威胁狩猎 ## 何时使用 / 何时不用 - 用:主动狩猎请求(「环境里有没有 X 的活动」)、假设驱动的环境排查、威胁情报落地(情报线索转环境内搜索) - 用:基线驱动的异常发现(无特定情报时先建基线再找偏离) - 用:事件后扩大排查(一次确认命中 → 同 TTP/同基础设施再查一遍,找漏网) - 用:告警驱动追溯(一次告警 → 反向狩猎同类未告警行为,找漏网) - 不用:纯合规巡检(无假设的定期报表是运营不是狩猎,两者流程不同) - 不用:已知样本分析([[re-behavior]]);IOC 查询([[re-ti]]);单点证据深挖(各域技能) - 不用:应急响应单点处置(狩猎是主动面,应急是被动触发,结论可互哺但流程不同) - 不用:无遥测来源时(数据源缺失无法支撑假设验证,先补齐采集再狩猎,见 [[gotchas]]) - 不用:设备/主机级单点排查(那是各域技能的事,狩猎面向环境整体) ## 工具准备 ### 日志分析工具(通用) - 多平台: jq / grep / awk(各发行版自带或 `apt install jq` / `brew install jq`) - 验证: `jq --version` - python3(基线统计/聚类脚本):安装见 [[re-python]] 工具准备 - 快速频次统计:`grep -E` + `sort | uniq -c`(基线初版可用) ### 遥测查询(按环境) - SIEM/EDR 查询接口(按部署环境给查询指引,工具不绑定) - 本地日志: `journalctl`(Linux,结构化过滤:`journalctl -o json --since "24 hours ago" | jq ...`);PowerShell `Get-WinEvent`(Windows,如 `Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4624} -MaxEvents 100`) - 网络遥测: 流量/防火墙日志(深挖见 [[re-netcap]]) - Windows 常用事件 ID(按环境实际启用情况核对):4624/4625 登录成功/失败、4688 进程创建、Sysmon 1 进程创建、Sysmon 11 文件创建 ### ATT&CK 导航(假设对齐参考) - 网页工具(公开访问);本地可下载 Navigator 层文件;规则匹配格式可参考 Sigma(公开规则格式,按环境适配) - 覆盖对照:结束后用 Navigator 层标记已覆盖技术,产出覆盖率声明(与盲区对照) ## 操作步骤 按顺序执行;假设明确再动手(坑 5)。每步产物存档(路径 + sha256,见 [[re-triage]])。 1. **狩猎假设生成**: - 输入:威胁情报([[re-ti]])、已知攻击模式([[re-behavior]] 经验)、环境特征(暴露面/业务/历史事件)、红队/演练报告(已知成功路径优先查) - 假设句式:「攻击者可能通过 X 技术在环境内做了 Y」——X 对齐 ATT&CK 技术,Y 是可观测的遥测痕迹 - 可证伪性检查:每个假设写得出「若为假应看到什么」(反证形态),写不出的不查 - 情报可检测性映射:情报的每条 IOC/TTP 都要回答「在环境里对应哪个遥测痕迹」;对不上的列为盲区假设 - 优先级:影响 × 可能性 × 可检测性(三者都低的不值得查) - 假设数量控制:单轮 3-5 个高优先级假设(过多则无法深入验证) - 假设卡片:编号/句式/来源情报/遥测痕迹/反证形态/优先级 - 产出:假设列表(每个假设 = 可证伪的搜索目标;按技术族覆盖多假设,避免单点) 2. **遥测源选择**: - 按假设选数据源:进程行为 → EDR/进程日志(Windows 4688/Sysmon 1);网络 → 流量/防火墙日志;登录 → 认证日志(4624/4625);文件 → 文件系统监控(Sysmon 11) - 数据源缺失 → 标注盲区(结论的有效性边界,见 [[gotchas]] 盲区坑) - 同一假设有多个数据源时先查覆盖最全的,再交叉验证 - 先验证遥测管道健康(收一条已知测试事件),再信「无告警」 - 时间归一:各数据源时间戳统一为 UTC 与同格式(ISO8601),跨源比较前先做 - 数据源映射示例(按环境核对实际事件 ID): | 假设侧重 | 数据源 | 事件/日志 | 缺失时 | |---|---|---|---| | 进程/执行 | EDR、进程日志 | 4688、Sysmon 1 | 无法验证执行链 | | 网络外联 | 流量/防火墙/代理 | 连接日志/NetFlow | 无法验证外联行为 | | 登录/凭据 | 认证日志 | 4624/4625 | 无法验证撞库/横向 | | 文件落地 | 文件系统审计 | Sysmon 11 | 无法验证投放 | 3. **基线 vs 异常**: - 基线:正常窗口的统计分布(频率/来源/目标特征)——窗口选已知干净时段且覆盖业务周期(见坑 1) - 统计方法:频率分布/百分位基线/环比突变(与上一窗口对比);用 python3 脚本做分布统计 - 异常检测:偏离基线的行为(新进程链、非常规时段、异常目标)、规则匹配(已知模式) - 启发式异常示例:首次出现的进程/域名、非工作时间登录、罕见端口外联 - 聚类:异常条目按特征聚类(进程名/路径/目标域名/时间窗),减少人工逐个审查 - 聚类产出:异常组清单(每组:特征/数量/时间范围/关联假设编号) - 基线产物:按实体的频率分布表(top N 进程/域名/登录源)+ 阈值建议 4. **验证闭环**: - 命中确认:异常 → 深挖([[re-behavior]] 行为分析、[[re-variant]] 样本关联、[[re-netcap]] 网络侧核对) - 误报排除:白名单核对、环境解释(合法变更/维护窗口)、与业务方确认 - 排除后留档:误报判定记录(为什么排除),复查不重复分析 - 白名单是动态资产:确认合法后入白名单(附原因),环境变化定期复查 - 证据存档:按 [[re-analyze/analysis-contract]] 复核格式(结论/证据/置信度) - 闭环输出:确认命中 → 事件报告(含 IOC 沉淀,可转 [[re-ioc]]);未命中 → 假设归档(可复跑,标注盲区) - 命中后扩大复查:同 TTP/同源再扫一遍(狩猎是迭代不是一次性) - 复盘产出:假设命中率统计(下轮优先级依据) - 交付结构:假设清单(含盲区)→ 命中列表(分级)→ 证据包路径 → 建议(规则/采集补强) - 判定分级与终止条件见 [[decision-tree]](确认/可疑/未证实/未命中四级) ## 跨域联合 - [[re-forensics]] 网关:本技能归属 - [[re-ti]]:情报输入(假设来源) - [[re-behavior]]:命中深挖(行为证据) - [[re-variant]]:样本关联 - [[re-netcap]]:网络遥测深挖 - [[re-ioc]]:命中指标沉淀(YARA/规则) - [[re-triage]]:产物存档规范(路径 + sha256) - [[re-analyze/analysis-contract]]:结论按复核格式交付 ## 常见坑与陷阱 - **基线污染**:现象——异常被视为正常;原因——环境本身已被攻陷(基线含恶意活动);对策——基线窗口选择在已知干净时段,标注基线假设 - **遥测缺失盲区**:现象——无异常结论但环境有活动;原因——关键数据源未采集;对策——步骤 2 显式标注盲区,结论限定「在已采集遥测内」 - **误报疲劳**:现象——大量命中无人深挖;原因——规则过宽/阈值过低;对策——先聚类再审查,阈值按基线校准 - **假设过窄**:现象——只查了一个技术;原因——假设单一;对策——按 ATT&CK 技术族生成多假设(覆盖率声明) - **结论过强**:现象——「环境干净」声明;原因——未标注盲区与假设边界;对策——结论带限定(见坑 2) - **确认偏误**:现象——只找支持假设的证据,忽略反证;原因——先有结论再找证据;对策——每个假设列「若为假应看到什么」,反证同样记录 - **时钟偏差/时区**:现象——事件序列对不上;原因——端侧时钟未校准;对策——先归一 UTC,标注时间源 - **无告警 ≠ 无活动**:现象——规则匹配全空即宣布安全;原因——监控盲区/规则逃逸/告警系统降级;对策——「已采集+已覆盖技术」与「未覆盖」分开陈述 - **只查一遍不复查**:现象——命中处理后不再扩大范围;原因——把狩猎当一次性任务;对策——命中后按同 TTP/同基础设施再查,迭代两轮 - **查询权限不足**:现象——结论带盲区但未标注;原因——只拿到部分数据源权限;对策——列出未授权数据源,结论限定在已授权范围 - **基线窗口含维护期**:现象——维护窗口的合法大动作被当异常/污染基线;原因——窗口选择粗糙;对策——基线窗口排除维护期并标注 - **命中即定性**:现象——单条日志命中即报事件;原因——未做环境解释;对策——过「环境解释」关再定性(决策树分级表) - 任务类型选择、命中分级与归档规则见 [[decision-tree]] / [[gotchas]]