发布于6小时前6小时 背景 内网横向移动排查时,很多人习惯先看告警平台结论,但实际处置中更可靠的还是回到主机日志。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 日志服务异常停止也需要一起看。 处置建议 确认横向移动后,建议按下面顺序处理: 隔离源主机和已确认受控的目标主机,避免继续扩散; 冻结或重置相关账号密码,优先处理域管、服务账号、本地管理员; 导出安全日志、系统日志、PowerShell 日志、任务计划和服务列表; 检查目标主机上的新增服务、计划任务、启动项、本地用户; 排查同源 IP 在其他主机上的 4624、5140、7045 记录; 回溯凭据来源,重点看 LSASS 访问、Mimikatz 痕迹、浏览器和配置文件泄露。 总结 Windows 横向移动排查的核心不是记住某个工具特征,而是把登录、权限、共享访问、远程执行几个环节串起来。实际工作中,建议建立一套固定的日志关联规则:4624 判断入口,4672 判断权限,5140 判断 SMB 访问,7045 判断远程服务,4688 还原执行内容。 如果环境允许,尽量把这些日志集中到日志平台,并做账号、主机、时间段的基线。这样遇到真实事件时,不需要从零开始翻日志,能够快速定位源头、影响范围和攻击路径。 网络请求、日志与边界流量分析示意
5小时前5小时 补一个实战里比较容易踩坑的点:单看 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”判成攻击。更靠谱的是看它后面有没有远程执行、管理共享访问、服务创建、异常命令行这些动作。尤其是服务账号和运维跳板机,白名单要先建好,不然后期告警会非常吵。