使用 attackcti 与 MITRE ATT&CK Navigator 分析威胁组织 TTP:Anthropic-Cybersecurity-Skills 实战指南
【免费下载链接】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
导读
本文以 Anthropic-Cybersecurity-Skills 仓库中的analyzing-threat-actor-ttps-with-mitre-navigator技能为主线,讲解如何用attackctiPython 库通过 STIX/TAXII 协议拉取 MITRE ATT&CK 数据,将 APT 组织的技术、战术与过程(TTP)程序化映射为 ATT&CK Navigator 层(Layer)JSON,从而构建攻击者画像、叠加检测覆盖率并定位防御缺口。读完本文,你将掌握从"查询威胁组织"到"导出可审阅的 Navigator 热力图层"的完整链路,并能复用仓库配套脚本 agent.py 直接落地分析。
背景:为什么需要"威胁组织 TTP + Navigator 层"
MITRE ATT&CK Navigator 是一个用于标注和可视化 ATT&CK 矩阵的 Web 应用。单独使用它只能手工勾选技术点;而一旦与attackcti这类编程库组合,分析师就可以:
- 通过 TAXII 服务批量查询某威胁组织(如 APT29)在 ATT&CK 中被归因的全部技术;
- 程序化生成 Navigator 层文件,把组织 TTP 变成可共享、可叠加的可视化图层;
- 横向对比多个组织(如 APT29、APT28、Lazarus Group)的共享技术与独有技术;
- 将"威胁组织已观察技术"与"自身检测能力"叠加,精确量化覆盖缺口,为检测工程排期提供依据。
这正是本仓库中该技能的核心应用场景:SOC 分析师在事件调查、检测规则建设、狩猎查询编写以及安全监控覆盖校验时,把威胁情报直接转化为可执行的技术矩阵。
前置条件与适用时机
在开始前需要准备:
- Python 3.8+,并安装
attackcti与stix2库(脚本依赖见 agent.py); - MITRE ATT&CK Navigator(Web UI 或本地实例),用于加载生成的层文件;
- 对STIX 2.1 对象与关系的基本理解,包括
intrusion-set(威胁组织)、attack-pattern(技术)及二者间的uses关系。
该技能尤其适用于以下场景:
- 安全事件调查中需要分析威胁组织 TTP 时;
- 为该领域构建检测规则或威胁狩猎查询时;
- SOC 分析师需要结构化分析流程时;
- 针对特定威胁行为者验证安全监控覆盖并识别差距时。
一、整体工作流:从 STIX 查询到 Navigator 层
原技能文档定义了五步核心流程,本文将其逐一展开并补充源码级细节:
- 查询 ATT&CK STIX 数据:用
attackcti的attack_client()初始化客户端,TAXII 服务拉取目标威胁组织; - 提取技术:通过 STIX 关系(组织
uses技术)取出与该组织关联的全部技术; - 生成 Navigator 层 JSON:为每条技术附加
techniqueID、score、color、comment等标注; - 叠加检测覆盖率:将组织 TTP 集合与自身可检测技术集合做差集运算,找出缺口;
- 导出层文件:交团队审阅与防御规划。
下面从第一步的底层原理讲起。
二、attackcti:通过 STIX/TAXII 程序化访问 ATT&CK
attackcti是一个专为 ATT&CK 数据设计的 Python 客户端,底层连接 MITRE 公开的 TAXII 服务器,返回 STIX 2.1 对象。仓库配套脚本 agent.py 的初始化方式如下:
from attackcti import attack_client def get_attack_client(): """Initialize ATT&CK STIX/TAXII client.""" return attack_client()如果attackcti未安装,脚本会提示Install: pip install attackcti并退出(见 agent.py)。参考文档 api-reference.md 列出了常用方法:
| 方法 | 说明 |
|---|---|
attack_client() | 初始化用于 ATT&CK 数据的 STIX/TAXII 客户端 |
client.get_groups() | 检索 ATT&CK 中的全部威胁组织 |
client.get_techniques() | 检索 ATT&CK 中的全部技术 |
client.get_techniques_used_by_group(group) | 获取与指定组织关联的技术 |
client.get_software() | 检索全部软件/工具 |
client.get_software_used_by_group(group) | 获取指定组织使用的软件 |
client.get_mitigations() | 检索全部缓解措施 |
client.get_data_sources() | 检索全部数据源 |
提示:本仓库的映射方法论中,技能到技术的映射同样依赖这些 ATT&CK 标识符(如
T1566、T1059.001),详见 mappings/mitre-attack/README.md。
2.1 列出全部威胁组织
分析的第一步通常是盘点可用的威胁组织。脚本通过client.get_groups()遍历每个组织对象,抽取名称、ATT&CK 外部 ID 与别名:
def list_threat_groups(client): """List all threat groups in ATT&CK.""" groups = client.get_groups() results = [] for g in groups: aliases = g.get("aliases", []) results.append({ "name": g.get("name", ""), "id": g.get("external_references", [{}])[0].get("external_id", "") if g.get("external_references") else "", "aliases": aliases, "description": g.get("description", "")[:200], }) return sorted(results, key=lambda x: x["name"])这里的关键点是:威胁组织在 STIX 中对应intrusion-set对象,其external_references数组中的external_id字段保存了 ATT&CK 组织编号(如G0016对应 APT29)。输出按名称排序,便于快速浏览。
2.2 提取组织使用的技术
get_group_techniques()先做名称/别名匹配定位组织,再调用get_techniques_used_by_group()获取技术列表,最后从每条技术的external_references中解析出mitre-attack来源的external_id(即T1xxx形式的编号)与官方 URL,并附上平台信息:
def get_group_techniques(client, group_name): groups = client.get_groups() target_group = None for g in groups: if g.get("name", "").lower() == group_name.lower(): target_group = g break aliases = [a.lower() for a in g.get("aliases", [])] if group_name.lower() in aliases: target_group = g break if not target_group: return {"error": f"Group '{group_name}' not found"} techniques = client.get_techniques_used_by_group(target_group) results = [] for tech in techniques: ext_refs = tech.get("external_references", []) tech_id = "" url = "" for ref in ext_refs: if ref.get("source_name") == "mitre-attack": tech_id = ref.get("external_id", "") url = ref.get("url", "") break results.append({ "technique_id": tech_id, "name": tech.get("name", ""), "description": tech.get("description", "")[:150], "url": url, "platforms": tech.get("x_mitre_platforms", []), }) return { "group_name": target_group.get("name", ""), "group_id": target_group.get("external_references", [{}])[0].get("external_id", ""), "technique_count": len(results), "techniques": results, }值得注意的细节是:匹配是大小写不敏感的,且会同时命中别名——例如用户输入Cozy Bear也能定位到 APT29。这一设计让情报报告中的俗称、别名可以直接作为查询入口。
2.3 STIX 2.1 对象字段速查
参考文档对 STIX 2.1 的组织与技术对象字段做了系统梳理,实际解析时按此处理:
组织(intrusion-set)对象字段
| 字段 | 说明 |
|---|---|
id | STIX 对象 ID(如intrusion-set--abc123) |
name | 组织名称(如 APT29) |
aliases | 组织的替代名称 |
description | 组织描述与背景 |
external_references | 引用列表,含 ATT&CK ID |
created | 对象创建时间戳 |
modified | 对象最后修改时间戳 |
技术(attack-pattern)对象字段
| 字段 | 说明 |
|---|---|
name | 技术名称(如 Spearphishing Attachment) |
external_references[].external_id | ATT&CK 技术 ID(如 T1566.001) |
x_mitre_platforms | 目标平台(Windows、Linux、macOS 等) |
kill_chain_phases | 杀伤链中关联的战术阶段 |
x_mitre_detection | 该技术的检测建议 |
x_mitre_is_subtechnique | 是否为子技术 |
三、生成 Navigator 层:Layer JSON 结构与语义
获取技术列表后,核心任务是把结构化数据转换为 Navigator 层文件。仓库脚本中的generate_navigator_layer()给出了完整实现(见 agent.py):
def generate_navigator_layer(group_data, color="#ff6666"): """Generate ATT&CK Navigator layer JSON from group technique data.""" techniques = [] for tech in group_data.get("techniques", []): tid = tech.get("technique_id", "") if not tid: continue techniques.append({ "techniqueID": tid, "score": 1, "color": color, "comment": tech.get("name", ""), "enabled": True, }) layer = { "name": f"{group_data.get('group_name', 'Unknown')} TTPs", "versions": { "attack": "15", "navigator": "5.0", "layer": "4.5", }, "domain": "enterprise-attack", "description": f"Techniques used by {group_data.get('group_name', '')} " f"({group_data.get('group_id', '')})", "filters": {"platforms": ["Windows", "Linux", "macOS", "Cloud"]}, "sorting": 0, "layout": {"layout": "side", "showID": True, "showName": True}, "hideDisabled": False, "techniques": techniques, "gradient": { "colors": ["#ffffff", color], "minValue": 0, "maxValue": 1, }, "legendItems": [ {"label": f"{group_data.get('group_name', '')} techniques", "color": color}, ], "metadata": [], "showTacticRowBackground": True, "tacticRowBackground": "#dddddd", } return layer原技能文档给出的最小输出示例如下,与本实现的结构一致:
{ "name": "APT29 TTPs", "domain": "enterprise-attack", "techniques": [ {"techniqueID": "T1566.001", "score": 1, "comment": "Spearphishing Attachment"}, {"techniqueID": "T1059.001", "score": 1, "comment": "PowerShell"} ] }3.1 Navigator Layer JSON Schema 详解
参考文档 api-reference.md 对 Layer Schema 做了逐字段说明,这是手工构造或校验层文件时的权威速查表:
| 字段 | 类型 | 说明 |
|---|---|---|
name | string | 层显示名称 |
versions.attack | string | ATT&CK 版本(如 "15") |
versions.navigator | string | Navigator 版本(如 "5.0") |
versions.layer | string | 层格式版本(如 "4.5") |
domain | string | enterprise-attack、mobile-attack或ics-attack |
techniques[].techniqueID | string | ATT&CK 技术 ID |
techniques[].score | integer | 用于着色的数值评分(0-100) |
techniques[].color | string | 十六进制颜色覆盖(如#ff6666) |
techniques[].comment | string | 该技术的注释文本 |
techniques[].enabled | boolean | 技术单元格是否启用 |
gradient.colors | array | 从最小到最大评分的颜色渐变 |
gradient.minValue | integer | 最小评分值 |
gradient.maxValue | integer | 最大评分值 |
filters.platforms | array | 矩阵中要展示的平台 |
legendItems[].label | string | 图例条目标签 |
legendItems[].color | string | 图例条目颜色 |
理解评分与着色的配合:score与gradient共同决定热力图颜色深浅——当某个技术score设为 1 且渐变区间为["#ffffff", color](0→1)时,命中技术即显示为color(默认红色#ff6666),未命中则为白色。若要做覆盖深度热力图(如"有多少个技能引用该技术"),则把minValue/maxValue扩到 0–100,并按引用数给score赋权。
3.2 仓库内的真实 Layer 实例
本仓库自身就是 Navigator 层的最佳范例:仓库根目录的 mappings/attack-navigator-layer.json 将 700+ 个技能对 ATT&CK Enterprise 矩阵的覆盖情况打包成了一个层文件。它的做法值得借鉴:
- 每条技术以
score表示被多少技能引用(如T1003.001LSASS Memory 的score: 46,表示被 12 个技能引用); metadata中附上skill_count与具体技能列表,让图层自带审计信息;- 使用蓝色渐变区分覆盖深度:浅蓝
#cfe2f3(1-2 个技能)、中蓝#6fa8dc(3-5 个)、深蓝#3d85c6(6-10 个)、最深#1155cc(11+ 个),详见 mappings/README.md。
这个实例证明了同一套 Layer Schema 既可以表达"威胁组织 TTP",也可以表达"防御方技能覆盖",两者叠加即为差距分析的基础。
四、CLI 实操:一条命令完成 TTP 分析与层导出
配套脚本 agent.py 封装了上述全部能力为命令行工具。参考文档 api-reference.md 给出了完整的 CLI 用法:
# 列出全部 ATT&CK 威胁组织 python agent.py --list-groups # 分析指定组织 python agent.py --group "APT29" # 生成 Navigator 层文件 python agent.py --group "APT29" --layer-output apt29_layer.json # 对比多个组织 python agent.py --compare "APT29" "APT28" "Lazarus Group" # 保存完整报告为 JSON python agent.py --group "APT29" --layer-output apt29.json --output report.json对应的命令行参数定义(见 agent.py):
| 参数 | 说明 |
|---|---|
--group | 要分析的威胁组织名称(如 APT29) |
--list-groups | 列出全部 ATT&CK 组织 |
--compare | 对比多个组织(接收多个参数) |
--layer-output | 将 Navigator 层 JSON 保存到文件 |
--output | 将完整报告保存为 JSON 文件 |
运行--group "APT29"时,脚本会输出组织 ID、技术总数及前 20 条技术(T1xxx: 名称格式);配合--layer-output即生成可直接拖入 Navigator 的层文件。整个审计过程会以 UTC 时间戳打印横幅头(见 agent.py),适合归档取证。
五、多组织对比与共享技术分析
威胁情报中的常见问题不是"某个组织用什么",而是"这些组织之间重叠了什么、各自独有什么"。compare_groups()用集合运算回答了这个问题(见 agent.py):
def compare_groups(client, group_names): all_techniques = {} group_techs = {} for name in group_names: data = get_group_techniques(client, name) if "error" in data: continue techs = {t["technique_id"] for t in data.get("techniques", [])} group_techs[data.get("group_name", name)] = techs for t in data.get("techniques", []): all_techniques[t["technique_id"]] = t["name"] shared = set.intersection(*group_techs.values()) if group_techs else set() unique_per_group = {} for name, techs in group_techs.items(): unique_per_group[name] = techs - set.union(*(v for k, v in group_techs.items() if k != name)) return { "groups_compared": list(group_techs.keys()), "total_unique_techniques": len(set.union(*group_techs.values())) if group_techs else 0, "shared_techniques": [{"id": t, "name": all_techniques.get(t, "")} for t in shared], "shared_count": len(shared), "unique_per_group": {k: len(v) for k, v in unique_per_group.items()}, }这套逻辑的产出非常直观:
shared_techniques:所有被对比组织共同使用的技术。若多个组织的交集中出现T1059.001(PowerShell),说明这是高价值、应优先覆盖的共性攻击面;unique_per_group:每个组织的独有技术,用于识别组织特异性行为,为差异化防御提供线索;total_unique_techniques:并集规模,反映整体威胁面大小。
例如--compare "APT29" "APT28" "Lazarus Group"会输出三个组织的名称、总技术数、共享技术数量及前 10 条共享技术。将共享技术生成一个 Navigator 层,就能在矩阵上一眼看出共性热区。
六、检测覆盖差距分析:把 TTP 变成防御行动
生成层文件只是手段,最终目标是找出检测缺口。同仓库的姊妹技能 analyzing-threat-actor-ttps-with-mitre-attack 给出了标准的差距分析范式:把"行为者技术集合"与"你当前能检测的技术集合"做集合运算。
# 对比威胁组织技术与你现有的检测能力 detected_techniques = {"T1059", "T1071", "T1566"} # 示例:你能检测的技术 actor_techniques = set(technique_map.keys()) covered = actor_techniques.intersection(detected_techniques) gaps = actor_techniques - detected_techniques print(f"Actor techniques: {len(actor_techniques)}") print(f"Detected: {len(covered)} ({len(covered)/len(actor_techniques)*100:.0f}%)") print(f"Gaps: {len(gaps)} ({len(gaps)/len(actor_techniques)*100:.0f}%)")将这一思想与本技能结合,可以形成闭环的实战流程:
- 用
get_group_techniques()得到组织技术集合(actor_techniques); - 用
--list-groups与 Navigator 层维护己方"可检测技术"集合; - 计算
gaps = actor_techniques - detected_techniques,得到未监控技术清单; - 把缺口清单以
score: 0、白色着色叠加到组织 TTP 层上,生成"覆盖 vs 缺口"双层对比图; - 按缺口的杀伤链阶段与技术严重程度排定检测规则开发优先级,输出给检测工程团队。
此外,ATT&CK 数据源字段(x_mitre_data_sources)可用于反推:若某技术依赖的数据源(如进程命令行、网络连接日志)尚未采集,那即使写了规则也无法检测——这是差距分析中值得补充的第二维度。
七、验证标准:如何确认分析结果可用
参考仓库中 mappings/mitre-attack/README.md 的映射方法论与同领域技能的验证准则,一份合格的 TTP 分析应当满足:
- 数据可达:ATT&CK 数据成功通过 TAXII 服务器或本地副本查询;
- 映射可追溯:威胁组织被映射到具体技术,并尽量附带程序(procedure)示例作为证据;
- 层文件合法:生成的 Navigator 层 JSON 格式有效,能在 Navigator 中正常渲染(可通过"Open Existing Layer → Upload from local"加载验证,参考 mappings/README.md 的加载方式);
- 缺口可量化:差距分析明确列出未监控技术及其占比;
- 对比有结论:跨组织对比揭示共享与独有 TTP;
- 输出可行动:结果能直接用于检测工程排期与防御规划。
八、最佳实践与注意事项
- 版本一致性:Layer 中的
versions.attack应与数据源的 ATT&CK 版本一致。本仓库实例使用 ATT&CK v14/v15、Layer v4.5 格式(见 mappings/attack-navigator-layer.json),新数据更新时需同步调整,避免 ID 漂移导致层渲染错位。 - 子技术粒度:ATT&CK 同时存在父技术(如
T1566)与子技术(如T1566.001)。生成层文件时建议同时保留,或在 Navigator 中启用expandedSubtechniques(仓库实例即设置了"expandedSubtechniques": "annotated")以完整呈现。 - 别名查询:攻击者组织常以多个名称出现,匹配逻辑务必覆盖
aliases字段(本仓库脚本已实现)。 - 评论信息:善用
comment与metadata字段把情报上下文(来源报告、事件 ID、程序示例)写进层文件,使图层成为自解释的审计制品。 - 环境依赖:
attackcti需要网络访问 MITRE TAXII 服务;离线环境可考虑本地 ATT&CK STIX 副本,再以相同数据结构喂给层生成逻辑。
结语
从 STIX/TAXII 数据查询、技术提取、Navigator 层生成,到多组织对比与检测缺口分析,analyzing-threat-actor-ttps-with-mitre-navigator技能把"威胁情报 → 可视矩阵 → 防御决策"的链路完整打通。你既可以一行命令直接使用 agent.py,也可以参考 api-reference.md 的 Schema 自行扩展(如叠加检测覆盖层、加入数据源分析),再对照仓库自身的 attack-navigator-layer.json 实例校准输出格式,快速产出可供团队审阅与排期的威胁驱动防御依据。
【免费下载链接】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),仅供参考