跳转到帖子

基于 Windows 事件日志的内网横向移动排查思路

精选回复

发布于

内网里做蓝队排查时,最容易被忽略的不是告警本身,而是告警前后那几分钟发生了什么。很多横向移动行为并不会留下特别“吓人”的日志,但把登录、进程创建、服务安装、计划任务、共享访问几类事件串起来,基本能还原大部分路径。

一、背景

在 Windows 域环境中,常见横向移动方式包括:

  • 使用 SMB/ADMIN$ 远程复制文件并启动服务;
  • 通过 WMI 执行远程命令;
  • 通过 PsExec、wmic、schtasks、WinRM 等工具批量执行;
  • 使用窃取到的域账号或本地管理员账号登录多台主机。

这些行为通常不会只体现在单一日志里。比如一次 PsExec 行为,可能同时出现 4624、4672、7045、4688、5140、5145 等事件。如果只看其中一个事件,很容易误判或漏判。

二、关键日志与技术分析

1. 登录事件:4624 / 4625 / 4672

排查横向移动时,首先看目标机器上的登录事件。

  • 4624:登录成功;
  • 4625:登录失败;
  • 4672:分配了特殊权限,通常说明该账号具备管理员权限。

重点关注 4624 的 LogonType:

  • 2:本地交互式登录;
  • 3:网络登录,SMB、远程服务调用常见;
  • 9:使用备用凭据,例如 runas /netonly;
  • 10:远程桌面登录;

横向移动里最常见的是 LogonType 3 和 10。大量主机短时间出现同一账号的 4624 Type 3,需要重点看。

2. 进程创建:4688

如果开启了“进程创建审核”,4688 是非常有价值的日志。建议同时开启命令行记录:

  • 组策略路径:计算机配置 → 管理模板 → 系统 → 审核进程创建;
  • 启用:在进程创建事件中加入命令行。

重点命令包括:

  • wmic.exe process call create;
  • psexesvc.exe;
  • sc.exe create/start;
  • schtasks.exe /create /run;
  • powershell.exe -enc;
  • winrs.exe、evil-winrm 相关行为;

3. 服务安装:7045

PsExec 或通过 SCM 远程创建服务时,目标主机系统日志中常见 7045:

  • 日志位置:System;
  • 事件 ID:7045;
  • 含义:系统中安装了一个新服务。

需要关注服务名、服务文件路径、创建时间以及创建前后的登录事件。常见可疑特征:

  • 服务路径位于 C:\Windows\Temp、C:\Users\Public、ADMIN$ 写入路径;
  • 服务名随机或类似 PSEXESVC;
  • 服务二进制是 exe、bat、cmd、powershell 命令;
  • 短时间创建后又删除。

4. 共享访问:5140 / 5145

如果文件共享审核开启,攻击者访问 ADMIN$、C$、IPC$ 时会留下痕迹。

  • 5140:访问了网络共享对象;
  • 5145:检查是否可授予客户端所需访问权限。

横向移动中比较典型的组合是:

  1. 源主机访问目标主机 ADMIN$;
  2. 目标主机出现 4624 Type 3;
  3. 随后出现 7045 新服务;
  4. 再出现 4688 执行 payload 或系统命令。

三、操作步骤:一次实际排查流程

步骤 1:确定时间窗口

先从告警时间、EDR 记录、防火墙连接或者异常账号登录时间入手,确定一个时间范围。建议先取前后 30 分钟,如果事件较多再缩小。

步骤 2:在目标主机查登录来源

查看目标主机 Security 日志中 4624,过滤 LogonType 为 3、10 的事件,记录:

  • TargetUserName:登录账号;
  • IpAddress:来源 IP;
  • LogonType:登录类型;
  • AuthenticationPackageName:认证方式;
  • LogonGuid / LogonId:后续关联用。

步骤 3:关联管理员权限事件

同一时间附近如果出现 4672,说明该账号拿到了特权。普通业务账号突然在多台服务器上出现 4672,风险较高。

步骤 4:检查服务、计划任务和进程

继续检查:

  • System 日志 7045;
  • Security 日志 4698、4702,计划任务创建和修改;
  • Security 日志 4688,异常命令行;
  • PowerShell 日志 4103、4104,脚本块执行。

步骤 5:回溯源主机

拿到来源 IP 后,不要只停留在目标机器。需要继续到源主机上查:

  • 该时间点是谁登录了源主机;
  • 是否存在凭据抓取工具痕迹;
  • 是否有异常进程连接多个内网地址;
  • 是否存在批量 wmic、net use、copy、sc 命令。

四、代码示例:快速提取横向移动相关日志

下面是一个 PowerShell 示例,用于在本机提取近 24 小时内常见横向移动相关事件。实际环境可以通过远程 PowerShell、日志采集平台或 SIEM 改写。

$StartTime = (Get-Date).AddHours(-24)

# 关注的事件 ID
$SecurityEventIds = @(4624, 4625, 4672, 4688, 4698, 4702, 5140, 5145)
$SystemEventIds   = @(7045)

Write-Host "[+] Query Security events..."
Get-WinEvent -FilterHashtable @{
    LogName   = 'Security'
    Id        = $SecurityEventIds
    StartTime = $StartTime
} | ForEach-Object {
    $xml = [xml]$_.ToXml()
    $data = @{}
    foreach ($d in $xml.Event.EventData.Data) {
        $data[$d.Name] = $d.'#text'
    }

    [PSCustomObject]@{
        TimeCreated   = $_.TimeCreated
        EventId       = $_.Id
        User          = $data['TargetUserName']
        Domain        = $data['TargetDomainName']
        LogonType     = $data['LogonType']
        SourceIp      = $data['IpAddress']
        ProcessName   = $data['NewProcessName']
        CommandLine   = $data['CommandLine']
        ShareName     = $data['ShareName']
        RelativePath  = $data['RelativeTargetName']
    }
} | Where-Object {
    ($_.EventId -ne 4624) -or ($_.LogonType -in @('3','9','10'))
} | Sort-Object TimeCreated | Format-Table -AutoSize

Write-Host "[+] Query System service install events..."
Get-WinEvent -FilterHashtable @{
    LogName   = 'System'
    Id        = $SystemEventIds
    StartTime = $StartTime
} | ForEach-Object {
    $xml = [xml]$_.ToXml()
    $data = @{}
    foreach ($d in $xml.Event.EventData.Data) {
        $data[$d.Name] = $d.'#text'
    }

    [PSCustomObject]@{
        TimeCreated = $_.TimeCreated
        EventId     = $_.Id
        ServiceName = $data['ServiceName']
        ImagePath   = $data['ImagePath']
        AccountName = $data['AccountName']
    }
} | Sort-Object TimeCreated | Format-Table -AutoSize

如果日志量比较大,不建议直接在生产服务器上全量 Format-Table。可以先导出 CSV:

Get-WinEvent -FilterHashtable @{
    LogName   = 'Security'
    Id        = 4624
    StartTime = (Get-Date).AddHours(-6)
} | Export-Clixml .\security_4624_last6h.xml

导出后再离线分析,避免对业务机器造成额外压力。

五、常见判断规则

1. PsExec 类行为

常见日志链路:

  • 目标主机出现 4624,LogonType=3;
  • 目标主机出现 ADMIN$ 或 IPC$ 访问;
  • System 日志出现 7045,新服务名可能为 PSEXESVC 或随机名;
  • 4688 中出现 cmd.exe、powershell.exe 或攻击载荷执行。

2. WMI 远程执行

常见特征:

  • 目标主机 4624 Type 3;
  • 可能出现 WmiPrvSE.exe 拉起 cmd.exe 或 powershell.exe;
  • 4688 父进程为 WmiPrvSE.exe;
  • 命令行中出现 process call create、/node、/user 等参数。

3. 计划任务横向执行

常见特征:

  • 4698:创建计划任务;
  • 4702:更新计划任务;
  • 任务内容中包含 powershell、cmd、rundll32、mshta、regsvr32 等;
  • 执行后任务被删除,需结合 4699 查看。

4. RDP 横向登录

常见日志:

  • 4624 LogonType=10;
  • 4778:重新连接到会话;
  • 4779:断开会话;
  • TerminalServices-LocalSessionManager 日志中的 21、24、25。

如果一个账号在非办公时间从跳板机以外的地址 RDP 登录多台服务器,需要重点核实。

六、注意事项

  • 不要只看域控日志。域控能看到认证行为,但远程执行的细节通常在目标主机。
  • 时间同步很关键。内网机器时间漂移会导致日志链路断裂,建议统一 NTP。
  • 4688 默认不一定完整。没有开启命令行记录时,很多判断只能看到进程名,价值会下降。
  • 5140/5145 需要开启对象访问审核。否则 SMB 访问链路可能缺失。
  • 注意正常运维工具。SCCM、域管脚本、堡垒机批量任务也会产生类似行为,判断时要结合资产和变更记录。
  • 保留原始日志。发现疑似入侵后,先导出 evtx,再做进一步筛选,避免日志轮转覆盖。

七、防护建议

  • 限制本地管理员账号横向复用,优先使用 LAPS 或 Windows LAPS;
  • 普通业务账号不要加入服务器本地管理员组;
  • 对 ADMIN$、C$ 访问做日志采集和基线;
  • 开启 4688 命令行审计、PowerShell 4104 脚本块日志;
  • 对 7045 服务安装事件设置告警;
  • 堡垒机、运维平台账号行为要能落到具体人员;
  • 域管账号禁止登录普通办公终端,减少凭据暴露面。

八、总结

横向移动排查的核心不是记住某个事件 ID,而是把“谁从哪里来、用了什么账号、在目标机器上做了什么、是否继续访问其他机器”串起来。4624、4672、4688、7045、5140、5145 这几类日志组合使用,基本能覆盖大多数 Windows 内网横向行为。

实际排查时建议先固定时间窗口,再从目标主机反查来源主机,最后沿着账号和源 IP 继续扩展。日志不完整时,不要急着下结论,可以结合 EDR、NetFlow、防火墙、堡垒机和域控认证日志交叉验证。

网络流量与边界分析示意图
网络请求、日志与边界流量分析示意
可以把排查重点放在“登录链路 + 进程创建 + 凭据使用”三条线上,单看某个 Event ID 容易误判,建议按时间线串起来看。 我一般会先从域控和被访问主机两侧同时查:
  • 域控:关注 4624、4768、4769、4776,确认账号从哪里发起认证、拿了哪些服务票据。
  • 目标主机:关注 4624、4672、4688、4697/7045、5140、5145,看是否存在远程登录、远程服务创建、共享访问和异常进程。
几个比较实用的点:
  1. 4624 登录类型不要只看 3
    横向里常见:
    • LogonType=3:SMB/WMI/远程服务等网络登录
    • LogonType=10:RDP
    • LogonType=9:RunAs /netonly,凭据复用时容易出现
    重点看 IpAddress、WorkstationName、TargetUserName、AuthenticationPackageName、LogonProcessName。
  2. 结合 4672 判断是否是高权限账号横向
    如果 4624 后紧跟 4672,且账号有 SeDebugPrivilege、SeImpersonatePrivilege 等特殊权限,基本要提高优先级。
  3. 远程服务创建看 7045 / 4697
    PsExec、部分远控工具、横向执行命令经常会落到服务创建事件。重点看:
    • ServiceName 是否随机或异常
    • ImagePath 是否指向 ADMIN$、Temp、Users\Public
    • 时间点前后是否有 4624 Type 3 登录
  4. 如果开了 4688,进程链价值很高
    常见横向痕迹:
    • wmiprvse.exe 拉起 cmd.exe、powershell.exe
    • services.exe 拉起异常 exe 或 bat
    • svchost.exe、rundll32.exe 执行异常参数
    • powershell.exe 带 -enc、-nop、-w hidden
    如果没开命令行参数,建议打开:
    本地安全策略 / 组策略:
    计算机配置 - 管理模板 - 系统 - 审核进程创建
    启用:在进程创建事件中加入命令行
  5. SMB 共享访问看 5140 / 5145
    如果看到访问 \\目标\ADMIN$、\\目标\C$,再结合后续服务创建或进程执行,基本能还原一段横向路径。
Windows 自带命令可以先快速筛一下,比如查某台机器上的远程登录和服务创建:
wevtutil qe Security /q:"*[System[(EventID=4624)]] and *[EventData[Data[@Name='LogonType']='3']]" /f:text /c:50

wevtutil qe System /q:"*[System[(EventID=7045)]]" /f:text /c:50
如果用 PowerShell 聚合会更方便,例如筛近 24 小时网络登录:
$start = (Get-Date).AddHours(-24)

Get-WinEvent -FilterHashtable @{
    LogName='Security'
    Id=4624
    StartTime=$start
} | Where-Object {
    $_.Properties[8].Value -eq 3
} | Select-Object TimeCreated,
    @{n='User';e={$_.Properties[5].Value}},
    @{n='Domain';e={$_.Properties[6].Value}},
    @{n='SourceIP';e={$_.Properties[18].Value}},
    @{n='Workstation';e={$_.Properties[11].Value}}
排查时可以按这个顺序走:
  1. 先在域控找异常账号的 4769,确认访问过哪些主机服务,比如 cifs/hostname、host/hostname。
  2. 到对应主机查同一时间段 4624 Type 3/10。
  3. 继续查 4672、4688、7045、5140/5145,确认是否有执行行为。
  4. 把源 IP、目标主机、账号、进程、服务名按时间线串起来。
还有一点容易忽略:日志留存时间很关键。安全日志默认大小经常不够,内网稍微大一点几小时就覆盖了。建议至少把域控、安全关键服务器的 Security/System/PowerShell 日志转发到集中日志平台,单机上也要把 Security 日志调大,避免事后没法追。

创建帐户或登录后发表意见

最近浏览 0

  • 没有会员查看此页面。