Detection and response notes · Part 3 of 3

Working a simulated SOC case with a bounded AI step

How I use AI agents to speed up the tedious parts of SOAR work, gathering, normalising, grouping and drafting, and where the playbook stops them so a person makes the call. Walked through on a simulated case.

I use AI agents to take the slow, repetitive parts out of security orchestration, automation and response (SOAR) work, so my attention goes to the decision. This entry shows which tasks I hand to an agent, what each one produces, and the gate that stops an agent from acting on its own.

The case is simulated. The events, the playbook run and the model call are sample evidence built on the same simulated day as the rest of the console. I have not measured time saved, so there is no speed claim here; the method for measuring one is at the end.

What I hand to an agent

  • Gathering and normalising evidence. Windows events and firewall records arrive in different shapes. The agent maps them into one schema so they can be compared at all.
  • Grouping duplicates. Seven alerts about the same account and machine are one observation, not seven.
  • Drafting the case note. A first draft with the facts, the open questions and the evidence references, which I then edit.
  • Recommending a next step. A bounded choice with an uncertainty attached, never an action.
  • Keeping the record honest. Outside this case, I keep my lab handoff notes with an assistant, and every fact is tagged confirmed, historical, proposed or unknown. That discipline is why this site can say which statuses come from a record.

What I do not hand over: closing a case, changing an account, isolating a machine, or deciding that two observations are the same incident.

The question

Seven failed logons hit the file server FS-01 within a few minutes, all for one account and all from the workstation WS-02. In the same quarter hour, Sophos denied WS-02 five times on its way to a SOC dashboard. Is this an attack, a mistake, or two unrelated things that happen to share a workstation?

The pipeline, stage by stage

SOC-0142 · AI-assisted SOAR pipeline

simulated case · substituted names and addresses

Wazuh rules (simulated) · 12 alerts in 15 minutes

  1. 08:14 Multiple failed logons (4625) · FS-01
  2. 08:15 Multiple failed logons (4625) · FS-01
  3. 08:16 Multiple failed logons (4625) · FS-01
  4. 08:16 Firewall deny burst · WS-02
  5. 08:17 Multiple failed logons (4625) · FS-01
  6. 08:18 Multiple failed logons (4625) · FS-01
  7. 08:19 Multiple failed logons (4625) · FS-01
  8. 08:19 Firewall deny burst · WS-02
  9. 08:20 Multiple failed logons (4625) · FS-01
  10. 08:22 Firewall deny burst · WS-02
  11. 08:25 Firewall deny burst · WS-02
  12. 08:28 Firewall deny burst · WS-02
How the stages were produced: 2 and 3 are deterministic code over the simulated fixture, so anyone rebuilding the site gets the same output. 4 and 5 are sample agent output written for this simulation; no model was called and no time was measured.

Where the agent saves time, and where I check the evidence

Step What the agent speeds up What I still check myself
Gather Pulling the 4625 events and Sophos records for the window into one list That the window and hosts are the right ones, and no source is missing
Normalise Mapping two log formats onto one schema One raw event against its normalised row, field by field
Group Folding seven alerts into one observation That the grouping key (account plus workstation) did not swallow a different source
Draft A first case note with facts, open questions and references Every claim in the note against the event it cites
Recommend A bounded choice with an uncertainty Whether the evidence supports that choice; the agent’s confidence is not evidence
Decide Nothing The disposition, and whether the firewall deny belongs in the case

The pattern is the same in every row: the agent saves the typing and the sorting, and I keep the judgement and the verification. The last row stays empty on purpose.

The replay

SOC-0142 Failed-logon cluster on FS-01 7 Nov 2026

simulated case · substituted names and addresses
  1. Windows Security → Wazuh agent

    08:14 UTC Windows event

    FS-01 writes event 4625 for each failed network logon. The Wazuh agent ships the Security log entries I selected, so the manager sees each failure within seconds.

  2. Wazuh → CoPilot · Graylog

    08:21 UTC Alert becomes a case

    Repeated failures from one source match a Wazuh frequency rule. CoPilot reads the alert from the indexer and opens SOC-0142; Graylog supplies the Sophos denies from the same window as a related observation.

  3. Shuffle · read-only

    08:21 UTC Read-only enrichment

    A Shuffle workflow looks up the account and the workstation. Every call is a read: no password reset, no isolation, nothing that changes the lab.

  4. AI agent · Jev

    08:22 UTC Agent draft and recommendation

    An agent drafts the triage note and cites E1 to E4 for every claim. Jev is asked one bounded question with typed choices and returns request context, with medium uncertainty: a bad-password sub status right after a password change fits a stale saved credential better than guessing.

    request contextanalyst reviewcandidate for closureuncertainty: medium

  5. Shuffle approval gate

    08:22 UTC Approval gate

    The workflow stops. Ambiguity and any closure recommendation go to a person, and disabling the account or isolating WS-02 would need explicit approval, so no automated action runs.

  6. Analyst in CoPilot

    08:40 UTC Analyst disposition

    I read the draft against the evidence, keep the case open as likely benign pending the account owner confirming the saved credential, and leave the firewall deny linked as its own observation.

Evidence

  • E1 7 × event 4625 on FS-01

    Windows Security · Wazuh agent

    Account LAB\student01, logon type 3 (network), sub status 0xC000006A (bad password), workstation WS-02, 08:14 to 08:20 UTC.

  • E2 5 × Sophos deny from WS-02

    Sophos syslog · Graylog

    WS-02 to soc-ui.lab.example on TCP 443, rule “Identity to SOC”, 08:16 to 08:28 UTC.

  • E3 Directory context for LAB\student01

    AD lookup (sample)

    Account exists and is enabled, member of Lab Users, password changed at 08:05 UTC.

  • E4 Workstation context for WS-02

    Asset notes (sample)

    Domain-joined workstation with a mapped drive to \\FS-01\share saved under the old password.

Decision log
UTCActorEntryEvidence
08:21Playbook v3 (sample)Case created from 7 alerts; 5 firewall denies attached as relatedE1E2
08:21Playbook v3 (sample)Account and workstation context attachedE3E4
08:22Triage agent (simulated)Draft note written; each statement cites its evidenceE1E2E3E4
08:22Jev (simulated)Recommendation: request context · uncertainty mediumE1E3E4
08:22Policy gateHeld for analyst; no automated action permitted
08:40AnalystOpen · likely benign, awaiting owner confirmation; deny kept separateE2E4

Step through the case or press Play. Evidence stays on screen as the decision state changes, and the decision log ties each entry to the evidence it rests on.

Open the full lab console

What the playbook does

  1. Collect and deduplicate. The 4625 events and the Sophos records arrive as separate alerts. The playbook folds the logon failures into one case and attaches account, endpoint, time and source context.
  2. Ask a bounded question. It asks TypeSafe’s Jev to choose between typed options: request context, analyst review, or candidate for closure. The answer comes back with an uncertainty, and both are stored next to the evidence that produced them.
  3. Apply explicit rules. Ambiguity, missing context, a timeout or conflicting evidence goes to a person. A recommendation to close only prompts an analyst. Disabling an account or isolating a host needs explicit approval.
  4. Record the decision. The case keeps its ID, the evidence references, the playbook version, the model identifier, the recommendation, the human action and the outcome.

Why the firewall deny stays separate

The playbook can put the logon events and the firewall record in front of me. Jev can recommend where the case goes next. I still have to explain why a firewall deny belongs in the same case, or why I would leave it separate. Here it targets a different host and port, so I link it as its own observation and keep it out of the evidence for a password attack.

Try the investigation yourself

analyst@training:~$simulated investigation · substituted names and addresses0 of 4 clues

Type help to list commands. Start with brief.

Fixed commands over the simulated fixture. Nothing typed here reaches a real system.

The terminal is a training room in the style of TryHackMe: fixed commands over the simulated data, and a decision at the end. It is deliberately separate from the replay so the guided version does not blur into the evidence.

How I would measure the time saved

Run the same five-case set twice: once by hand, once with the pipeline, starting a timer at the first alert and stopping at a disposition I would sign. Keep the cases, the fixture and the scoring rules public, count only my time, and report both medians with the spread. This page publishes no speed number, because none has been measured that way.

The Kali Red and Blue page shows where test activity like this comes from, and how Kali Blue’s evidence feeds the same kind of case.

What I learned

Working through SOC-0142 changed what I ask an agent for. I stopped asking it for answers and started asking it for well-sorted evidence and a bounded suggestion. The step that matters most, deciding whether the firewall deny is part of the story, is exactly the one the agent cannot make for me, because it depends on why WS-02 was talking to that dashboard.

Takeaway: let an agent gather, normalise, group and draft. Before signing anything, check one raw event against the agent’s version of it.

Further reading: TypeSafe’s introduction to Jev · Windows event 4625

Skills used

  • Triage with an evidence trail
  • Deciding which SOAR steps an agent may take
  • Keeping a human approval gate

All skills, grouped by what job postings ask for

Tools in this entry

Every tool and its documentation