# Performing Lateral Movement Detection

> 检测横向移动（Lateral Movement）技术，包括哈希传递（Pass-the-Hash）、PsExec、WMI 执行、 RDP 转移和基于 SMB 的传播，使用 SIEM 关联 Windows 事件日志、网络流数据和终端遥测， 映射到 MITRE ATT&CK 横向移动战术（TA0008）技术。

- Skill: `killvxk/performing-lateral-movement-detection` (Agent Skill, multi-file: 4 files)
- Install (CLI): `npx skillmds@latest add killvxk/performing-lateral-movement-detection`
- Raw SKILL.md: https://api.skillmd.com/api/skills/killvxk/performing-lateral-movement-detection/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- License: Apache-2.0
- Author: killvxk (https://skillmd.com/u/killvxk)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/killvxk/performing-lateral-movement-detection

---

# 执行横向移动检测

## 适用场景

以下情况使用本技能：
- SOC 团队需要检测攻击者在初始入侵后在系统间横向移动
- 事件调查需要追踪攻击者在网络中的移动路径
- 检测工程需要映射到 ATT&CK TA0008 技术的横向移动规则
- 红队/紫队演练识别出横向移动检测缺口

**不适用于**检测初始访问或外部攻击——横向移动检测专注于内部主机到主机的转移活动。

## 前置条件

- 来自所有终端和服务器的 Windows 安全事件日志（EventCode 4624、4625、4648、4672）
- 部署了进程创建（EventCode 1）、网络连接（EventCode 3）和命名管道（EventCode 17/18）的 Sysmon
- 网络流数据（NetFlow/sFlow、Zeek 连接日志）用于内部流量分析
- 具有跨源关联能力的 SIEM
- 正常内部认证模式的基线

## 工作流程

### 步骤 1：检测哈希传递/票据传递（T1550）

**哈希传递（Pass-the-Hash）检测（EventCode 4624 含 NTLM）：**
```spl
index=wineventlog sourcetype="WinEventLog:Security" EventCode=4624 Logon_Type=3
AuthenticationPackageName="NTLM"
| where TargetUserName!="ANONYMOUS LOGON" AND TargetUserName!="$"
| stats count, dc(ComputerName) AS unique_targets, values(ComputerName) AS targets
  by src_ip, TargetUserName
| where unique_targets > 3
| eval alert = "可能的哈希传递：NTLM 网络登录到 ".unique_targets." 台主机"
| sort - unique_targets
| table src_ip, TargetUserName, unique_targets, count, targets, alert
```

**越过哈希（Overpass-the-Hash）检测（使用 RC4 的 Kerberos）：**
```spl
index=wineventlog sourcetype="WinEventLog:Security" EventCode=4769
 TicketEncryptionType="0x17"
| where ServiceName!="krbtgt" AND ServiceName!="$"
| stats count, dc(ServiceName) AS unique_services by src_ip, TargetUserName
| where count > 5
| eval alert = "可能的越过哈希：来自 ".src_ip." 的 RC4 Kerberos 票据"
| table _time, src_ip, TargetUserName, unique_services, count, alert
```

**黄金票/白银票检测（T1558）：**
```spl
index=wineventlog sourcetype="WinEventLog:Security" EventCode=4769
| where TicketOptions="0x40810000" OR TicketOptions="0x40800000"
| eval ticket_lifetime = TicketExpireTime - TicketIssueTime
| where ticket_lifetime > 36000  --- >10 小时（异常）
| stats count by src_ip, TargetUserName, ServiceName, TicketEncryptionType, TicketOptions
| eval alert = "可能的黄金/白银票：异常票据属性"
```

### 步骤 2：检测远程服务利用（T1021）

**PsExec 检测（T1021.002）：**
```spl
--- 通过 Sysmon 进程创建
index=sysmon EventCode=1
(Image="*\\psexec.exe" OR Image="*\\psexesvc.exe"
 OR OriginalFileName="psexec.c" OR OriginalFileName="psexesvc.exe"
 OR ParentImage="*\\psexesvc.exe")
| table _time, Computer, User, ParentImage, Image, CommandLine, Hashes

--- 通过命名管道创建（Sysmon EventCode 17）
index=sysmon EventCode=17
PipeName IN ("\\PSEXESVC*", "\\RemCom*", "\\csexec*")
| table _time, Computer, User, Image, PipeName

--- 通过 Windows 服务创建（EventCode 7045）
index=wineventlog sourcetype="WinEventLog:System" EventCode=7045
ServiceName="PSEXESVC" OR ServiceFileName="*PSEXESVC*"
| table _time, Computer, ServiceName, ServiceFileName, AccountName
```

**WMI 远程执行（T1047）：**
```spl
index=sysmon EventCode=1
(Image="*\\wmic.exe" AND CommandLine="*/node:*")
OR (ParentImage="*\\WmiPrvSE.exe" AND Image IN ("*\\cmd.exe", "*\\powershell.exe"))
| eval execution_type = case(
    match(Image, "wmic"), "WMI 命令行",
    match(ParentImage, "WmiPrvSE"), "WMI 提供程序主机（远程执行）"
  )
| table _time, Computer, User, execution_type, ParentImage, Image, CommandLine
```

**WinRM/PowerShell 远程（T1021.006）：**
```spl
index=wineventlog sourcetype="WinEventLog:Security" EventCode=4624
Logon_Type=3 AuthenticationPackageName="Kerberos"
| where ProcessName="*\\wsmprovhost.exe" OR ProcessName="*\\powershell.exe"
| stats count, dc(ComputerName) AS unique_targets by src_ip, TargetUserName
| where unique_targets > 2
| eval alert = "PowerShell 远程连接到来自 ".src_ip." 的 ".unique_targets." 台主机"

--- Sysmon 变体
index=sysmon EventCode=1
ParentImage="*\\wsmprovhost.exe"
Image IN ("*\\cmd.exe", "*\\powershell.exe", "*\\csc.exe")
| table _time, Computer, User, Image, CommandLine
```

**RDP 横向移动（T1021.001）：**
```spl
index=wineventlog sourcetype="WinEventLog:Security" EventCode=4624 Logon_Type=10
| stats count, dc(ComputerName) AS rdp_targets, values(ComputerName) AS destinations,
        earliest(_time) AS first_rdp, latest(_time) AS last_rdp
  by src_ip, TargetUserName
| where rdp_targets > 2
| eval duration_hours = round((last_rdp - first_rdp) / 3600, 1)
| eval alert = TargetUserName." 在 ".duration_hours." 小时内 RDP 连接到 ".rdp_targets." 台主机"
| sort - rdp_targets
```

### 步骤 3：检测基于 SMB 的横向移动

**异常 SMB 流量模式：**
```spl
index=firewall OR index=zeek sourcetype IN ("pan:traffic", "bro:conn:json")
dest_port=445 action=allowed
| where src_ip!=dest_ip
| stats count AS smb_sessions, dc(dest_ip) AS unique_targets,
        sum(bytes_out) AS total_bytes
  by src_ip
| where unique_targets > 10
| eval alert = case(
    unique_targets > 50, "严重：来自 ".src_ip." 的大量 SMB 枚举",
    unique_targets > 20, "高：显著的 SMB 横向移动",
    unique_targets > 10, "中：SMB 连接次数偏高"
  )
| sort - unique_targets
```

**管理共享访问（C$、ADMIN$）：**
```spl
index=wineventlog sourcetype="WinEventLog:Security" EventCode=5140
ShareName IN ("\\\\*\\C$", "\\\\*\\ADMIN$", "\\\\*\\IPC$")
| where SubjectUserName!="SYSTEM" AND SubjectUserName!="$"
| stats count, dc(ComputerName) AS unique_hosts by SubjectUserName, ShareName, src_ip
| where unique_hosts > 3
| eval alert = SubjectUserName." 访问了 ".unique_hosts." 台主机的管理共享"
| sort - unique_hosts
```

### 步骤 4：构建横向移动图

可视化攻击路径：

```spl
--- 构建认证事件的源->目标图
index=wineventlog EventCode=4624 Logon_Type IN (3, 10)
earliest=-24h
| stats count AS connections, latest(_time) AS last_connection
  by src_ip, ComputerName, TargetUserName, Logon_Type
| eval edge = src_ip." -> ".ComputerName." (用户：".TargetUserName."，类型：".Logon_Type.")"
| sort - connections
| table edge, connections, last_connection

--- 网络流关联
index=netflow earliest=-24h
dest_port IN (445, 135, 3389, 5985, 5986)
| stats sum(bytes) AS total_bytes, count AS flow_count,
        dc(dest_ip) AS targets by src_ip, dest_port
| where targets > 5
| eval service = case(
    dest_port=445, "SMB",
    dest_port=135, "RPC/WMI",
    dest_port=3389, "RDP",
    dest_port IN (5985, 5986), "WinRM"
  )
| sort - targets
| table src_ip, service, targets, flow_count, total_bytes
```

### 步骤 5：检测 DCOM 和计划任务横向移动

**DCOM 远程执行（T1021.003）：**
```spl
index=sysmon EventCode=1
ParentImage IN ("*\\mmc.exe", "*\\excel.exe", "*\\outlook.exe")
Image IN ("*\\cmd.exe", "*\\powershell.exe", "*\\mshta.exe")
| where ParentCommandLine="*-Embedding*"
| eval alert = "基于 DCOM 的横向移动：".ParentImage." 生成了 ".Image
| table _time, Computer, User, ParentImage, Image, CommandLine, alert
```

**远程计划任务创建（T1053.005）：**
```spl
index=wineventlog EventCode=4698
| where SubjectUserName!="SYSTEM"
| eval task_xml = TaskContent
| search task_xml="*http*" OR task_xml="*powershell*" OR task_xml="*cmd*" OR task_xml="*\\Temp\\*"
| table _time, Computer, SubjectUserName, TaskName, task_xml
```

### 步骤 6：将移动与杀伤链阶段关联

构建端到端攻击链检测：

```spl
--- 检测完整横向移动序列
index=wineventlog OR index=sysmon
(EventCode=4625 OR EventCode=4624 OR EventCode=1 OR EventCode=4698 OR EventCode=5140)
| eval phase = case(
    EventCode=4625, "1-侦察/暴力破解",
    EventCode=4624 AND Logon_Type=3, "2-横向移动",
    EventCode=5140 AND match(ShareName, "C\$|ADMIN\$"), "3-管理共享访问",
    EventCode=1 AND match(ParentImage, "psexesvc|WmiPrvSE|wsmprovhost"), "4-远程执行",
    EventCode=4698, "5-持久化（计划任务）",
    1=1, "other"
  )
| where phase!="other"
| stats count by phase, src_ip, ComputerName, TargetUserName
| sort phase, _time
| table phase, src_ip, ComputerName, TargetUserName, count
```

## 核心概念

| 术语 | 定义 |
|------|------|
| **横向移动（Lateral Movement）** | 入侵后攻击者在系统间横向转移以到达目标的技术 |
| **哈希传递（Pass-the-Hash）** | 使用盗取的 NTLM 哈希进行认证，无需知道明文密码 |
| **票据传递（Pass-the-Ticket）** | 使用盗取的 Kerberos TGT/TGS 票据在域内进行认证 |
| **PsExec** | Sysinternals 工具（及攻击技术），通过 SMB 和命名管道进行远程进程执行 |
| **WMI 执行（WMI Execution）** | 通过 DCOM 或 WinRM 使用 Windows 管理规范（WMI）进行远程命令执行 |
| **管理共享（Admin Share）** | 默认 Windows 管理共享（C$、ADMIN$、IPC$），用于远程系统管理 |

## 工具与系统

- **Splunk Enterprise Security**：用于关联 Windows 事件、Sysmon 和网络流的 SIEM 平台
- **Microsoft Defender for Identity**：通过域控制器监控检测横向移动的云服务
- **BloodHound**：Active Directory 攻击路径分析工具，用于识别横向移动机会
- **CrowdStrike Falcon**：具有横向移动检测和自动遏制功能的 EDR 平台
- **Zeek（Bro）**：网络监控器，为 SMB、RDP 和 WinRM 流量分析生成连接日志

## 常见场景

- **PsExec 传播**：攻击者使用 PsExec 在 20 台工作站上执行恶意软件——通过服务创建事件检测
- **RDP 转移**：被入侵的 VPN 账号用于通过多台内部主机进行 RDP 转移——通过 Logon_Type 10 链检测
- **WMI 侦察和执行**：攻击者使用 WMI 进行发现然后执行——通过 WmiPrvSE 子进程检测
- **哈希传递活动**：盗取的本地管理员哈希在子网范围内使用——通过 NTLM Logon_Type 3 到多台主机检测
- **计划任务持久化**：在域控制器上远程创建计划任务——通过来自非管理员来源的 EventCode 4698 检测

## 输出格式

```
横向移动检测报告
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
时段：       2024-03-15 14:00 至 18:00 UTC
来源：       192.168.1.105（WORKSTATION-042）

移动路径：
  14:23  192.168.1.105 → 10.0.5.20（DC-PRIMARY）  — 通过 NTLM Type 3 哈希传递
  14:25  10.0.5.20 → 10.0.5.21（DC-BACKUP）       — Kerberos 票据复用
  14:28  10.0.5.20 → 10.0.10.15（FILESERVER-01）  — PsExec 服务创建
  14:32  10.0.10.15 → 10.0.10.20（DB-PRIMARY）    — WMI 远程执行
  14:35  10.0.10.20 → 10.0.10.25（DB-BACKUP）     — SMB 管理共享访问

检测到的技术：
  T1550.002 — 哈希传递（NTLM 认证到 DC）
  T1021.002 — PsExec（远程服务安装）
  T1047     — WMI 执行（WmiPrvSE 子进程）
  T1021.002 — SMB 管理共享（DB-BACKUP 上的 C$ 访问）

受影响系统：  跨 2 个网络分段的 5 台主机
用户账号：    admin_compromised（域管理员）
遏制措施：    5 台主机在 14:45 UTC 已隔离
```

