mcpField
A
analyzing-campaign-attribution-evidence

analyzing-campaign-attribution-evidence

github.com/mukul975安全35.2k465 次安装8 周前更新
代码仓库

关于 analyzing-campaign-attribution-evidence

面向 SOC 分析师和威胁情报调查人员的归因分析技能,按证据类别比较威胁活动与候选行为者。结合 Diamond Model 和 ACH,形成带置信度的评估并考虑替代假设及误导迹象。

主要功能

  1. 01收集六类归因证据
  2. 02分析基础设施重叠
  3. 03比较 ATT&CK TTP
  4. 04用 ACH 评估竞争假设
  5. 05生成置信度归因报告

适用场景

  1. 01调查事件并评估可能的威胁行为者
  2. 02构建检测规则或威胁狩猎查询
  3. 03验证相关攻击技术的监控覆盖

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/mukul975/anthropic-cybersecurity-skills --skill analyzing-campaign-attribution-evidence

安装后在 Claude Code 中输入/analyzing-campaign-attribution-evidence确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

LICENSE
assets/
template.md
references/
api-reference.md
standards.md
workflows.md
scripts/
agent.py
process.py

详细介绍

分析行动归因证据

概述

行动归因分析是指系统地评估证据,以确定哪个威胁行为者或组织应对某项网络行动负责。本技能涵盖使用钻石模型和 ACH(竞争性假设分析)收集并加权归因指标,分析基础设施重叠、TTP 一致性、恶意软件代码相似性、行动时间模式和语言痕迹,从而构建带有置信度权重的归因评估。

适用场景

  • 调查需要分析行动归因证据的安全事件时
  • 为此领域构建检测规则或威胁狩猎查询时
  • SOC 分析师需要此类分析的结构化流程时
  • 验证针对相关攻击技术的安全监控覆盖情况时

前置条件

  • Python 3.9+,以及 attackcti、stix2、networkx 库
  • 可访问威胁情报平台(MISP、OpenCTI)
  • 了解入侵分析钻石模型
  • 熟悉 MITRE ATT&CK 威胁组织概况
  • 了解恶意软件分析和基础设施追踪技术

核心概念

归因证据类别
  1. 基础设施重叠:共用 C2 服务、域名、IP 地址范围、托管服务提供商
  2. TTP 一致性:不同行动中匹配的 ATT&CK 技术和子技术
  3. 恶意软件代码相似性:共用代码库、编译器、PDB 路径、加密例程
  4. 行动模式:时间(工作时间、时区)、目标模式、行动节奏
  5. 语言痕迹:特定语言中的嵌入式字符串、变量名称、错误消息
  6. 受害者特征:目标行业、地理位置和组织概况的一致性
置信度级别
  • 高置信度:多个独立证据类别指向同一行为者
  • 中等置信度:若干证据类别相符,但仍存在一些模糊之处
  • 低置信度:证据有限,可能存在误导性线索或共用工具
竞争性假设分析(ACH)

一种结构化分析方法,用于依据多个相互竞争的假设评估证据。针对每个假设,将每条证据评分为一致、不一致或中立。优先考虑不一致证据最少的假设。

工作流

步骤 1:收集归因证据
from stix2 import MemoryStore, Filter
from collections import defaultdict

class AttributionAnalyzer:
    def __init__(self):
        self.evidence = []
        self.hypotheses = {}

    def add_evidence(self, category, description, value, confidence):
        self.evidence.append({
            "category": category,
            "description": description,
            "value": value,
            "confidence": confidence,
            "timestamp": None,
        })

    def add_hypothesis(self, actor_name, actor_id=""):
        self.hypotheses[actor_name] = {
            "actor_id": actor_id,
            "consistent_evidence": [],
            "inconsistent_evidence": [],
            "neutral_evidence": [],
            "score": 0,
        }

    def evaluate_evidence(self, evidence_idx, actor_name, assessment):
        """Assess evidence against a hypothesis: consistent/inconsistent/neutral."""
        if assessment == "consistent":
            self.hypotheses[actor_name]["consistent_evidence"].append(evidence_idx)
            self.hypotheses[actor_name]["score"] += self.evidence[evidence_idx]["confidence"]
        elif assessment == "inconsistent":
            self.hypotheses[actor_name]["inconsistent_evidence"].append(evidence_idx)
            self.hypotheses[actor_name]["score"] -= self.evidence[evidence_idx]["confidence"] * 2
        else:
            self.hypotheses[actor_name]["neutral_evidence"].append(evidence_idx)

    def rank_hypotheses(self):
        """Rank hypotheses by attribution score."""
        ranked = sorted(
            self.hypotheses.items(),
            key=lambda x: x[1]["score"],
            reverse=True,
        )
        return [
            {
                "actor": name,
                "score": data["score"],
                "consistent": len(data["consistent_evidence"]),
                "inconsistent": len(data["inconsistent_evidence"]),
                "confidence": self._score_to_confidence(data["score"]),
            }
            for name, data in ranked
        ]

    def _score_to_confidence(self, score):
        if score >= 80:
            return "HIGH"
        elif score >= 40:
            return "MODERATE"
        else:
            return "LOW"
步骤 2:分析基础设施重叠
def analyze_infrastructure_overlap(campaign_a_infra, campaign_b_infra):
    """Compare infrastructure between two campaigns for attribution."""
    overlap = {
        "shared_ips": set(campaign_a_infra.get("ips", [])).intersection(
            campaign_b_infra.get("ips", [])
        ),
        "shared_domains": set(campaign_a_infra.get("domains", [])).intersection(
            campaign_b_infra.get("domains", [])
        ),
        "shared_asns": set(campaign_a_infra.get("asns", [])).intersection(
            campaign_b_infra.get("asns", [])
        ),
        "shared_registrars": set(campaign_a_infra.get("registrars", [])).intersection(
            campaign_b_infra.get("registrars", [])
        ),
    }

    overlap_score = 0
    if overlap["shared_ips"]:
        overlap_score += 30
    if overlap["shared_domains"]:
        overlap_score += 25
    if overlap["shared_asns"]:
        overlap_score += 15
    if overlap["shared_registrars"]:
        overlap_score += 10

    return {
        "overlap": {k: list(v) for k, v in overlap.items()},
        "overlap_score": overlap_score,
        "assessment": "STRONG" if overlap_score >= 40 else "MODERATE" if overlap_score >= 20 else "WEAK",
    }
步骤 3:比较不同组织的 TTP
from attackcti import attack_client

def compare_campaign_ttps(campaign_techniques, known_actor_techniques):
    """Compare campaign TTPs against known threat actor profiles."""
    campaign_set = set(campaign_techniques)
    actor_set = set(known_actor_techniques)

    common = campaign_set.intersection(actor_set)
    unique_campaign = campaign_set - actor_set
    unique_actor = actor_set - campaign_set

    jaccard = len(common) / len(campaign_set.union(actor_set)) if campaign_set.union(actor_set) else 0

    return {
        "common_techniques": sorted(common),
        "common_count": len(common),
        "unique_to_campaign": sorted(unique_campaign),
        "unique_to_actor": sorted(unique_actor),
        "jaccard_similarity": round(jaccard, 3),
        "overlap_percentage": round(len(common) / len(campaign_set) * 100, 1) if campaign_set else 0,
    }
步骤 4:生成归因报告
def generate_attribution_report(analyzer):
    """Generate structured attribution assessment report."""
    rankings = analyzer.rank_hypotheses()

    report = {
        "assessment_date": "2026-02-23",
        "total_evidence_items": len(analyzer.evidence),
        "hypotheses_evaluated": len(analyzer.hypotheses),
        "rankings": rankings,
        "primary_attribution": rankings[0] if rankings else None,
        "evidence_summary": [
            {
                "index": i,
                "category": e["category"],
                "description": e["description"],
                "confidence": e["confidence"],
            }
            for i, e in enumerate(analyzer.evidence)
        ],
    }

    return report

验证标准

  • 证据收集涵盖全部六个归因类别
  • ACH 矩阵正确评估证据与相互竞争假设之间的关系
  • 基础设施重叠分析识别出共用指标
  • TTP 比较使用 ATT&CK 技术 ID,以确保精确性
  • 归因置信度级别均有充分依据
  • 报告包含替代假设和误导性线索方面的考量

参考资料

评论

支持 Markdown