$npx -y skills add killvxk/cybersecurity-skills-zh --skill analyzing-indicators-of-compromise分析失陷指标(IOC),包括 IP 地址、域名、文件哈希、URL 和电子邮件工件,以确定恶意置信度、攻击活动溯源归因和封锁优先级。适用于对来自钓鱼邮件、安全告警或外部威胁情报的 IOC 进行分诊;使用多源情报对原始 IOC 进行富化;或作出封锁/监控/白名单决策时使用。
| 1 | # 分析失陷指标 |
| 2 | |
| 3 | ## 适用场景 |
| 4 | |
| 5 | 在以下情况下使用本技能: |
| 6 | - 钓鱼邮件或告警产生需要快速分诊的 IOC(URL、IP 地址、文件哈希) |
| 7 | - 自动化情报推送批量投递需要在进入封锁控制前进行置信度评分的 IOC |
| 8 | - 事件调查需要对观察到的网络工件进行上下文富化 |
| 9 | |
| 10 | **不适用于**将本技能单独用于高风险封锁决策——始终将自动化富化与分析师判断结合使用,特别是对于共享基础设施(CDN、云服务商)的情况。 |
| 11 | |
| 12 | ## 前置条件 |
| 13 | |
| 14 | - VirusTotal API 密钥(免费或企业版),用于多引擎杀毒软件和沙箱查询 |
| 15 | - AbuseIPDB API 密钥,用于 IP 信誉检查 |
| 16 | - MISP 实例或威胁情报平台(TIP),用于与已知攻击活动交叉核对 |
| 17 | - 安装有 `requests` 和 `vt-py` 库的 Python,或带有预构建连接器的 SOAR 平台 |
| 18 | |
| 19 | ## 工作流程 |
| 20 | |
| 21 | ### 步骤 1:规范化并分类 IOC 类型 |
| 22 | |
| 23 | 在富化之前,对每个 IOC 进行分类: |
| 24 | - **IPv4/IPv6 地址**:检查是否为 RFC 1918 私有地址(跳过外部富化),验证格式 |
| 25 | - **域名/FQDN**:为安全处理进行去激活(`evil[.]com`),使用 tldextract 提取注册域名 |
| 26 | - **URL**:分别提取域名和路径;检查是否存在重定向 |
| 27 | - **文件哈希**:识别哈希类型(MD5/SHA-1/SHA-256);优先使用 SHA-256 确保唯一性 |
| 28 | - **电子邮件地址**:拆分为域名部分(检查 MX/DMARC)和本地部分进行模式分析 |
| 29 | |
| 30 | 在文档中对 IOC 进行去激活处理(将 `.` 替换为 `[.]`,将 `://` 替换为 `[://]`),防止意外点击。 |
| 31 | |
| 32 | ### 步骤 2:多源富化 |
| 33 | |
| 34 | **VirusTotal(文件哈希、URL、IP、域名)**: |
| 35 | ```python |
| 36 | import vt |
| 37 | |
| 38 | client = vt.Client("YOUR_VT_API_KEY") |
| 39 | |
| 40 | # 文件哈希查询 |
| 41 | file_obj = client.get_object(f"/files/{sha256_hash}") |
| 42 | detections = file_obj.last_analysis_stats |
| 43 | print(f"Malicious: {detections['malicious']}/{sum(detections.values())}") |
| 44 | |
| 45 | # 域名分析 |
| 46 | domain_obj = client.get_object(f"/domains/{domain}") |
| 47 | print(domain_obj.last_analysis_stats) |
| 48 | print(domain_obj.reputation) |
| 49 | client.close() |
| 50 | ``` |
| 51 | |
| 52 | **AbuseIPDB(IP 地址)**: |
| 53 | ```python |
| 54 | import requests |
| 55 | |
| 56 | response = requests.get( |
| 57 | "https://api.abuseipdb.com/api/v2/check", |
| 58 | headers={"Key": "YOUR_KEY", "Accept": "application/json"}, |
| 59 | params={"ipAddress": "1.2.3.4", "maxAgeInDays": 90} |
| 60 | ) |
| 61 | data = response.json()["data"] |
| 62 | print(f"Confidence: {data['abuseConfidenceScore']}%, Reports: {data['totalReports']}") |
| 63 | ``` |
| 64 | |
| 65 | **MalwareBazaar(文件哈希)**: |
| 66 | ```python |
| 67 | response = requests.post( |
| 68 | "https://mb-api.abuse.ch/api/v1/", |
| 69 | data={"query": "get_info", "hash": sha256_hash} |
| 70 | ) |
| 71 | result = response.json() |
| 72 | if result["query_status"] == "ok": |
| 73 | print(result["data"][0]["tags"], result["data"][0]["signature"]) |
| 74 | ``` |
| 75 | |
| 76 | ### 步骤 3:结合攻击活动溯源归因进行上下文分析 |
| 77 | |
| 78 | 在 MISP 中查询匹配 IOC 的现有事件: |
| 79 | ```python |
| 80 | from pymisp import PyMISP |
| 81 | |
| 82 | misp = PyMISP("https://misp.example.com", "API_KEY") |
| 83 | results = misp.search(value="evil-domain.com", type_attribute="domain") |
| 84 | for event in results: |
| 85 | print(event["Event"]["info"], event["Event"]["threat_level_id"]) |
| 86 | ``` |
| 87 | |
| 88 | 使用 Shodan 获取 IP 上下文(托管服务商、开放端口、Banner 信息),识别 IP 是否属于防弹托管(Bulletproof Hosting)或合法云服务商(存在误报风险)。 |
| 89 | |
| 90 | ### 步骤 4:分配置信度分数和处置决定 |
| 91 | |
| 92 | 应用分层决策框架: |
| 93 | - **封锁(高置信度 ≥70%)**:VirusTotal ≥15 个引擎检测为恶意,AbuseIPDB 分数 ≥70,匹配已知恶意软件家族或攻击活动 |
| 94 | - **监控/告警(中置信度 40-69%)**:5-14 个引擎检测,AbuseIPDB 分数中等,无攻击活动溯源 |
| 95 | - **白名单/调查(低置信度 <40%)**:≤4 个引擎检测,无滥用报告,合法服务(Google、Cloudflare CDN IP) |
| 96 | - **误报(False Positive)**:被错误标记的合法业务服务;记录并从未来告警中排除 |
| 97 | |
| 98 | ### 步骤 5:记录并分发 |
| 99 | |
| 100 | 在 TIP/MISP 中记录发现结果,包含: |
| 101 | - 收集的所有富化数据(时间戳、来源、分数) |
| 102 | - 处置决定及理由 |
| 103 | - 已采取的封锁措施(防火墙、代理、DNS 黑洞) |
| 104 | - 相关事件工单编号 |
| 105 | |
| 106 | 以适当置信度字段导出为 STIX 指标(indicator)对象。 |
| 107 | |
| 108 | ## 核心概念 |
| 109 | |
| 110 | | 术语 | 定义 | |
| 111 | |------|-----------| |
| 112 | | **IOC(失陷指标)** | 表明潜在失陷的可观测网络或主机工件 | |
| 113 | | **富化(Enrichment)** | 从多个情报来源向原始 IOC 添加上下文数据的过程 | |
| 114 | | **去激活(Defanging)** | 修改 IOC(将 `.` 替换为 `[.]`)以防止在文档中意外激活 | |
| 115 | | **误报率(False Positive Rate)** | 被错误标记为恶意的良性工件百分比;对于调整封锁阈值至关重要 | |
| 116 | | **黑洞(Sinkhole)** | 将恶意域名查询重定向到良性 IP 的 DNS 服务器,用于在不完全封锁流量的情况下进行检测 | |
| 117 | | **TTL** | IOC 在封锁控制中的存活时间;IP 指标应在 30 天后过期,域名在 90 天后过期 | |
| 118 | |
| 119 | ## 工具与系统 |
| 120 | |
| 121 | - **VirusTotal**:多引擎恶意软件扫描器和威胁情报平台,拥有 70+ 杀毒引擎、沙箱报告和社区评论 |
| 122 | - **AbuseIPDB**:社区维护的 IP 信誉数据库,具有 90 天滥用报告历史 |
| 123 | - **MalwareBazaar (abuse.ch)**:免费恶意软件哈希仓库,关联 YARA 规则并进行恶意软件家族标记 |
| 124 | - **URLScan.io**:免费 URL 分析服务,捕获截图、DOM 和网络请求用于钓鱼 URL 分诊 |
| 125 | - **Shodan**:全网扫描数据,提供托管服务商、开放端口和 Banner 信息用于 IP 富化 |
| 126 | |
| 127 | ## 常见陷阱 |
| 128 | |
| 129 | - **封锁共享基础设施**:CDN IP(Cloudflare 104.21.x.x、AWS CloudFront)可能合法托管恶意内容,但封锁该 IP 会中断成千上万个合法站点。 |
| 130 | - **过度依赖 VirusTotal 分数**:低 VirusTotal 检测数量并不意味着安全——零日恶意软件和自定义 APT 工具初始得分通常为 0。需检查沙箱行为、MISP 和被动 DNS。 |
| 131 | - **遗漏去激活**:在邮件或 Confluence 文档中粘贴活跃 IOC 可能触发自动 URL 扫描器或钓鱼工具。 |
| 132 | - **无过期策略**:没有 TTL 的 IOC 会无限期积累在封锁列表中,当基础设施被合法用户重新利用时产生误报。 |
| 133 | - **过度依赖单一来源**:VirusTotal 汇聚了杀毒软件的意见——所有意见都可能是错误的或落后于新兴恶意软件。高风险决策应使用 3 个以上独立来源。 |