Anthropic-Cybersecurity-Skills:AI Agent 视角下的 IOC 分析实战——多源富集、置信度评分与 BLOCK/MONITOR/INVESTIGATE 处置框架
【免费下载链接】Anthropic-Cybersecurity-Skills817 structured cybersecurity skills for AI agents · Mapped to 6 frameworks: MITRE ATT&CK, NIST CSF 2.0, MITRE ATLAS, D3FEND, NIST AI RMF & MITRE F3 (Fight Fraud) · agentskills.io standard · Works with Claude Code, GitHub Copilot, Codex CLI, Cursor, Gemini CLI & 20+ platforms · 29 security domains · Apache 2.0项目地址: https://gitcode.com/GitHub_Trending/an/Anthropic-Cybersecurity-Skills
威胁情报工作中最基础、也最容易被自动化滥用的环节,是对失陷指标(Indicator of Compromise, IOC)的分析与富集:一条钓鱼邮件、一条 SIEM 告警或一个外部威胁情报源抛给你 URL、IP、文件哈希、邮箱地址之后,如何快速判定其恶意性置信度、归因到已知攻击活动,并给出「封禁 / 监控 / 加白」的处置决策?本文以 analyzing-indicators-of-compromise 技能 为主体,完整还原其五步工作流(规范化分类 → 多源富集 → 活动归因 → 置信度评分 → 记录分发),并结合该技能自带的 API 参考文档 与 可直接运行的富集脚本,讲清 VirusTotal、AbuseIPDB、MalwareBazaar、MISP 等数据源的具体调用方式与打分规则,帮助你把 IOC 分诊流程沉淀为可复制、可被 AI Agent 直接执行的标准化能力。
技能定位:在 Anthropic-Cybersecurity-Skills 库中的角色
Anthropic-Cybersecurity-Skills 是一个包含 817 个结构化网络安全技能、覆盖 29 个安全领域、遵循 agentskills.io 开放标准的开源技能库,每个技能都映射到 MITRE ATT&CK、NIST CSF 2.0、MITRE ATLAS、D3FEND、NIST AI RMF 与 MITRE F3 六个框架。IOC 分析技能(analyzing-indicators-of-compromise)属于cybersecurity域下的threat-intelligence子域,目录结构如下:
- SKILL.md:技能主体,包含触发条件、前置条件、五步工作流、核心概念表、工具清单与常见陷阱;
- references/api-reference.md:各富集数据源(VirusTotal v3、AbuseIPDB v2、MalwareBazaar、URLScan.io、Shodan)的 curl 调用示例、响应字段表与置信度评分框架;
- scripts/agent.py:可运行的 Python 富集 Agent,实现了 IOC 分类、defang/refang、私网 IP 过滤、三源查询与自动打分。
从 SKILL.md 的 frontmatter 可以看到该技能的框架映射关系:NIST CSF 侧映射ID.RA-01(识别资产)、ID.RA-05(识别外部风险)、DE.CM-01(控制点管理)、DE.AE-02(安全事件监测);MITRE ATT&CK 侧映射T1071(应用层协议)、T1105(入站工具传输)、T1041(非 C2 协议)、T1567(云数据外传)——这些正是 IOC 最常出现在 C2 与外传通道中的技术点;同时它还与 MITRE F3 框架的钓鱼信息收集(T1598)、钓鱼初始访问(T1660)、获取域名基础设施(T1583.001)与伪造网站(F1020.002)建立了关联,说明该技能也被设计用于金融欺诈场景下钓鱼基础设施的 IOC 研判。
技能描述中明确了激活边界:当请求涉及 VirusTotal、AbuseIPDB、MalwareBazaar、MISP 或 IOC 富集流水线时应触发本技能;同时文档特别强调——不要孤立地用本技能做高风险封禁决策,必须将自动富集结果与分析师判断结合使用,尤其是涉及 CDN、云服务商等共享基础设施时。
适用场景与前置条件
SKILL.md 给出了三个典型触发场景:
- 钓鱼邮件或告警快速分诊:一封钓鱼邮件或一条安全告警产生了一批 IOC(URL、IP、文件哈希),需要在数分钟内完成初步定性;
- 批量 IOC 摄入前评分:自动化威胁情报源推送大批量 IOC,需要在进入封禁控制(防火墙、DNS、代理黑名单)之前完成置信度打分;
- 事件调查中的上下文富集:调查中观察到一批网络工件(域名、IP),需要补充归属、历史行为等上下文信息以支撑归因。
前置条件(Prerequisites)清单:
- VirusTotal API Key(免费或 Enterprise 版),用于多引擎杀毒与沙箱结果查询;
- AbuseIPDB API Key,用于 IP 信誉检查;
- 一个 MISP 实例或 TIP(威胁情报平台),用于与已知攻击活动交叉比对;
- 带
requests和vt-py库的 Python 环境,或已内置上述连接器的 SOAR 平台。
配套的 agent.py 对依赖做了降级处理:脚本顶部用try/except ImportError探测requests库,缺失时仅返回错误标记而不崩溃,分类与 defang 等纯本地功能仍然可用——这体现了技能「无密钥也能离线跑通流程骨架」的设计思路。
五步工作流详解
Step 1:规范化与 IOC 类型分类
在发起任何外部查询之前,先对每条 IOC 做规范化并判定类型。SKILL.md 给出的分类规则如下:
| IOC 类型 | 处理规则 |
|---|---|
| IPv4/IPv6 地址 | 检查是否为 RFC 1918 私网地址(是则跳过外部富集),校验格式合法性 |
| 域名/FQDN | 做 defang 处理以便安全书写(evil[.]com),用tldextract提取注册域名 |
| URL | 分离出域名与路径两部分分别处理;检查是否存在重定向器 |
| 文件哈希 | 识别哈希类型(MD5/SHA-1/SHA-256),优先使用 SHA-256 保证唯一性 |
| 邮箱地址 | 拆分为域名(可查 MX/DMARC)与本地部分(做模式分析)两部分 |
文档同时要求:在文档与工单中一律 defang IOC(.替换为[.],://替换为[://]),防止被误点击或被自动化扫描器触发。
agent.py 中的classify_ioc()正是这组规则的代码化实现,用一串正则表达式完成类型判定,匹配顺序值得注意——先判 IPv4、再判 64/40/32 位十六进制串(SHA-256/SHA-1/MD5)、然后才是https?://前缀的 URL、邮箱、最后兜底为域名模式,避免一个 32 位十六进制字符串被误判为域名:
def classify_ioc(value): """Classify an IOC by type: ipv4, domain, url, sha256, sha1, md5, email.""" value = value.strip() if re.match(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$", value): return "ipv4" if re.match(r"^[a-fA-F0-9]{64}$", value): return "sha256" if re.match(r"^[a-fA-F0-9]{40}$", value): return "sha1" if re.match(r"^[a-fA-F0-9]{32}$", value): return "md5" if re.match(r"^https?://", value): return "url" if re.match(r"^[^@]+@[^@]+\.[^@]+$", value): return "email" if re.match(r"^[a-zA-Z0-9][a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$", value): return "domain" return "unknown"脚本中的is_private_ip()(agent.py#L53-L64)把「RFC 1918 跳过外部富集」这条规则落到了具体网段:10.0.0.0/8、172.16.0.0/12(即首段 172 且次段 16–31)、192.168.0.0/16,并额外覆盖了127.0.0.0/8回环地址。在enrich_ioc()中(agent.py#L192-L194),命中私网 IP 会直接标注RFC 1918 private IP - skipping external enrichment并返回,避免把内网地址发给外部 API 浪费配额、也避免泄露内部网络信息。
defang 的实现同样值得参考:defang_ioc()将http://替换为hxxp://、https://替换为hxxps://,再用re.sub(r"\.(?=\w)", "[.]", value)把点后跟单词字符的点号统一改写为[.];与之配对的refang_ioc()则反向还原(含[://]的还原),用于把文档中的失活 IOC 恢复为可查询形态——「文档中 defang、查 API 前 refang」这一对逆操作是 IOC 处理流水线里必须闭环的一步。
Step 2:多源富集(VirusTotal / AbuseIPDB / MalwareBazaar)
这是整个技能的核心环节。SKILL.md 为三类数据源各给出了一段 Python 示例,下面完整保留,并补充 API 参考文档中对应的 curl 调用与响应字段说明。
VirusTotal(文件哈希、URL、IP、域名)——利用多引擎统计判断恶意倾向:
import vt client = vt.Client("YOUR_VT_API_KEY") # File hash lookup file_obj = client.get_object(f"/files/{sha256_hash}") detections = file_obj.last_analysis_stats print(f"Malicious: {detections['malicious']}/{sum(detections.values())}") # Domain analysis domain_obj = client.get_object(f"/domains/{domain}") print(domain_obj.last_analysis_stats) print(domain_obj.reputation) client.close()对应的 API v3 端点(摘自 api-reference.md):
# 文件哈希查询 curl -H "x-apikey: $VT_KEY" \ "https://www.virustotal.com/api/v3/files/<sha256>" # 域名查询 curl -H "x-apikey: $VT_KEY" \ "https://www.virustotal.com/api/v3/domains/<domain>" # IP 查询 curl -H "x-apikey: $VT_KEY" \ "https://www.virustotal.com/api/v3/ip_addresses/<ip>"VirusTotal 响应中应重点关注的字段:
| 字段 | 说明 |
|---|---|
last_analysis_stats.malicious | 判定为恶意的 AV 引擎数量 |
last_analysis_stats.undetected | 判定为干净的引擎数量 |
reputation | 社区信誉分 |
popular_threat_classification | 威胁标签共识(社区投票得出的威胁名称) |
AbuseIPDB(IP 地址)——获取社区举报维度的滥用置信度:
import requests response = requests.get( "https://api.abuseipdb.com/api/v2/check", headers={"Key": "YOUR_KEY", "Accept": "application/json"}, params={"ipAddress": "1.2.3.4", "maxAgeInDays": 90} ) data = response.json()["data"] print(f"Confidence: {data['abuseConfidenceScore']}%, Reports: {data['totalReports']}")curl 形式:
curl -G "https://api.abuseipdb.com/api/v2/check" \ -H "Key: $ABUSE_KEY" -H "Accept: application/json" \ -d "ipAddress=1.2.3.4" -d "maxAgeInDays=90"响应字段:abuseConfidenceScore(0–100 滥用置信度)、totalReports(时间窗内举报数)、countryCode(来源国)、isp(运营商)、isTor(是否 Tor 出口节点)。maxAgeInDays=90与 AbuseIPDB 的 90 天举报历史窗口对应,是文档推荐的默认时间窗。
MalwareBazaar(abuse.ch,文件哈希)——免费恶意软件样本库,命中即意味着该哈希已被社区分析师提交过:
response = requests.post( "https://mb-api.abuse.ch/api/v1/", data={"query": "get_info", "hash": sha256_hash} ) result = response.json() if result["query_status"] == "ok": print(result["data"][0]["tags"], result["data"][0]["signature"])响应字段:signature(恶意软件家族名)、tags(关联标签)、file_type(文件类型)、first_seen(首次提交日期)、reporter(提交分析师)。
agent.py 把上述三个数据源封装成了四个查询函数,并统一了超时(timeout=30)与返回结构,可以直接作为集成参考:
query_virustotal_hash()(L67-L83):从data.attributes提取last_analysis_stats,返回malicious、total、type_description、popular_threat_classification.suggested_threat_label与tags;query_virustotal_domain()(L86-L101):额外提取registrar与creation_date——注册时间短的域名本身就是风险信号,这也是文档「用 Shodan/VT 上下文判断归属」思路的一部分;query_abuseipdb()(L104-L120):默认max_age_days=90,返回滥用置信度、举报数、国家、ISP、域名与 Tor 标记;query_malwarebazaar()(L123-L139):仅在query_status == "ok"且存在data时取第一条记录。
enrich_ioc()(L179-L214)体现了按类型分发的查询路由:哈希类 IOC 查 VirusTotal + MalwareBazaar;IPv4 查 AbuseIPDB(有密钥时)+ VirusTotal;域名查 VirusTotal。每个结果对象都附带ioc、type、defanged和timestamp(UTC ISO 格式),天然满足 Step 5 的记录要求。
除上述三源之外,API 参考文档还补充了两个数据源的调用方式,用于不同场景:
URLScan.io(钓鱼 URL 分诊)——抓取 URL 的截图、DOM 与网络请求:
# 提交扫描 curl -X POST "https://urlscan.io/api/v1/scan/" \ -H "API-Key: $KEY" -H "Content-Type: application/json" \ -d '{"url": "http://suspicious.com", "visibility": "private"}' # 拉取结果 curl "https://urlscan.io/api/v1/result/<uuid>/"Shodan(IP 上下文富集)——判断 IP 背后的托管商、开放端口与 Banner:
curl "https://api.shodan.io/shodan/host/<ip>?key=$SHODAN_KEY"Shodan 响应字段:ports(开放端口)、os(操作系统)、org(组织)、asn(自治系统号)、hostnames(关联主机名)。
Step 3:活动归因(Campaign Attribution)
单点富集只回答「这个东西坏不坏」,归因要回答「它属于哪个活动、和谁有关」。SKILL.md 给出两步:
1. 查询 MISP 中匹配该 IOC 的既有事件:
from pymisp import PyMISP misp = PyMISP("https://misp.example.com", "API_KEY") results = misp.search(value="evil-domain.com", type_attribute="domain") for event in results: print(event["Event"]["info"], event["Event"]["threat_level_id"])type_attribute="domain"指定了只按domain类型的属性做匹配,避免把evil-domain.com与同名 IP/URL 属性混淆;命中后输出的threat_level_id直接可用于后续置信度合成。
2. 用 Shodan 查 IP 上下文(托管商、开放端口、Banner),核心目的是判别该 IP 属于 bulletproof hosting(接盘黑产)还是正规云厂商——后者存在误报风险,这正是 SKILL.md 开头「Do not use」警告的具体展开:共享基础设施(CDN、云服务商)上的恶意内容如果按 IP 封禁,会连带影响成千上万的正常站点。
Step 4:置信度评分与处置决策
SKILL.md 给出的分层决策框架(tiered decision framework):
| 处置 | 置信区间 | 判定标准 |
|---|---|---|
| Block(封禁) | 高置信 ≥ 70% | VT 检测数 ≥15;或 AbuseIPDB 分数 ≥70;或匹配已知恶意软件家族/活动 |
| Monitor/Alert(监控/告警) | 中置信 40–69% | VT 检测数 5–14;AbuseIPDB 分数中等;无活动归因 |
| Whitelist/Investigate(加白/继续调查) | 低置信 <40% | VT 检测数 ≤4;无滥用举报;确认为合法服务(如 Google、Cloudflare CDN 段 IP) |
| False Positive(误报) | — | 正常业务服务被错误标记;记录在案并从后续告警中排除 |
api-reference.md 中的评分框架表与其一致:
| Score | Disposition | Criteria |
|---|---|---|
| >= 70 | BLOCK | 15+ VT detections, AbuseIPDB >= 70%, or MalwareBazaar match |
| 40-69 | MONITOR | 5-14 VT detections, moderate abuse score |
| < 40 | INVESTIGATE | Low detection, no campaign attribution |
agent.py 的score_ioc()则把这个框架实现成了可解释的加权累加模型,每一条加分都带原因字符串,方便事后审计:
| 信号 | 加分 | 附加原因记录 |
|---|---|---|
| VT 恶意检测数 ≥15 | +40 | VT: N detections (high) |
| VT 恶意检测数 5–14 | +20 | VT: N detections (moderate) |
| VT 恶意检测数 1–4 | +5 | VT: N detections (low) |
| AbuseIPDB 分数 ≥70 | +30 | AbuseIPDB: N% confidence |
| AbuseIPDB 分数 30–69 | +15 | AbuseIPDB: N% confidence |
| MalwareBazaar 命中 | +30 | MalwareBazaar: <signature> |
最终分数 ≥70 判BLOCK,40–69 判MONITOR,<40 判INVESTIGATE。从源码结构看,三源满分组合(40+30+30=100)恰好覆盖文档定义的三个档位边界;而 MalwareBazaar 单独命中即 +30,若再叠加任一 VT 中高分信号即可越过 BLOCK 线,这与参考文档「MalwareBazaar match」直接列为 BLOCK 条件的表述相互印证。
脚本的__main__部分(L217-L251)内置了 5 条演示 IOC(含一条192.168.1.100私网地址用于演示跳过逻辑),未设置VT_API_KEY/ABUSEIPDB_API_KEY环境变量时只执行分类与 defang 演示并提示设置密钥——这意味着可以直接python3 scripts/agent.py离线体验流程骨架,设置密钥后再跑真实富集。
Step 5:记录与分发
研判结论必须落到系统里才算闭环。SKILL.md 要求在 TIP/MISP 中记录四组信息:
- 采集到的全部富集数据(时间戳、来源、分数);
- 处置决策及其理由;
- 已执行的封禁动作(防火墙、代理、DNS sinkhole);
- 关联的事件工单号。
并要求将结果导出为 STIX indicator 对象,confidence字段按评分填入。agent.py输出结构中已经预置了timestamp(UTC)、reasons(决策理由列表)与defanged三字段,正是为这一步准备的:直接把这些字段灌入 STIX/TIP 记录即可,无需二次加工。
核心概念速查
继承 SKILL.md 的 Key Concepts 表,这是 IOC 分诊岗位的通用词汇表:
| 术语 | 定义 |
|---|---|
| IOC | 失陷指标——表明潜在失陷的可观测网络或主机工件 |
| Enrichment(富集) | 从多个情报源为原始 IOC 附加上下文数据的过程 |
| Defanging(失活) | 改写 IOC(.替换为[.]等)以防止文档中被意外激活 |
| False Positive Rate(误报率) | 良性工件被错误标记为恶意的比例;调优封禁阈值的关键指标 |
| Sinkhole | 把恶意域名解析重定向到良性 IP 的 DNS 服务,用于「检测但不完全阻断」 |
| TTL | IOC 在封禁控制中的存活期:IP 类指标建议 30 天后过期,域名类 90 天后过期 |
defang 的完整对照规则(来自 api-reference.md):
| 原始写法 | 失活写法 |
|---|---|
http:// | hxxp:// |
https:// | hxxps:// |
.com | [.]com |
evil.com | evil[.]com |
工具与数据源速查
| 工具 | 定位 |
|---|---|
| VirusTotal | 多引擎恶意软件扫描与情报平台,70+ AV 引擎、沙箱报告、社区评论 |
| AbuseIPDB | 社区维护的 IP 信誉库,含 90 天滥用举报历史 |
| MalwareBazaar (abuse.ch) | 免费恶意软件哈希库,带 YARA 规则关联与家族标签 |
| URLScan.io | 免费 URL 分析服务,抓取截图、DOM 与网络请求,用于钓鱼 URL 分诊 |
| Shodan | 全网扫描数据,提供托管商、开放端口、Banner 信息用于 IP 富集 |
常见陷阱:来自 SKILL.md 的五条实战教训
- 封禁共享基础设施:CDN 段 IP(Cloudflare
104.21.x.x、AWS CloudFront 等)可能承载恶意内容,但按 IP 封禁会瘫痪其上成千上万的合法站点——对这类 IOC 应转向封域名、封 URL 或 sinkhole。 - 迷信 VT 分数:低检测数 ≠ 良性。零日恶意软件与定制 APT 工具最初往往 0 分;必须结合沙箱行为、MISP 命中与被动 DNS 判断。
- 忘记 defang:把活 IOC 直接粘贴进邮件或 Confluence 文档,可能触发自动 URL 扫描器甚至钓鱼工具本身。
- 无过期策略:没有 TTL 的 IOC 会在黑名单中无限累积,随着基础设施被合法用户回收而持续产生误报——这也是 Key Concepts 中「IP 30 天 / 域名 90 天 TTL」规则存在的原因。
- 单一来源依赖:VirusTotal 聚合的是各家 AV 的共识,所有引擎都可能集体误判或滞后于新型恶意软件;高风险决策至少使用 3 个独立数据源交叉验证。
小结:把 IOC 分诊变成可执行流水线
回到这个技能的设计意图:它把「拿 IOC → 分类 → 多源查 → 打分 → 定处置 → 落记录」这条分析师脑子里的隐性流程,拆解成了带 API 示例、字段表和可运行脚本的显式流程,并前置声明了适用边界(不孤立做高风险封禁决策)。在 Anthropic-Cybersecurity-Skills 这类 agentskills.io 标准技能库中,它的价值在于 AI Agent 可以在钓鱼邮件分诊、批量情报摄入、事件调查三个场景下直接复现这套流程——分类与 defang 逻辑可离线验证(scripts/agent.py),真实富集只需注入VT_API_KEY与ABUSEIPDB_API_KEY两个环境变量;而加权打分模型保留了每一步的理由输出,让 Agent 给出的 BLOCK/MONITOR/INVESTIGATE 结论天然可解释、可审计。对于安全运营团队,这正是把「IOC 分诊 SOP」沉淀为机器可执行能力的典型范式。
【免费下载链接】Anthropic-Cybersecurity-Skills817 structured cybersecurity skills for AI agents · Mapped to 6 frameworks: MITRE ATT&CK, NIST CSF 2.0, MITRE ATLAS, D3FEND, NIST AI RMF & MITRE F3 (Fight Fraud) · agentskills.io standard · Works with Claude Code, GitHub Copilot, Codex CLI, Cursor, Gemini CLI & 20+ platforms · 29 security domains · Apache 2.0项目地址: https://gitcode.com/GitHub_Trending/an/Anthropic-Cybersecurity-Skills
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考