Splunk Survival Series — Part 4: Hunting Like a Pro

Splunk Survival Series: From Noise to Signal

This is Part 4 in the analyst survival series where we break Splunk into something usable, not mythical. If you missed the earlier entries, go back and get your field chops in order:

🔹 Part 1 — Taming the Data Deluge

🔹 Part 2 — Getting Analytical

🔹 Part 3 — Regex and Field Extractions

Today, it’s time to hunt. Because dashboards won’t save you, alerts lie, and real threats rarely scream.


🕵️‍♀️ Linking Events with transaction

Threats don’t happen in isolation. A login attempt might look harmless — until you notice it happened 87 times from 19 IPs in 2 minutes.

transaction lets you correlate related events across time using fields like session_id, src, user, or even uri_path.

index=auth_logs action="login"
| transaction user startswith="login attempt" endswith="login success"
| table _time duration user src

Now you can see duration and behavioral patterns across sessions — perfect for detecting brute force, token misuse, or post-compromise pivoting.


🔗 Correlation Across Indexes

Criminals don’t care about your indexes. If your alert logic does, you’re blind.

Use field normalization, lookups, and multi-index queries to correlate events from:

  • Auth logs (index=auth_logs)
  • Web access logs (index=proxy)
  • Endpoint telemetry (index=edr)
(index=auth_logs OR index=proxy OR index=edr) user="jdoe"
| stats earliest(_time) as first_seen latest(_time) as last_seen by user src dest action

This kind of correlation shows lateral movement, command-and-control, or impossible travel without needing an alert to tell you something’s wrong.


🎯 Threat Hunting Queries

Don’t wait for alerts. Here are a few classic hunting patterns to build from:

🚫 Failed Logons (Brute Force Recon)

index=auth_logs action=failure
| stats count by user src
| where count > 10

🪟 RDP Enumeration Attempts

index=wineventlog sourcetype="WinEventLog:Security" EventCode=4625
| search LogonType=10
| stats count by src, user

📡 Beaconing Behavior (Regular Intervals)

index=proxy uri="*"
| timechart span=1m count by dest_ip
| where count > 5

Hunting is about patterns. Build these out, iterate, and log what you find.


⚙️ Performance Tuning for Real Analysts

🔍 Search Modes

Use Fast Mode when doing count-based hunting (stats, timechart), and Verbose Mode when testing field extractions or regex.

🧠 Indexing Strategy

If your searches always need index=*, fix your source types. Work with your ingestion team (or become them) and normalize.

🛠 Key Performance Tips:

  • Always filter by index and sourcetype when possible
  • Use fields to limit returned fields early
  • Leverage tstats for known, structured data (it’s way faster)

📦 Final Thoughts

This is the real Splunk: fast, brutal, and manually driven. The console won’t hold your hand. The search bar is where you fight.

Regex carved the data out — now you’re weaponizing it. Transactions and correlations reveal the stories attackers hope you miss. Hunt often. Hunt aggressively. Don’t wait for a dashboard to tell you what already happened.

Next up in Part 5: how to take your best findings and codify them into reusable knowledge. Macros, lookups, and playbooks — so your future self doesn’t have to rediscover the same threat twice.

Leave a comment