junyamade

Case study · Oct 2026

Lookout: a home SOC lab, triaged for real.

I wanted to prove two things: that I can do real SOC work end to end, and that I can use AI inside a security workflow without letting it make the decisions. So I built the whole loop — attack, collect, detect, triage, write up — and published it.

  • RoleSolo — lab, detections, console, write-ups
  • StackWazuh 4.14.8 · Sysmon 15.22 · Atomic Red Team 2.3 · Next.js 16 · Postgres · Claude
  • StatusLive, public, read-only demo (sanitised lab data)

01 · The lab

Attacker, victim and SIEM — isolated.

Host-only network: the victim is never exposed. Real hostnames, users and IPs are replaced with placeholders before anything leaves the lab.

02 · Findings

The defaults caught 4 of 8.

The most serious miss — LSASS credential dumping, the technique behind Mimikatz — wasn’t a rule problem first. Sysmon wasn’t collecting the access at all. I enabled ProcessAccess logging, then wrote the rule.

Eight ATT&CK techniques run against the lab, whether default Wazuh rules caught them, and the custom rule I wrote
TechniqueWhat it isDefault WazuhMy ruleWhat I found
T1033System owner / user discoveryDiscoveryMissed100020whoami left no trace in the alert queue at all
T1059.001Encoded PowerShellExecutionCaughtnot neededflagged by script-block logging, but only at level 4
T1547.001Registry Run keyPersistenceMissed100030Sysmon logged it; no default rule raised it
T1053.005Scheduled taskPersistencePartial100050caught the dropped script, not the task itself
T1136.001Create local accountPersistenceCaughtnot neededcaught cleanly by the defaults
T1003.001LSASS memory dumpCredential accessMissed100010the headline gap — a telemetry gap, not just a rule gap
T1070.004File deletionDefense evasionCaughtnot neededcaught, at a low level worth raising
T1560.001Archive for exfil (makecab)CollectionMissed100040a living-off-the-land tool nothing flagged

03 · Detections

Five rules, levels chosen on purpose.

Each rule is mapped to ATT&CK and has a severity that reflects how often the behaviour is legitimate.

Custom Wazuh rules
RuleLevelATT&CKDetectsNotes
10001012T1003.001Credential dumping — a process opened LSASS memoryValidated. Needed Sysmon ProcessAccess turned on first; now flags normal svchost.exe access too, which I document as a known false positive.
10003010T1547.001Persistence — registry Run key value setPromotes Sysmon event 13 on Run keys to an alert.
1000508T1053.005Persistence — scheduled task created from the command lineNames the technique the defaults only caught indirectly.
1000408T1560.001Collection — archiving tool launchedWatches living-off-the-land archivers such as makecab.exe.
1000206T1033 · T1082 · T1016Discovery — recon binary executedLow level on purpose: recon is common, so it adds context rather than noise.
Lookout alert detail with key fields, process tree, ATT&CK mapping and raw event

04 · The console

Every alert, the whole story.

Built for triage speed: keyboard triage (j/k/enter/t/f/e), filters in the URL, near-duplicate grouping, process trees, raw events and analyst notes.

  • Triage assist a likely verdict with reasoning and next checks
  • Explain this log plain-English meaning of any field
  • Natural-language search turned into a typed filter, never SQL
  • Clustering near-duplicate alerts grouped (deterministic, no LLM)
  • Case report drafting a first draft I edit
  • Rule assistant suggests detection logic to review
  • False-positive tuning suggests exclusions, with the trade-off
  • Accuracy tracker how often the AI matched my verdict — including misses

05 · Using AI safely

The model is a risk to manage.

Logs are untrusted input

Sent to the model inside delimiters, with instructions that they are data to analyse — never commands. That is the prompt-injection defence.

Output is validated, never executed

Every response must match a strict zod schema or it is rejected. Model output never triggers an action by itself.

Search becomes a typed filter

Natural-language questions are turned into a constrained filter object, never raw SQL.

Keys and costs stay controlled

The API key is server-side only; results are cached and calls go through a database-backed daily rate limit, so a public demo can’t run up a bill.

07 · Lessons

What the lab taught me.

01

A detection gap can be a telemetry gap.

You can’t alert on what you don’t collect — check the endpoint, not just the SIEM.

02

A rule that fires isn’t finished.

False positives are where tuning starts. I document them.

03

AI output is data, not instructions.

Validated, never executed. I make the final call.

Walkthrough

Want me to triage it live?

I’ll share my screen, run an alert end to end and explain every decision.