4625 登录失败分析
Windows 安全日志中的 4625 记录每一次登录失败,字段里包含目标账号、来源地址、登录类型与失败原因码。分析价值在于两点:一是判断是否属于定向尝试(固定账号、固定来源、高频),二是找出失败之后是否紧跟着一次成功登录。只看失败总量没有意义,内网服务账号口令配置错误同样会产生成片失败记录。
基本信息
| 事件来源 | Security 日志,需开启登录审核策略才会有记录 |
|---|---|
| 关键字段 | TargetUserName、IpAddress、LogonType、Status 与 SubStatus |
| 常见原因码 | 0xC000006A 口令错误、0xC0000064 账号不存在、0xC0000234 账号被锁定、0xC0000072 账号已禁用 |
| 配套事件 | 4740 账号被锁定,可作为爆破得手的间接证据 |
| 聚合维度 | 按目标账号、按来源地址、按登录类型分别统计 |
| 时间基准 | 分析前先确认主机时区,与日志平台时间对齐 |
典型使用场景
- 终端出现异常登录告警,需要判断是否已被突破
- 确认某个账号是否正在被持续尝试
- 统计来源地址,为边界封禁与白名单核对提供依据
- 区分远程桌面爆破与内网服务账号配置错误
- 与 4624 成功登录记录串链,评估实际影响
按用户与来源聚合失败
按用户与来源聚合失败
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4625; StartTime=(Get-Date).AddDays(-1)} -MaxEvents 300 -ErrorAction SilentlyContinue | Select-Object TimeCreated, Id, @{n='Msg';e={$_.Message.Split([char]10)[0]}} | Format-Table -AutoSize
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4625; StartTime=(Get-Date).AddDays(-1)} -MaxEvents 300 -ErrorAction SilentlyContinue | Group-Object { ($_.Message.Split([char]10) | Select-String 'Source Network Address').ToString() } | Sort-Object Count -Descending | Select-Object -First 10 Count,Name
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4740} -MaxEvents 20 -ErrorAction SilentlyContinue | Select-Object TimeCreated,Message
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4624; StartTime=(Get-Date).AddDays(-1)} -MaxEvents 50 -ErrorAction SilentlyContinue | Select-Object TimeCreated, @{n='Msg';e={$_.Message.Split([char]10)[0]}}登录类型读法
| LogonType | 含义 | 排查提示 |
|---|---|---|
| 2 | 交互式登录(键盘) | 集中在非工作时间且来自本地,值得追查 |
| 3 | 网络登录(共享、远程管理) | 爆破最常出现的类型,需看来源地址 |
| 4 | 批处理登录 | 计划任务使用的凭据,关注异常的定时任务 |
| 5 | 服务登录 | 服务账号口令错误会造成大量失败,多为配置问题 |
| 7 | 解锁屏幕 | 结合物理接触可能性判断 |
| 8 | 网络明文登录 | 明文认证场景,通常对应老式应用 |
| 10 | 远程桌面登录 | 暴露到公网的主机最常被尝试的类型 |
同一来源在密集失败之后紧接出现 4624 成功登录,应按已突破处理:立刻核查该账号的登录时间、后续进程与计划任务变更,而不是先去封 IP。
字段位置随系统版本会有差异:直接在消息文本里按关键字提取,比按固定属性序号取值稳妥;正式分析前先导出几条原始事件核对字段顺序。