Skip to content

Kill Chain — Lateral Movement Agent Response ​

When this fires: lateral_movement_agent detected same account on 3+ machines within 30 minutes (EventID 4624 Type 3), explicit credential use workstation-to-server (EventID 4648 Type 9 or NewCredentials), or admin share access (EventID 5140 to C$ or ADMIN$).

Severity: CRITICAL — immediate notification, no analyst queue.

MITRE: T1021.002 (Remote Services: SMB/Windows Admin Shares), T1550.002 (Use Alternate Authentication Material: Pass the Hash)


Immediate Triage — Within 5 Minutes ​

  1. Open SecOps finding. Note: account, machines involved, detection subtype, timestamp
  2. Determine subtype:
    • multi_machine_logon — same account on 3+ machines in 30 min
    • explicit_cred_lateral — EventID 4648, explicit creds used workstation-to-server
    • admin_share_access — C$ or ADMIN$ share accessed from unexpected source
  3. Is this account a known IT admin performing routine work? Check CM tickets for the host(s) involved
  4. Check if this account also appears in credential dumping findings in the same window — if yes, this is likely pass-the-hash or pass-the-ticket

Investigation KQL ​

kql
// All machines this account authenticated to in the last hour
SecurityEvent
| where TimeGenerated > ago(1h)
| where EventID in (4624, 4648)
| where TargetUserName == "<account>"
| where TargetUserName !endswith "$"
| extend Host = toupper(tostring(split(Computer, ".")[0]))
| project TimeGenerated, EventID, Host, LogonType, IpAddress, WorkstationName, TargetUserName
| order by TimeGenerated
kql
// Admin share access — what was accessed and from where?
SecurityEvent
| where TimeGenerated > ago(1h)
| where EventID == 5140
| where ShareName in ("\\\\*\\C$", "\\\\*\\ADMIN$", "\\\\*\\IPC$")
| where Account == "<account>" or IpAddress == "<source_ip>"
| extend Host = toupper(tostring(split(Computer, ".")[0]))
| project TimeGenerated, Host, IpAddress, Account, ShareName, AccessMask
kql
// Did any of the accessed machines then make outbound connections?
CommonSecurityLog
| where TimeGenerated > ago(1h)
| where DeviceVendor == "Palo Alto Networks"
| where SourceIP in ("<ip1>", "<ip2>", "<ip3>")
| project TimeGenerated, SourceIP, DestinationIP, SentBytes, ApplicationProtocol
| order by SentBytes desc

Scope Assessment ​

List all machines that this account touched. The scope assessment determines how broad the isolation must be.

Number of Machines CompromisedResponse Level
1–2 machinesDisable account, isolate machines, investigate
3–5 machinesCRITICAL — active spreading in progress, engage Arctic Wolf
6+ machines or includes a DC/serverFull incident response — isolate segment, initiate incident-response.md

Domain controllers appearing in the lateral movement path are the highest-risk target. If a DC is in the list of accessed machines, escalate immediately — a compromised DC means all credentials on the domain are potentially compromised.


Containment Steps ​

Step 1 — Disable the account:

Disable immediately — do not just reset the password. An attacker with a stolen hash or Kerberos ticket can still authenticate even after a password reset if the account is not disabled and sessions are not revoked.

powershell
# Disable in Active Directory
Disable-ADAccount -Identity "<sAMAccountName>"

# Revoke Entra sessions (cloud accounts)
# Entra → Users → [user] → Revoke sessions

Step 2 — Isolate the source host (where lateral movement originated):

  • Cortex XDR → Endpoints → [source host] → Actions → Isolate
  • This is the machine the attacker is using as a pivot

Step 3 — Isolate machines selectively:

Do NOT shut down all machines at once — you lose visibility and may destroy evidence. Isolate machines one at a time, starting with the source of the movement.

For domain controllers: do not isolate DCs unless you confirm they are the origin of the movement (not just a target). DC isolation breaks domain authentication for all machines.

Step 4 — Block the source IP at the firewall:

If the movement originates from a specific IP (e.g., an initially compromised workstation):

  • Panorama → Policies → Security → add inbound deny rule for that IP from reaching internal servers

Break-Glass Account Warning ​

If any break-glass account appears in 4648 or 5140 events:

  • This is unconditionally CRITICAL regardless of any other context
  • No allowlist check, no CM ticket exemption
  • Treat as confirmed active breach — initiate runbooks/incident-response.md immediately
  • Notify Rory via phone (not just Telegram) if break-glass accounts are involved

HIPAA Breach Assessment ​

If lateral movement reached:

  • psql-secops-prod
  • Any DDE environment host (Medicare app)
  • A file server or share with ePHI

Initiate the breach risk assessment immediately per compliance/hipaa-breach-notification-procedure.md.


Escalation ​

  • Rory immediately (automatic CRITICAL Telegram notification)
  • Arctic Wolf — especially if DCs are involved or movement has reached 3+ machines
  • Consider activating the full IR plan (runbooks/incident-response.md) if 5+ machines involved

Post-Incident Checklist ​

  • [ ] Compromised account disabled, sessions revoked, Kerberos tickets expired (krbtgt reset if DC involved)
  • [ ] All compromised hosts isolated or confirmed clean
  • [ ] Source of initial access identified (previous execution or credential dumping finding?)
  • [ ] Domain controller access checked — if a DC was touched, force-reset krbtgt password twice
  • [ ] Service accounts with privileged access — passwords rotated
  • [ ] HIPAA breach assessment completed
  • [ ] Full scope of compromised hosts documented in SecOps incident

  • runbooks/kill-chain-credential-dumping-response.md — lateral movement is usually preceded by credential dumping
  • runbooks/kill-chain-execution-response.md — execution often preceded this
  • runbooks/incident-response.md — full IR plan for widespread compromise
  • runbooks/active-directory-operations.md — krbtgt reset and AD recovery
  • compliance/hipaa-breach-notification-procedure.md

Internal use only — Cirius Group