Tabletop Exercises
Incident-response interviews often run as a tabletop: the interviewer gives you a situation, you say what you'd do, then they reveal what happens next. These two scenarios work the same way. Read each update, answer out loud before opening the model answer, then move on. Turn on Practice mode at the top of the page to blur the answers; every question also appears on the practice page with spaced repetition.
Memory hookevery answer has four partsSafety and scope (who and what is affected, is anyone in danger), contain (the smallest action that stops it getting worse), preserve (evidence you'll need later), communicate (who needs to know, by when). If your answer covers all four in under a minute, it's a strong answer.
Scenario 1 — A Leaked Cloud Key at 2 a.m.
You are the on-call security engineer for a company running on AWS. It's 02:07 on a Saturday.
Update 1 (02:07)Amazon GuardDuty raises a high-severity finding: Discovery:IAMUser/AnomalousBehavior for the IAM user ci-deployer, which is calling GetCallerIdentity, ListBuckets and ListUsers from an IP address in a hosting provider you don't use.
I treat it as a likely leaked long-term key, because a CI user calling identity and listing APIs from an unknown hosting IP is classic post-leak reconnaissance. First I confirm in CloudTrail which access key ID was used and from where, then I contain by deactivating that access key, not deleting it, so evidence and attribution survive, and I check whether the pipeline breaks, which tells me the key really was in use. I preserve a CloudTrail export for the user from the last 30 days, open an incident channel, and page the CI owner. If the key is in a public repository, I also check GitHub's secret-scanning alerts for when it was exposed.
Update 2 (02:31)The key is deactivated. CloudTrail shows that at 01:52, fifteen minutes before the alert, the same IP called CreateUser (backup-svc), CreateAccessKey for it, and AttachUserPolicy with AdministratorAccess. The new user's key is active and is now calling ListBuckets.
It means the attacker already has persistence through a new admin identity, so deactivating the original key was necessary but not enough. I immediately deactivate the backup-svc access key, attach an explicit deny-all policy to that user, then search CloudTrail for every action by both identities: other new users, roles, access keys, login profiles, trust-policy changes, new Lambda functions or EC2 instances. Anything they created gets the same treatment. I escalate severity, because the attacker had administrator rights, and bring in the incident commander and the cloud platform team.
Update 3 (03:10)You find a burst of GetObject calls from the attacker's IP against prod-customer-exports, an S3 bucket holding CSV exports of customer records. About 40 GB was downloaded between 02:00 and 02:25.
This is now a data breach, not just an intrusion, so the work splits. On the technical side I confirm exactly which objects were read from the S3 server-access or CloudTrail data-event logs, so we can say what was taken rather than guess, and I make sure containment holds. On the business side I hand the scope to the incident commander, who pulls in legal and privacy, because regulatory clocks may have started: GDPR's 72-hour notification runs from awareness if EU personal data is involved. I don't notify customers myself; I give legal an accurate, evidenced scope so they can decide. I also rotate any secrets that could have been in those exports.
Update 4 (09:00)The attacker is locked out, scope is established, and the leaked key is traced to a .env file a developer accidentally committed to a public GitHub repo three days ago.
I run a blameless post-mortem focused on the system, not the developer. The immediate fixes: move CI to short-lived credentials with GitHub OIDC federation so there's no long-term key to leak, add pre-commit and server-side secret scanning to catch .env files before they're pushed, and put the customer-export bucket behind tighter access with alerting on bulk reads. I'd also ask why reconnaissance ran for fifteen minutes before anyone was paged, and whether GuardDuty's create-user and admin-attach findings should trigger automatic key deactivation. The measure of success is a specific, owned action item for each link in the chain.
Scenario 2 — The Finance Team Can't Open Their Files
You are the security lead at a mid-sized manufacturer. It's 16:40 on a Thursday.
Update 1 (16:40)The IT help desk escalates: three people in finance say files on a shared drive have turned into gibberish with a .locked extension, and a text file called RESTORE_YOUR_FILES.txt appeared in each folder. It mentions a Tor chat link and a deadline.
I declare a ransomware incident and assume it's still spreading, because file encryption is the last step of an intrusion that has been going for days. I move the team to an out-of-band channel, since the attacker may be reading email and Teams, and I contain fast: isolate the affected hosts and the file server through EDR or by pulling network access, rather than powering them off so memory evidence survives. I disable the accounts involved and start identifying the ransomware family from the note and extension. In parallel I check whether our backups are intact and get them offline, and I call our cyber-insurer, who often must be notified before we engage anyone.
Update 2 (17:15)EDR shows the encryption ran from a finance workstation whose user has local admin. Ninety minutes earlier, that host made large outbound transfers to a file-sharing site. The backup server is reachable from the same network and its last snapshot is from last night.
The outbound transfer means this is double extortion: they stole data before encrypting, so even a clean restore doesn't make the problem go away, and legal needs to know personal or contract data may be published. The backup being reachable from the infected network worries me, because attackers routinely delete or encrypt backups first, so I verify the snapshot is actually intact and immediately take it offline or make it immutable. I keep scoping: how the attacker got admin, which other hosts they touched, and whether domain accounts are compromised, because if they reached the domain, the whole environment is suspect.
Update 3 (18:30)The intrusion traces back to a VPN account without MFA, logged in from abroad five days ago. The attacker reached a domain admin account and moved to several servers. Leadership asks: "Can we just pay and get the key?"
I frame it as their decision with legal, and give honest inputs rather than a yes or no. Can we recover from backups in a timeframe the business survives: if last night's snapshot is intact and tested, that's our leverage to not pay. Is it legal: if the group or its wallet is sanctioned, paying can itself break the law, so legal must check. And what payment doesn't buy: decryptors are often slow, and paying doesn't reliably get stolen data deleted, as Change Healthcare found in 2024 when a second group extorted them with the same data. I'd also check No More Ransom for a free decryptor for this family before anyone considers paying.
Update 4 (Friday)Leadership decides not to pay; backups are intact. You're planning recovery across the domain-admin-compromised environment.
Identity first, because everything trusts it: with a domain admin compromised I rebuild or clean Active Directory, reset the krbtgt account twice, reset all privileged and service accounts, and remove persistence, or the attacker just re-encrypts what I restore. Then core infrastructure: DNS, DHCP, the backup system, EDR and logging, so I can see what happens as systems come back. Then the crown-jewel business services in the order the continuity plan sets, restored from backups that predate the intrusion and patched with EDR before they touch the network. Everything else last, rebuilt from clean images where possible. And the entry point gets fixed before anyone reconnects: MFA on every remote-access path.
How to Run These on Yourself
-
Read one update at a timeReadper step
- Cover the model answer; don't read ahead
-
Say your answer out loud, timedAnswer60 sec
- Hit all four parts: safety/scope, contain, preserve, communicate
-
Open the model answerCompareper step
- Note what you missed, not just whether you were "right"
-
Mark it on the practice pageRateafter
- Nailed / shaky / blank, so shaky ones come back sooner
🎯On the job. Real tabletop exercises run the same way for a whole team, usually quarterly: a facilitator walks a scenario, each role says what they'd do, and the output is a list of gaps, such as "nobody knew who declares an incident" or "the out-of-band contact list was out of date." The point isn't to pass; it's to find those gaps while it's an exercise and not a breach.