L61 · MITRE ATT&CK
Module 9: Detection and Incident Response · ~20 min · Lesson 61 of 71
🎯 What you'll learn
- Tactics (why), techniques (how), sub-techniques (how exactly) and procedures (what one attacker did)
- How to read an ID like T1552.005, and where the Cloud and Containers matrices fit a typical API stack
- How to map a real breach (Capital One, Uber) onto ATT&CK
- How defenders use it (coverage heatmaps, the Navigator) and where it misleads
🔥 Why this matters
A CISA advisory in your team channel says the actor used T1078.004, T1621 and T1530. A GuardDuty finding is tagged "Credential Access", and the security report claims "62% ATT&CK coverage". Then your manager asks: "Would we catch what happened to Capital One?" ATT&CK is the shared vocabulary that lets advisories, findings, detection rules and postmortems point at the same things.
1. From a story to a catalog
L03's Cyber Kill Chain tells an intrusion as seven stages: a good story, but coarse. An attacker with a stolen password skips half of them.
MITRE ATT&CK (Adversarial Tactics, Techniques, and Common Knowledge) is a free, public catalog of attacker behavior seen in real intrusions, with sources. MITRE started it in 2013, published it in 2015, and releases twice a year (April and October). This lesson uses v20.1 (October 2026). Of its three domains, Enterprise covers cloud and API work; the others are Mobile and ICS.
2. Four levels: why, how, how exactly, what they did
TACTIC the attacker's goal at this step "why"
TA0006 Credential Access
│ is achieved by
▼
TECHNIQUE one way to reach that goal "how"
T1552 Unsecured Credentials
│ more specifically
▼
SUB-TECHNIQUE a narrower variant "how
T1552.005 Cloud Instance Metadata API exactly"
│ as done by one actor, once
▼
PROCEDURE "made a WAF on EC2 fetch 169.254.169.254
/latest/meta-data/iam/security-credentials/
and got the role's keys" (Capital One, L47)
- A tactic is the attacker's short-term goal, such as Persistence (ID
TA####). - A technique is a way to reach that goal (ID
T####). - A sub-technique narrows a technique: the parent ID plus
.NNN, so T1552.005 is under T1552. - A procedure is how a real group or tool actually did it. Procedures have no ID; they're the "Procedure Examples" on each technique page.
Security people shorten the set to TTPs (tactics, techniques and procedures).
One technique can serve several tactics. T1078 Valid Accounts sits under Initial Access, Persistence, Privilege Escalation and Stealth: a stolen login gets you in, keeps you in, and blends in.
Each technique page lists platforms, procedure examples, mitigations (M IDs, such as M1032
Multi-factor Authentication) and, since v18, detection strategies.
The Enterprise matrix has 15 tactics in v20. Read them roughly left to right, but attackers loop:
Reconnaissance → Resource Development → Initial Access →
Execution → Persistence → Privilege Escalation → Stealth →
Defense Impairment → Credential Access → Discovery →
Lateral Movement → Collection → Command and Control →
Exfiltration → Impact
A recent change. v19 (April 2026) split Defense Evasion in two: Stealth (blending in) kept TA0005, and Defense Impairment (TA0112, breaking your controls) is new. Some techniques got new IDs: "disable or modify cloud logs" moved from T1562.008 to T1685.002 (the old page redirects). Older tools and vendor findings will use the old names for a while.
3. One catalog, several matrices
Enterprise techniques are tagged with platforms, and a "matrix" is a view filtered to some of them. v20.1 has 227 techniques and 479 sub-techniques. The views that matter for a typical API stack:
| Example stack | Matrix / platform | Example technique |
|---|---|---|
| AWS accounts, EC2, S3 | Cloud: IaaS | T1552.005 Cloud Instance Metadata API |
| IAM Identity Center, Okta | Cloud: Identity Provider | T1621 Multi-Factor Authentication Request Generation |
| GitHub, Slack, Confluence | Cloud: SaaS | T1213.005 Messaging Applications |
| EKS, containers | Containers | T1609 Container Administration Command (kubectl exec) |
| Kong and the APIs behind it | Linux, Containers, IaaS | T1190 Exploit Public-Facing Application |
The Containers matrix has 10 of the 15 tactics (no Reconnaissance, Resource Development, Collection, Command and Control or Exfiltration). Real attacks cross matrices: leave the pod and you're in IaaS.
4. Mapping a real incident: Capital One (L47)
To map an incident, ask of each step: which tactic did it serve, and which technique was it? L47's attack path becomes:
L47 step TACTIC TECHNIQUE
─────────────────────────────── ──────────────── ──────────
1 connects via TOR and a VPN Command and T1090.003
Control Multi-hop
Proxy
2 WAF made to fetch an internal Initial Access T1190
URL (SSRF) [reported]
3 IMDSv1 returns role keys Credential T1552.005
Access
4 uses the role's keys from Initial Access, T1078.004
outside AWS Stealth Cloud
Accounts
5 "ls": lists 700+ buckets Discovery T1619
6 "sync": copies the data Collection T1530
7 data ends up on her machine Exfiltration no neat fit
First, mapping is a judgment call: step 7 has no clean technique, because the "exfiltration" was the same S3 API call as the collection. Write down your reasoning. Second, each row is a question for your own estate: "Would we see this? Would anything stop it?" For row 3: IMDSv2 with hop limit 1 (L35), and an alert on instance credentials used outside AWS (L52).
5. How defenders use it
Coverage heatmaps. Score each technique that matters to you by how well you'd catch it:
TECHNIQUE SCORE
T1190 Exploit app ■■□ 2
T1552.005 Cloud IMDS ■■■ 3
T1078.004 Cloud accounts ■□□ 1
T1621 MFA push spam □□□ 0
T1619 Bucket discovery ■□□ 1
T1530 Cloud storage ■■□ 2
T1685.002 Disable cloud log ■■■ 3
0 = no data 1 = logged, no rule
2 = rule that alerts 3 = rule tested by simulation (L62)
Rows at 0 and 1 are your backlog. T1621 is 0 because IdP logs aren't in the SIEM: a logging gap (L60).
The ATT&CK Navigator is MITRE's free web app for this. It draws the matrix, lets you score, color and comment on techniques, and saves a JSON layer file. Layers combine: "techniques used by groups that target finance" minus "techniques we detect" leaves your gaps. A layer is just JSON, so you can generate it from your detection repo on every merge (L62).
ATT&CK IDs also tag detection rules (L62), let you check an advisory against your heatmap, and give red and purple teams a menu to test.
6. Where ATT&CK misleads
- Coverage percentages are vanity metrics. One narrow rule turns a technique green, and T1078 Valid Accounts can't be "covered" by any single rule: every real login looks like it.
- Not every technique matters to you. Prioritize by what attackers of companies like yours do (deep dive 2), not by filling the grid.
- It's built from public reporting, so it leans to Windows and lags new tricks.
- It's about behavior, not bugs. A BOLA flaw (L40) isn't a technique; exploiting it maps, at best, to T1190. CVEs and CWEs (L29) are a separate catalog.
- It's not a maturity model or a compliance checklist.
🧪 Worked example: mapping Uber (L28)
The same method on L28's timeline ([Uber] confirmed, [claim] attacker's claim):
| Step | Tactic | Technique | Source |
|---|---|---|---|
| Contractor's stolen password | Initial Access | T1078 Valid Accounts | [Uber] |
| Push spam until one is accepted | Credential Access | T1621 MFA Request Generation | [Uber] |
| WhatsApp message posing as IT | Stealth | T1684.001 Impersonation (new in v19) | [claim] |
| Logs in over the VPN | Initial Access, Persistence | T1133 External Remote Services | [claim] |
| Finds a network share | Discovery | T1135 Network Share Discovery | [claim] |
| Admin password in a script | Credential Access | T1552.001 Credentials In Files | [claim] |
| Pulls secrets from the PAM vault | Credential Access | T1555.005 Password Managers (closest fit) | [claim] |
| Reads Slack messages | Collection | T1213.005 Messaging Applications | [Uber] |
| Defaces internal pages | Impact | T1491.001 Internal Defacement | [Uber] |
Turned into questions for your estate:
- T1621. Do IdP MFA events reach the SIEM? "Five denied pushes, then an approve" is an easy rule once they do (L28's first deep dive).
- T1552.001. Would a credential committed to a repo or DAG be caught? (Secret scanning, L57.)
- T1555.005. Would one identity reading 50 secrets in an hour alert? (L62 builds this.)
No malware and no exploit, only valid credentials: that's why the Kill Chain fits Uber badly and ATT&CK fits it well.
🛠 Try it (optional, ~5 min)
Part 1: open attack.mitre.org/techniques/T1552/005/ and read Procedure Examples, Mitigations (look for IMDSv2) and Detection Strategy. Then open mitre-attack.github.io/attack-navigator/, create an Enterprise layer, and score T1552.005.
Part 2: ATT&CK is published as STIX JSON on GitHub (about 55 MB). List the Containers techniques:
mkdir -p ~/tmp/attack && cd ~/tmp/attack
curl -sSLo ea.json https://raw.githubusercontent.com/mitre-attack/\
attack-stix-data/master/enterprise-attack/enterprise-attack.json
jq -r '.objects[]
| select(.type=="attack-pattern")
| select((.revoked|not) and (.x_mitre_deprecated|not))
| select(.x_mitre_platforms | index("Containers"))
| "\(.external_references[0].external_id) \(.name)"' \
ea.json | sort | head -4
Output from v20.1 (48 lines in total):
T1036 Masquerading
T1036.005 Match Legitimate Resource Name or Location
T1036.010 Masquerade Account Name
T1046 Network Service Discovery
Change "Containers" to "IaaS" and compare. Which ones would show up in CloudTrail?
🧠 Key takeaways
- Tactic = why, technique = how, sub-technique = how exactly, procedure = what one actor really did.
- IDs are stable handles, but they change: v19 split Defense Evasion into Stealth and Defense Impairment.
- Cloud and Containers matrices are filtered views of one Enterprise catalog; real attacks cross them.
- Mapping an incident turns a story into questions: would we see this, would anything stop it?
- Score coverage honestly (no data, logged, alerting, tested); a grid percentage means little.
📖 Words to know
| Term | Meaning |
|---|---|
| ATT&CK | MITRE's public catalog of attacker tactics and techniques seen in real intrusions |
| Tactic | The attacker's goal at a step, such as Credential Access (ID TA####) |
| Technique | A way to achieve a tactic, such as Valid Accounts (ID T####) |
| Sub-technique | A narrower variant of a technique (ID T####.###) |
| Procedure | The specific way a real group or tool used a technique |
| Matrix | A grid of tactics (columns) and techniques, filtered to a domain or platform |
| ATT&CK Navigator | MITRE's web app for annotating the matrix; saves JSON "layers" |
⏭ Next time
L62 turns techniques into alerts: what a SIEM does, and how to write, test and tune a Sigma rule.
The Containers matrix on EKS: one attack path, step by step
The Containers matrix is small, and most people never look at it. Walking one realistic path through an EKS cluster shows which techniques matter and, more usefully, where the attacker leaves the container world for the cloud.
The path
A made-up quote-api pod in namespace pricing has a remote code execution bug. Its
ServiceAccount is bound, by mistake, to a Role that can create pods (L27's second deep dive).
1 RCE in quote-api ............ T1190 Exploit Public-Facing App
│ (Initial Access)
▼
2 read the mounted SA token ... T1528 Steal Application
│ /var/run/secrets/... Access Token (Credential Access)
▼
3 list pods, secrets, roles ... T1613 Container and Resource
│ Discovery (Discovery)
▼
4 create a privileged pod ..... T1610 Deploy Container
│ with hostPath: / (Execution)
▼
5 break out to the node ....... T1611 Escape to Host
│ (Privilege Escalation)
▼ ── leaves the Containers matrix ──
6 node's IMDS → node role ..... T1552.005 (Credential Access,
│ IaaS only)
▼
7 use the role from outside ... T1078.004 → T1530 (IaaS)
Step 2 is in ATT&CK's own words: the T1528 page says a compromised container's service account token can give "access to Kubernetes API commands". Step 6 is where L35's advice (IMDSv2, hop limit 1, pods with their own roles through IRSA or Pod Identity) cuts the path.
What sees each step
| Step | Technique | Where the evidence is |
|---|---|---|
| 1 | T1190 | Kong access logs (odd payloads, 500s), app logs |
| 2 | T1528 | Nothing directly: reading a file inside the pod isn't logged |
| 3 | T1613 | EKS audit log: list on secrets, roles by a workload SA that never lists |
| 4 | T1610 | EKS audit log: create pods with privileged: true or hostPath; admission policy should reject it (L51) |
| 5 | T1611 | Runtime security (Falco, GuardDuty Runtime Monitoring): new process on the host from a container |
| 6 | T1552.005 | Usually invisible; with hop limit 1 it fails |
| 7 | T1078.004 | CloudTrail: node role used from an outside IP (L52's second deep dive) |
Step 2 is the useful lesson: some techniques leave no log at all. You cover them by preventing them
(no token mounted unless the pod needs it, automountServiceAccountToken: false) and by catching
the next step, where the stolen token is used.
Worked example: a coverage note in a layer file
Turn the table into a Navigator layer so it shows up on the team heatmap. Scores use the scale from section 5; the comment records why:
{
"name": "EKS pricing cluster coverage",
"versions": {"attack": "20", "navigator": "5.3.2",
"layer": "4.5"},
"domain": "enterprise-attack",
"techniques": [
{"techniqueID": "T1528", "score": 0,
"comment": "No telemetry. Prevent: no automount."},
{"techniqueID": "T1613", "score": 2,
"comment": "Audit log rule: SA lists secrets"},
{"techniqueID": "T1610", "score": 3,
"comment": "Kyverno blocks privileged; tested"},
{"techniqueID": "T1611", "score": 1,
"comment": "GuardDuty runtime on, no triage rule"}
],
"gradient": {"colors": ["#ff6666", "#66cc66"],
"minValue": 0, "maxValue": 3}
}
The layer format (4.5) and Navigator version (5.3.2) are current as of late 2026; Navigator will offer to upgrade older layers when you open them. Upload it with Open Existing Layer.
🧠 Extra takeaways
- The Containers matrix covers the cluster; the moment an attacker reaches node credentials, you're in the IaaS matrix.
- T1528 (stealing a mounted service account token) leaves no log; prevent it and detect the token's use instead.
- The EKS audit log covers discovery and pod creation; runtime tools cover escapes; CloudTrail covers what happens after.
- Record why each score is what it is, so the next person can trust the heatmap.
Threat-informed defense: from group pages to your top detections
There are about 700 techniques and sub-techniques. You can't detect them all, and you shouldn't try. Threat-informed defense means choosing what to build by asking which techniques the attackers most likely to hit you actually use.
Groups, software and campaigns
Besides techniques, ATT&CK tracks:
- Groups (IDs
G####): named threat actors, with every technique they've been reported using. Example: LAPSUS$ (G1004), the group Uber linked to its attacker (L28). - Software (
S####): malware and tools, such as AADInternals (S0677). - Campaigns (
C####): specific operations within a time window.
For a financial company running on AWS and SSO, one natural pair to study is LAPSUS$ and Scattered Spider (G1015). Both are loose, largely young extortion crews known for phone-based social engineering, MFA fatigue and SaaS and cloud theft rather than custom malware.
Worked example: what do both groups do?
Using the STIX file from the Try it, list techniques reported for both groups. Groups link to
techniques through relationship objects of type uses:
cat > both.jq <<'EOF'
(.objects | map(select(.type=="intrusion-set"))
| map({key: .id, value: .external_references[0]
.external_id})
| from_entries) as $g
| (.objects | map(select(.type=="attack-pattern"
and (.revoked|not) and (.x_mitre_deprecated|not)))
| map({key: .id, value: "\(.external_references[0]
.external_id) \(.name)"})
| from_entries) as $t
| [.objects[] | select(.type=="relationship"
and .relationship_type=="uses" and (.revoked|not))
| select($g[.source_ref] == ("G1004", "G1015"))
| select($t[.target_ref])
| {g: $g[.source_ref], t: $t[.target_ref]}]
| unique | group_by(.t)
| map(select(length == 2) | .[0].t) | .[]
EOF
jq -r -f both.jq ea.json | sort
Against v20.1 this prints 21 techniques. A selection:
T1078.004 Cloud Accounts
T1098.003 Additional Cloud Roles
T1133 External Remote Services
T1213.003 Code Repositories
T1213.005 Messaging Applications
T1555.005 Password Managers
T1578.002 Create Cloud Instance
T1598.004 Spearphishing Voice
T1621 Multi-Factor Authentication Request Generation
T1684.001 Impersonation
The list reads like L28 replayed. Some entries (NTDS dumping, Windows domain groups) matter less if your crown jewels are in AWS and SaaS, so filter by the platforms you actually run.
From list to backlog
Score each remaining technique on three questions, then sort:
| Technique | Used by both? | Hits our crown jewels? | Current score | Priority |
|---|---|---|---|---|
| T1621 MFA request generation | Yes | Yes: SSO is the key to AWS | 0 (no IdP logs) | 1 |
| T1078.004 Cloud accounts | Yes | Yes | 1 | 2 |
| T1213.003 Code repositories | Yes | Yes: GitHub holds infra code | 1 | 3 |
| T1098.003 Additional cloud roles | Yes | Yes | 2 | 4 |
| T1578.002 Create cloud instance | Yes | Medium (cost, a foothold) | 2 | 5 |
The top of that table is your next quarter's detection work. Repeat it when a new advisory comes out. CISA advisories include ATT&CK tables precisely so you can do this.
Caveats. A group page lists what has been reported, not everything a group does, and attribution is often disputed (at the London trial, prosecutors said Uber's attacker acted on his own, not for LAPSUS$). Treat group pages as a strong hint, not a complete list.
🧠 Extra takeaways
- Prioritize techniques used by attackers who target companies like yours, not the whole grid.
- Group (
G), software (S) and campaign (C) pages tie techniques to real actors. - The STIX data makes it a five-minute query to compare groups, or a group against your heatmap.
- Group pages are incomplete and attribution is often uncertain; use them to rank, not to rule things out.
The quiz for this lesson and the Tests section need JavaScript.