What You'll Learn
- Apply the 5-step investigation workflow — Read, Enrich, Pivot, Correlate, Decide — to any alert
- Extract the critical fields from a raw Wazuh alert JSON and determine what actually fired
- Enrich alerts using the five context dimensions (asset, user, temporal, geographic, behavioral) from Lesson 4.2
- Pivot in four directions from a single alert — same host, same user, same source IP, same technique
- Build an attack timeline from correlated events and map findings to the kill chain
- Make a confident triage decision (true positive, false positive, or escalate) and document it properly
- Manage investigation time using the 10-minute rule for Tier 1 triage
The Difference Between Reacting and Investigating
A new analyst sees an alert and asks: "Is this bad?" A senior analyst sees the same alert and asks: "What story does this alert begin to tell, and what other evidence would confirm or deny it?"
That shift — from reacting to investigating — is the single most important skill transition in a SOC career. Lessons 4.1 and 4.2 gave you the classification framework and the context dimensions. This lesson gives you the workflow — the repeatable, step-by-step process that turns a raw alert into a confident verdict.
Every experienced analyst follows this workflow, whether they realize it or not. Some do it in 90 seconds on a routine false positive. Others spend 45 minutes on a complex chain of suspicious events. But the steps are always the same.
The 5-Step Investigation Workflow
| Step | Action | Time Target | Output |
|---|---|---|---|
| 1. Read | What fired? What rule? What severity? Read the raw event. | 30 seconds | Understanding of the alert |
| 2. Enrich | Add context — asset, user, temporal, geographic, behavioral | 1-2 minutes | Contextualized alert |
| 3. Pivot | Search for related events in four directions | 2-4 minutes | Related evidence |
| 4. Correlate | Build the story — isolated event or attack chain? | 1-2 minutes | Timeline + kill chain map |
| 5. Decide | TP → escalate. FP → document and close. Ambiguous → collect more, set time limit. | 30 seconds | Verdict + documentation |
Total target: 5-10 minutes for a Tier 1 analyst on a standard alert. Complex investigations that exceed this window get escalated — not abandoned.
Step 1: READ — What Actually Fired?
Before you do anything, read the raw alert. Not the summary. Not the title. The actual event data. Summaries lie — they truncate, they simplify, they strip context. The raw JSON never lies.
Here's a real alert from Wazuh. Take 30 seconds and read every field:
{
"rule": {
"id": "5551",
"level": 10,
"description": "Multiple SSH authentication failures",
"groups": ["syslog", "sshd", "authentication_failures"],
"mitre": {
"id": ["T1110.001"],
"tactic": ["Credential Access"],
"technique": ["Brute Force: Password Guessing"]
}
},
"agent": {
"id": "001",
"name": "linux-web-01",
"ip": "10.0.0.10"
},
"data": {
"srcip": "185.220.101.42",
"srcport": "44892",
"dstuser": "root"
},
"timestamp": "2026-02-23T02:47:33.000+0000",
"location": "/var/log/auth.log"
}
In 30 seconds, you should extract these facts:
| Field | Value | What It Tells You |
|---|---|---|
rule.id | 5551 | Multiple SSH auth failures — not a single failure, a pattern |
rule.level | 10 | High severity in Wazuh's 0-15 scale |
rule.mitre | T1110.001 | Brute Force: Password Guessing — ATT&CK mapped |
agent.name | linux-web-01 | The target host — your web server |
data.srcip | 185.220.101.42 | The source of the attack — external IP |
data.dstuser | root | Targeting the root account specifically |
timestamp | 02:47 UTC | Middle of the night (if your org is US-based) |
location | /var/log/auth.log | Source log — SSH authentication log on Linux |
Never skip the raw event. A common Tier 1 mistake is reading only the alert title ("Multiple SSH authentication failures") and immediately classifying it. The title doesn't tell you that the target is root on a production web server at 2:47 AM from a known Tor exit node. Those details change the severity from "routine" to "needs immediate attention."
What to Extract on Every Alert
Build the habit of extracting these seven fields from every alert, regardless of type:
- What rule fired — ID, description, severity level
- What host was involved — agent name, IP, role in the environment
- Who was involved — username, account type, privilege level
- Where did it come from — source IP, source port, geographic origin
- When did it happen — exact timestamp, relative to business hours
- What log source generated it — auth.log, sysmon, firewall, web server
- What ATT&CK technique maps to it — tactic and technique ID
Step 2: ENRICH — Add Context
Raw data tells you what happened. Context tells you whether it matters. In Lesson 4.2, you learned the five context dimensions. Now apply them systematically to the SSH brute-force alert:
| Dimension | Question | Finding |
|---|---|---|
| Asset | What is linux-web-01? | Production web server, Tier 2, internet-facing |
| User | Who is "root"? | Superuser account — highest privileges on the system |
| Temporal | 02:47 UTC — normal? | Outside business hours for US-based org. No maintenance window scheduled. |
| Geographic | Where is 185.220.101.42? | Known Tor exit node (check AbuseIPDB, GreyNoise, or your TI feeds) |
| Behavioral | Are SSH failures normal on this host? | Check baseline: if this host sees 50 failed SSH attempts/day from scanners, another 50 is noise. If it normally sees 2, this is a 25x deviation. |
Enrichment speed depends on tooling. In a mature SOC, your SIEM auto-enriches alerts with asset tier, GeoIP, and threat intel lookups. In the CyberBlueSOC lab, you'll do this manually — which is actually better for learning. You need to understand what enrichment data means before you trust automated enrichment.
GeoIP and Threat Intel Lookups
For the source IP 185.220.101.42, a quick lookup reveals:
AbuseIPDB: Confidence Score 100% — reported 2,847 times
GreyNoise: Classification: malicious — known scanner
Tor Project: Listed as exit node
GeoIP: Germany (DE), AS205100 — F3 Netze e.V.
This enrichment immediately shifts your assessment. This isn't an employee mistyping their password. This is a known malicious IP associated with thousands of abuse reports, running through the Tor network.
Step 3: PIVOT — Search for Related Events
A single alert is a data point. Multiple related alerts are a story. Pivoting means searching for other events connected to your alert — expanding your view from a single dot to the full picture.
There are four pivot directions. Run all four on every investigation.
Pivot 1: Same Host (±30-Minute Window)
Question: What else happened on linux-web-01 in the 30 minutes before and after this alert?
In Wazuh, filter by agent name and time range:
agent.name: "linux-web-01" AND timestamp:[2026-02-23T02:17:00 TO 2026-02-23T03:17:00]
What you're looking for:
- Other authentication failures (escalating brute force?)
- Successful authentication after failures (brute force succeeded?)
- New process execution (post-compromise activity?)
- File integrity changes (persistence mechanism installed?)
- Sudo or privilege escalation events
- Outbound connections to unusual IPs (C2 callback?)
Critical pattern: If you see SSH failures followed by a successful SSH logon from the same source IP, the brute force likely succeeded. This changes your alert from "attempted attack" to "probable compromise" and demands immediate escalation.
Pivot 2: Same User
Question: Has the root account been targeted or used anywhere else recently?
data.dstuser: "root" AND timestamp:[2026-02-23T00:00:00 TO 2026-02-23T03:17:00]
What you're looking for:
- Is root being targeted on multiple hosts? (Coordinated campaign)
- Any successful root logons from unexpected sources?
- Sudo-to-root escalations from compromised user accounts?
Pivot 3: Same Source IP
Question: Is 185.220.101.42 hitting other systems in our environment?
data.srcip: "185.220.101.42"
What you're looking for:
- Same IP targeting multiple hosts → automated scanning campaign
- Same IP targeting multiple services (SSH, HTTP, RDP) → reconnaissance
- Same IP appearing in Suricata alerts → network-level detection correlation
- Same IP in firewall deny logs → how many attempts were blocked?
Pivot 4: Same Technique
Question: Are other IPs also brute-forcing SSH across our environment right now?
rule.id: "5551" AND timestamp:[2026-02-23T02:00:00 TO 2026-02-23T03:00:00]
What you're looking for:
- Multiple source IPs hitting the same target → distributed brute force
- Same rule firing across many hosts → worm-like propagation or mass scanning
- Increase in frequency compared to baseline → active campaign vs background noise
Why ±30 minutes? Attack chains unfold over minutes, not hours. If an attacker brute-forces SSH at 02:47, you'd expect post-compromise activity (file drops, lateral movement, C2 callbacks) within 5-30 minutes. A 30-minute window on each side captures the attack chain without drowning you in unrelated noise. For slow-and-low attacks, expand to ±2 hours.
Step 4: CORRELATE — Build the Story
Pivoting gives you related events. Correlation turns those events into a narrative. The question shifts from "what happened?" to "is this an isolated event or part of an attack chain?"
Building a Timeline
Arrange your pivot findings chronologically:
| Time (UTC) | Source | Event | Kill Chain Stage |
|---|---|---|---|
| 02:31 | fw-edge-01 | Firewall: allow inbound SSH from 185.220.101.42 to 10.0.0.10 | Reconnaissance |
| 02:31-02:47 | linux-web-01 | Rule 5551: 847 failed SSH attempts, user=root | Initial Access (attempted) |
| 02:47 | linux-web-01 | Rule 5551: Alert threshold triggered (level 10) | Detection |
| 02:48 | linux-web-01 | Rule 5715: Successful SSH logon, user=root, src=185.220.101.42 | Initial Access (success) |
| 02:49 | linux-web-01 | Rule 550: New user "svc-backup" added | Persistence |
| 02:51 | linux-web-01 | Rule 18152: Process curl downloading from 91.234.56.78 | Command & Control |
| 02:53 | dns-server-01 | Rule 87702: DNS query to known C2 domain | Command & Control |
| 02:55 | linux-web-01 | Rule 100002: FIM — /etc/crontab modified | Persistence |
Kill Chain Mapping
The timeline above maps cleanly to MITRE ATT&CK:
| Kill Chain Stage | Evidence | Confidence |
|---|---|---|
| Reconnaissance | External IP scanning SSH port | Medium |
| Initial Access | Brute force succeeded (T1110.001) | High — 847 failures followed by success from same IP |
| Persistence | New user created (T1136.001) + crontab modified (T1053.003) | High — two separate persistence mechanisms |
| Command & Control | Curl download + DNS to C2 domain (T1071.004) | High — confirmed C2 infrastructure |
This is no longer a "brute-force alert." It's a confirmed compromise with persistence and C2 — a completely different severity and response.
Isolated Event vs. Attack Chain
Ask yourself three questions:
- Is there progression? Do events follow a logical attack sequence? (Failures → success → post-exploitation = YES)
- Is there a common thread? Do events share the same source IP, user, or host? (185.220.101.42 appears in all = YES)
- Do later events depend on earlier ones? Could the curl download happen without the SSH access? (NO — they're causally linked)
If all three answers are "yes," you have an attack chain. If only one event exists with no follow-on activity, it's likely isolated.
Step 5: DECIDE — Verdict and Action
After reading, enriching, pivoting, and correlating, you arrive at the decision point. There are exactly three outcomes:
True Positive → Escalate and Respond
The evidence confirms malicious activity. Your responsibilities:
- Escalate immediately to Tier 2/3 or incident response, per your escalation procedures
- Preserve evidence — do NOT remediate yet (don't kill processes, don't block IPs) unless the attack is actively causing damage. Evidence preservation comes first.
- Document everything you found — timeline, queries, indicators
False Positive → Document and Close
The evidence confirms benign activity. Your responsibilities:
- Document your reasoning — why is this a false positive?
- Close the alert with a clear explanation another analyst can understand
- Consider tuning — if this FP recurs, submit a tuning request to reduce noise
Ambiguous → Collect More Data (With a Time Limit)
You can't tell. The evidence is inconclusive. Your responsibilities:
- Expand your pivots — wider time window, additional log sources
- Set a time limit — give yourself 5 more minutes, not infinity
- If still ambiguous after the time limit, escalate — "I found X but couldn't confirm Y, here's what I checked" is a perfectly valid escalation
Never close an ambiguous alert as a false positive just because you ran out of ideas. If you can't prove it's benign, it stays open or gets escalated. The cost of a missed true positive vastly exceeds the cost of escalating an alert that turns out to be benign.
Time Management: The 10-Minute Rule
Tier 1 analysts process volume. Your queue has 50-100 alerts per shift. If you spend 45 minutes on each one, you process 10 alerts and the other 90 sit untouched — including the one that's a real breach.
The 10-Minute Rule:
| Timer | Action |
|---|---|
| 0:00 - 0:30 | Read the raw alert |
| 0:30 - 2:00 | Enrich with context |
| 2:00 - 6:00 | Pivot in all four directions |
| 6:00 - 8:00 | Correlate findings, build timeline |
| 8:00 - 10:00 | Decide and document |
| 10:00 | If no verdict → escalate to Tier 2 |
This doesn't mean complex investigations can't exceed 10 minutes. It means that Tier 1 should make a triage decision within 10 minutes. If the investigation needs more time, the decision is to escalate — which is itself a valid and complete triage outcome.
"I don't have enough information to determine if this is malicious, here's what I found and what I checked" is one of the most valuable things a Tier 1 analyst can write in an escalation. It saves Tier 2 from repeating your work and demonstrates thoroughness. A good escalation note is worth more than a wrong verdict.
Documentation: What Goes in Your Ticket
Every alert you touch gets documented, even if it takes only 90 seconds to close as a false positive. Your ticket is the audit trail, the knowledge base for other analysts, and your proof of work.
At Each Step, Record:
| Step | What to Document |
|---|---|
| Read | Alert rule ID, severity, source, target, timestamp |
| Enrich | Asset tier, user role, GeoIP result, TI lookup results, temporal assessment |
| Pivot | Exact queries you ran, number of results, notable findings |
| Correlate | Timeline of related events, kill chain mapping, whether events form a chain |
| Decide | Verdict (TP/FP/Escalation), confidence level, reasoning |
Example Ticket — SSH Brute Force on linux-web-01
ALERT: Rule 5551 — Multiple SSH authentication failures
SEVERITY: High (Level 10)
TARGET: linux-web-01 (10.0.0.10) — Tier 2 production web server
SOURCE: 185.220.101.42 (Tor exit node, AbuseIPDB 100%, GreyNoise: malicious)
TIME: 2026-02-23 02:47 UTC (outside business hours)
INVESTIGATION:
- Same Host pivot: Found 847 failed SSH attempts (02:31-02:47),
followed by successful SSH logon at 02:48 from SAME source IP.
Post-logon: new user created (02:49), curl download (02:51),
crontab modified (02:55).
- Same Source IP: 185.220.101.42 also hit dns-server-01 (SSH scan,
no success).
- Same User: root account — no other unusual activity prior to
this event.
- Same Technique: Rule 5551 fired only for this source IP in
the past 24 hours.
TIMELINE: Brute force (16 min) → success → user creation →
C2 download → persistence
VERDICT: TRUE POSITIVE — Confirmed compromise
ACTION: Escalated to Tier 2 / IR team. Host requires
immediate containment.
CONFIDENCE: High — attack chain confirmed across 6 correlated events
Practical Walkthrough: From Alert to Verdict
Let's trace the complete workflow on the SSH brute-force alert from Step 1, simulating what you'd do in the Wazuh dashboard during Lab 4.1.
Minute 0:00 — READ. Open the alert. Rule 5551, level 10, SSH brute force against root on linux-web-01 from 185.220.101.42 at 02:47 UTC. Source log: /var/log/auth.log. ATT&CK mapping: T1110.001 (Brute Force: Password Guessing).
Minute 0:30 — ENRICH. linux-web-01 is a Tier 2 production web server (asset context). Root is the highest-privilege account (user context). 02:47 UTC is outside business hours — no maintenance scheduled (temporal context). 185.220.101.42 is a known Tor exit node with 100% abuse confidence (geographic + TI context). SSH failures on this host baseline is ~5/day — 847 in 16 minutes is a 169x deviation (behavioral context).
Minute 2:00 — PIVOT. Same Host (±30 min): discover 847 failures, then successful logon, then new user creation, curl download, crontab modification. Same Source IP: this IP also probed dns-server-01. Same User: root has no other unusual activity. Same Technique: rule 5551 only triggered for this IP.
Minute 6:00 — CORRELATE. Build the timeline (shown in Step 4 above). Map to kill chain: reconnaissance → initial access → persistence → C2. Six correlated events. Attack chain confirmed.
Minute 8:00 — DECIDE. This is a true positive. The brute force succeeded, the attacker established persistence (new user + crontab), and initiated C2 communications. Escalate immediately. Document the full timeline, queries run, and indicators.
Total time: 8 minutes. Well within the 10-minute guideline. The key: no wasted motion, systematic pivoting, and the confidence to make a call once the evidence is clear.
In Lab 4.1, you'll apply this exact workflow to 30 pre-loaded alerts. Some will resolve in 2 minutes as obvious false positives. Others will chain together into multi-stage attacks. The target is 85% accuracy — which means you're allowed to misclassify a few. Speed and consistency matter more than perfection on every single alert.
Common Investigation Mistakes
| Mistake | Why It's Dangerous | Fix |
|---|---|---|
| Skipping the raw event | You miss critical fields that change the verdict | Always start with Step 1 — read the JSON |
| Enriching without pivoting | A single enriched alert is still a single data point | Always run all four pivot directions |
| Pivoting without a time window | You drown in millions of irrelevant events | Use ±30 minutes for the initial pivot window |
| Spending 40 minutes on one alert | Your queue backlog grows; other real attacks go unnoticed | Apply the 10-minute rule; escalate if stuck |
| Closing ambiguous alerts as FP | You miss a real attack because you assumed it was benign | If you can't prove it's benign, escalate |
| Not documenting | The next analyst repeats your work; no audit trail | Document every alert, even 90-second FP closures |
Key Takeaways
- Read the raw event first — alert titles summarize, but the JSON contains the full truth (rule ID, source IP, target user, timestamp, ATT&CK mapping)
- Enrich using all five context dimensions — asset value, user role, temporal patterns, geographic origin, and behavioral baseline together determine the true severity
- Pivot in four directions — same host (±30 min), same user, same source IP, same technique — to find related events that transform a single alert into a story
- Correlate into a timeline — arrange events chronologically and map to the kill chain to determine whether you're looking at an isolated event or an active attack
- Decide within 10 minutes — TP → escalate, FP → document and close, ambiguous → collect more data with a time limit, then escalate
- Document everything — your ticket is the audit trail: alert details, enrichment findings, queries run, timeline, verdict, and reasoning
- The workflow is the same for every alert — what changes is the speed, not the steps. A routine FP takes 90 seconds. A confirmed compromise takes 10 minutes. Both follow Read → Enrich → Pivot → Correlate → Decide.
What's Next
You now have the investigation workflow — the repeatable process that turns any alert into a confident verdict. In Lesson 4.4: Decoding & Deobfuscation, you'll learn what to do when attackers hide their payload behind layers of Base64, URL encoding, and PowerShell obfuscation. Because sometimes Step 1 (Read) reveals an event full of encoded strings — and you can't investigate what you can't read. CyberChef becomes your decoder ring.
Knowledge Check: Investigation Workflow
10 questions · 70% to pass
What is the FIRST step an analyst should take when a new alert appears in the queue?
During the Enrich step, you look up source IP 185.220.101.42 and find it has a 100% confidence score on AbuseIPDB, is classified as malicious by GreyNoise, and is listed as a Tor exit node. Which context dimensions does this information satisfy?
Why does the investigation workflow specify a ±30-minute pivot window when searching for related events on the same host?
An analyst finds 847 failed SSH login attempts from 185.220.101.42 targeting root on linux-web-01 between 02:31 and 02:47 UTC, followed by a successful SSH logon from the same IP at 02:48. What does this sequence indicate?
During the Correlate step, you build a timeline showing: brute force (02:31-02:47) → successful logon (02:48) → new user 'svc-backup' created (02:49) → curl download from 91.234.56.78 (02:51) → crontab modified (02:55). Which kill chain stages are represented?
After 10 minutes of investigation, a Tier 1 analyst has found a suspicious alert with inconclusive evidence — the enrichment suggests the source IP is unusual but not definitively malicious, and pivoting found no related events. What is the correct action under the 10-minute rule?
In Lab 4.1, you triage 30 pre-loaded alerts on Wazuh. You see Rule 5551 (SSH brute force) fire on linux-web-01 from source IP 185.220.101.42. Your Same Source IP pivot shows this IP also triggered alerts on dns-server-01 and fw-edge-01. What does this cross-host pattern tell you?
During an investigation, you find Rule 18152 fired on linux-web-01 showing the process 'curl' downloading a file from external IP 91.234.56.78 at 02:51 UTC, two minutes after a confirmed SSH brute-force success from 185.220.101.42. Which pivot direction is MOST important to run next?
What THREE questions should you ask during the Correlate step to determine whether related events form an attack chain or are isolated incidents?
In Lab 4.1, you encounter an alert for Rule 100002 (FIM: /etc/crontab modified) on linux-web-01 at 02:55 UTC. Viewed in isolation, this might be a routine system administration change. However, your investigation has already identified a confirmed SSH brute-force success from 185.220.101.42 at 02:48, a new user created at 02:49, and a curl download at 02:51. How does this correlation change your assessment of the crontab alert?
0/10 answered