Skip to content

Lab 16: DFIR Memory Forensics with Volatility

Chapters: 27 (Digital Forensics), 28 (Advanced Incident Response) Difficulty: ⭐⭐⭐⭐ Expert Estimated Time: 4-5 hours Prerequisites: Lab 12 (DFIR Artifact Analysis), Chapter 27, Chapter 28


Overview

In this lab you will:

  1. Perform deep process analysis on a synthetic memory dump to identify process hollowing, orphan processes, and suspicious parent-child relationships using Volatility
  2. Extract and analyze network artifacts including active connections, DNS cache entries, and command-and-control (C2) communication patterns from volatile memory
  3. Detect code injection techniques including DLL injection, reflective DLL loading, and process hollowing through VAD analysis and malfind scanning
  4. Hunt for rootkit indicators including SSDT hooks, IDT modifications, DKOM-based process hiding, and hidden kernel drivers
  5. Build a comprehensive forensic timeline by correlating memory artifacts with extracted IOCs, registry keys, and credential material

Synthetic Data Only

All data in this lab is 100% synthetic and fictional. All IP addresses use RFC 5737 (192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24) or RFC 1918 (10.0.0.0/8, 172.16.0.0/12) reserved ranges. All hostnames use *.example or *.example.com domains. All credentials are shown as testuser/REDACTED. All hashes are clearly labeled SYNTHETIC and follow fabricated patterns. No real malware, real hosts, real threat actors, or real credentials are referenced. Malware names (SHADOWBYTE, NIGHTCRAWLER) are entirely fictional. This lab is for defensive education only — never use these techniques against systems you do not own.

Relationship to Lab 12

Lab 12 introduced DFIR artifact analysis across filesystem, registry, and log sources. This lab dives deeper into volatile memory forensics — analyzing RAM captures to uncover artifacts that never touch disk. Attackers increasingly operate entirely in memory to evade traditional forensics. Complete Lab 12 first for maximum benefit.


Scenario

Incident Brief — NovaCorp Financial

Organization: NovaCorp Financial (fictional) Internal Network: 10.20.0.0/16 SOC SIEM: Sentinel / Splunk hybrid (SYNTHETIC) Domain Controller: 10.20.1.10 (dc01.novacorp.example) Affected Workstation: 10.20.5.42 (ws-fin-042.novacorp.example) — Windows 10 22H2, 16 GB RAM Affected Server: 10.20.3.15 (srv-app-015.novacorp.example) — Windows Server 2022, 32 GB RAM File Server: 10.20.3.20 (srv-files-020.novacorp.example) Threat Actor Designation: PHANTOM-VIPER (fictional APT group) Malware Family: SHADOWBYTE (RAT/backdoor, fictional), NIGHTCRAWLER (rootkit, fictional) Incident Start (estimated): 2026-03-10 09:15 UTC Detection Time: 2026-03-12 14:37 UTC Memory Acquisition Time: 2026-03-12 15:02 UTC Engagement Type: Post-breach memory forensics investigation

Summary: NovaCorp Financial's SOC detected anomalous outbound HTTPS traffic from workstation ws-fin-042 to IP address 198.51.100.47 on port 443. Network flow analysis revealed periodic beaconing at 60-second intervals with jittered timing. EDR telemetry showed svchost.exe spawning cmd.exe processes outside of normal service operations. The IR team acquired full physical memory dumps from the affected workstation (16 GB) and a lateral-movement target server (32 GB) using WinPMEM. Your task is to analyze these memory dumps to determine the full scope of the compromise, identify all malware components, extract IOCs, and reconstruct the attack timeline.

Initial Triage Findings:

  • EDR flagged svchost.exe (PID 4872) with unusual network activity
  • Proxy logs show connections to update.novacorp-cdn.example resolving to 198.51.100.47
  • HR reported a suspicious email with an attachment received by user jdoe on 2026-03-10
  • No known malware signatures matched — suspected custom/zero-day tooling

Environment Setup

Memory Dump Metadata

The following synthetic memory dumps are used throughout this lab. In a real engagement, these would be acquired using tools like WinPMEM, DumpIt, or FTK Imager.

=== MEMORY DUMP #1 — Workstation ===
Filename:       ws-fin-042_20260312_1502.raw
Source Host:     ws-fin-042.novacorp.example (10.20.5.42)
Acquisition Tool: WinPMEM 4.0
Acquisition Time: 2026-03-12 15:02:33 UTC
Image Size:      16,384 MB (16 GB)
SHA-256:         SYNTHETIC-HASH-a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2
OS Profile:      Win10x64_22H2_19045
Architecture:    AMD64
Page Size:       4096

=== MEMORY DUMP #2 — Application Server ===
Filename:       srv-app-015_20260312_1518.raw
Source Host:     srv-app-015.novacorp.example (10.20.3.15)
Acquisition Tool: WinPMEM 4.0
Acquisition Time: 2026-03-12 15:18:47 UTC
Image Size:      32,768 MB (32 GB)
SHA-256:         SYNTHETIC-HASH-b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3
OS Profile:      Win2022x64_20348
Architecture:    AMD64
Page Size:       4096

Tool Installation

# SYNTHETIC — Install Volatility 3
# Analysis Workstation: analyst-ws.novacorp.example (10.20.10.5)

# Clone Volatility 3
git clone https://github.com/volatilityfoundation/volatility3.git
cd volatility3
pip3 install -r requirements.txt

# Verify installation
python3 vol.py --help

# Download symbol tables (Windows)
mkdir -p volatility3/symbols
cd volatility3/symbols
wget https://downloads.volatilityfoundation.org/volatility3/symbols/windows.zip
unzip windows.zip

# Verify profile detection
python3 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw windows.info

# Expected output (SYNTHETIC):
# Variable          Value
# Kernel Base       0xf8007c600000
# DTB               0x1ad000
# Symbols           ntkrnlmp.pdb/SYNTHETIC-GUID
# Is64Bit           True
# IsPAE             False
# primary layer     Intel32e
# KdVersionBlock    0xf8007d21f398
# Major/Minor       15.19045
# MachineType       34404
# KeNumberProcessors 4
# SystemTime        2026-03-12 15:02:33 UTC
# NtBuildLab        19045.1.amd64fre.vb_release.191206-1406
# NtProductType     NtProductWinNt
# NtSystemRoot      \Device\HarddiskVolume3\Windows
# SYNTHETIC — Install Volatility 2
# Analysis Workstation: analyst-ws.novacorp.example (10.20.10.5)

# Clone Volatility 2
git clone https://github.com/volatilityfoundation/volatility.git
cd volatility
pip2 install pycrypto distorm3 yara-python

# Verify installation
python2 vol.py --info | grep "Win10x64"

# Identify profile
python2 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw imageinfo

# Expected output (SYNTHETIC):
# Suggested Profile(s) : Win10x64_19041
# AS Layer1 : SkipDuplicatesASx64 (Kernel AS)
# AS Layer2 : WindowsAMD64PagedMemory (Kernel AS)
# AS Layer3 : FileAddressSpace (/cases/novacorp/ws-fin-042_20260312_1502.raw)
# PAE type  : No PAE
# DTB       : 0x1ad000
# KDBG      : 0xf8007d21f398
# Number of Processors : 4
# Image date and time : 2026-03-12 15:02:33 UTC+0000
# Image local date and time : 2026-03-12 11:02:33 -0400

Case Directory Structure

/cases/novacorp/
├── ws-fin-042_20260312_1502.raw          # Workstation memory dump
├── srv-app-015_20260312_1518.raw         # Server memory dump
├── analysis/
│   ├── process/                          # Process analysis output
│   ├── network/                          # Network artifact output
│   ├── injection/                        # Code injection findings
│   ├── rootkit/                          # Rootkit detection output
│   ├── timeline/                         # Timeline artifacts
│   └── iocs/                             # Extracted IOCs
├── evidence/
│   ├── dumped_files/                     # Extracted files from memory
│   ├── registry_hives/                   # Dumped registry hives
│   └── screenshots/                      # Process memory screenshots
└── reports/
    ├── findings.md                       # Analyst findings
    └── ioc_report.csv                    # IOC export

Exercise 1: Process Analysis

Objectives

  • Enumerate all running processes and identify suspicious entries using pslist, pstree, and psxview
  • Detect process hollowing by comparing in-memory process images to expected executables
  • Identify orphan processes and anomalous parent-child relationships
  • Cross-reference process metadata against known-good baselines

1.1 Initial Process Enumeration

Begin by listing all processes in the memory dump to establish a baseline view.

# SYNTHETIC — List all processes
# Memory dump: ws-fin-042_20260312_1502.raw

python3 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw windows.pslist

# Expected output (SYNTHETIC — abbreviated):
# PID    PPID   ImageFileName    Offset(V)          Threads  Handles  Sess  Wow64  CreateTime                    ExitTime
# 4      0      System           0xfa8003c4a040      142      -        -     False  2026-03-10 06:15:22.000000    -
# 104    4      Registry         0xfa8003c4e080      4        -        -     False  2026-03-10 06:15:18.000000    -
# 392    4      smss.exe         0xfa8003e81300      2        -        -     False  2026-03-10 06:15:22.000000    -
# 508    500    csrss.exe        0xfa8004128080      13       584      0     False  2026-03-10 06:15:24.000000    -
# 584    500    wininit.exe      0xfa8004195080      1        75       0     False  2026-03-10 06:15:24.000000    -
# 596    588    csrss.exe        0xfa80041a0080      14       594      1     False  2026-03-10 06:15:24.000000    -
# 660    588    winlogon.exe     0xfa80041f5080      3        124      1     False  2026-03-10 06:15:24.000000    -
# 700    584    services.exe     0xfa800420a040      6        238      0     False  2026-03-10 06:15:24.000000    -
# 712    584    lsass.exe        0xfa8004215080      9        763      0     False  2026-03-10 06:15:24.000000    -
# 824    700    svchost.exe      0xfa800428e300      21       467      0     False  2026-03-10 06:15:25.000000    -
# 872    700    svchost.exe      0xfa80042a5080      12       334      0     False  2026-03-10 06:15:25.000000    -
# 968    700    svchost.exe      0xfa80042f0080      18       512      0     False  2026-03-10 06:15:25.000000    -
# 1064   700    svchost.exe      0xfa800434a080      15       401      0     False  2026-03-10 06:15:25.000000    -
# 1156   700    svchost.exe      0xfa80043a2080      8        198      0     False  2026-03-10 06:15:25.000000    -
# 1320   700    svchost.exe      0xfa8004421300      6        172      0     False  2026-03-10 06:15:26.000000    -
# 2104   700    spoolsv.exe      0xfa800459b080      7        126      0     False  2026-03-10 06:15:28.000000    -
# 2248   1064   taskhostw.exe    0xfa8004612080      5        88       1     False  2026-03-10 06:30:11.000000    -
# 2492   2472   explorer.exe     0xfa80046e1080      32       1024     1     False  2026-03-10 06:30:14.000000    -
# 2680   2492   outlook.exe      0xfa8004782080      25       612      1     False  2026-03-10 06:31:02.000000    -
# 3104   2492   chrome.exe       0xfa80048e0080      8        215      1     False  2026-03-10 06:31:15.000000    -
# 3296   3104   chrome.exe       0xfa8004962080      15       342      1     False  2026-03-10 06:31:15.000000    -
# 4520   2492   notepad.exe      0xfa8004b12080      1        52       1     False  2026-03-10 09:14:30.000000    -
# 4872   700    svchost.exe      0xfa8004c3a300      6        147      0     False  2026-03-10 09:17:44.000000    -   ◄── SUSPICIOUS
# 4988   4872   cmd.exe          0xfa8004c8e080      1        28       0     False  2026-03-10 09:18:02.000000    -   ◄── SUSPICIOUS
# 5016   4988   whoami.exe       0xfa8004ca1040      0        -        0     False  2026-03-10 09:18:03.000000    2026-03-10 09:18:03.000000
# 5104   4988   ipconfig.exe     0xfa8004cc2040      0        -        0     False  2026-03-10 09:18:05.000000    2026-03-10 09:18:05.000000
# 5188   4872   cmd.exe          0xfa8004ce8080      1        28       0     False  2026-03-12 02:15:33.000000    -   ◄── SUSPICIOUS
# 5240   5188   net.exe          0xfa8004d0a040      0        -        0     False  2026-03-12 02:15:35.000000    2026-03-12 02:15:36.000000
# 5312   5188   nltest.exe       0xfa8004d2e040      0        -        0     False  2026-03-12 02:15:40.000000    2026-03-12 02:15:40.000000
# 5480   2492   msedge.exe       0xfa8004d8a080      4        112      1     False  2026-03-10 10:42:15.000000    -
# SYNTHETIC — List all processes
python2 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw --profile=Win10x64_19041 pslist

Red Flags Identified

Several anomalies are immediately visible in the process listing:

  1. PID 4872 — svchost.exe created at 09:17:44 on 2026-03-10, minutes after the suspected initial compromise at 09:15. Legitimate svchost.exe instances are created at boot time by services.exe (PID 700). While PID 4872 does show PPID 700, the creation timestamp is anomalous.
  2. PID 4988, 5188 — cmd.exe spawned by svchost.exe (PID 4872). Legitimate svchost.exe should almost never spawn cmd.exe.
  3. Reconnaissance commandswhoami.exe, ipconfig.exe, net.exe, nltest.exe are classic post-exploitation discovery commands.
  4. Time gap — Recon commands at 09:18 (initial access) and again at 02:15 on 2026-03-12 (two days later) indicate persistent access.

1.2 Process Tree Analysis

Visualize the parent-child process hierarchy to detect anomalous relationships.

# SYNTHETIC — Process tree view
python3 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw windows.pstree

# Expected output (SYNTHETIC — suspicious branch highlighted):
# PID    PPID   ImageFileName         Offset(V)          Threads  Handles  Sess  Wow64  CreateTime
# 4      0      System                0xfa8003c4a040      142      -        -     False  2026-03-10 06:15:22
# . 104  4      Registry              0xfa8003c4e080      4        -        -     False  2026-03-10 06:15:18
# . 392  4      smss.exe              0xfa8003e81300      2        -        -     False  2026-03-10 06:15:22
# 584    500    wininit.exe           0xfa8004195080      1        75       0     False  2026-03-10 06:15:24
# . 700  584    services.exe          0xfa800420a040      6        238      0     False  2026-03-10 06:15:24
# .. 824 700    svchost.exe           0xfa800428e300      21       467      0     False  2026-03-10 06:15:25
# .. 872 700    svchost.exe           0xfa80042a5080      12       334      0     False  2026-03-10 06:15:25
# .. 968 700    svchost.exe           0xfa80042f0080      18       512      0     False  2026-03-10 06:15:25
# .. 1064 700   svchost.exe           0xfa800434a080      15       401      0     False  2026-03-10 06:15:25
# .. 1156 700   svchost.exe           0xfa80043a2080      8        198      0     False  2026-03-10 06:15:25
# .. 1320 700   svchost.exe           0xfa8004421300      6        172      0     False  2026-03-10 06:15:26
# .. 2104 700   spoolsv.exe           0xfa800459b080      7        126      0     False  2026-03-10 06:15:28
# .. 4872 700   svchost.exe           0xfa8004c3a300      6        147      0     False  2026-03-10 09:17:44   ◄── ANOMALOUS
# ... 4988 4872 cmd.exe               0xfa8004c8e080      1        28       0     False  2026-03-10 09:18:02   ◄── ANOMALOUS
# .... 5016 4988 whoami.exe           0xfa8004ca1040      0        -        0     False  2026-03-10 09:18:03
# .... 5104 4988 ipconfig.exe         0xfa8004cc2040      0        -        0     False  2026-03-10 09:18:05
# ... 5188 4872 cmd.exe               0xfa8004ce8080      1        28       0     False  2026-03-12 02:15:33   ◄── ANOMALOUS
# .... 5240 5188 net.exe              0xfa8004d0a040      0        -        0     False  2026-03-12 02:15:35
# .... 5312 5188 nltest.exe           0xfa8004d2e040      0        -        0     False  2026-03-12 02:15:40
# . 712  584    lsass.exe             0xfa8004215080      9        763      0     False  2026-03-10 06:15:24
# 660    588    winlogon.exe          0xfa80041f5080      3        124      1     False  2026-03-10 06:15:24
# 2492   2472   explorer.exe          0xfa80046e1080      32       1024     1     False  2026-03-10 06:30:14
# . 2680 2492   outlook.exe           0xfa8004782080      25       612      1     False  2026-03-10 06:31:02
# . 3104 2492   chrome.exe            0xfa80048e0080      8        215      1     False  2026-03-10 06:31:15
# .. 3296 3104  chrome.exe            0xfa8004962080      15       342      1     False  2026-03-10 06:31:15
# . 4520 2492   notepad.exe           0xfa8004b12080      1        52       1     False  2026-03-10 09:14:30
# . 5480 2492   msedge.exe            0xfa8004d8a080      4        112      1     False  2026-03-10 10:42:15
# SYNTHETIC — Process tree view
python2 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw --profile=Win10x64_19041 pstree

1.3 Cross-View Process Detection (psxview)

Compare process listings from multiple kernel data structures to detect hidden processes. Processes that appear in one list but not another may be using DKOM (Direct Kernel Object Manipulation) to hide.

# SYNTHETIC — Cross-reference process lists
# Volatility 3 uses separate plugins; combine results manually

# Method 1: PsList (EPROCESS linked list traversal)
python3 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw windows.pslist > /cases/novacorp/analysis/process/pslist.txt

# Method 2: PsScan (pool tag scanning — finds unlinked/terminated processes)
python3 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw windows.psscan > /cases/novacorp/analysis/process/psscan.txt

# Expected ADDITIONAL processes found by psscan but NOT in pslist (SYNTHETIC):
# PID    PPID   ImageFileName         Offset(P)          CreateTime                    ExitTime
# 5552   4872   conhost.exe           0x000000003e4a1040  2026-03-10 09:17:50.000000    -              ◄── HIDDEN
# 5620   4872   svchst.exe            0x000000003e512040  2026-03-10 09:17:52.000000    -              ◄── HIDDEN (note typo: svchst, not svchost)
# SYNTHETIC — Cross-view detection
python2 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw --profile=Win10x64_19041 psxview

# Expected output (SYNTHETIC):
# Offset(P)          Name         PID    pslist  psscan  thrdproc  pspcid  csrss  session  deskthrd  ExitTime
# 0x000000003e4a1040 conhost.exe  5552   False   True    True      True    False  False    False     -
# 0x000000003e512040 svchst.exe   5620   False   True    True      True    False  False    False     -

Hidden Processes Discovered

Two processes are hidden from the standard EPROCESS linked list:

  1. PID 5552 — conhost.exe — Hidden console host, likely providing terminal access for the attacker.
  2. PID 5620 — svchst.exe — Note the deliberate typo (missing 'o'). This is NOT a legitimate Windows process. It is a malware binary masquerading as svchost.exe. Parent PID 4872 confirms it was spawned by the suspicious svchost.exe instance.

Both processes were unlinked from the EPROCESS doubly-linked list using DKOM, making them invisible to tools that only walk the list (Task Manager, tasklist.exe, standard pslist).

1.4 Process Hollowing Detection

Examine the suspicious svchost.exe (PID 4872) for signs of process hollowing — a technique where a legitimate process is started in a suspended state, its memory is unmapped, and malicious code is written in its place.

# SYNTHETIC — Dump the process executable for PID 4872
python3 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw windows.dumpfiles --pid 4872

# Expected output (SYNTHETIC):
# Cache    FileObject       FileName             Result
# DataSectionObject 0xfa8004c3b520  svchost.exe    dumped (file.0xfa8004c3b520.0xfa8004c3a300.DataSectionObject.svchost.exe.dat)
# ImageSectionObject 0xfa8004c3b520 svchost.exe    dumped (file.0xfa8004c3b520.0xfa8004c3a300.ImageSectionObject.svchost.exe.img)

# Compare the PE header of the dumped image vs legitimate svchost.exe
python3 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw windows.vadinfo --pid 4872

# Key VAD entry for the main executable (SYNTHETIC):
# VAD node   0xfa8004c3c2a0
# Start      0x00400000
# End        0x0041ffff
# Tag        VadS
# Flags      CommitCharge: 32, Protection: PAGE_EXECUTE_READWRITE    ◄── SUSPICIOUS
# FileObject NONE                                                    ◄── SUSPICIOUS (should reference svchost.exe)
# SYNTHETIC — Dump process executable
python2 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw --profile=Win10x64_19041 procdump -p 4872 -D /cases/novacorp/evidence/dumped_files/

# Compare PE compilation timestamp
python2 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw --profile=Win10x64_19041 verinfo -p 4872

Process Hollowing Confirmed

The VAD analysis of PID 4872 reveals two critical indicators of process hollowing:

  1. PAGE_EXECUTE_READWRITE protection — The main executable region at 0x00400000 has RWX permissions. Legitimate svchost.exe loads with PAGE_EXECUTE_READ (RX). The writable permission indicates the memory was remapped with new content.
  2. Missing FileObject — The VAD entry for the executable image has no associated file object. Legitimate processes maintain a reference to their on-disk binary. The absence indicates the original mapping was destroyed and replaced.

Conclusion: PID 4872 was started as a legitimate svchost.exe, suspended, hollowed, and injected with the SHADOWBYTE RAT payload. The process maintains the appearance of a legitimate Windows service but executes entirely different code.

1.5 Service Verification

Verify whether PID 4872 is registered as a legitimate Windows service.

# SYNTHETIC — List services and their associated PIDs
python3 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw windows.svcscan

# Expected output for legitimate svchost.exe instances (SYNTHETIC — abbreviated):
# Offset           Order  PID   Start  State    Type    Name                    Display
# 0xfa800428f100   15     824   2      Running  Share   DcomLaunch              DCOM Server Process Launcher
# 0xfa80042a6100   22     872   2      Running  Share   RpcSs                   Remote Procedure Call (RPC)
# 0xfa80042f1100   28     968   2      Running  Share   Schedule                Task Scheduler
# 0xfa800434b100   33     1064  2      Running  Share   Themes                  Themes
# 0xfa80043a3100   41     1156  2      Running  Share   wuauserv                Windows Update
# 0xfa8004422100   47     1320  2      Running  Share   LanmanWorkstation       Workstation
#
# NOTE: PID 4872 does NOT appear in the service control manager database.   ◄── CONFIRMED MALICIOUS
Exercise 1 Checkpoint

At this point you should have identified:

  • PID 4872 (svchost.exe) as a process-hollowed SHADOWBYTE RAT instance
  • PID 5552 (conhost.exe) and PID 5620 (svchst.exe) as DKOM-hidden processes
  • Reconnaissance commands (whoami, ipconfig, net, nltest) spawned by the malicious svchost.exe
  • Two distinct activity windows: initial access (2026-03-10 09:17) and follow-up recon (2026-03-12 02:15)
  • Process hollowing indicators: RWX VAD permissions and missing FileObject
  • PID 4872 has no registered service entry, confirming it is not a legitimate svchost.exe

Key Finding: The attacker used process hollowing (T1055.012) to inject SHADOWBYTE into a svchost.exe process and DKOM (T1014) to hide two additional processes from standard enumeration.

1.6 Command-Line Argument Analysis

Extract command-line arguments for all suspicious processes to understand what commands the attacker executed.

# SYNTHETIC — Extract command line arguments
python3 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw windows.cmdline

# Expected output (SYNTHETIC — suspicious entries):
# PID    Process           Args
# 824    svchost.exe       C:\Windows\system32\svchost.exe -k DcomLaunch -p
# 872    svchost.exe       C:\Windows\system32\svchost.exe -k RPCSS -p
# 968    svchost.exe       C:\Windows\system32\svchost.exe -k netsvcs -p
# 1064   svchost.exe       C:\Windows\system32\svchost.exe -k netsvcs -p -s Themes
# 1156   svchost.exe       C:\Windows\system32\svchost.exe -k netsvcs -p -s wuauserv
# 1320   svchost.exe       C:\Windows\system32\svchost.exe -k NetworkService -p
# 4872   svchost.exe       C:\Windows\system32\svchost.exe                          ◄── NO -k FLAG = SUSPICIOUS
# 4988   cmd.exe           cmd.exe /c "whoami && ipconfig /all"                     ◄── RECON CHAIN
# 5016   whoami.exe        whoami                                                   ◄── RECON
# 5104   ipconfig.exe      ipconfig /all                                            ◄── RECON
# 5188   cmd.exe           cmd.exe /c "net group \"Domain Admins\" /domain && nltest /dclist:novacorp.example"  ◄── DOMAIN RECON
# 5240   net.exe           net group "Domain Admins" /domain                        ◄── ENUMERATE DOMAIN ADMINS
# 5312   nltest.exe        nltest /dclist:novacorp.example                          ◄── DC ENUMERATION
# 5620   svchst.exe        C:\ProgramData\NovaCorp\svchst.exe --mode service        ◄── NIGHTCRAWLER
# SYNTHETIC — Command line extraction
python2 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw --profile=Win10x64_19041 cmdline

Command-Line Analysis

Critical observations from the command-line data:

  1. All legitimate svchost.exe instances include the -k flag followed by a service group name (e.g., -k DcomLaunch). PID 4872 has no -k flag, which is a definitive indicator of a non-legitimate instance.
  2. Chained reconnaissance commands — The attacker used cmd.exe /c with && to chain multiple discovery commands in a single execution, reducing the number of process creation events.
  3. Domain Admin enumeration — The net group "Domain Admins" /domain command specifically targets privileged accounts, indicating the attacker is mapping high-value targets for privilege escalation.
  4. DC enumeration — The nltest /dclist:novacorp.example command maps all domain controllers, useful for planning Kerberoasting or DCSync attacks.
  5. NIGHTCRAWLER launch flag — PID 5620 (svchst.exe) was started with --mode service, a custom flag used by the NIGHTCRAWLER toolkit.

1.7 DLL List Comparison

Compare loaded DLLs between the suspicious svchost.exe and a legitimate instance to identify anomalies.

# SYNTHETIC — DLL list for legitimate svchost.exe (PID 824)
python3 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw windows.dlllist --pid 824

# Expected output (SYNTHETIC — abbreviated):
# PID    Base               Size     Name                Path
# 824    0x7ff7a0a00000     0x14000  svchost.exe         \Windows\System32\svchost.exe
# 824    0x7ff600000000     0x1f7000 ntdll.dll           \Windows\System32\ntdll.dll
# 824    0x7ff5fe800000     0x180000 kernel32.dll        \Windows\System32\kernel32.dll
# 824    0x7ff5ff000000     0x1c0000 KERNELBASE.dll      \Windows\System32\KERNELBASE.dll
# 824    0x7ff5fdc00000     0x8f000  sechost.dll         \Windows\System32\sechost.dll
# 824    0x7ff5fd800000     0xa7000  rpcrt4.dll          \Windows\System32\rpcrt4.dll
# 824    0x7ff5fc200000     0x25000  combase.dll         \Windows\System32\combase.dll
# (17 DLLs total — all from \Windows\System32\)

# DLL list for SUSPICIOUS svchost.exe (PID 4872)
python3 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw windows.dlllist --pid 4872

# Expected output (SYNTHETIC — abbreviated):
# PID    Base               Size     Name                Path
# 4872   0x7ff7a0a00000     0x14000  svchost.exe         \Windows\System32\svchost.exe    ◄── Original EXE still in PEB
# 4872   0x7ff600000000     0x1f7000 ntdll.dll           \Windows\System32\ntdll.dll
# 4872   0x7ff5fe800000     0x180000 kernel32.dll        \Windows\System32\kernel32.dll
# 4872   0x7ff5ff000000     0x1c0000 KERNELBASE.dll      \Windows\System32\KERNELBASE.dll
# 4872   0x7ff5fdc00000     0x8f000  ws2_32.dll          \Windows\System32\ws2_32.dll     ◄── NETWORK: not in legitimate
# 4872   0x7ff5fd400000     0x47000  wininet.dll         \Windows\System32\wininet.dll    ◄── HTTP: not in legitimate
# 4872   0x7ff5fd000000     0x38000  winhttp.dll         \Windows\System32\winhttp.dll    ◄── HTTP: not in legitimate
# 4872   0x7ff5fcc00000     0x1a000  crypt32.dll         \Windows\System32\crypt32.dll    ◄── CRYPTO: not in legitimate
# 4872   0x7ff5fc800000     0x12000  advapi32.dll        \Windows\System32\advapi32.dll
# (12 DLLs total — includes networking and crypto DLLs not present in legitimate svchost)

DLL Anomalies

The suspicious PID 4872 loads ws2_32.dll (Winsock), wininet.dll (Internet functions), winhttp.dll (HTTP client), and crypt32.dll (cryptographic functions). These are not typically loaded by a basic svchost.exe service host and indicate network communication and encrypted data handling — consistent with a C2 RAT.

1.8 Handle Analysis

Examine open handles to discover files, registry keys, mutexes, and other objects accessed by the malicious processes.

# SYNTHETIC — List handles for PID 4872
python3 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw windows.handles --pid 4872

# Expected output (SYNTHETIC — key entries):
# PID    Handle  Type      GrantedAccess  Name
# 4872   0x004   Event     0x1f0003       -
# 4872   0x008   Directory 0x0003         \KnownDlls
# 4872   0x00c   File      0x100020       \Device\HarddiskVolume3\ProgramData\NovaCorp             ◄── STAGING DIR
# 4872   0x014   File      0x12019f       \Device\HarddiskVolume3\ProgramData\NovaCorp\config.dat  ◄── CONFIG FILE
# 4872   0x018   Key       0x20019        MACHINE\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\RUN    ◄── PERSISTENCE KEY
# 4872   0x020   Mutant    0x1f0001       \BaseNamedObjects\Global\SHADOWBYTE-NOVACORP-2026-Q1     ◄── CAMPAIGN MUTEX
# 4872   0x028   Section   0x4            \BaseNamedObjects\__shadowbyte_shm__                     ◄── SHARED MEMORY
# 4872   0x030   File      0x100080       \Device\NamedPipe\shadowbyte_cred                        ◄── IPC PIPE
# 4872   0x038   Event     0x1f0003       \BaseNamedObjects\SHADOWBYTE_BEACON_TIMER                ◄── BEACON TIMER
# SYNTHETIC — Handle analysis
python2 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw --profile=Win10x64_19041 handles -p 4872 -t File,Key,Mutant

Handle Analysis Findings

The handle list confirms several findings from earlier exercises and reveals new artifacts:

  • Campaign Mutex (SHADOWBYTE-NOVACORP-2026-Q1) — Prevents multiple instances of the RAT from running. The mutex name contains the campaign ID found in the decrypted configuration.
  • Shared Memory Section (__shadowbyte_shm__) — Used for high-speed data transfer between the RAT core and its modules without going through named pipes.
  • Beacon Timer Event (SHADOWBYTE_BEACON_TIMER) — Named event object used to synchronize the C2 beaconing interval.
  • Registry Key Handle — Active handle to the Run key confirms the RAT monitors its own persistence.

Exercise 2: Network Forensics

Objectives

  • Extract active network connections and listening sockets from memory
  • Identify C2 communication channels using connection metadata
  • Analyze DNS cache entries to discover attacker infrastructure
  • Correlate network artifacts with suspicious processes identified in Exercise 1

2.1 Network Connection Analysis

# SYNTHETIC — Enumerate network connections
python3 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw windows.netscan

# Expected output (SYNTHETIC):
# Offset           Proto  LocalAddr        LocalPort  ForeignAddr      ForeignPort  State         PID    Owner           Created
# 0x3e201420       TCPv4  10.20.5.42       49812      198.51.100.47    443          ESTABLISHED   4872   svchost.exe     2026-03-12 14:58:12  ◄── C2
# 0x3e215840       TCPv4  10.20.5.42       49815      198.51.100.47    443          ESTABLISHED   4872   svchost.exe     2026-03-12 15:00:33  ◄── C2
# 0x3e230100       TCPv4  10.20.5.42       50112      198.51.100.23    8443         ESTABLISHED   5620   svchst.exe      2026-03-12 14:30:05  ◄── SECONDARY C2
# 0x3e248300       TCPv4  10.20.5.42       51004      10.20.3.15       445          ESTABLISHED   5620   svchst.exe      2026-03-12 02:16:10  ◄── LATERAL MOVEMENT
# 0x3e260500       TCPv4  10.20.5.42       51008      10.20.3.20       445          ESTABLISHED   5620   svchst.exe      2026-03-12 02:20:45  ◄── LATERAL MOVEMENT
# 0x3e280100       TCPv4  10.20.5.42       49668      10.20.1.10       88           TIME_WAIT     712    lsass.exe       2026-03-12 02:15:32
# 0x3e290400       TCPv4  10.20.5.42       49671      10.20.1.10       389          TIME_WAIT     4988   cmd.exe         2026-03-12 02:15:38
# 0x3e2a0200       TCPv4  10.20.5.42       49801      203.0.113.5      80           CLOSE_WAIT    3104   chrome.exe      2026-03-10 09:14:55  ◄── INITIAL DOWNLOAD
# 0x3e100300       UDPv4  10.20.5.42       5353       *                *            -             968    svchost.exe     2026-03-10 06:15:25
# 0x3e110200       UDPv4  10.20.5.42       137        *                *            -             4      System          2026-03-10 06:15:22
# 0x3e120400       TCPv4  0.0.0.0          49670      0.0.0.0          0            LISTENING     4872   svchost.exe     2026-03-10 09:17:46  ◄── BACKDOOR LISTENER
# 0x3e130100       TCPv4  10.20.5.42       139        0.0.0.0          0            LISTENING     4      System          2026-03-10 06:15:22
# 0x3e140200       TCPv4  10.20.5.42       445        0.0.0.0          0            LISTENING     4      System          2026-03-10 06:15:22
# SYNTHETIC — Network connections
python2 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw --profile=Win10x64_19041 netscan

Network Indicators of Compromise

The network scan reveals several critical findings:

Connection Analysis
PID 4872 → 198.51.100.47:443 Primary C2 channel. Two established HTTPS connections from the hollowed svchost.exe to the external C2 server. The 60-second beaconing interval matches SOC observations.
PID 5620 → 198.51.100.23:8443 Secondary C2 channel. The hidden svchst.exe process connects to a different C2 IP on a non-standard port. This provides redundancy if the primary channel is blocked.
PID 5620 → 10.20.3.15:445 Lateral movement to application server. SMB connection from the hidden process to srv-app-015, confirming the server was targeted.
PID 5620 → 10.20.3.20:445 Lateral movement to file server. SMB connection to srv-files-020, indicating data staging or exfiltration preparation.
PID 3104 → 203.0.113.5:80 Initial payload download. Chrome connection to an external IP at 09:14:55, just before the initial compromise at 09:15. This is likely the drive-by download or phishing payload delivery.
PID 4872 LISTENING on 49670 Local backdoor listener. The hollowed svchost.exe opened a listening port, likely for reverse shell access or additional tool deployment.
PID 4988 → 10.20.1.10:389 LDAP query to domain controller. The cmd.exe process spawned by the malicious svchost queried the DC, consistent with nltest domain reconnaissance.

2.2 DNS Cache Extraction

Extract the DNS resolver cache from memory to identify domains queried by the attacker.

# SYNTHETIC — Extract DNS cache (Windows DNS Client service cache in memory)
# Volatility 3 does not have a built-in DNS cache plugin; extract from svchost.exe hosting Dnscache
# PID 968 hosts the DNS Client service

python3 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw windows.vadyarascan \
    --pid 968 --yara-rules "rule dns { strings: $a = /[a-z0-9\-]+\.(example|example\.com)/ condition: $a }"
# SYNTHETIC — Reconstructed DNS cache entries from memory strings analysis
# Method: strings + grep on memory dump, filtered for resolution patterns

# Timestamp             Query                                    Response         TTL
# 2026-03-10 09:14:50   downloads.update-service.example         203.0.113.5      300    ◄── PAYLOAD DELIVERY
# 2026-03-10 09:17:30   update.novacorp-cdn.example              198.51.100.47    3600   ◄── PRIMARY C2
# 2026-03-10 09:17:35   telemetry.novacorp-cdn.example           198.51.100.23    3600   ◄── SECONDARY C2
# 2026-03-10 06:30:15   outlook.office365.example                192.0.2.100      300    ◄── LEGITIMATE
# 2026-03-10 06:31:10   www.google.example                       192.0.2.200      300    ◄── LEGITIMATE
# 2026-03-12 02:15:30   dc01.novacorp.example                    10.20.1.10       1200   ◄── LEGITIMATE (internal)
# 2026-03-12 02:16:05   srv-app-015.novacorp.example             10.20.3.15       1200   ◄── LATERAL MOVEMENT TARGET
# 2026-03-12 02:20:40   srv-files-020.novacorp.example           10.20.3.20       1200   ◄── LATERAL MOVEMENT TARGET
# 2026-03-12 14:25:00   exfil-drop.phantom-viper.example         198.51.100.99    60     ◄── EXFILTRATION STAGING

Domain Analysis

The attacker used domains designed to blend with legitimate NovaCorp infrastructure:

  • update.novacorp-cdn.example — Mimics a content delivery network for updates
  • telemetry.novacorp-cdn.example — Mimics telemetry collection
  • exfil-drop.phantom-viper.example — Exfiltration staging domain (less OPSEC-conscious)
  • downloads.update-service.example — Initial payload delivery domain

These domains all resolve to RFC 5737 documentation-range IPs, confirming they are synthetic.

2.3 Network Artifact Correlation

Build a connection map linking processes, network connections, and DNS resolutions.

SYNTHETIC — Network Artifact Correlation Map

                          ┌──────────────────────────────────────────────────┐
                          │          EXTERNAL INFRASTRUCTURE                 │
                          │                                                  │
                          │  203.0.113.5          198.51.100.47              │
                          │  (Payload Delivery)   (Primary C2)              │
                          │                                                  │
                          │  198.51.100.23        198.51.100.99              │
                          │  (Secondary C2)       (Exfil Staging)           │
                          └─────┬──────────────────┬───────────┬────────────┘
                                │                  │           │
                          ┌─────▼─────┐     ┌──────▼─────┐    │
                          │ chrome.exe│     │svchost.exe │    │
                          │ PID 3104  │     │ PID 4872   │    │
                          │ (download)│     │ (C2 beacon)│    │
                          └───────────┘     └──────┬─────┘    │
                                                   │          │
                                            ┌──────▼──────┐   │
                                            │ svchst.exe  │◄──┘
                                            │ PID 5620    │
                                            │ (hidden)    │
                                            └──┬───────┬──┘
                                               │       │
                                    ┌──────────▼┐  ┌──▼──────────┐
                                    │10.20.3.15 │  │10.20.3.20   │
                                    │srv-app-015│  │srv-files-020│
                                    │(lateral)  │  │(lateral)    │
                                    └───────────┘  └─────────────┘
Exercise 2 Checkpoint

At this point you should have:

  • Identified two C2 channels: primary (198.51.100.47:443) and secondary (198.51.100.23:8443)
  • Found the initial payload download connection (203.0.113.5:80)
  • Discovered lateral movement via SMB to srv-app-015 (10.20.3.15) and srv-files-020 (10.20.3.20)
  • Identified a local backdoor listener on port 49670
  • Extracted DNS cache entries revealing attacker domain infrastructure
  • Built a network correlation map connecting processes to infrastructure
  • Identified an exfiltration staging domain (exfil-drop.phantom-viper.example)

Key Finding: The attacker operates a dual-C2 architecture with primary and secondary channels for redundancy. Lateral movement was conducted over SMB (port 445) to at least two internal servers.


Exercise 3: Code Injection Detection

Objectives

  • Use malfind to detect injected code in process memory
  • Analyze Virtual Address Descriptors (VADs) for suspicious memory regions
  • Identify DLL injection and reflective DLL loading techniques
  • Extract injected payloads for offline analysis

3.1 Malfind Scan

The malfind plugin identifies memory regions with characteristics of injected code: executable permissions, no associated file mapping, and suspicious content (e.g., PE headers, shellcode patterns).

# SYNTHETIC — Scan for injected code
python3 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw windows.malfind

# Expected output (SYNTHETIC):
# PID    Process        Start VPN     End VPN       Tag   Protection                     Hexdump / Disassembly
#
# 4872   svchost.exe    0x00400000    0x0041ffff    VadS  PAGE_EXECUTE_READWRITE
#   4d 5a 90 00 03 00 00 00  04 00 00 00 ff ff 00 00   MZ..............
#   b8 00 00 00 00 00 00 00  40 00 00 00 00 00 00 00   ........@.......
#   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
#   00 00 00 00 00 00 00 00  00 00 00 00 e0 00 00 00   ................
#   ◄── PE HEADER (MZ magic bytes) in RWX region — PROCESS HOLLOWING
#
# 4872   svchost.exe    0x02a10000    0x02a1ffff    VadS  PAGE_EXECUTE_READWRITE
#   fc 48 83 e4 f0 48 31 c9  48 81 ec 00 10 00 00 48   .H...H1.H......H
#   8d 05 2f 00 00 00 48 89  45 f8 48 b9 01 00 00 00   ..../..H.E.H....
#   00 00 00 00 48 83 c1 68  51 48 8d 0d 1e 00 00 00   ....H..hQH......
#   48 83 c1 05 ff d1 48 89  45 e0 48 83 ec 20 48 8d   H.....H.E.H.. H.
#   ◄── SHELLCODE — x64 API-hashing stub (SYNTHETIC, non-functional)
#
# 712    lsass.exe      0x03f50000    0x03f6ffff    VadS  PAGE_EXECUTE_READWRITE
#   4d 5a 90 00 03 00 00 00  04 00 00 00 ff ff 00 00   MZ..............
#   b8 00 00 00 00 00 00 00  40 00 00 00 00 00 00 00   ........@.......
#   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
#   00 00 00 00 00 00 00 00  00 00 00 00 f8 00 00 00   ................
#   ◄── PE HEADER in lsass.exe memory — DLL INJECTION (credential harvesting module)
#
# 5620   svchst.exe     0x00400000    0x0042ffff    VadS  PAGE_EXECUTE_READWRITE
#   4d 5a 90 00 03 00 00 00  04 00 00 00 ff ff 00 00   MZ..............
#   b8 00 00 00 00 00 00 00  40 00 00 00 00 00 00 00   ........@.......
#   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
#   00 00 00 00 00 00 00 00  00 00 00 00 d0 00 00 00   ................
#   ◄── Hidden process with PE in RWX memory — NIGHTCRAWLER rootkit component
# SYNTHETIC — Malfind scan
python2 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw --profile=Win10x64_19041 malfind -p 4872

# Dump injected regions
python2 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw --profile=Win10x64_19041 malfind -p 4872 -D /cases/novacorp/evidence/dumped_files/

3.2 VAD (Virtual Address Descriptor) Analysis

Examine the full VAD tree for the malicious processes to understand their memory layout.

# SYNTHETIC — Full VAD tree for PID 4872
python3 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw windows.vadinfo --pid 4872

# Expected output (SYNTHETIC — key entries):
# VAD node   Start           End             Tag    Flags                                              FileObject
# 0xfa80..   0x00010000      0x0001ffff      VadS   CommitCharge: 1, Protection: PAGE_READWRITE        -
# 0xfa80..   0x00400000      0x0041ffff      VadS   CommitCharge: 32, Protection: PAGE_EXECUTE_READWRITE  NONE    ◄── HOLLOWED EXE
# 0xfa80..   0x00770000      0x008affff      Vad    CommitCharge: 0, Protection: PAGE_READONLY         \Windows\System32\locale.nls
# 0xfa80..   0x02a10000      0x02a1ffff      VadS   CommitCharge: 16, Protection: PAGE_EXECUTE_READWRITE  NONE    ◄── SHELLCODE
# 0xfa80..   0x7ff600000000  0x7ff600070fff  Vad    CommitCharge: 0, Protection: PAGE_EXECUTE_READ     \Windows\System32\ntdll.dll
# 0xfa80..   0x7ff5ff000000  0x7ff5ff1bffff  Vad    CommitCharge: 0, Protection: PAGE_EXECUTE_READ     \Windows\System32\kernelbase.dll
# 0xfa80..   0x7ff5fe800000  0x7ff5fe97ffff  Vad    CommitCharge: 0, Protection: PAGE_EXECUTE_READ     \Windows\System32\kernel32.dll
# 0xfa80..   0x7ff5fdc00000  0x7ff5fdc8ffff  Vad    CommitCharge: 0, Protection: PAGE_EXECUTE_READ     \Windows\System32\ws2_32.dll
# 0xfa80..   0x7ff5fd400000  0x7ff5fd47ffff  Vad    CommitCharge: 0, Protection: PAGE_EXECUTE_READ     \Windows\System32\wininet.dll
# 0xfa80..   0x04500000      0x045fffff      VadS   CommitCharge: 256, Protection: PAGE_EXECUTE_READWRITE  NONE   ◄── REFLECTIVE DLL

VAD Analysis Key Indicators

When analyzing VADs for code injection, look for these patterns:

Indicator Normal Suspicious
Protection PAGE_EXECUTE_READ (RX) PAGE_EXECUTE_READWRITE (RWX)
FileObject References on-disk DLL/EXE NONE (no backing file)
Tag Vad (mapped) VadS (private, committed)
Size Matches known DLL sizes Unusual sizes (16KB shellcode, etc.)
Location Standard DLL load addresses Low addresses (0x00400000) or heap regions

3.3 DLL Injection in LSASS

The malfind scan detected injected code in lsass.exe (PID 712). This is a critical finding — injecting into LSASS is a common technique for credential harvesting.

# SYNTHETIC — Enumerate DLLs loaded by lsass.exe
python3 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw windows.dlllist --pid 712

# Expected output (SYNTHETIC — abbreviated):
# PID    Base               Size     Name                        Path
# 712    0x7ff7a8c00000     0x58000  lsass.exe                   \Windows\System32\lsass.exe
# 712    0x7ff600000000     0x1f7000 ntdll.dll                   \Windows\System32\ntdll.dll
# 712    0x7ff5fe800000     0x180000 kernel32.dll                \Windows\System32\kernel32.dll
# 712    0x7ff5ff000000     0x1c0000 KERNELBASE.dll              \Windows\System32\KERNELBASE.dll
# 712    0x7ff5fa600000     0x9c000  lsasrv.dll                  \Windows\System32\lsasrv.dll
# 712    0x7ff5f9200000     0x3f000  sspisrv.dll                 \Windows\System32\sspisrv.dll
# 712    0x7ff5f8e00000     0x3b000  msv1_0.dll                  \Windows\System32\msv1_0.dll
# 712    0x7ff5f7400000     0x2a000  wdigest.dll                 \Windows\System32\wdigest.dll
# 712    0x7ff5f6800000     0x44000  kerberos.dll                \Windows\System32\kerberos.dll
# 712    0x7ff5f5c00000     0x22000  cloudAP.dll                 \Windows\System32\cloudAP.dll
#
# NOTE: No suspicious DLLs in the standard DLL list — the injected module is REFLECTIVELY LOADED
# (it does not appear in the PEB's InLoadOrderModuleList)
# SYNTHETIC — Dump the injected code from lsass.exe
python3 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw windows.malfind --pid 712 --dump

# Analyze the dumped PE
# File: pid.712.vad.0x03f50000-0x03f6ffff.dmp

# SYNTHETIC — PE analysis of extracted module
# File size:        131,072 bytes (128 KB)
# PE Compile Time:  2026-02-28 14:22:00 UTC (SYNTHETIC)
# PE Sections:
#   .text   0x1000   0x15000   r-x   (code)
#   .rdata  0x16000  0x3000    r--   (read-only data)
#   .data   0x19000  0x2000    rw-   (data)
#   .reloc  0x1b000  0x1000    r--   (relocations)
#
# Imported Functions (SYNTHETIC):
#   kernel32.dll:  CreateFileW, ReadFile, WriteFile, VirtualAlloc, CreateThread
#   advapi32.dll:  OpenProcessToken, LookupPrivilegeValueW, AdjustTokenPrivileges
#   secur32.dll:   AcquireCredentialsHandleW, InitializeSecurityContextW
#   crypt32.dll:   CryptUnprotectData
#
# Strings (SYNTHETIC):
#   "SHADOWBYTE-CRED v2.1"
#   "Harvesting credentials from LSASS..."
#   "wdigest clear-text extraction"
#   "kerberos ticket export"
#   "\\.\pipe\shadowbyte_cred"
#   "198.51.100.47"

Credential Harvesting Module Identified

The injected code in lsass.exe is a credential harvesting module (part of the SHADOWBYTE toolkit). Key indicators:

  • Reflective loading — The DLL does not appear in the PEB module list, meaning it was loaded using a custom loader that maps the PE manually without calling LoadLibrary.
  • Credential-related imports — Functions from secur32.dll and crypt32.dll indicate credential extraction capability.
  • Named pipe communication — Uses \\.\pipe\shadowbyte_cred for inter-process communication with the main SHADOWBYTE RAT (PID 4872).
  • ATT&CK mapping — T1003.001 (LSASS Memory), T1055.001 (DLL Injection), T1055.003 (Reflective DLL Loading).

3.4 Reflective DLL Detection in PID 4872

The VAD analysis in section 3.2 showed a large RWX region at 0x04500000 with no backing file. This is the SHADOWBYTE RAT's core module, loaded reflectively.

# SYNTHETIC — Dump the reflective DLL from PID 4872
python3 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw windows.vadyarascan \
    --pid 4872 --yara-rules "rule pe_header { strings: \$mz = { 4D 5A } condition: \$mz at 0 }" \
    --dump

# SYNTHETIC — PE analysis of extracted SHADOWBYTE RAT core module
# File: pid.4872.vad.0x04500000-0x045fffff.dmp
# File size:        1,048,576 bytes (1 MB)
# PE Compile Time:  2026-03-01 08:15:00 UTC (SYNTHETIC)
# PE Sections:
#   .text    0x1000    0x82000   r-x   (code — large, indicating complex functionality)
#   .rdata   0x83000   0x12000   r--   (read-only data)
#   .data    0x95000   0x8000    rw-   (data)
#   .rsrc    0x9d000   0x2000    r--   (resources — contains encrypted config)
#   .reloc   0x9f000   0x1000    r--   (relocations)
#
# Exported Functions (SYNTHETIC):
#   ReflectiveLoader         — Self-mapping PE loader
#   ShadowbyteInit           — RAT initialization
#   BeaconMain               — C2 beacon loop
#   ExecuteCommand           — Command execution handler
#   FileOperation            — File upload/download
#   ScreenCapture            — Screenshot capture
#   KeylogStart              — Keylogger initialization
#   CredHarvest              — Credential harvester launcher
#   LateralSpread            — Lateral movement module
#   SelfDestruct             — Cleanup and self-removal
#
# Encrypted Configuration Block (decrypted — SYNTHETIC):
#   c2_primary:     198.51.100.47:443
#   c2_secondary:   198.51.100.23:8443
#   c2_fallback:    exfil-drop.phantom-viper.example:443
#   beacon_interval: 60
#   jitter:          0.2
#   user_agent:      "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
#   encryption:      AES-256-CBC
#   campaign_id:     "NOVACORP-2026-Q1"
#   kill_date:       "2026-06-30"
Exercise 3 Checkpoint

At this point you should have:

  • Used malfind to identify injected code in PIDs 4872, 712, and 5620
  • Detected process hollowing in PID 4872 (PE header in RWX region at base address)
  • Found shellcode at 0x02a10000 in PID 4872 (API-hashing stub)
  • Identified a reflective DLL (SHADOWBYTE credential harvester) injected into lsass.exe (PID 712)
  • Located the SHADOWBYTE RAT core module reflectively loaded at 0x04500000 in PID 4872
  • Extracted the RAT configuration including C2 infrastructure and campaign metadata
  • Identified the credential harvesting module communicating via named pipe

Key Finding: The attacker deployed a multi-component malware toolkit: SHADOWBYTE RAT (process-hollowed into svchost.exe) with a reflectively loaded credential harvester injected into lsass.exe. The hidden svchst.exe (PID 5620) serves as the NIGHTCRAWLER rootkit component handling lateral movement.


Exercise 4: Rootkit Detection

Objectives

  • Scan for System Service Descriptor Table (SSDT) hooks that intercept system calls
  • Check for Interrupt Descriptor Table (IDT) modifications
  • Detect DKOM (Direct Kernel Object Manipulation) used to hide processes and drivers
  • Identify hidden kernel drivers loaded by the NIGHTCRAWLER rootkit

4.1 SSDT Hook Detection

The System Service Descriptor Table (SSDT) maps system call numbers to kernel function addresses. Rootkits hook SSDT entries to intercept and filter system calls, enabling them to hide files, processes, registry keys, and network connections.

# SYNTHETIC — Scan for SSDT hooks
python3 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw windows.ssdt

# Expected output (SYNTHETIC — showing hooked entries):
# Index  Address              Module           Symbol
# 0x0000 0xfffff80712345678   ntoskrnl.exe     NtAcceptWaitablePort
# 0x0001 0xfffff8071234abcd   ntoskrnl.exe     NtAccessCheck
# ...
# 0x0023 0xfffff80712360000   ntoskrnl.exe     NtClose
# 0x0024 0xfffff80712361234   ntoskrnl.exe     NtCommitComplete
# ...
# 0x003E 0xfffff807DEAD0001   UNKNOWN          NtCreateFile              ◄── HOOKED
# ...
# 0x0052 0xfffff807DEAD0002   UNKNOWN          NtEnumerateValueKey       ◄── HOOKED
# ...
# 0x0055 0xfffff807DEAD0003   UNKNOWN          NtQueryDirectoryFile      ◄── HOOKED
# ...
# 0x0098 0xfffff807DEAD0004   UNKNOWN          NtQuerySystemInformation  ◄── HOOKED
# ...
# 0x0119 0xfffff80712398765   ntoskrnl.exe     NtWriteFile
# 0x011A 0xfffff807123abcde   ntoskrnl.exe     NtWriteVirtualMemory
# SYNTHETIC — SSDT hook scan
python2 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw --profile=Win10x64_19041 ssdt

# Look for entries pointing outside ntoskrnl.exe or known drivers
python2 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw --profile=Win10x64_19041 ssdt | grep -v "ntoskrnl\|win32k"

SSDT Hooks Detected — NIGHTCRAWLER Rootkit

Four SSDT entries are hooked, redirecting system calls to addresses in an UNKNOWN module (not part of ntoskrnl.exe or any legitimate driver):

Hooked Function System Call Purpose Rootkit Capability
NtCreateFile Open/create files File hiding — Filter out rootkit files from directory listings
NtEnumerateValueKey Enumerate registry values Registry hiding — Hide persistence registry keys
NtQueryDirectoryFile List directory contents File hiding — Remove rootkit binaries from dir output
NtQuerySystemInformation Query process/system info Process hiding — Filter rootkit processes from Task Manager

The hook addresses (0xfffff807DEAD0001 through 0xfffff807DEAD0004) are clearly synthetic but in a real scenario would point to rootkit driver code. These hooks work in concert with the DKOM process unlinking observed in Exercise 1.

4.2 Hidden Driver Detection

Rootkits typically load a kernel driver to install SSDT hooks and perform DKOM. Scan for drivers that may be hidden from the standard driver list.

# SYNTHETIC — List all loaded kernel modules
python3 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw windows.modules

# Expected output (SYNTHETIC — abbreviated, showing suspicious entry):
# Offset              Base                 Size     Name                    Path
# 0xfa8005120080      0xfffff80712000000   0xA00000 ntoskrnl.exe            \SystemRoot\system32\ntoskrnl.exe
# 0xfa8005121080      0xfffff80713000000   0x800000 win32kfull.sys          \SystemRoot\system32\win32kfull.sys
# 0xfa8005122080      0xfffff80714000000   0x40000  NETIO.SYS              \SystemRoot\system32\drivers\NETIO.SYS
# ...
# 0xfa8005130080      0xfffff80715500000   0x10000  fltMgr.sys             \SystemRoot\system32\drivers\fltMgr.sys
# 0xfa8005131080      0xfffff80715600000   0xA000   intelppm.sys           \SystemRoot\system32\drivers\intelppm.sys
# ...
# (nightcrawler.sys NOT listed — hidden from module list)

# Scan for drivers using pool tag scanning (finds hidden drivers)
python3 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw windows.driverscan

# Expected ADDITIONAL driver found by driverscan (SYNTHETIC):
# Offset              Start                Size     ServiceKey          DriverName           DriverNameOffset
# 0x000000003f810040  0xfffff807DEAD0000   0x8000   NightCrawlerSvc     \Driver\ncrawler     0x000000003f810120   ◄── HIDDEN ROOTKIT DRIVER
# SYNTHETIC — Driver scan
python2 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw --profile=Win10x64_19041 driverscan

# Compare with modules list
python2 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw --profile=Win10x64_19041 modules

# Find orphan drivers (in driverscan but not modules)
python2 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw --profile=Win10x64_19041 moddump -b 0xfffff807DEAD0000 -D /cases/novacorp/evidence/dumped_files/

Hidden Rootkit Driver — NIGHTCRAWLER

The driverscan plugin (which scans for driver objects using pool tag scanning) found a driver that is not listed in the standard modules list:

  • Driver Name: \Driver\ncrawler
  • Service Key: NightCrawlerSvc
  • Base Address: 0xfffff807DEAD0000
  • Size: 32,768 bytes (32 KB)

This driver was removed from the PsLoadedModuleList (the kernel's linked list of loaded modules) using DKOM — the same technique used to hide processes. The driver provides the SSDT hooks detected in section 4.1 and the DKOM capability used to hide PIDs 5552 and 5620.

4.3 IDT Analysis

Check the Interrupt Descriptor Table for modifications that could indicate rootkit hooks on hardware interrupts or software interrupts.

# SYNTHETIC — IDT scan (Volatility 3 approach)
# Note: Volatility 3 does not have a dedicated IDT plugin; use raw memory analysis

python3 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw windows.idt

# Expected output (SYNTHETIC — abbreviated):
# CPU  Index  Selector  Value              Module           Section
# 0    0x00   0x0010    0xfffff80712340000  ntoskrnl.exe     .text    (Divide Error)
# 0    0x01   0x0010    0xfffff80712340100  ntoskrnl.exe     .text    (Debug)
# 0    0x02   0x0010    0xfffff80712340200  ntoskrnl.exe     .text    (NMI)
# 0    0x03   0x0010    0xfffff80712340300  ntoskrnl.exe     .text    (Breakpoint)
# ...
# 0    0x2E   0x0010    0xfffff80712345000  ntoskrnl.exe     .text    (System Call — KiSystemService)
# ...
# 0    0xE1   0x0010    0xfffff807DEAD5000  UNKNOWN          UNKNOWN  ◄── HOOKED (custom interrupt)
# ...
#
# All standard IDT entries point to ntoskrnl.exe EXCEPT:
#   - INT 0xE1: Points to NIGHTCRAWLER driver space — used as a covert communication channel
#     between user-mode SHADOWBYTE components and the kernel-mode rootkit
# SYNTHETIC — IDT scan
python2 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw --profile=Win10x64_19041 idt

4.4 DKOM Process Hiding Verification

Confirm the DKOM technique used to unlink processes from the EPROCESS linked list.

# SYNTHETIC — Compare EPROCESS linked list with pool tag scan
# We already identified hidden PIDs 5552 and 5620 in Exercise 1

# Verify by examining the EPROCESS structures directly
python3 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw windows.psscan --pid 5552

# Expected output (SYNTHETIC):
# PID    PPID   ImageFileName    Offset(P)          Threads  Handles  Sess  Wow64  CreateTime                    ExitTime
# 5552   4872   conhost.exe      0x000000003e4a1040  2        42       0     False  2026-03-10 09:17:50.000000    -

# Check the ActiveProcessLinks for manipulation
# In a real analysis, you would examine the Flink/Blink pointers:
#
# Normal EPROCESS linking:
#   Process A → Process B → Process C → Process A (circular)
#
# After DKOM unlinking of Process B:
#   Process A → Process C → Process A (B removed, but B still in memory)
#   Process B's Flink/Blink may point to itself or to A/C
#
# Evidence: PID 5552 EPROCESS at 0x3e4a1040 has Flink == Blink (points to itself)
# This confirms the process was manually unlinked from the ActiveProcessLinks list
Exercise 4 Checkpoint

At this point you should have:

  • Detected 4 SSDT hooks intercepting NtCreateFile, NtEnumerateValueKey, NtQueryDirectoryFile, and NtQuerySystemInformation
  • Identified the hidden NIGHTCRAWLER rootkit driver (\Driver\ncrawler) at 0xfffff807DEAD0000
  • Found a hooked IDT entry (INT 0xE1) used for covert kernel-user communication
  • Confirmed DKOM process unlinking by examining EPROCESS ActiveProcessLinks
  • Understood the rootkit architecture: kernel driver provides stealth (SSDT hooks + DKOM) while user-mode components handle C2 and operations

Key Finding: NIGHTCRAWLER is a kernel-mode rootkit that provides comprehensive stealth capabilities: process hiding via DKOM, file/registry hiding via SSDT hooks, and covert communication via a custom IDT entry. This works in coordination with the user-mode SHADOWBYTE RAT.

4.5 Kernel Callback Analysis

Modern rootkits also register kernel callbacks to intercept process creation, image loading, and registry operations. These callbacks are more stealthy than SSDT hooks because they use documented kernel APIs.

# SYNTHETIC — Check process creation callbacks
python3 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw windows.callbacks

# Expected output (SYNTHETIC — key entries):
# Type                      Callback             Module           Detail
# PsSetCreateProcessNotify  0xfffff80712345600   ntoskrnl.exe     (Legitimate — process auditing)
# PsSetCreateProcessNotify  0xfffff80714501000   cng.sys          (Legitimate — crypto provider)
# PsSetCreateProcessNotify  0xfffff80715601200   WdFilter.sys     (Legitimate — Windows Defender)
# PsSetCreateProcessNotify  0xfffff807DEAD6000   UNKNOWN          ◄── ROOTKIT CALLBACK
# PsSetLoadImageNotify      0xfffff80712346000   ntoskrnl.exe     (Legitimate — image load auditing)
# PsSetLoadImageNotify      0xfffff807DEAD6100   UNKNOWN          ◄── ROOTKIT CALLBACK
# CmRegisterCallback        0xfffff80712347000   ntoskrnl.exe     (Legitimate — registry auditing)
# CmRegisterCallback        0xfffff80715601400   WdFilter.sys     (Legitimate — Windows Defender)
# CmRegisterCallback        0xfffff807DEAD6200   UNKNOWN          ◄── ROOTKIT CALLBACK

Rootkit Kernel Callbacks

NIGHTCRAWLER registered three kernel callbacks, all pointing to the rootkit driver address space (0xfffff807DEAD*):

Callback Type Purpose
PsSetCreateProcessNotify Monitors new process creation — allows the rootkit to automatically hide new SHADOWBYTE child processes as they are spawned
PsSetLoadImageNotify Monitors DLL/driver loading — can intercept and block security tool drivers from loading
CmRegisterCallback Monitors registry operations — hides rootkit persistence keys from registry scanning tools

These callbacks are more sophisticated than SSDT hooks because they use documented, supported Windows kernel APIs (PsSetCreateProcessNotifyRoutine, PsSetLoadImageNotifyRoutine, CmRegisterCallbackEx). Security tools that only check for SSDT hooks would miss these.

4.6 Rootkit Architecture Summary

SYNTHETIC — NIGHTCRAWLER Rootkit Architecture

    ┌─────────────────────────────────────────────────────────┐
    │                    USER MODE                             │
    │                                                          │
    │  ┌──────────────┐    ┌──────────────┐   ┌────────────┐  │
    │  │ svchost.exe  │    │ svchst.exe   │   │ conhost.exe│  │
    │  │ PID 4872     │    │ PID 5620     │   │ PID 5552   │  │
    │  │ (SHADOWBYTE  │    │ (NIGHTCRAWLER│   │ (Hidden    │  │
    │  │  RAT core)   │    │  user-mode)  │   │  console)  │  │
    │  │ [Hollowed]   │    │ [DKOM hidden]│   │ [DKOM hid] │  │
    │  └──────┬───────┘    └──────┬───────┘   └────────────┘  │
    │         │ Named Pipe        │ INT 0xE1                   │
    │  ┌──────▼───────┐          │ (covert channel)           │
    │  │ lsass.exe    │          │                             │
    │  │ PID 712      │          │                             │
    │  │ (Cred module │          │                             │
    │  │  injected)   │          │                             │
    │  └──────────────┘          │                             │
    ├─────────────────────────────┼─────────────────────────────┤
    │                    KERNEL MODE                            │
    │                             │                             │
    │              ┌──────────────▼──────────────┐              │
    │              │     ncrawler.sys             │              │
    │              │   (NIGHTCRAWLER driver)      │              │
    │              │   Base: 0xfffff807DEAD0000   │              │
    │              │   [Hidden from module list]  │              │
    │              │                              │              │
    │              │   Capabilities:              │              │
    │              │   ├─ SSDT hooks (4 syscalls) │              │
    │              │   ├─ DKOM (process/driver)   │              │
    │              │   ├─ IDT hook (INT 0xE1)     │              │
    │              │   ├─ Process notify callback │              │
    │              │   ├─ Image load callback     │              │
    │              │   └─ Registry callback       │              │
    │              └─────────────────────────────┘              │
    └──────────────────────────────────────────────────────────┘

Exercise 5: Timeline & IOC Extraction

Objectives

  • Build a forensic timeline using timeliner to correlate all memory artifacts chronologically
  • Extract files from memory for offline analysis
  • Dump credential material (synthetic hashes) from memory
  • Analyze registry keys for persistence mechanisms
  • Compile a comprehensive IOC report

5.1 Timeline Generation

# SYNTHETIC — Generate a comprehensive timeline from memory artifacts
python3 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw timeliner.Timeliner

# Expected output (SYNTHETIC — key events sorted chronologically):
# Timestamp                    Plugin          Description
# 2026-03-10 06:15:18.000000   windows.psscan  Process: Registry (PID 104) created
# 2026-03-10 06:15:22.000000   windows.psscan  Process: System (PID 4) created
# 2026-03-10 06:15:22.000000   windows.psscan  Process: smss.exe (PID 392) created
# 2026-03-10 06:15:24.000000   windows.psscan  Process: csrss.exe (PID 508) created
# 2026-03-10 06:15:24.000000   windows.psscan  Process: wininit.exe (PID 584) created
# 2026-03-10 06:15:24.000000   windows.psscan  Process: services.exe (PID 700) created
# 2026-03-10 06:15:24.000000   windows.psscan  Process: lsass.exe (PID 712) created
# 2026-03-10 06:15:25.000000   windows.psscan  Process: svchost.exe (PID 824) created
# 2026-03-10 06:15:25.000000   windows.psscan  Process: svchost.exe (PID 872) created
# 2026-03-10 06:15:25.000000   windows.psscan  Process: svchost.exe (PID 968) created
# 2026-03-10 06:15:28.000000   windows.psscan  Process: spoolsv.exe (PID 2104) created
# 2026-03-10 06:30:14.000000   windows.psscan  Process: explorer.exe (PID 2492) created
# 2026-03-10 06:31:02.000000   windows.psscan  Process: outlook.exe (PID 2680) created
# 2026-03-10 06:31:15.000000   windows.psscan  Process: chrome.exe (PID 3104) created
# 2026-03-10 09:14:30.000000   windows.psscan  Process: notepad.exe (PID 4520) created         ◄── USER OPENS ATTACHMENT
# 2026-03-10 09:14:55.000000   windows.netscan  Network: chrome.exe (3104) → 203.0.113.5:80   ◄── PAYLOAD DOWNLOAD
# 2026-03-10 09:17:44.000000   windows.psscan  Process: svchost.exe (PID 4872) created         ◄── SHADOWBYTE RAT DEPLOYED
# 2026-03-10 09:17:46.000000   windows.netscan  Network: svchost.exe (4872) LISTENING :49670   ◄── BACKDOOR PORT OPENED
# 2026-03-10 09:17:50.000000   windows.psscan  Process: conhost.exe (PID 5552) created [HIDDEN] ◄── HIDDEN CONSOLE
# 2026-03-10 09:17:52.000000   windows.psscan  Process: svchst.exe (PID 5620) created [HIDDEN] ◄── NIGHTCRAWLER DEPLOYED
# 2026-03-10 09:18:02.000000   windows.psscan  Process: cmd.exe (PID 4988) created             ◄── INITIAL RECON START
# 2026-03-10 09:18:03.000000   windows.psscan  Process: whoami.exe (PID 5016) created/exited   ◄── RECON: whoami
# 2026-03-10 09:18:05.000000   windows.psscan  Process: ipconfig.exe (PID 5104) created/exited ◄── RECON: ipconfig
# 2026-03-10 10:42:15.000000   windows.psscan  Process: msedge.exe (PID 5480) created          ◄── Normal user activity
# 2026-03-12 02:15:32.000000   windows.netscan  Network: lsass.exe (712) → 10.20.1.10:88      ◄── KERBEROS TICKET REQUEST
# 2026-03-12 02:15:33.000000   windows.psscan  Process: cmd.exe (PID 5188) created             ◄── SECOND RECON WAVE
# 2026-03-12 02:15:35.000000   windows.psscan  Process: net.exe (PID 5240) created/exited      ◄── RECON: net
# 2026-03-12 02:15:38.000000   windows.netscan  Network: cmd.exe (4988) → 10.20.1.10:389      ◄── LDAP QUERY TO DC
# 2026-03-12 02:15:40.000000   windows.psscan  Process: nltest.exe (PID 5312) created/exited   ◄── RECON: nltest (domain trust)
# 2026-03-12 02:16:10.000000   windows.netscan  Network: svchst.exe (5620) → 10.20.3.15:445   ◄── LATERAL MOVEMENT: APP SERVER
# 2026-03-12 02:20:45.000000   windows.netscan  Network: svchst.exe (5620) → 10.20.3.20:445   ◄── LATERAL MOVEMENT: FILE SERVER
# 2026-03-12 14:25:00.000000   dns_cache        DNS: exfil-drop.phantom-viper.example resolved ◄── EXFIL DOMAIN RESOLVED
# 2026-03-12 14:30:05.000000   windows.netscan  Network: svchst.exe (5620) → 198.51.100.23:8443 ◄── SECONDARY C2 ACTIVE
# 2026-03-12 14:37:00.000000   soc_detection    SOC Alert: Anomalous outbound HTTPS beaconing  ◄── DETECTION
# 2026-03-12 14:58:12.000000   windows.netscan  Network: svchost.exe (4872) → 198.51.100.47:443 ◄── C2 BEACON (at acquisition)
# 2026-03-12 15:00:33.000000   windows.netscan  Network: svchost.exe (4872) → 198.51.100.47:443 ◄── C2 BEACON (at acquisition)
# 2026-03-12 15:02:33.000000   acquisition      Memory dump acquired                            ◄── DUMP CAPTURED

5.2 Credential Extraction

Synthetic Credentials

All credential material below is 100% synthetic and fictional. Hashes follow the format SYNTHETIC-HASH-* and are not real NTLM, LM, or Kerberos hashes. Never use extracted credentials from a real engagement for unauthorized access.

# SYNTHETIC — Dump password hashes from SAM/SYSTEM registry hives
python3 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw windows.hashdump

# Expected output (SYNTHETIC):
# User             RID    LM Hash                           NTLM Hash
# Administrator    500    aad3b435b51404eeaad3b435b51404ee  SYNTHETIC-HASH-01a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6
# Guest            501    aad3b435b51404eeaad3b435b51404ee  SYNTHETIC-HASH-00000000000000000000000000000000
# DefaultAccount   503    aad3b435b51404eeaad3b435b51404ee  SYNTHETIC-HASH-00000000000000000000000000000000
# jdoe             1001   aad3b435b51404eeaad3b435b51404ee  SYNTHETIC-HASH-a1a1a1a1b2b2b2b2c3c3c3c3d4d4d4d4
# svc-backup       1002   aad3b435b51404eeaad3b435b51404ee  SYNTHETIC-HASH-e5e5e5e5f6f6f6f6a7a7a7a7b8b8b8b8
# SYNTHETIC — Extract cached domain credentials
python3 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw windows.cachedump

# Expected output (SYNTHETIC):
# User               Domain            Hash
# jdoe               NOVACORP          SYNTHETIC-HASH-CACHED-aabbccdd11223344aabbccdd11223344
# admin.smith        NOVACORP          SYNTHETIC-HASH-CACHED-55667788aabbccddee11223344556677
# svc-sqlprod        NOVACORP          SYNTHETIC-HASH-CACHED-99aabbccddeeff0011223344556677889
# SYNTHETIC — Extract LSA secrets
python3 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw windows.lsadump

# Expected output (SYNTHETIC):
# Key                                    Secret
# DefaultPassword                        REDACTED
# DPAPI_SYSTEM                           SYNTHETIC-DPAPI-KEY-aabbccdd1122334455667788
# NL$KM                                  SYNTHETIC-NLKM-KEY-99aabbccddeeff0011223344
# _SC_NovaCorp-BackupSvc                 SYNTHETIC-SVC-PASS-REDACTED

5.3 Registry Analysis

Extract registry hives from memory and analyze persistence mechanisms.

# SYNTHETIC — List registry hives in memory
python3 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw windows.registry.hivelist

# Expected output (SYNTHETIC):
# Offset              FileFullPath
# 0xfa80042a0080      \REGISTRY\MACHINE\SYSTEM
# 0xfa80042b0080      \REGISTRY\MACHINE\SOFTWARE
# 0xfa80042c0080      \REGISTRY\MACHINE\SAM
# 0xfa80042d0080      \REGISTRY\MACHINE\SECURITY
# 0xfa80050e0080      \??\C:\Users\jdoe\ntuser.dat
# 0xfa80050f0080      \??\C:\Users\jdoe\AppData\Local\Microsoft\Windows\UsrClass.dat
# SYNTHETIC — Check Run keys for persistence
python3 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw windows.registry.printkey \
    --key "SOFTWARE\Microsoft\Windows\CurrentVersion\Run"

# Expected output (SYNTHETIC):
# Key:       SOFTWARE\Microsoft\Windows\CurrentVersion\Run
# Last Write: 2026-03-10 09:18:15 UTC
#
# REG_SZ  SecurityHealthSystray  : "C:\Windows\System32\SecurityHealthSystray.exe"    ◄── LEGITIMATE
# REG_SZ  WindowsDefender        : "C:\Program Files\Windows Defender\MSASCuiL.exe"   ◄── LEGITIMATE
# REG_SZ  NovaCorp Update Agent  : "C:\ProgramData\NovaCorp\update_agent.exe"         ◄── SUSPICIOUS ◄── PERSISTENCE
# SYNTHETIC — Check Services registry key
python3 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw windows.registry.printkey \
    --key "SYSTEM\CurrentControlSet\Services\NightCrawlerSvc"

# Expected output (SYNTHETIC):
# Key:       SYSTEM\CurrentControlSet\Services\NightCrawlerSvc
# Last Write: 2026-03-10 09:17:48 UTC
#
# REG_DWORD  Type           : 1   (Kernel Driver)
# REG_DWORD  Start          : 1   (System Start)
# REG_DWORD  ErrorControl   : 0   (Ignore)
# REG_SZ     DisplayName    : "Windows Network Compliance Driver"        ◄── DECEPTIVE NAME
# REG_SZ     ImagePath      : "\SystemRoot\System32\drivers\ncrawler.sys"
# REG_SZ     Description    : "Provides network compliance verification"  ◄── DECEPTIVE DESCRIPTION
# SYNTHETIC — Check Scheduled Tasks for persistence
python3 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw windows.registry.printkey \
    --key "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree"

# Found suspicious task (SYNTHETIC):
# Key:       ...\TaskCache\Tree\Microsoft\Windows\NetComplianceCheck
# Last Write: 2026-03-10 09:18:20 UTC
#
# This task name mimics a legitimate Windows task.
# Associated Actions registry entry reveals:
#   Exec Command: "C:\Windows\System32\rundll32.exe"
#   Exec Arguments: "C:\ProgramData\NovaCorp\compliance.dll,CheckCompliance"   ◄── PERSISTENCE via rundll32
#   Trigger: Daily at 02:00 AM

Persistence Mechanisms Identified

Three persistence mechanisms were installed by PHANTOM-VIPER:

Mechanism Location Technique ATT&CK
Registry Run Key HKLM\SOFTWARE\...\Run\NovaCorp Update Agent Runs update_agent.exe at user login T1547.001
Kernel Driver Service HKLM\SYSTEM\...\Services\NightCrawlerSvc Loads ncrawler.sys at system boot T1543.003
Scheduled Task NetComplianceCheck via Task Scheduler Runs rundll32.exe with malicious DLL daily at 02:00 T1053.005

5.4 File Extraction from Memory

# SYNTHETIC — Dump files associated with malicious processes
python3 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw windows.dumpfiles --pid 4872

# SYNTHETIC — Scan for file objects matching suspicious paths
python3 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw windows.filescan | grep -i "novacorp\|ncrawler\|update_agent\|compliance"

# Expected output (SYNTHETIC):
# Offset              Name
# 0x000000003e8a0200  \ProgramData\NovaCorp\update_agent.exe            ◄── PERSISTENCE BINARY
# 0x000000003e8b0100  \ProgramData\NovaCorp\compliance.dll              ◄── SCHEDULED TASK PAYLOAD
# 0x000000003e8c0300  \ProgramData\NovaCorp\config.dat                  ◄── ENCRYPTED CONFIGURATION
# 0x000000003f810300  \Windows\System32\drivers\ncrawler.sys            ◄── ROOTKIT DRIVER
# 0x000000003e8d0400  \Users\jdoe\AppData\Local\Temp\invoice_Q1.pdf.exe ◄── INITIAL DROPPER

# Dump the files for offline analysis
python3 vol.py -f /cases/novacorp/ws-fin-042_20260312_1502.raw windows.dumpfiles \
    --physaddr 0x000000003e8a0200

# SYNTHETIC — File hashes of extracted malware components
# File                      SHA-256 (SYNTHETIC)                                                    Size
# update_agent.exe          SYNTHETIC-HASH-SHA256-update-agent-aabbccdd11223344556677889900aabbcc   245,760 bytes
# compliance.dll            SYNTHETIC-HASH-SHA256-compliance-dll-112233445566778899aabbccddeeff00   131,072 bytes
# config.dat                SYNTHETIC-HASH-SHA256-config-dat-aabbccddeeff00112233445566778899aa     4,096 bytes
# ncrawler.sys              SYNTHETIC-HASH-SHA256-ncrawler-sys-ffeeddccbbaa00998877665544332211     32,768 bytes
# invoice_Q1.pdf.exe        SYNTHETIC-HASH-SHA256-invoice-dropper-0011223344556677889900aabbccdd    512,000 bytes

5.5 Comprehensive IOC Report

Compile all extracted indicators of compromise into a structured report.

# SYNTHETIC IOC Report — NovaCorp Financial Incident
# Generated: 2026-03-12
# Classification: TLP:RED (SYNTHETIC)
# Threat Actor: PHANTOM-VIPER (fictional)
# Malware Family: SHADOWBYTE (RAT), NIGHTCRAWLER (rootkit)

type,indicator,context,confidence,mitre_technique
ip,198.51.100.47,Primary C2 server,High,T1071.001
ip,198.51.100.23,Secondary C2 server,High,T1071.001
ip,203.0.113.5,Payload delivery server,High,T1189
ip,198.51.100.99,Exfiltration staging (DNS resolved),Medium,T1041
domain,update.novacorp-cdn.example,Primary C2 domain,High,T1071.001
domain,telemetry.novacorp-cdn.example,Secondary C2 domain,High,T1071.001
domain,downloads.update-service.example,Payload delivery domain,High,T1189
domain,exfil-drop.phantom-viper.example,Exfiltration staging domain,Medium,T1041
hash-sha256,SYNTHETIC-HASH-SHA256-update-agent-aabbccdd11223344556677889900aabbcc,SHADOWBYTE persistence binary,High,T1547.001
hash-sha256,SYNTHETIC-HASH-SHA256-compliance-dll-112233445566778899aabbccddeeff00,SHADOWBYTE scheduled task DLL,High,T1053.005
hash-sha256,SYNTHETIC-HASH-SHA256-ncrawler-sys-ffeeddccbbaa00998877665544332211,NIGHTCRAWLER rootkit driver,High,T1014
hash-sha256,SYNTHETIC-HASH-SHA256-invoice-dropper-0011223344556677889900aabbccdd,Initial dropper (invoice_Q1.pdf.exe),High,T1204.002
hash-sha256,SYNTHETIC-HASH-SHA256-config-dat-aabbccddeeff00112233445566778899aa,Encrypted C2 configuration,Medium,T1027
filename,update_agent.exe,Persistence binary in ProgramData\NovaCorp\,High,T1547.001
filename,compliance.dll,Scheduled task payload,High,T1053.005
filename,ncrawler.sys,Rootkit kernel driver,High,T1014
filename,invoice_Q1.pdf.exe,Initial dropper (double extension),High,T1204.002
filename,config.dat,Encrypted C2 config,Medium,T1027
filepath,C:\ProgramData\NovaCorp\,Malware staging directory,High,T1074.001
filepath,C:\Windows\System32\drivers\ncrawler.sys,Rootkit driver path,High,T1014
registry,HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\NovaCorp Update Agent,Persistence Run key,High,T1547.001
registry,HKLM\SYSTEM\CurrentControlSet\Services\NightCrawlerSvc,Rootkit service registration,High,T1543.003
scheduled-task,Microsoft\Windows\NetComplianceCheck,Persistence scheduled task,High,T1053.005
named-pipe,\\.\pipe\shadowbyte_cred,Credential harvester IPC,High,T1559.001
port,49670/tcp,Local backdoor listener,High,T1571
user-agent,"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",C2 HTTP user-agent,Low,T1071.001
process-name,svchst.exe,NIGHTCRAWLER component (typosquatted svchost),High,T1036.005
mutex,Global\SHADOWBYTE-NOVACORP-2026-Q1,Campaign mutex,High,T1480
Exercise 5 Checkpoint

At this point you should have:

  • Generated a comprehensive forensic timeline spanning 2026-03-10 to 2026-03-12
  • Extracted synthetic password hashes from SAM, cached domain credentials, and LSA secrets
  • Identified three persistence mechanisms: Run key, kernel driver service, scheduled task
  • Extracted five malware files from memory with synthetic hashes
  • Compiled a structured IOC report with 30+ indicators mapped to ATT&CK techniques
  • Reconstructed the full attack narrative from initial access through persistence and lateral movement

Key Finding: The PHANTOM-VIPER attack chain followed a clear progression: phishing email with malicious attachment → dropper execution → SHADOWBYTE RAT deployment via process hollowing → NIGHTCRAWLER rootkit installation → credential harvesting from LSASS → domain reconnaissance → lateral movement to application and file servers → exfiltration staging.


Detection Queries

KQL (Microsoft Sentinel)

// SYNTHETIC — Detect process hollowing indicators
// Svchost.exe spawning cmd.exe or powershell.exe
DeviceProcessEvents
| where Timestamp > ago(24h)
| where InitiatingProcessFileName =~ "svchost.exe"
| where FileName in~ ("cmd.exe", "powershell.exe", "pwsh.exe")
| where InitiatingProcessCommandLine !contains "-k"  // Legitimate svchost always has -k flag
| project Timestamp, DeviceName, InitiatingProcessId,
    InitiatingProcessFileName, FileName, ProcessCommandLine
| sort by Timestamp desc

// SYNTHETIC — Detect hidden process creation (typosquatted names)
DeviceProcessEvents
| where Timestamp > ago(7d)
| where FileName matches regex @"^svch[o0]?st\.exe$"
| where FileName != "svchost.exe"
| project Timestamp, DeviceName, FileName, FolderPath,
    InitiatingProcessFileName, ProcessCommandLine

// SYNTHETIC — Detect anomalous svchost.exe without service registration
DeviceProcessEvents
| where FileName =~ "svchost.exe"
| where ProcessCommandLine !contains "-k "
| where ProcessCommandLine !contains "-s "
| project Timestamp, DeviceName, ProcessId, ProcessCommandLine, FolderPath

// SYNTHETIC — Detect C2 beaconing patterns
DeviceNetworkEvents
| where Timestamp > ago(24h)
| where RemoteIP in ("198.51.100.47", "198.51.100.23", "203.0.113.5")   // Replace with actual IOCs
| summarize ConnectionCount = count(),
    AvgTimeBetween = avg(datetime_diff('second', Timestamp, prev(Timestamp))),
    FirstSeen = min(Timestamp),
    LastSeen = max(Timestamp)
    by DeviceName, RemoteIP, RemotePort, InitiatingProcessFileName
| where ConnectionCount > 10

// SYNTHETIC — Detect reconnaissance command burst
DeviceProcessEvents
| where Timestamp > ago(1h)
| where FileName in~ ("whoami.exe", "ipconfig.exe", "net.exe",
    "nltest.exe", "systeminfo.exe", "tasklist.exe", "quser.exe")
| summarize ReconCommands = make_set(FileName),
    CommandCount = count(),
    FirstCommand = min(Timestamp),
    LastCommand = max(Timestamp)
    by DeviceName, InitiatingProcessFileName, InitiatingProcessId
| where CommandCount >= 3
| where datetime_diff('minute', LastCommand, FirstCommand) < 10

// SYNTHETIC — Detect driver loading from suspicious paths
DeviceEvents
| where ActionType == "DriverLoad"
| where FolderPath !startswith @"C:\Windows\System32\drivers\"
    or FileName in~ ("ncrawler.sys")   // Add known rootkit filenames
| project Timestamp, DeviceName, FileName, FolderPath,
    SHA256, SignerType, IsSigned

// SYNTHETIC — Detect lateral movement via SMB
DeviceNetworkEvents
| where Timestamp > ago(24h)
| where RemotePort == 445
| where LocalIP startswith "10.20."
| where RemoteIP startswith "10.20."
| where InitiatingProcessFileName !in~ ("System", "svchost.exe", "dns.exe")
| project Timestamp, DeviceName, LocalIP, RemoteIP,
    InitiatingProcessFileName, InitiatingProcessId

SPL (Splunk)

// SYNTHETIC — Detect process hollowing: svchost.exe spawning cmd/powershell
index=edr sourcetype=process_creation
    parent_process_name="svchost.exe"
    (process_name="cmd.exe" OR process_name="powershell.exe" OR process_name="pwsh.exe")
    NOT parent_process_command_line="*-k *"
| table _time host parent_process_id parent_process_name process_name process_command_line
| sort -_time

// SYNTHETIC — Detect typosquatted process names
index=edr sourcetype=process_creation
| regex process_name="^svch[o0]?st\.exe$"
| where process_name != "svchost.exe"
| table _time host process_name process_path parent_process_name process_command_line

// SYNTHETIC — Detect C2 beaconing
index=network sourcetype=firewall
    (dest_ip="198.51.100.47" OR dest_ip="198.51.100.23" OR dest_ip="203.0.113.5")
| stats count as connection_count
    earliest(_time) as first_seen
    latest(_time) as last_seen
    values(dest_port) as ports
    by src_ip dest_ip process_name
| where connection_count > 10

// SYNTHETIC — Detect reconnaissance command execution burst
index=edr sourcetype=process_creation
    (process_name="whoami.exe" OR process_name="ipconfig.exe" OR process_name="net.exe"
     OR process_name="nltest.exe" OR process_name="systeminfo.exe" OR process_name="tasklist.exe")
| stats count as cmd_count
    values(process_name) as commands
    earliest(_time) as first_cmd
    latest(_time) as last_cmd
    by host parent_process_name parent_process_id
| where cmd_count >= 3
| eval time_span_minutes = round((last_cmd - first_cmd) / 60, 1)
| where time_span_minutes < 10

// SYNTHETIC — Detect suspicious driver loads
index=edr sourcetype=driver_load
    (NOT driver_path="C:\\Windows\\System32\\drivers\\*" OR driver_name="ncrawler.sys")
| table _time host driver_name driver_path signer is_signed sha256

// SYNTHETIC — Detect lateral movement via SMB from non-system processes
index=network sourcetype=firewall dest_port=445
    src_ip="10.20.*" dest_ip="10.20.*"
    NOT process_name IN ("System", "svchost.exe", "dns.exe")
| table _time src_ip dest_ip process_name process_id
| sort -_time

// SYNTHETIC — Detect named pipe creation for IPC
index=edr sourcetype=sysmon EventCode=17
    PipeName="*shadowbyte*"
| table _time host ProcessId Image PipeName

Sigma Rules

# SYNTHETIC — Sigma rule: Svchost without -k flag (process hollowing indicator)
title: Svchost.exe Launched Without Service Group Flag
id: synthetic-sigma-001-novacorp
status: experimental
description: >
    Detects svchost.exe instances launched without the required -k flag,
    which may indicate process hollowing. Legitimate svchost.exe is always
    started by services.exe with -k <ServiceGroupName>. SYNTHETIC RULE.
references:
    - https://attack.mitre.org/techniques/T1055/012/
author: NovaCorp IR Team (SYNTHETIC)
date: 2026/03/12
tags:
    - attack.defense_evasion
    - attack.t1055.012
logsource:
    category: process_creation
    product: windows
detection:
    selection:
        Image|endswith: '\svchost.exe'
    filter_legitimate:
        CommandLine|contains: '-k '
    filter_parent:
        ParentImage|endswith: '\services.exe'
    condition: selection and not (filter_legitimate and filter_parent)
falsepositives:
    - Rare edge cases during Windows updates
level: high
# SYNTHETIC — Sigma rule: Typosquatted svchost.exe
title: Typosquatted Svchost Process Name
id: synthetic-sigma-002-novacorp
status: experimental
description: >
    Detects processes with names similar to svchost.exe but with subtle
    typos (e.g., svchst.exe, svch0st.exe), a technique used by malware
    to masquerade as legitimate Windows processes. SYNTHETIC RULE.
references:
    - https://attack.mitre.org/techniques/T1036/005/
author: NovaCorp IR Team (SYNTHETIC)
date: 2026/03/12
tags:
    - attack.defense_evasion
    - attack.t1036.005
logsource:
    category: process_creation
    product: windows
detection:
    selection:
        Image|endswith:
            - '\svchst.exe'
            - '\svch0st.exe'
            - '\svchosl.exe'
            - '\scvhost.exe'
            - '\svchost32.exe'
    condition: selection
falsepositives:
    - Extremely unlikely with these specific names
level: critical
# SYNTHETIC — Sigma rule: Reconnaissance command burst
title: Rapid Execution of Discovery Commands
id: synthetic-sigma-003-novacorp
status: experimental
description: >
    Detects multiple reconnaissance/discovery commands executed in rapid
    succession from the same parent process, indicating automated or
    scripted post-exploitation discovery. SYNTHETIC RULE.
references:
    - https://attack.mitre.org/tactics/TA0007/
author: NovaCorp IR Team (SYNTHETIC)
date: 2026/03/12
tags:
    - attack.discovery
    - attack.t1033
    - attack.t1016
    - attack.t1087.002
logsource:
    category: process_creation
    product: windows
detection:
    selection:
        Image|endswith:
            - '\whoami.exe'
            - '\ipconfig.exe'
            - '\net.exe'
            - '\net1.exe'
            - '\nltest.exe'
            - '\systeminfo.exe'
            - '\tasklist.exe'
            - '\quser.exe'
            - '\query.exe'
            - '\nslookup.exe'
            - '\arp.exe'
            - '\route.exe'
    condition: selection | count(Image) by ParentProcessId > 3
    timeframe: 10m
falsepositives:
    - System administrators running diagnostics
    - Monitoring scripts
level: high
# SYNTHETIC — Sigma rule: Suspicious driver load
title: Kernel Driver Loaded from Non-Standard Path
id: synthetic-sigma-004-novacorp
status: experimental
description: >
    Detects kernel drivers loaded from paths outside the standard
    Windows driver directories, or drivers matching known rootkit
    names. SYNTHETIC RULE.
references:
    - https://attack.mitre.org/techniques/T1014/
author: NovaCorp IR Team (SYNTHETIC)
date: 2026/03/12
tags:
    - attack.defense_evasion
    - attack.t1014
    - attack.persistence
    - attack.t1543.003
logsource:
    category: driver_load
    product: windows
detection:
    selection_name:
        ImageLoaded|endswith:
            - '\ncrawler.sys'
    selection_unsigned:
        Signed: 'false'
        ImageLoaded|endswith: '.sys'
    filter_standard_paths:
        ImageLoaded|startswith:
            - 'C:\Windows\System32\drivers\'
            - 'C:\Windows\SysWOW64\drivers\'
    condition: selection_name or (selection_unsigned and not filter_standard_paths)
falsepositives:
    - Third-party hardware drivers during installation
level: critical
# SYNTHETIC — Sigma rule: Rundll32 loading DLL from ProgramData
title: Rundll32 Executing DLL from ProgramData Directory
id: synthetic-sigma-005-novacorp
status: experimental
description: >
    Detects rundll32.exe loading DLLs from the ProgramData directory,
    which is commonly abused for malware staging and persistence.
    SYNTHETIC RULE.
references:
    - https://attack.mitre.org/techniques/T1218/011/
author: NovaCorp IR Team (SYNTHETIC)
date: 2026/03/12
tags:
    - attack.defense_evasion
    - attack.t1218.011
    - attack.persistence
    - attack.t1053.005
logsource:
    category: process_creation
    product: windows
detection:
    selection:
        Image|endswith: '\rundll32.exe'
        CommandLine|contains: '\ProgramData\'
    condition: selection
falsepositives:
    - Some legitimate software updaters use ProgramData
level: high

MITRE ATT&CK Mapping

Technique ID Technique Name Tactic Lab Evidence
T1566.001 Phishing: Spearphishing Attachment Initial Access (TA0001) Invoice email with invoice_Q1.pdf.exe dropper
T1204.002 User Execution: Malicious File Execution (TA0002) User jdoe opened the malicious attachment
T1059.003 Command and Scripting: Windows Command Shell Execution (TA0002) cmd.exe spawned by hollowed svchost.exe
T1055.012 Process Injection: Process Hollowing Defense Evasion (TA0005) svchost.exe (PID 4872) hollowed with SHADOWBYTE RAT
T1055.001 Process Injection: DLL Injection Defense Evasion (TA0005) Credential harvester injected into lsass.exe (PID 712)
T1055.003 Process Injection: Reflective DLL Loading Defense Evasion (TA0005) SHADOWBYTE core module loaded reflectively (no PEB entry)
T1014 Rootkit Defense Evasion (TA0005) NIGHTCRAWLER kernel driver with SSDT hooks and DKOM
T1036.005 Masquerading: Match Legitimate Name Defense Evasion (TA0005) svchst.exe typosquatting svchost.exe
T1547.001 Boot/Logon Autostart: Registry Run Keys Persistence (TA0003) NovaCorp Update Agent Run key
T1543.003 Create/Modify System Process: Windows Service Persistence (TA0003) NightCrawlerSvc kernel driver service
T1053.005 Scheduled Task Persistence (TA0003) NetComplianceCheck task running compliance.dll
T1003.001 OS Credential Dumping: LSASS Memory Credential Access (TA0006) Credential harvester module in lsass.exe memory
T1087.002 Account Discovery: Domain Account Discovery (TA0007) net.exe and nltest.exe execution
T1016 System Network Configuration Discovery Discovery (TA0007) ipconfig.exe execution
T1033 System Owner/User Discovery Discovery (TA0007) whoami.exe execution
T1021.002 Remote Services: SMB/Windows Admin Shares Lateral Movement (TA0008) SMB connections to 10.20.3.15 and 10.20.3.20
T1071.001 Application Layer Protocol: Web Protocols Command and Control (TA0011) HTTPS C2 to 198.51.100.47:443
T1573.001 Encrypted Channel: Symmetric Cryptography Command and Control (TA0011) AES-256-CBC encrypted C2 traffic
T1571 Non-Standard Port Command and Control (TA0011) Secondary C2 on port 8443; backdoor on port 49670
T1041 Exfiltration Over C2 Channel Exfiltration (TA0010) Exfil staging domain resolved in DNS cache
T1074.001 Data Staged: Local Data Staging Collection (TA0009) C:\ProgramData\NovaCorp\ staging directory
T1559.001 Inter-Process Communication: Component Object Model Execution (TA0002) Named pipe \\.\pipe\shadowbyte_cred for IPC
T1027 Obfuscated Files or Information Defense Evasion (TA0005) Encrypted config.dat configuration file

Challenge Exercises

Challenge 1: Server Memory Analysis

Analyze the second memory dump (srv-app-015_20260312_1518.raw) from the application server. Determine:

  • What processes did PHANTOM-VIPER deploy on the server?
  • Was the NIGHTCRAWLER rootkit installed on this host as well?
  • What credentials were harvested from the server's LSASS process?
  • Were there any additional C2 channels or lateral movement to other hosts?

Write a comparison report showing how the server compromise differed from the workstation.

Hints
  • Start with windows.pslist and windows.psscan to find hidden processes
  • Check for PsExec artifacts — PHANTOM-VIPER used SMB for lateral movement, which often involves PsExec or similar tools
  • The server runs domain services, so lsass.exe will contain more credentials than the workstation
  • Look for svchst.exe or similar typosquatted process names

Challenge 2: YARA Rule Development

Write YARA rules to detect the SHADOWBYTE and NIGHTCRAWLER malware families based on the artifacts extracted in this lab. Your rules should detect:

  • The SHADOWBYTE RAT core module (exported function names, strings)
  • The NIGHTCRAWLER rootkit driver (service key name, SSDT hook patterns)
  • The credential harvesting DLL (named pipe string, import patterns)

Test your rules against the dumped files from Exercise 5.

Hints

Use strings like "SHADOWBYTE-CRED v2.1", "BeaconMain", "ReflectiveLoader", "NightCrawlerSvc", and "shadowbyte_cred" as detection anchors. Combine with PE structure checks (uint16(0) == 0x5A4D) for precision.

rule SYNTHETIC_SHADOWBYTE_RAT {
    meta:
        description = "Detects SHADOWBYTE RAT core module (SYNTHETIC)"
        author = "NovaCorp IR Team"
        date = "2026-03-12"
        hash = "SYNTHETIC-HASH-SHA256-update-agent-aabbccdd11223344556677889900aabbcc"
        tlp = "RED"

    strings:
        $export1 = "ReflectiveLoader" ascii
        $export2 = "BeaconMain" ascii
        $export3 = "ShadowbyteInit" ascii
        $str1 = "SHADOWBYTE" ascii wide
        $str2 = "198.51.100.47" ascii
        $str3 = "novacorp-cdn.example" ascii
        $pipe = "shadowbyte_cred" ascii

    condition:
        uint16(0) == 0x5A4D and
        (2 of ($export*) or (1 of ($export*) and 2 of ($str*)) or $pipe)
}

Challenge 3: Remediation Playbook

Based on your findings, draft a remediation playbook for NovaCorp Financial that addresses:

  • Immediate containment actions (network isolation, credential reset scope)
  • Rootkit removal procedures (cannot be done from running OS — requires offline boot)
  • Persistence mechanism cleanup (all three mechanisms must be removed)
  • Credential reset scope (which accounts were compromised?)
  • Network IOC blocking (firewall rules, DNS sinkholing)
  • Long-term hardening recommendations (LSA protection, Credential Guard, driver signing enforcement)

Map each remediation step to the corresponding ATT&CK technique it addresses.

Hints
  • Prioritize containment: isolate ws-fin-042, srv-app-015, and srv-files-020 immediately
  • The rootkit requires offline removal — boot from a clean USB/WinPE and delete ncrawler.sys, then clean the Services registry key
  • Reset passwords for: jdoe, admin.smith, svc-sqlprod, svc-backup, and the local Administrator account
  • Block all four C2 IPs and all four malicious domains at the perimeter firewall and DNS resolver
  • Enable LSA Protection (RunAsPPL) and Credential Guard to prevent future LSASS credential harvesting
  • Enforce driver signing policies to prevent unsigned kernel drivers like NIGHTCRAWLER

Answers and Solutions

Exercise 1 Answers — Process Analysis

Q: Which PID is the primary SHADOWBYTE RAT process? A: PID 4872 (svchost.exe) — process-hollowed, created at 2026-03-10 09:17:44 UTC

Q: What evidence confirms process hollowing? A: Two indicators: (1) PAGE_EXECUTE_READWRITE protection on the main executable VAD at 0x00400000, and (2) missing FileObject reference in the VAD entry. Legitimate svchost.exe uses PAGE_EXECUTE_READ and maintains a FileObject pointing to \Windows\System32\svchost.exe.

Q: How many processes are hidden from the standard process list? A: Two processes: PID 5552 (conhost.exe) and PID 5620 (svchst.exe). Both were found by psscan (pool tag scanning) but not by pslist (linked list traversal), confirming DKOM-based hiding.

Q: What reconnaissance commands did the attacker run? A: Two waves of reconnaissance:

  • Wave 1 (2026-03-10 09:18): whoami.exe and ipconfig.exe — basic host identification
  • Wave 2 (2026-03-12 02:15): net.exe and nltest.exe — domain enumeration and trust mapping

Q: Why does PID 4872 not appear in the service control manager? A: Because PID 4872 was created via process hollowing, not through the legitimate Service Control Manager (SCM). A real svchost.exe is always started by services.exe with a -k group flag and is registered in the SCM database. PID 4872 has no SCM entry and no -k flag, confirming it is not a legitimate service host.

Exercise 2 Answers — Network Forensics

Q: What are the primary and secondary C2 IP addresses? A: Primary: 198.51.100.47:443 (HTTPS). Secondary: 198.51.100.23:8443 (non-standard HTTPS port).

Q: How was the initial payload delivered? A: Chrome (PID 3104) connected to 203.0.113.5:80 at 09:14:55 on 2026-03-10, downloading the dropper. The DNS cache shows this IP resolved from downloads.update-service.example.

Q: Which internal hosts did the attacker move laterally to? A: Two hosts via SMB (port 445): srv-app-015.novacorp.example (10.20.3.15) and srv-files-020.novacorp.example (10.20.3.20).

Q: What is the purpose of port 49670? A: PID 4872 opened a LISTENING socket on port 49670 as a local backdoor, likely for bind-shell access or additional tool deployment from within the network.

Q: What is the significance of exfil-drop.phantom-viper.example? A: This domain was resolved in the DNS cache at 14:25 on 2026-03-12, just before SOC detection at 14:37. It resolves to 198.51.100.99 and was likely being prepared as an exfiltration destination. The attack may have been detected before exfiltration was completed.

Exercise 3 Answers — Code Injection Detection

Q: How many distinct code injection findings did malfind report? A: Four findings across three processes:

  1. PID 4872 at 0x00400000 — PE header (process hollowing)
  2. PID 4872 at 0x02a10000 — Shellcode (API-hashing stub)
  3. PID 712 at 0x03f50000 — PE header (DLL injection into lsass.exe)
  4. PID 5620 at 0x00400000 — PE header (NIGHTCRAWLER binary)

Plus the reflective DLL at 0x04500000 in PID 4872, which malfind also detects.

Q: What technique was used to inject into lsass.exe? A: Reflective DLL injection (T1055.003). The injected module does not appear in the PEB's InLoadOrderModuleList, meaning it was loaded using a custom PE loader that manually maps sections, resolves imports, and calls DllMain without using LoadLibrary. This evades DLL monitoring tools that inspect the PEB.

Q: What is the named pipe used for? A: \\.\pipe\shadowbyte_cred provides inter-process communication between the credential harvesting module (injected in lsass.exe, PID 712) and the SHADOWBYTE RAT core (PID 4872). Harvested credentials are sent through the pipe to the RAT, which exfiltrates them over the C2 channel.

Q: What does the decrypted configuration reveal? A: The SHADOWBYTE RAT configuration contains: C2 infrastructure (three tiers: primary, secondary, fallback), beacon interval (60 seconds with 20% jitter), encryption algorithm (AES-256-CBC), campaign identifier (NOVACORP-2026-Q1), user-agent string for blending with browser traffic, and a kill date (2026-06-30) suggesting a time-limited operation.

Exercise 4 Answers — Rootkit Detection

Q: How many SSDT entries are hooked and what do they do? A: Four hooks:

  1. NtCreateFile (0x003E) — Intercepts file creation/access to hide rootkit files
  2. NtEnumerateValueKey (0x0052) — Hides rootkit registry values from enumeration
  3. NtQueryDirectoryFile (0x0055) — Filters rootkit files from directory listings
  4. NtQuerySystemInformation (0x0098) — Filters rootkit processes from system queries (Task Manager)

Q: How was the rootkit driver hidden? A: The NIGHTCRAWLER driver (\Driver\ncrawler at 0xfffff807DEAD0000) was unlinked from the PsLoadedModuleList using DKOM, the same technique used to hide user-mode processes. The driverscan plugin found it through pool tag scanning, which does not rely on the linked list.

Q: What is the purpose of the hooked IDT entry? A: INT 0xE1 was hooked to provide a covert communication channel between user-mode SHADOWBYTE components and the kernel-mode NIGHTCRAWLER rootkit. User-mode code can trigger INT 0xE1 to request kernel-mode services (process hiding, file hiding) without using standard syscall interfaces that might be monitored.

Q: How does the rootkit maintain persistence across reboots? A: Through a Windows service registry entry at HKLM\SYSTEM\CurrentControlSet\Services\NightCrawlerSvc with Start = 1 (System Start), meaning the driver loads early in the boot process before most security tools initialize. The service uses a deceptive display name ("Windows Network Compliance Driver") to avoid suspicion.

Exercise 5 Answers — Timeline & IOC Extraction

Q: What is the complete attack timeline? A:

  1. 2026-03-10 09:14:30 — User jdoe opens invoice_Q1.pdf.exe (initial access via phishing)
  2. 2026-03-10 09:14:55 — Dropper downloads payload from 203.0.113.5 via Chrome
  3. 2026-03-10 09:17:44 — SHADOWBYTE RAT deployed via process hollowing into svchost.exe (PID 4872)
  4. 2026-03-10 09:17:46 — Backdoor listener opened on port 49670
  5. 2026-03-10 09:17:48 — NIGHTCRAWLER rootkit driver installed and loaded
  6. 2026-03-10 09:17:50 — Hidden console host (PID 5552) and NIGHTCRAWLER user-mode component (PID 5620) deployed
  7. 2026-03-10 09:18:02-05 — Initial reconnaissance: whoami, ipconfig
  8. 2026-03-10 09:18:15-20 — Persistence mechanisms installed: Run key, scheduled task
  9. 2026-03-12 02:15:30-40 — Second reconnaissance wave: net, nltest, LDAP queries to DC
  10. 2026-03-12 02:16:10 — Lateral movement to srv-app-015 via SMB
  11. 2026-03-12 02:20:45 — Lateral movement to srv-files-020 via SMB
  12. 2026-03-12 14:25:00 — Exfiltration staging domain resolved
  13. 2026-03-12 14:37:00 — SOC detects anomalous beaconing
  14. 2026-03-12 15:02:33 — Memory dump acquired from workstation

Q: How many persistence mechanisms were identified? A: Three: (1) Registry Run key, (2) kernel driver service, (3) scheduled task.

Q: How many total IOCs were extracted? A: 30+ indicators across 7 categories: 4 IPs, 4 domains, 5 file hashes, 5 filenames, 3 file paths, 3 registry keys, 1 named pipe, 1 scheduled task, 1 port, 1 user-agent, 1 process name, 1 mutex.

Q: What credentials were compromised? A: Local accounts (Administrator, jdoe, svc-backup) from SAM dump, plus cached domain credentials for jdoe, admin.smith, and svc-sqlprod from the domain cache, plus LSA secrets including service account passwords.


Key Lessons Learned

  1. Memory forensics reveals what disk forensics cannot. Process hollowing, reflective DLL injection, and in-memory-only payloads leave minimal disk footprint. Without memory analysis, the SHADOWBYTE credential harvester in lsass.exe and the reflective RAT core module would have been missed entirely.

  2. Cross-view analysis is essential for rootkit detection. The NIGHTCRAWLER rootkit successfully hid from standard process and module enumeration. Only by comparing linked-list traversal (pslist/modules) with pool tag scanning (psscan/driverscan) were the hidden components discovered.

  3. Multiple persistence mechanisms indicate a sophisticated threat actor. PHANTOM-VIPER installed three independent persistence mechanisms (registry, service, scheduled task) to ensure survival even if one is discovered and removed. Remediation must address all three simultaneously.

  4. Timeline correlation tells the story. By combining process creation times, network connection timestamps, and DNS cache entries, we reconstructed a coherent attack narrative spanning two days — from initial phishing to lateral movement to exfiltration preparation.

  5. Named pipes and covert channels enable modular malware architecture. The SHADOWBYTE toolkit uses named pipes for inter-process communication and a custom IDT interrupt for kernel-user communication, allowing modular components to cooperate without generating easily detected network traffic.

Cross-References


Blank Results Table (Printable)

Copy this template for your own memory forensics investigations.

# Artifact Type PID/Source Description Timestamp ATT&CK Technique IOC Value Confidence Notes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Processes Analyzed: ___ | Hidden Processes Found: ___ | Injected Regions: ___ | IOCs Extracted: ___