跳转到帖子

从 Windows 安全日志识别横向移动:4624/4672/4688/5140 的关联分析实践

精选回复

发布于

背景

内网横向移动排查时,很多人习惯先看告警平台结论,但实际处置中更可靠的还是回到主机日志。Windows 安全日志里,登录事件、特权分配、进程创建、共享访问之间存在比较稳定的关联关系。只看单条日志容易误判,把 4624、4672、4688、5140、7045 等事件串起来,通常能还原出比较清晰的入侵路径。

本文按蓝队日常排查思路,整理一套可落地的 Windows 横向移动日志分析方法,重点放在远程登录、PsExec/WMI/WinRM、SMB 共享访问和服务创建几个场景。

技术分析

横向移动本质上通常包含几个动作:

  • 使用有效凭据登录目标主机;
  • 访问 ADMIN$、C$、IPC$ 等管理共享;
  • 远程创建服务、执行命令或启动远程进程;
  • 建立持久化、投递工具或继续凭据收集。

在 Windows 日志中,可以重点关注以下事件 ID:

事件 ID 含义 排查价值
4624 登录成功 重点看 Logon Type、源 IP、目标账号、认证包
4625 登录失败 爆破、密码喷洒、横向尝试痕迹
4672 特殊权限分配 管理员登录后常伴随出现,适合与 4624 关联
4688 进程创建 需要开启命令行审计,用于定位执行内容
5140 网络共享对象被访问 识别 ADMIN$、C$、IPC$ 等共享访问
7045 系统服务被安装 PsExec、远程服务投递常见痕迹

1. 4624 登录类型判断

4624 的 Logon Type 很关键,常见含义如下:

  • 2:交互式登录,本地控制台;
  • 3:网络登录,SMB、远程服务、计划任务访问常见;
  • 7:解锁;
  • 10:远程交互式登录,通常是 RDP;
  • 11:缓存交互式登录。

横向移动里最常见的是 Type 3 和 Type 10。如果某个普通办公终端在非办公时间段对多台服务器产生 Type 3 登录,就需要重点关注。

2. 4672 与管理员权限确认

4672 表示“为新登录分配了特殊权限”,例如:

  • SeDebugPrivilege
  • SeImpersonatePrivilege
  • SeBackupPrivilege
  • SeRestorePrivilege

它本身不是恶意行为,但如果 4624 后紧跟 4672,且账号不是日常运维账号,就说明该登录会话具备较高权限,应继续追踪后续进程和共享访问。

3. SMB 共享访问与 5140

远程执行工具经常需要通过 SMB 投递文件或访问命名管道。5140 事件中的 ShareName 字段很重要:

  • \\*\ADMIN$:远程管理共享;
  • \\*\C$:系统盘默认管理共享;
  • \\*\IPC$:命名管道通信常用。

如果看到某源 IP 对多台主机连续访问 ADMIN$,且随后目标主机出现 7045 服务创建,很像 PsExec 类行为。

操作步骤

步骤一:确认审计策略

如果没有开启关键审计,日志会缺失很多细节。建议至少确认以下策略:

  • 审核登录事件成功与失败;
  • 审核账户登录事件成功与失败;
  • 审核进程创建;
  • 进程创建事件包含命令行参数;
  • 审核对象访问,用于记录共享访问。

通过组策略路径可配置:

计算机配置 -> Windows 设置 -> 安全设置 -> 高级审核策略配置

开启 4688 命令行记录的位置:

计算机配置 -> 管理模板 -> 系统 -> 审核进程创建 -> 在进程创建事件中加入命令行

步骤二:筛选可疑远程登录

优先筛选 4624 中的 Type 3 和 Type 10,关注以下字段:

  • TargetUserName:登录账号;
  • IpAddress:源地址;
  • WorkstationName:来源主机名;
  • AuthenticationPackageName:NTLM 或 Kerberos;
  • LogonProcessName:登录进程。

异常判断建议结合基线,例如:

  • 普通用户账号登录服务器;
  • 服务账号从非固定主机登录;
  • 同一源 IP 短时间登录多台主机;
  • 凌晨时间段出现大量 Type 3 登录;
  • NTLM 登录比例异常升高。

步骤三:关联 5140 和 7045

如果 4624 Type 3 后出现 5140 访问 ADMIN$,并在一分钟内出现 7045 服务安装,基本可以判断存在远程服务执行行为。需要记录:

  • 服务名称;
  • 服务文件路径;
  • 服务安装账号;
  • 源 IP;
  • 服务二进制文件是否仍存在。

PsExec 默认服务名常见为 PSEXESVC,但攻击者通常会改名,所以不能只匹配服务名,要看服务路径和时间线。

步骤四:检查 4688 进程创建

开启命令行审计后,4688 可以看到执行命令。横向移动排查中常见可疑进程包括:

  • cmd.exe /c
  • powershell.exe -enc
  • wmic.exe
  • rundll32.exe
  • regsvr32.exe
  • sc.exe create
  • schtasks.exe /create

这里不要只靠进程名判断,最好结合父进程、命令行和登录会话 ID。例如 cmd.exe 本身正常,但如果父进程是远程服务进程,并且命令行包含下载、解压、添加用户,就需要升级处置。

代码示例

下面是一个 PowerShell 示例,用于从本机安全日志中提取近 24 小时的 4624、4672、5140、7045 相关信息。实际使用时可以通过远程采集或日志平台批量执行。

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

# 解析 4624 登录成功事件,筛选远程登录类型 3 和 10
$logonEvents = Get-WinEvent -FilterHashtable @{
    LogName = 'Security'
    Id = 4624
    StartTime = $StartTime
} | ForEach-Object {
    $xml = [xml]$_.ToXml()
    $data = @{}
    foreach ($d in $xml.Event.EventData.Data) {
        $data[$d.Name] = $d.'#text'
    }

    if ($data['LogonType'] -in @('3','10')) {
        [PSCustomObject]@{
            TimeCreated = $_.TimeCreated
            EventId     = $_.Id
            LogonType   = $data['LogonType']
            User        = "$($data['TargetDomainName'])\$($data['TargetUserName'])"
            IpAddress   = $data['IpAddress']
            Workstation = $data['WorkstationName']
            AuthPackage = $data['AuthenticationPackageName']
            LogonId     = $data['TargetLogonId']
        }
    }
}

# 解析 5140 网络共享访问事件
$shareEvents = Get-WinEvent -FilterHashtable @{
    LogName = 'Security'
    Id = 5140
    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['SubjectDomainName'])\$($data['SubjectUserName'])"
        IpAddress   = $data['IpAddress']
        ShareName   = $data['ShareName']
    }
}

# 解析 7045 服务安装事件,位于 System 日志
$serviceEvents = Get-WinEvent -FilterHashtable @{
    LogName = 'System'
    Id = 7045
    StartTime = $StartTime
} | ForEach-Object {
    $xml = [xml]$_.ToXml()
    [PSCustomObject]@{
        TimeCreated = $_.TimeCreated
        EventId     = $_.Id
        Provider    = $_.ProviderName
        Message     = $_.Message
    }
}

Write-Host "=== Remote Logon Events 4624 Type 3/10 ==="
$logonEvents | Sort-Object TimeCreated | Format-Table -AutoSize

Write-Host "`n=== Admin Share Access 5140 ==="
$shareEvents |
    Where-Object { $_.ShareName -match 'ADMIN\$|C\$|IPC\$' } |
    Sort-Object TimeCreated |
    Format-Table -AutoSize

Write-Host "`n=== Service Install Events 7045 ==="
$serviceEvents | Sort-Object TimeCreated | Format-List

如果环境里已经接入了 Elasticsearch 或 SIEM,可以把思路转成查询规则。下面给一个偏通用的关联逻辑:

条件一:目标主机出现 4624,LogonType in (3,10)
条件二:同一账号、同一源 IP,在 5 分钟内访问 ADMIN$ 或 C$
条件三:目标主机在 5 分钟内出现 7045 服务安装
条件四:服务路径位于 Windows\Temp、Users\Public、ProgramData 等非常规目录

满足 条件一 + 条件二 + 条件三 时,标记为高危横向移动行为。
满足 条件一 + 条件二 + 条件四 时,标记为中高危远程投递行为。

典型场景判断

1. PsExec 类远程执行

常见日志链路:

  • 4624 Type 3:源主机登录目标主机;
  • 5140:访问 ADMIN$ 或 IPC$;
  • 7045:安装远程服务;
  • 4688:服务进程启动命令或子进程。

如果服务名随机、二进制路径位于 C:\Windows\ 下,仍然不能直接放过。建议核对文件创建时间、签名、哈希,以及是否与登录时间重合。

2. WMI 远程执行

WMI 远程执行常见特征:

  • 4624 Type 3 登录;
  • 目标主机上出现 WmiPrvSE.exe 相关进程;
  • 4688 中 ParentProcessName 可能指向 WmiPrvSE.exe;
  • 命令行中可能出现 cmd.exe /c、powershell 等。

WMI 不一定产生 7045,所以如果只依赖服务安装日志,会漏掉这类行为。

3. RDP 登录

RDP 对应 4624 Type 10,还可以结合终端服务日志:

  • Microsoft-Windows-TerminalServices-LocalSessionManager/Operational
  • 事件 ID 21:会话登录成功;
  • 事件 ID 24:会话断开;
  • 事件 ID 25:会话重连。

如果发现管理员账号从陌生出口 IP 或办公终端远程登录服务器,需要确认是否为堡垒机绕行。

注意事项

  • 不要单事件定性。4624 Type 3 很常见,文件共享、补丁分发、杀软管理都可能产生,需要结合时间线。
  • 关注账号使用位置。服务账号、域管账号应该有固定使用范围,出现在普通终端上通常不正常。
  • 保留原始日志。处置前先导出 EVTX,避免重启、清理或覆盖导致证据缺失。
  • 时间同步很重要。域内主机如果 NTP 不一致,跨主机关联会非常痛苦,建议统一校时。
  • 4688 命令行有隐私和敏感信息风险。开启后要控制日志访问权限,避免凭据、Token、业务参数泄露。
  • 注意日志清理痕迹。安全日志被清理会产生 1102,System 日志服务异常停止也需要一起看。

处置建议

确认横向移动后,建议按下面顺序处理:

  1. 隔离源主机和已确认受控的目标主机,避免继续扩散;
  2. 冻结或重置相关账号密码,优先处理域管、服务账号、本地管理员;
  3. 导出安全日志、系统日志、PowerShell 日志、任务计划和服务列表;
  4. 检查目标主机上的新增服务、计划任务、启动项、本地用户;
  5. 排查同源 IP 在其他主机上的 4624、5140、7045 记录;
  6. 回溯凭据来源,重点看 LSASS 访问、Mimikatz 痕迹、浏览器和配置文件泄露。

总结

Windows 横向移动排查的核心不是记住某个工具特征,而是把登录、权限、共享访问、远程执行几个环节串起来。实际工作中,建议建立一套固定的日志关联规则:4624 判断入口,4672 判断权限,5140 判断 SMB 访问,7045 判断远程服务,4688 还原执行内容。

如果环境允许,尽量把这些日志集中到日志平台,并做账号、主机、时间段的基线。这样遇到真实事件时,不需要从零开始翻日志,能够快速定位源头、影响范围和攻击路径。

网络流量与边界分析示意图
网络请求、日志与边界流量分析示意
补一个实战里比较容易踩坑的点:单看 4624 很容易误判,建议把“登录类型 + 账号形态 + 来源主机 + 随后的行为”串起来看。 几个比较有价值的关联方向: 1. 先筛 4624 里的高风险登录类型 - `LogonType=3`:网络登录,常见于 SMB、远程服务、PsExec、WMI 等 - `LogonType=10`:RDP - `LogonType=9`:NewCredentials,常见于 runas /netonly,也可能出现在凭据滥用场景 - 重点看 `TargetUserName`、`IpAddress`、`WorkstationName`、`LogonId` 可以用 PowerShell 先把关键字段拉出来:
Get-WinEvent -FilterHashtable @{
    LogName='Security'
    Id=4624
} | ForEach-Object {
    $xml = [xml]$_.ToXml()
    $d = @{}
    $xml.Event.EventData.Data | ForEach-Object {
        $d[$_.Name] = $_.'#text'
    }

    if ($d.LogonType -in 3,9,10) {
        [PSCustomObject]@{
            TimeCreated    = $_.TimeCreated
            TargetUserName = $d.TargetUserName
            TargetDomain   = $d.TargetDomainName
            LogonType      = $d.LogonType
            IpAddress      = $d.IpAddress
            Workstation    = $d.WorkstationName
            LogonId        = $d.TargetLogonId
            AuthPackage    = $d.AuthenticationPackageName
            ProcessName    = $d.ProcessName
        }
    }
} | Sort-Object TimeCreated
2. 4624 和 4672 要用 `LogonId` 关联 4672 本身只表示“分配了特殊权限”,域管理员、备份操作员、服务账号经常会触发。它的价值在于和 4624 同一个 `LogonId` 关联后,确认这次远程登录是不是高权限账号。 比如某台主机出现: - 4624:`LogonType=3`,来源 IP 是另一台工作站 - 同一 `LogonId` 紧跟 4672 - 账号不是该机器日常管理账号 这个比单独看到 4672 有意义得多。 3. 4688 要重点看“远程登录后短时间内的新进程” 如果开了命令行审计,建议看这些进程: - `cmd.exe /c` - `powershell.exe -enc` - `wmic.exe process call create` - `sc.exe create/start` - `psexesvc.exe` - `rundll32.exe` - `regsvr32.exe` - `net.exe use` - `net.exe group "domain admins"` 对应策略:
计算机配置
  → Windows 设置
    → 安全设置
      → 高级审核策略配置
        → 详细跟踪
          → 审核进程创建:成功

同时打开:
计算机配置
  → 管理模板
    → 系统
      → 审核进程创建
        → 在进程创建事件中加入命令行:启用
命令行方式:
auditpol /set /subcategory:"Process Creation" /success:enable
reg add "HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\Audit" ^
 /v ProcessCreationIncludeCmdLine_Enabled /t REG_DWORD /d 1 /f
4. 5140 更适合确认 SMB 横向痕迹 5140 记录共享访问,建议重点看: - `\\*\ADMIN$` - `\\*\C$` - `\\*\IPC$` - 异常账号访问多个主机共享 - 普通办公账号访问服务器管理共享 如果看到链路是: - A 主机账号登录 B:4624 LogonType 3 - B 上同账号拿到特殊权限:4672 - B 上访问 `ADMIN$` / `C$`:5140 - B 上出现 `services.exe` 拉起异常进程或 `cmd/powershell`:4688 这个基本就比较像横向执行链条了。 5. 时间窗口建议别拉太大 个人习惯是以 4624 为锚点,前后 1 到 3 分钟关联 4672、5140、4688。PsExec、WMI 这类动作通常事件很集中,窗口太大会引入很多噪声。 可以先导出到 CSV 做关联:
wevtutil epl Security C:\Temp\Security.evtx /q:"*[System[(EventID=4624 or EventID=4672 or EventID=4688 or EventID=5140)]]"
如果环境里有集中日志,建议把这些字段标准化: - `Computer` - `EventID` - `TimeCreated` - `TargetUserName` - `TargetLogonId` - `IpAddress` - `WorkstationName` - `ProcessName` - `CommandLine` - `ShareName` 最后补一句:横向移动排查里,不建议直接把“4624 + 4672”判成攻击。更靠谱的是看它后面有没有远程执行、管理共享访问、服务创建、异常命令行这些动作。尤其是服务账号和运维跳板机,白名单要先建好,不然后期告警会非常吵。

最近浏览 0

  • 没有会员查看此页面。