APT29 — Adversary Emulation Playbook
Tier-3 Russian SVR espionage actor. Emulate stealth cloud-identity tradecraft, not
malware: APT29's modern signature is compromising identity (no-MFA password spray,
device-code/consent phishing), abusing OAuth applications and tokens for persistence, and
collecting mail/documents over residential proxies with a near-zero endpoint footprint.
Authorized red-team emulation only — every action runs under the engagement RoE.
When to emulate APT29
- Target is a cloud-first / hybrid-identity estate (Microsoft 365 + Entra ID, Okta, AWS IAM
Identity Center, Google Workspace) and the client wants their identity blast radius
tested the way a top-tier espionage actor would.
- Government, diplomatic, defense, think-tank, technology, or MSP targets (see the
industry → actor map in
../../references/apt-groups.md).
- The objective is quiet, long-dwell collection — not smash-and-grab.
ThreatProfile seed (plan/threat-profile.json)
{
"engagement_name": "<fill>",
"actor_name": "APT29-like (Cozy Bear / Midnight Blizzard)",
"actor_aliases": ["Cozy Bear", "Midnight Blizzard", "NOBELIUM", "The Dukes", "UNC2452"],
"group_id": "G0016",
"tier": "tier-3",
"sophistication": "nation-state",
"motivation": "espionage",
"initial_access": ["T1078.004", "T1110.003", "T1566.002", "T1195.002"],
"key_ttps": ["T1528", "T1550.001", "T1098.001", "T1098.003", "T1606.002", "T1114.002", "T1071.001", "T1090.003", "T1070.004"],
"tools": ["AADInternals", "ROADtools", "TokenTactics", "Sliver", "residential proxies"],
"infrastructure": ["Engagement-owned OAuth apps (consent abuse)", "Residential proxy egress", "Low-and-slow Graph/API calls"],
"recent_cti_delta": "2024-2026: malware-light cloud tradecraft — malicious OAuth app consent, device-code phishing, password spray against legacy/no-MFA tenants (Microsoft + HPE corporate breaches); SolarWinds-style CI/CD supply-chain remains in repertoire.",
"confidence": "probable"
}
Prune to RoE: if social engineering is out of scope, drop T1566.002; if only one cloud is
in scope, drop the others. A phase whose techniques are all pruned drops its kill-chain row.
Kill-chain emulation
Each row is a candidate OPPLAN objective. The orchestrator's OPPLAN-builder turns surviving
rows into add_objective calls; the executing agent loads the named skill.
| # |
Phase |
MITRE |
Emulated action |
Executing agent → skill |
| 1 |
Recon |
T1593 / T1589.002 |
Map tenant, federation, employees, exposed apps/OWA, email format |
recon → /skills/standard/recon/osint/SKILL.md, /skills/standard/recon/cloud-recon/SKILL.md |
| 2 |
Initial Access |
T1110.003 |
Slow password spray against legacy/no-MFA cloud auth |
exploit → /skills/standard/exploit/web/ato-methodology/SKILL.md |
| 3 |
Initial Access (alt) |
T1566.002 |
Device-code / consent phishing (Teams/email lure) |
phisher → /skills/standard/phisher/SKILL.md |
| 4 |
Initial Access (alt) |
T1195.002 |
CI/CD or dependency supply-chain foothold |
exploit → /skills/standard/exploit/supplychain/dep-confusion/SKILL.md |
| 5 |
Credential/Token |
T1528 / T1550.001 |
Steal & replay OAuth app access tokens (skip password+MFA) |
exploit → /skills/standard/exploit/web/oauth/SKILL.md |
| 6 |
Persistence (cloud) |
T1098.001 / T1098.003 |
Add app credentials + high Graph roles; consent malicious OAuth app |
cloud → /skills/standard/cloud/azure-managed-identity/SKILL.md, /skills/standard/cloud/aws-iam-passrole-chain/SKILL.md |
| 7 |
Lateral (identity) |
T1606.002 |
Golden SAML / federation-trust token forgery |
exploit → /skills/standard/exploit/web/saml/SKILL.md |
| 8 |
Collection |
T1114.002 |
Mailbox / document collection via Graph (canary mailbox) |
post-exploit → /skills/standard/post-exploit/credential-access/SKILL.md |
| 9 |
C2 |
T1071.001 / T1090.003 |
Sliver beacon over HTTPS via residential proxy |
post-exploit → /skills/standard/post-exploit/c2-sliver/SKILL.md |
| 10 |
Exfiltration |
T1567.002 |
Low-and-slow exfil of scoped collection set |
post-exploit → /skills/standard/post-exploit/reporting/SKILL.md |
Defense evasion (T1070.004 log/file cleanup, blending with admin activity) is cross-cutting —
the shared defense-evasion / opsec skills are auto-injected into every operational agent.
CONOPS kill_chain (copy into conops.json)
Collapse the table into the 5-phase ObjectivePhase model:
recon — tenant/identity/federation enumeration (rows 1).
initial-access — no-MFA password spray + consent phishing + optional supply-chain (2-4).
post-exploit — token theft, cloud role/cred persistence, Golden SAML, mailbox collection (5-8).
c2 — Sliver over HTTPS via residential proxy (9).
exfiltration — scoped, throttled collection exfil (10).
OPSEC & signature fidelity
- Low and slow. Spread the password spray over hours, one attempt per account; APT29 is
patient. No bursty auth.
- Egress from residential / reputable IP space, not a datacenter VPS, to defeat IOC-based
detection (mirror the real actor's residential-proxy obfuscation).
- Prefer tokens over passwords. Once an app token is held, stop touching passwords/MFA —
that is the whole point of the OAuth tradecraft.
- Blend with admin activity. Use Graph/PowerShell the way a tenant admin would; avoid
noisy endpoint tooling.
- Clean up consent grants and added credentials at engagement end (feeds
cleanup.json).
RoE / safety gates
- Identity takeover is high blast-radius. OAuth consent + added cloud roles can affect a
production tenant globally — require explicit, written cloud-tenant authorization. Prefer a
dedicated test tenant or a sandboxed app registration.
- Phishing requires social-engineering authorization and a lure-deconfliction pass
(
/skills/standard/phisher/lure-deconfliction/SKILL.md).
- Add an
EMERGENCY abort trigger to abort.json: "real (non-canary) user mailbox or
document collected, or consent granted on a non-engagement OAuth app."
Deconfliction
- Name every engagement OAuth app
redteam-<engagement-id>-* and record the app/client IDs
in deconfliction.json.
- Pin a known deconfliction egress IP range + a marker User-Agent string so the identity team
can separate the exercise from a real Midnight Blizzard sign-in.
- Pre-brief the identity/SOC team that no-MFA spray + consent grants are expected.
Fidelity notes (deviations)
- Emulate consent/token abuse with an engagement-owned app registration — never publish a
real malicious multi-tenant app.
- Use a canary mailbox/SharePoint site seeded with marked documents for the collection and
exfil phases; do not collect real PII or classified mail.
- Sliver replaces APT29's bespoke implants (WINELOADER, etc.); fidelity is the C2 channel
shape (HTTPS, jittered beacon, residential egress), not the binary.
1---2name: apt293description: APT29 (Cozy Bear / Midnight Blizzard, SVR) adversary-emulation playbook — malware-light cloud-identity espionage: no-MFA password spray, OAuth consent/token abuse, Golden SAML, mailbox collection over residential proxies. Use when emulating APT29 against an M365/Entra/AWS-identity estate. Triggers on: 'emulate APT29', 'Cozy Bear', 'Midnight Blizzard', 'NOBELIUM', 'OAuth abuse', 'cloud identity espionage', 'Golden SAML'.4---56# APT29 — Adversary Emulation Playbook78> Tier-3 Russian SVR espionage actor. Emulate **stealth cloud-identity tradecraft**, not9> malware: APT29's modern signature is compromising identity (no-MFA password spray,10> device-code/consent phishing), abusing OAuth applications and tokens for persistence, and11> collecting mail/documents over residential proxies with a near-zero endpoint footprint.12> Authorized red-team emulation only — every action runs under the engagement RoE.1314## When to emulate APT291516- Target is a cloud-first / hybrid-identity estate (Microsoft 365 + Entra ID, Okta, AWS IAM17 Identity Center, Google Workspace) and the client wants their **identity blast radius**18 tested the way a top-tier espionage actor would.19- Government, diplomatic, defense, think-tank, technology, or MSP targets (see the20 industry → actor map in `../../references/apt-groups.md`).21- The objective is quiet, long-dwell collection — *not* smash-and-grab.2223## ThreatProfile seed (`plan/threat-profile.json`)2425```json26{27 "engagement_name": "<fill>",28 "actor_name": "APT29-like (Cozy Bear / Midnight Blizzard)",29 "actor_aliases": ["Cozy Bear", "Midnight Blizzard", "NOBELIUM", "The Dukes", "UNC2452"],30 "group_id": "G0016",31 "tier": "tier-3",32 "sophistication": "nation-state",33 "motivation": "espionage",34 "initial_access": ["T1078.004", "T1110.003", "T1566.002", "T1195.002"],35 "key_ttps": ["T1528", "T1550.001", "T1098.001", "T1098.003", "T1606.002", "T1114.002", "T1071.001", "T1090.003", "T1070.004"],36 "tools": ["AADInternals", "ROADtools", "TokenTactics", "Sliver", "residential proxies"],37 "infrastructure": ["Engagement-owned OAuth apps (consent abuse)", "Residential proxy egress", "Low-and-slow Graph/API calls"],38 "recent_cti_delta": "2024-2026: malware-light cloud tradecraft — malicious OAuth app consent, device-code phishing, password spray against legacy/no-MFA tenants (Microsoft + HPE corporate breaches); SolarWinds-style CI/CD supply-chain remains in repertoire.",39 "confidence": "probable"40}41```4243Prune to RoE: if social engineering is out of scope, drop `T1566.002`; if only one cloud is44in scope, drop the others. A phase whose techniques are all pruned drops its kill-chain row.4546## Kill-chain emulation4748Each row is a candidate OPPLAN objective. The orchestrator's OPPLAN-builder turns surviving49rows into `add_objective` calls; the **executing agent** loads the named skill.5051| # | Phase | MITRE | Emulated action | Executing agent → skill |52|---|-------|-------|-----------------|-------------------------|53| 1 | Recon | T1593 / T1589.002 | Map tenant, federation, employees, exposed apps/OWA, email format | recon → `/skills/standard/recon/osint/SKILL.md`, `/skills/standard/recon/cloud-recon/SKILL.md` |54| 2 | Initial Access | T1110.003 | Slow password spray against legacy/no-MFA cloud auth | exploit → `/skills/standard/exploit/web/ato-methodology/SKILL.md` |55| 3 | Initial Access (alt) | T1566.002 | Device-code / consent phishing (Teams/email lure) | phisher → `/skills/standard/phisher/SKILL.md` |56| 4 | Initial Access (alt) | T1195.002 | CI/CD or dependency supply-chain foothold | exploit → `/skills/standard/exploit/supplychain/dep-confusion/SKILL.md` |57| 5 | Credential/Token | T1528 / T1550.001 | Steal & replay OAuth app access tokens (skip password+MFA) | exploit → `/skills/standard/exploit/web/oauth/SKILL.md` |58| 6 | Persistence (cloud) | T1098.001 / T1098.003 | Add app credentials + high Graph roles; consent malicious OAuth app | cloud → `/skills/standard/cloud/azure-managed-identity/SKILL.md`, `/skills/standard/cloud/aws-iam-passrole-chain/SKILL.md` |59| 7 | Lateral (identity) | T1606.002 | Golden SAML / federation-trust token forgery | exploit → `/skills/standard/exploit/web/saml/SKILL.md` |60| 8 | Collection | T1114.002 | Mailbox / document collection via Graph (canary mailbox) | post-exploit → `/skills/standard/post-exploit/credential-access/SKILL.md` |61| 9 | C2 | T1071.001 / T1090.003 | Sliver beacon over HTTPS via residential proxy | post-exploit → `/skills/standard/post-exploit/c2-sliver/SKILL.md` |62| 10 | Exfiltration | T1567.002 | Low-and-slow exfil of scoped collection set | post-exploit → `/skills/standard/post-exploit/reporting/SKILL.md` |6364Defense evasion (T1070.004 log/file cleanup, blending with admin activity) is cross-cutting —65the shared `defense-evasion` / `opsec` skills are auto-injected into every operational agent.6667## CONOPS kill_chain (copy into `conops.json`)6869Collapse the table into the 5-phase `ObjectivePhase` model:70711. `recon` — tenant/identity/federation enumeration (rows 1).722. `initial-access` — no-MFA password spray + consent phishing + optional supply-chain (2-4).733. `post-exploit` — token theft, cloud role/cred persistence, Golden SAML, mailbox collection (5-8).744. `c2` — Sliver over HTTPS via residential proxy (9).755. `exfiltration` — scoped, throttled collection exfil (10).7677## OPSEC & signature fidelity7879- **Low and slow.** Spread the password spray over hours, one attempt per account; APT29 is80 patient. No bursty auth.81- **Egress from residential / reputable IP space**, not a datacenter VPS, to defeat IOC-based82 detection (mirror the real actor's residential-proxy obfuscation).83- **Prefer tokens over passwords.** Once an app token is held, stop touching passwords/MFA —84 that is the whole point of the OAuth tradecraft.85- **Blend with admin activity.** Use Graph/PowerShell the way a tenant admin would; avoid86 noisy endpoint tooling.87- **Clean up** consent grants and added credentials at engagement end (feeds `cleanup.json`).8889## RoE / safety gates9091- **Identity takeover is high blast-radius.** OAuth consent + added cloud roles can affect a92 production tenant globally — require explicit, written cloud-tenant authorization. Prefer a93 **dedicated test tenant** or a sandboxed app registration.94- **Phishing requires social-engineering authorization** and a lure-deconfliction pass95 (`/skills/standard/phisher/lure-deconfliction/SKILL.md`).96- Add an `EMERGENCY` abort trigger to `abort.json`: *"real (non-canary) user mailbox or97 document collected, or consent granted on a non-engagement OAuth app."*9899## Deconfliction100101- Name every engagement OAuth app `redteam-<engagement-id>-*` and record the app/client IDs102 in `deconfliction.json`.103- Pin a known deconfliction egress IP range + a marker User-Agent string so the identity team104 can separate the exercise from a real Midnight Blizzard sign-in.105- Pre-brief the identity/SOC team that no-MFA spray + consent grants are *expected*.106107## Fidelity notes (deviations)108109- Emulate consent/token abuse with an **engagement-owned** app registration — never publish a110 real malicious multi-tenant app.111- Use a **canary mailbox/SharePoint site** seeded with marked documents for the collection and112 exfil phases; do not collect real PII or classified mail.113- Sliver replaces APT29's bespoke implants (WINELOADER, etc.); fidelity is the C2 *channel114 shape* (HTTPS, jittered beacon, residential egress), not the binary.