Skip to main content
skill CX Codex

analyzing-campaign-attribution-evidence — Claude Code skill: campaign

A skill that scores cyber-campaign evidence against competing hypotheses and returns a confidence level for attribution. Useful when an incident report has to defend its conclusion.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add mukul975/Anthropic-Cybersecurity-Skills --skill analyzing-campaign-attribution-evidence -a claude-code
Open on GitHub

What analyzing-campaign-attribution-evidence does

The skill walks an analyst through a fixed process. Evidence gets collected by category first: infrastructure overlap, TTP consistency, malware code similarity, operational patterns, language artifacts, victimology. Each item carries a confidence weight.

Then ACH takes over. Every piece of evidence is marked consistent, inconsistent or neutral against each candidate actor. Consistent evidence adds to the score, inconsistent subtracts twice as much. The hypothesis with the fewest contradictions wins, not the one with the most matches. The final score maps to HIGH, MODERATE or LOW confidence.

Ready-made Python functions ship with it: an AttributionAnalyzer class for tracking evidence and ranking hypotheses, a comparison of two campaigns across IPs, domains, ASNs and registrars, and TTP matching through attackcti. You need Python 3.9+ with attackcti, stix2 and networkx, plus access to MISP or OpenCTI. Skip the threat intel platform and the comparison steps have nothing to compare against.

What it helps with

  • pull scattered incident evidence into one picture
  • decide how confidently an actor can be named
  • check two campaigns for shared infrastructure
  • test an actor hypothesis against contradicting facts
  • justify a confidence level in a client report

Example prompts for the agent

  • work through the evidence for this campaign and score the attribution confidence
  • compare infrastructure between the two campaigns: IPs, domains, ASNs
  • run ACH across three actor hypotheses and show me where they conflict

How to install analyzing-campaign-attribution-evidence

1Skills CLI (Vercel)

npx skills add mukul975/Anthropic-Cybersecurity-Skills --skill analyzing-campaign-attribution-evidence -a claude-code

2Manually: put the files in place

~/.claude/skills/analyzing-campaign-attribution-evidence/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/analyzing-campaign-attribution-evidence/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about analyzing-campaign-attribution-evidence

How do I install analyzing-campaign-attribution-evidence in Claude?

Run npx skills add mukul975/Anthropic-Cybersecurity-Skills --skill analyzing-campaign-attribution-evidence -a claude-code. The skill lands at ~/.claude/skills/analyzing-campaign-attribution-evidence/SKILL.md.

What does analyzing-campaign-attribution-evidence do?

It evaluates campaign evidence with ACH and the Diamond Model, weighing infrastructure overlap, TTP matches and malware code similarity, then returns an attribution confidence level.

What do I need to run this skill?

Python 3.9+ with attackcti, stix2 and networkx, plus access to MISP or OpenCTI. Familiarity with the Diamond Model and MITRE ATT&CK group profiles helps.

Source text

SKILL.md · Apache-2.0
---
name: analyzing-campaign-attribution-evidence
description: Systematically evaluate cyber-campaign evidence to attribute an operation to a threat actor, using the Diamond Model and Analysis of Competing Hypotheses (ACH) to weigh infrastructure overlaps, TTP consistency, malware code similarity, and timing/language artifacts into confidence-weighted attribution assessments. Use when an incident investigation needs a defensible attribution confidence level.
domain: cybersecurity
subdomain: threat-intelligence
tags:
- threat-intelligence
- cti
- ioc
- mitre-attack
- stix
- attribution
- campaign-analysis
version: '1.0'
author: mahipal
license: Apache-2.0
nist_csf:
- ID.RA-01
- ID.RA-05
- DE.CM-01
- DE.AE-02
mitre_attack:
- T1587.001
- T1583.001
- T1588.002
- T1071.001
---
# Analyzing Campaign Attribution Evidence

## Overview

Campaign attribution analysis involves systematically evaluating evidence to determine which threat actor or group is responsible for a cyber operation. This skill covers collecting and weighting attribution indicators using the Diamond Model and ACH (Analysis of Competing Hypotheses), analyzing infrastructure overlaps, TTP consistency, malware code similarities, operational timing patterns, and language artifacts to build confidence-weighted attribution assessments.


## When to Use

- When investigating security incidents that require analyzing campaign attribution evidence
- When building detection rules or threat hunting queries for this domain
- When SOC analysts need structured procedures for this analysis type
- When validating security monitoring coverage for related attack techniques

## Prerequisites

- Python 3.9+ with `attackcti`, `stix2`, `networkx` libraries
- Access to threat intelligence platforms (MISP, OpenCTI)
- Understanding of Diamond Model of Intrusion Analysis
- Familiarity with MITRE ATT&CK threat group profiles
- Knowledge of malware analysis and infrastructure tracking techniques

## Key Concepts

### Attribution Evidence Categories
1. **Infrastructure Overlap**: Shared C2 servers, domains, IP ranges, hosting providers
2. **TTP Consistency**: Matching ATT&CK techniques and sub-techniques across campaigns
3. **Malware Code Similarity**: Shared code bases, compilers, PDB paths, encryption routines
4. **Operational Patterns**: Timing (working hours, time zones), targeting patterns, operational tempo
5. **Language Artifacts**: Embedded strings, variable names, error messages in specific languages
6. **Victimology**: Target sector, geography, and organizational profile consistency

### Confidence Levels
- **High Confidence**: Multiple independent evidence categories converge on same actor
- **Moderate Confidence**: Several evidence categories match, some ambiguity remains
- **Low Confidence**: Limited evidence, possible false flags or shared tooling

### Analysis of Competing Hypotheses (ACH)
Structured analytical method that evaluates evidence against multiple competing hypotheses. Each piece of evidence is scored as consistent, inconsistent, or neutral with respect to each hypothesis. The hypothesis with the least inconsistent evidence is favored.

## Workflow

### Step 1: Collect Attribution Evidence

```python
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"
```

### Step 2: Infrastructure Overlap Analysis

```python
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",
    }
```

### Step 3: TTP Comparison Across Campaigns

```python
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,
    }
```

### Step 4: Generate Attribution Report

```python
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
```

## Validation Criteria

- Evidence collection covers all six attribution categories
- ACH matrix properly evaluates evidence against competing hypotheses
- Infrastructure overlap analysis identifies shared indicators
- TTP comparison uses ATT&CK technique IDs for precision
- Attribution confidence levels are properly justified
- Report includes alternative hypotheses and false flag considerations

## References

- [Diamond Model of Intrusion Analysis](https://www.activeresponse.org/wp-content/uploads/2013/07/diamond.pdf)
- [MITRE ATT&CK Groups](https://attack.mitre.org/groups/)
- [Analysis of Competing Hypotheses](https://www.cia.gov/static/9a5f1162fd0932c29e985f0159f56c07/Tradecraft-Primer-apr09.pdf)
- [Threat Attribution Framework](https://www.mandiant.com/resources/reports)

© mahipal · Apache-2.0 · mukul975/Anthropic-Cybersecurity-Skills

Similar skills

Everything for Security →

From the same set89

reverse-engineering-android-malware-with-jadx A skill that walks the agent through a malicious Android APK: JADX decompilation, manifest review, and hunting for data theft and C2. CX Codex +1 486installs testing-api-authentication-weaknesses Tests REST API authentication for bypasses, broken JWT implementations, and unprotected endpoints. Useful for security auditing before production. CX Codex +1 484installs analyzing-azure-activity-logs-for-threats Runs KQL queries against Azure Monitor activity and sign-in logs to surface suspicious admin operations and sign-in anomalies. CX Codex +1 471installs analyzing-indicators-of-compromise Scores IPs, domains, hashes, URLs and email artifacts for maliciousness, then sorts them into block, monitor or whitelist. CX Codex +1 466installs testing-cors-misconfiguration Audits API endpoints for Cross-Origin Resource Sharing vulnerabilities during authorized penetration tests. It identifies weak Origin reflection and misconfigured credentials. CX Codex +1 463installs analyzing-linux-system-artifacts Walks an agent through Linux system artifacts after a breach: auth logs, cron and systemd persistence, shell history, SSH keys. Built for incident response. CX Codex +1 461installs analyzing-linux-elf-malware A skill that walks an agent through dissecting suspicious Linux ELF binaries: headers, strings, syscalls, Ghidra. Useful when a server or container looks compromised. CX Codex +1 457installs analyzing-disk-image-with-autopsy Guides forensic investigation of raw, E01, and AFF disk images using Autopsy and The Sleuth Kit. Helps extract metadata, recover deleted files, and build activity timelines. CX Codex +1 454installs

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor