Lesson 2 of 5 · 25 min read

PEAK Framework — Prepare, Execute, Act with Knowledge

PEAK (Prepare, Execute, Act with Knowledge) is Splunk SURGe’s formalization of the threat hunting workflow. It solves the most common hunting failure mode: starting a hunt without clear success criteria, collecting data without a plan, and ending the hunt without producing anything actionable.


Phase 1: Prepare

The Prepare phase has four steps — all must complete before querying begins.

Step 1: Define the Hypothesis

A hunt hypothesis is a falsifiable statement about attacker behavior. Template:

“I believe [attacker behavior] is/was occurring in [scope] because [reason], and if true, I expect to find [evidence].”

Example:

“I believe APT29-affiliated actors may be using WMI event subscriptions (T1546.003) for persistence on our Windows servers, based on the CISA advisory AA24-057A published last week, and if true, I expect to find Sysmon Event 20 (WmiEventConsumerToFilter) or Event 19 (WmiEventFilter) activity from non-administrative processes in the past 30 days.”

This hypothesis is:

Step 2: Identify Required Data Sources

List the telemetry the hunt requires:

Hunt topicRequired data sourceSysmon events / log types
WMI persistenceSysmon WMI eventsEvents 19, 20, 21
Lateral movement via SMBProcess creation + networkEvent 1 + Event 3
KerberoastingDomain controller logsWindows Event 4769
Cloud IAM persistenceCloudTrailmanagement events

Step 3: Verify Data Availability

Before hunting, confirm the data actually exists:

# Verify Sysmon WMI events are present
index=sysmon EventCode IN (19, 20, 21)
  earliest="-30d"
| stats count by EventCode, host

If this returns zero results: Sysmon WMI logging isn’t enabled in the config. The hunt can’t proceed until the data gap is remediated. Document this as a telemetry gap finding — it’s a valuable output even before the hunt begins.

Step 4: Establish Baseline

Before looking for anomalies, know what normal looks like:

# Baseline: WMI event subscription activity in the past 90 days
index=sysmon EventCode IN (19, 20, 21)
  earliest="-90d" latest="-30d"
| stats count by host, User, EventCode
| sort -count

This tells you: which hosts typically generate WMI subscription events, who creates them, and at what frequency. Anything outside this baseline during the hunt window is a candidate for investigation.


Phase 2: Execute

The Execute phase is the actual hunting: querying, collecting candidates, triaging.

The Query Progression

Don’t start with the most specific query — start broad and narrow:

# Step 1: Broad — all WMI subscription events
index=sysmon EventCode IN (19, 20, 21) earliest="-30d"
| stats count by host, EventCode

# Step 2: Narrow — unexpected hosts or users
index=sysmon EventCode IN (19, 20, 21) earliest="-30d"
| stats count by host, User, EventCode
| where NOT User IN ("SYSTEM", "LOCAL SERVICE", "NETWORK SERVICE")

# Step 3: Deep — inspect the subscription details
index=sysmon EventCode=20 earliest="-30d"
  NOT User IN ("SYSTEM", "LOCAL SERVICE")
| table _time, host, User, Name, Type, Destination

Candidate Triage

For each suspicious event, classify:

ClassificationCriteriaAction
Confirmed benignKnown process, documented use caseAdd to baseline documentation
SuspiciousUnusual but not confirmed maliciousEscalate for investigation
Confirmed maliciousClear attack behavior, IOC matchTrigger incident response

Build a triage log as you work:

## Hunt Triage Log — WMI Persistence Hunt 2026-05-20

| Time | Host | User | Subscription Name | Classification | Evidence |
|------|------|------|------------------|----------------|----------|
| 2026-05-18 02:14 | ws-dev-04 | jdoe | WindowsUpdate | Suspicious | Created at 2am by non-admin user; subscription calls powershell.exe |
| 2026-05-15 11:30 | dc01 | svc-backup | BackupMonitor | Benign | Documented backup monitoring subscription; verified with IT |

Phase 3: Act with Knowledge

Every hunt ends with four outputs, regardless of whether an attacker was found:

Output 1: Finding Report

## Hunt Finding: WMI Subscription Activity — ws-dev-04

**Classification:** Suspicious — escalated to investigation
**Time:** 2026-05-18 02:14 UTC
**Host:** ws-dev-04 (Tier 2 workstation, owner: jdoe)
**User:** CORP\jdoe
**Subscription:** Name=WindowsUpdate, Destination=powershell.exe -enc SGVsbG8=

**Evidence:**
- Sysmon Event 20 at 02:14 (WMI event consumer created)
- Subscription executes encoded PowerShell at midnight daily
- Created by a non-admin user account (jdoe is Finance staff)
- No legitimate business reason for this subscription identified

**Next action:** IR escalated — host isolated, jdoe account suspended

Output 2: Detection Rule

title: Suspicious WMI Event Subscription — Non-System Account
logsource:
  product: windows
  category: wmi_event
detection:
  selection:
    EventID: 20   # WmiEventConsumer
  filter_system:
    User|contains:
      - 'SYSTEM'
      - 'LOCAL SERVICE'
      - 'NETWORK SERVICE'
  condition: selection and not filter_system
level: high
tags:
  - attack.persistence
  - attack.t1546.003

Output 3: Baseline Update

Document what normal looks like now that the hunt is complete:

## WMI Subscription Baseline — Updated 2026-05-20

Normal WMI event subscription activity:
- BackupMonitor: svc-backup account on DC/servers (daily, documented)
- WindowsUpdate: SYSTEM account only (automated, verified)
- Anomaly threshold: any WMI subscription by non-service-account users = investigate

Output 4: Hunt Library Entry

Add the hunt to the team’s hunt library so it can be repeated:

## Hunt: WMI Event Subscription Persistence (T1546.003)
**Author:** hunt-team
**Last run:** 2026-05-20
**Frequency:** Monthly
**Hypothesis:** Attackers use WMI subscriptions for persistence on Windows hosts
**Key queries:** [link to query library]
**Known FP:** BackupMonitor subscription from svc-backup
**Finding this run:** 1 suspicious (escalated to IR)
PEAK Threat Hunting Framework— Splunk SURGe