s225645819/splunk-soc-detection-dashboard
GitHub: s225645819/splunk-soc-detection-dashboard
Stars: 0 | Forks: 0
# SOC Detection Dashboard — Splunk + BOTS v3
A blue-team detection engineering project built in **Splunk Enterprise** using the
**Boss of the SOC (BOTS) v3** dataset. The dashboard ingests realistic security
telemetry and surfaces four detections that together reconstruct an entire intrusion —
from initial access through to command-and-control — and maps each detection to the
**MITRE ATT&CK** framework.
## Overview
| | |
|---|---|
| **Platform** | Splunk Enterprise (Dashboard Studio, Grid layout) |
| **Dataset** | [Splunk BOTS v3](https://github.com/splunk/botsv3) — ~2.08M pre-indexed events |
| **Data sources used** | Azure AD sign-in logs, Sysmon process creation, network stream (TCP/IP) |
| **Detections** | 4 (auth brute force, malicious PowerShell, masquerading, C2 / outbound) |
| **Frameworks** | MITRE ATT&CK |
The scenario in BOTS v3 centres on the fictional company **Frothly** (`froth.ly`). The
detections below trace the attacker through the network on the night of
**20–21 August 2018**.
## The Attack, as a Kill Chain
The four detections aren't isolated — they correspond to consecutive stages of a single
intrusion. Reading them together tells the story:
A key piece of analysis: the attacker IP **45.77.53.176** and port **8088** were
identified independently in *both* the process logs (Detection 2) and the network logs
(Detection 4) — a cross-source correlation that confirms the command-and-control channel
from two angles.
## Detection 2 — Suspicious PowerShell & Masquerading (Sysmon)
**Goal:** Catch process-creation events that show obfuscated/encoded PowerShell, or
binaries masquerading as legitimate software.
**Data source:** `XmlWinEventLog:Microsoft-Windows-Sysmon/Operational` (EventID 1 — process creation)
**SPL:**
index=botsv3 sourcetype="XmlWinEventLog:Microsoft-Windows-Sysmon/Operational" earliest=0 "EventID>1<"
| rex field=_raw "Name='Image'>(?[^<]+)<"
| rex field=_raw "Name='CommandLine'>(?[^<]+)<"
| rex field=_raw "Name='User'>(?[^<]+)<"
| search CommandLine="*-enc*" OR CommandLine="*-nop*" OR CommandLine="*hidden*"
OR CommandLine="*DownloadString*" OR CommandLine="*IEX*" OR CommandLine="*Invoke-Expression*"
| stats count BY host, User, Image, CommandLine
| sort - count
| table host User Image CommandLine count
**Findings:**
- **Encoded PowerShell** on host `BSTOLL-L` (user `AzureAD\BudStoll`):
`powershell.exe -noP -sta -w 1 -enc ` — no profile, hidden window, Base64-encoded
payload. Classic obfuscation to hide intent from defenders.
- **Registry-based PowerShell** (user `FyodorMalteskesko`):
`-NoP -NonI -W Hidden -c $x=$((gp HKCU:Software\...` — reading from the registry.
- **Masquerading binary:** `iexeplorer.exe` running from
`C:\Windows\Temp\unziped\lsof-master\` — a renamed executable posing as Internet Explorer
(the real binary is `iexplore.exe` in Program Files), beaconing to `192.168.9.30:8080`.
- **Reverse shell** observed in the command line:
`/bin/sh 0/tmp/backpipe` — netcat piping a shell
to an external host via a named pipe.
**MITRE ATT&CK:**
- **T1059.001** — Command and Scripting Interpreter: PowerShell
- **T1027** — Obfuscated Files or Information (encoded command)
- **T1036** — Masquerading (renamed binary in a temp directory)
## Detection 3 — Authentication Timeline (Visualization)
**Goal:** Plot login successes vs failures over time so the brute-force burst is visible
at a glance.
**Data source:** `ms:aad:signin`
**SPL:**
index=botsv3 sourcetype=ms:aad:signin earliest=0
| timechart span=1h count BY loginStatus
| where Success > 0 OR Failure > 0
**Visualization:** Column chart (Success vs Failure per hour). The `where` clause removes
empty time buckets so the chart focuses on the active window.
**Findings:** Failures cluster at **2018-08-20 21:00** (5 failures) with smaller spikes
into the early hours of **21 August** — visually pinpointing the attack window against the
backdrop of normal login activity.
**MITRE ATT&CK:**
- Supports **T1110** (provides temporal context for the brute-force activity)
## Detection 4 — C2 / Outbound to Known-Bad IP (Network Stream)
**Goal:** Confirm command-and-control and identify high-volume outbound traffic to the
attacker's infrastructure, using network telemetry independent of the host logs.
**Data source:** `stream:tcp`, `stream:ip`
**SPL:**
index=botsv3 (sourcetype=stream:tcp OR sourcetype=stream:ip) earliest=0 dest_ip="45.77.53.176"
| stats count AS connections,
sum(bytes_out) AS bytes_sent,
values(dest_port) AS dest_ports,
earliest(_time) AS first_seen,
latest(_time) AS last_seen
BY src_ip, dest_ip
| convert ctime(first_seen) ctime(last_seen)
| sort - connections
**Findings:** Three internal hosts communicating with attacker IP `45.77.53.176`:
| Source IP | Dest Port(s) | Connections | Bytes Sent | Interpretation |
|---|---|---|---|---|
| `192.168.70.186` | 3333, 443 | 8,371 | ~13.1 MB | High volume; port 3333 suggests cryptomining / possible exfil |
| `192.168.24.128` | 443 | 2,769 | ~489 KB | Sustained outbound over HTTPS |
| `192.168.9.30` | 8088 | 6 | ~85 KB | **Reverse shell** — matches the `nc ... 8088` command from Detection 2 |
**Cross-source correlation:** `192.168.9.30` → `45.77.53.176:8088` appears in *both* the
Sysmon command line and the network stream, confirming the C2 channel from two
independent data sources.
**MITRE ATT&CK:**
- **T1071** — Application Layer Protocol (C2)
- **T1041** — Exfiltration Over C2 Channel
- **T1496** — Resource Hijacking (port 3333 / cryptomining indicator)
## How to Reproduce
1. Install **Splunk Enterprise** (free 60-day trial).
2. Download the **BOTS v3** dataset and install it via
*Manage Apps → Install app from file* (data is pre-indexed, so it does not consume the
license quota).
3. Restart Splunk and confirm the data loads:
index=botsv3 earliest=0
4. Build each detection as a panel in a **Dashboard Studio** dashboard (Grid layout).
## Skills Demonstrated
- Writing and tuning **SPL** detections (`stats`, `timechart`, `eval`, `rex`, `convert`)
- **Search-time field extraction** from unparsed XML when an add-on isn't available
- **Threshold tuning** to fit the data and reduce false positives
- **Cross-source correlation** (host logs ↔ network logs) to confirm findings
- **MITRE ATT&CK** mapping and kill-chain reconstruction
- Building a multi-panel **Splunk dashboard** combining tables and visualizations
## Notes & Limitations
- Detection thresholds are tuned to this dataset's size; production thresholds would differ.
- Several BOTS v3 add-ons were intentionally skipped for simplicity, which is why
field extraction for Sysmon is done at search time.
- This is a learning/portfolio project built against a static, pre-indexed dataset, not a
live environment.