发布于6小时前6小时 内网里做蓝队排查时,最容易被忽略的不是告警本身,而是告警前后那几分钟发生了什么。很多横向移动行为并不会留下特别“吓人”的日志,但把登录、进程创建、服务安装、计划任务、共享访问几类事件串起来,基本能还原大部分路径。 一、背景 在 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:检查是否可授予客户端所需访问权限。 横向移动中比较典型的组合是: 源主机访问目标主机 ADMIN$; 目标主机出现 4624 Type 3; 随后出现 7045 新服务; 再出现 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、防火墙、堡垒机和域控认证日志交叉验证。 网络请求、日志与边界流量分析示意
5小时前5小时 可以把排查重点放在“登录链路 + 进程创建 + 凭据使用”三条线上,单看某个 Event ID 容易误判,建议按时间线串起来看。 我一般会先从域控和被访问主机两侧同时查: 域控:关注 4624、4768、4769、4776,确认账号从哪里发起认证、拿了哪些服务票据。 目标主机:关注 4624、4672、4688、4697/7045、5140、5145,看是否存在远程登录、远程服务创建、共享访问和异常进程。 几个比较实用的点: 4624 登录类型不要只看 3 横向里常见: LogonType=3:SMB/WMI/远程服务等网络登录 LogonType=10:RDP LogonType=9:RunAs /netonly,凭据复用时容易出现 重点看 IpAddress、WorkstationName、TargetUserName、AuthenticationPackageName、LogonProcessName。 结合 4672 判断是否是高权限账号横向 如果 4624 后紧跟 4672,且账号有 SeDebugPrivilege、SeImpersonatePrivilege 等特殊权限,基本要提高优先级。 远程服务创建看 7045 / 4697 PsExec、部分远控工具、横向执行命令经常会落到服务创建事件。重点看: ServiceName 是否随机或异常 ImagePath 是否指向 ADMIN$、Temp、Users\Public 时间点前后是否有 4624 Type 3 登录 如果开了 4688,进程链价值很高 常见横向痕迹: wmiprvse.exe 拉起 cmd.exe、powershell.exe services.exe 拉起异常 exe 或 bat svchost.exe、rundll32.exe 执行异常参数 powershell.exe 带 -enc、-nop、-w hidden 如果没开命令行参数,建议打开: 本地安全策略 / 组策略: 计算机配置 - 管理模板 - 系统 - 审核进程创建 启用:在进程创建事件中加入命令行 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}} 排查时可以按这个顺序走: 先在域控找异常账号的 4769,确认访问过哪些主机服务,比如 cifs/hostname、host/hostname。 到对应主机查同一时间段 4624 Type 3/10。 继续查 4672、4688、7045、5140/5145,确认是否有执行行为。 把源 IP、目标主机、账号、进程、服务名按时间线串起来。 还有一点容易忽略:日志留存时间很关键。安全日志默认大小经常不够,内网稍微大一点几小时就覆盖了。建议至少把域控、安全关键服务器的 Security/System/PowerShell 日志转发到集中日志平台,单机上也要把 Security 日志调大,避免事后没法追。
创建帐户或登录后发表意见