Lesson 6 of 6 · 25 min read

Hunt-to-IR Handoff — Packaging Evidence and Escalation Standards

A hunt finding that stays in the hunter’s notebook provides no value. The evidence must transfer to IR cleanly enough that a new analyst — who wasn’t in the hunt — can pick it up, understand it, and act correctly. Clean handoffs save hours; bad handoffs cause re-compromise.


The Hunt-to-IR Ticket Structure

P1 IR TICKET — Active C2 — [Hunt Finding]

1. AFFECTED HOST(S)
   Hostname:     WS-JSMITH-01
   IP:           10.1.2.33
   Owner:        jsmith@corp.com (Sales Engineer)
   Business role: Customer demo access — read-only CRM, full email
   Domain:       CORP

2. FINDING SUMMARY
   Hunt type:   Network beacon hunt → host pivot → memory forensics
   Confirmed:   Cobalt Strike beacon (process hollow in svchost.exe PID 8844)
                Active C2 session to 185.220.101.9:443
   Confidence:  HIGH — VT 47/72, malfind MZ header, active ESTABLISHED TCP

3. EVIDENCE CHAIN
   a. Network: CV=0.031 beacon to 185.220.101.9:443 (30 days, conn_count=1440)
   b. Sysmon:  svchost.exe PID 8844 spawned by powershell.exe PID 3444 (wrong parent)
   c. Memory:  malfind — MZ header in private PAGE_EXECUTE_READWRITE region PID 8844
   d. Memory:  netscan — ESTABLISHED 10.1.2.33:50111 → 185.220.101.9:443 (PID 8844)
   e. Hash:    injected PE SHA256 = 4a3f7e2c... → CobaltStrike.Beacon.generic (VT)
   f. Timeline: WINWORD.EXE → cmd.exe → powershell.exe (macro chain, 14:23:11)
               svcupd.exe created 14:24:02, Run key 14:24:15, beacon 14:24:18

4. IOCS
   C2 IP:      185.220.101.9 (AS12876 — Scaleway VPS France)
   C2 Port:    443 (TLS, self-signed cert, JA3: a1b2c3d4)
   Domain:     update-cdn-proxy.net (registered 14 days ago — WHOIS)
   Payload:    svcupd.exe SHA256: 4a3f7e2c...
   Persistence: HKCU\...\Run\svcmon → svcupd.exe

5. ATT&CK CHAIN
   T1566.002   Phishing (malicious Word attachment)
   T1059.003   Windows Command Shell (macro → cmd.exe)
   T1059.001   PowerShell (-enc download stager)
   T1055.012   Process Hollowing (svchost.exe)
   T1071.001   Web Protocols (TLS C2 on 443)
   T1547.001   Registry Run Keys (persistence)
   [T1003.001  Suspected — LSASS not confirmed in this hunt]

6. SCOPE ASSESSMENT
   Confirmed:  WS-JSMITH-01 (active C2 for ≥30 days)
   Suspected:  Any host jsmith authenticated to in past 30 days (credential risk)
   Pivot needed: Authentication logs — jsmith logons to other hosts
               Network logs — 10.1.2.33 internal lateral movement
   Unknown:    Whether attacker accessed file shares or CRM database

7. CONTAINMENT RECOMMENDATION (in order)
   Step 1: Block 185.220.101.9 at perimeter firewall (both directions)
   Step 2: Add update-cdn-proxy.net to DNS sinkhole
   Step 3: Disable jsmith AD account (prevent credential reuse)
   Step 4: Isolate WS-JSMITH-01 from network (VLAN or NAC quarantine)
   Step 5: Force password reset for all accounts on jsmith's host (domain-wide if DC-level access found)
   Order matters: block C2 first to prevent evidence destruction on the attacker's side.

8. EVIDENCE FILES
   memory.raw:         sha256=9b4c2f1d... (collected 2024-09-02 18:30 via Velociraptor)
   pid.8844.0x1a0000.dmp:  sha256=4a3f7e2c... (injected PE extracted by Volatility 3)
   timeline.csv:       plaso output, 2024-09-01 00:00 to 2024-09-02 23:59
   hunt_journal_2024-09-02.md: full hunt notes and query log
   Location: DFIR Evidence Server → Case #2024-089 / WS-JSMITH-01

Lateral Movement Scope Check

Before handing off, always run these three queries:

1. Authentication from Compromised Host

// Did WS-JSMITH-01 authenticate to other internal hosts?
SecurityEvent
| where EventID == 4624
| where WorkstationName == "WS-JSMITH-01" or IpAddress == "10.1.2.33"
| where LogonType in (3, 10)  // Network + RemoteInteractive
| where TargetServerName != "WS-JSMITH-01"  // to other hosts
| project TimeGenerated, TargetServerName, TargetUserName, LogonType, IpAddress
| order by TimeGenerated desc

2. Network Lateral Movement

// Internal connections from compromised host to other internal hosts
Zeek_conn_CL
| where id_orig_h_s == "10.1.2.33"
| where local_resp_b == true  // connecting to internal hosts
| where id_resp_p_i in (445, 135, 139, 5985, 5986, 3389, 22)  // LM protocols
| summarize 
    conn_count = count(),
    first_seen = min(TimeGenerated),
    last_seen = max(TimeGenerated)
  by id_resp_h_s, id_resp_p_i
| order by last_seen desc

3. IOC Sweep Across Fleet

// Did any other host connect to the same C2 IP?
Zeek_conn_CL
| where id_resp_h_s == "185.220.101.9"
| where id_orig_h_s != "10.1.2.33"  // other hosts
| summarize host_list = make_set(id_orig_h_s) by id_resp_h_s

// Did any other host have svcupd.exe? (Velociraptor fleet hash hunt)
// Already covered by fleet hash query in M22 Lesson 2