BetaHydri/Get-NtlmLogonEvents
GitHub: BetaHydri/Get-NtlmLogonEvents
用于审计Windows环境中NTLM身份验证事件的PowerShell脚本,帮助识别遗留NTLM使用、特权会话和Kerberos回退问题,为禁用不安全认证协议提供决策依据。
Stars: 0 | Forks: 0
# Get-NtlmLogonEvents
[](https://docs.microsoft.com/en-us/powershell/)
[](https://www.microsoft.com/windows)
[](LICENSE)
[](https://github.com/BetaHydri/Get-NtlmLogonEvents/stargazers)
[](https://github.com/BetaHydri/Get-NtlmLogonEvents/issues)
[](https://github.com/BetaHydri/Get-NtlmLogonEvents/commits/main)
一个用于查询 Windows 安全事件日志中 NTLM 身份验证事件的 PowerShell 脚本(事件 ID 4624 表示成功登录,以及可选的事件 ID 4625 表示失败登录)。它还可以将 NTLM 登录与事件 ID 4672 关联以识别特权会话,查询 NTLM Operational 日志以获取进程级详细信息(事件 8001-8006/4001-4006),并检查您的 NTLM 审核/限制 GPO 配置。专为安全审计和识别环境中遗留的 NTLMv1 和 NTLMv2 使用情况而设计。
## 为什么这很重要
NTLM(包括 NTLMv1、NTLMv2 和 LM)是一种遗留身份验证协议,容易受到中继、暴力破解和哈希传递攻击。Microsoft 强烈建议改用 Kerberos 身份验证。此脚本帮助您**查找哪些用户、工作站和应用程序仍在使用 NTLM**,以便您在强制执行更强的身份验证策略之前对其进行修复。
使用 NTLM 的特权账户尤其危险——它们是中继和哈希传递攻击的主要目标。`-CorrelatePrivileged` 开关交叉引用事件 ID 4672(分配给新登录的特殊权限)以标记这些高风险会话,以便您可以优先将它们迁移到 Kerberos。
### 直接 NTLM vs. Negotiate 回退
并非所有 NTLM 使用都是一样的。理解*为什么*使用 NTLM 对于选择正确的修复方法至关重要:
| 场景 | `AuthenticationPackageName` | `LogonProcessName` | 根本原因 | 修复方法 |
|---|---|---|---|---|
| **直接 NTLM** | `NTLM` | `NtLmSsp` | 应用程序硬编码为 NTLM | 更改应用程序配置或代码以使用 Negotiate/Kerberos |
| **Negotiate→NTLM 回退** | `Negotiate` | `Negotiate` | Kerberos 尝试失败 | 修复 SPN、DNS、时钟偏差或信任问题 |
此脚本同时显示 `AuthenticationPackageName` 和 `LogonProcessName`,以便您一眼就能区分这些情况。
## 功能
- 查询仅 NTLMv1 或所有 NTLM(v1、v2、LM)登录事件
- **检测 Negotiate→NTLM 回退** — `AuthenticationPackageName` 和 `LogonProcessName` 字段揭示了何时尝试了 Kerberos 但回退到了 NTLM
- **包含失败的 NTLM 登录尝试**(事件 ID 4625),用于暴力破解和中继攻击检测
- **与特权登录关联** — `-CorrelatePrivileged` 交叉引用事件 ID 4672 以标记获得提升权限的 NTLM 登录(高价值的中继/哈希传递目标)
- 目标可以是 localhost、特定的远程服务器、所有域控制器,或**整个 AD 林中的所有 DC**
- 按日期范围过滤(`-StartTime` / `-EndTime`)
- 排除空会话(ANONYMOUS LOGON)
- 支持远程连接的备用凭据
- **查询 NTLM Operational 日志** — `-IncludeNtlmOperationalLog` 查询 `Microsoft-Windows-NTLM/Operational` 日志以获取捕获进程名称、目标服务器 SPN 和安全通道名称的审核事件(8001-8006)和阻止事件(4001-4006)
- **检查 NTLM 审核配置** — `-CheckAuditConfig` 读取相关的注册表值并报告是否启用了推荐的 NTLM 审核 GPO 设置([参考](https://techcommunity.microsoft.com/blog/coreinfrastructureandsecurityblog/active-directory-hardening-series---part-8-%E2%80%93-disabling-ntlm/4485782))
- 将模拟级别代码(`%%1831`–`%%1834`)转换为可读名称(参见 [模拟级别参考](#impersonation-levels-reference))
- 输出结构化的 `PSCustomObject` — 可通过管道传输到 `Export-Csv`、`ConvertTo-Json`、`Format-Table` 等。
## 要求
| 要求 | 详情 |
|---|---|
| PowerShell | 5.1 或更高版本 |
| 权限 | 必须以提升的权限(管理员)运行才能读取安全事件日志 |
| 远程目标 | 远程主机上必须启用 WinRM(`winrm quickconfig`)。参见 [WinRM 防火墙先决条件](#winrm-firewall-prerequisites)。 |
| 域控制器 | ActiveDirectory PowerShell 模块 (RSAT) |
| NTLM Operational 日志 | 需要先配置 NTLM 审核 GPO 策略(参见 [NTLM Operational 日志的先决条件](#prerequisites-for-ntlm-operational-log))。日志通道本身默认启用 — 无需手动启用。 |
### WinRM 防火墙先决条件
当查询**远程**主机时(通过 `-ComputerName`、`-Target DCs` 或 `-Target Forest`),脚本使用 WinRM(`Get-WinEvent -ComputerName` / `Invoke-Command`)。以下端口和防火墙规则必须到位:
| 端口 | 协议 | 传输层 | 用途 |
|---|---|---|---|
| **TCP 5985** | HTTP | WinRM 默认监听器 | 由 PowerShell 远程处理和 `Get-WinEvent -ComputerName` 使用 |
| **TCP 5986** | HTTPS | 基于 TLS 的 WinRM | 在远程主机上配置 SSL 证书时使用 |
#### 远程目标上的防火墙规则
1. **Windows 防火墙** — 内置规则**“Windows Remote Management (HTTP-In)”**必须启用。在远程主机上运行 `winrm quickconfig` 或 `Enable-PSRemoting` 会自动配置此项。
2. **网络/边界防火墙** — 查询机器与远程目标之间的任何防火墙必须允许入站 **TCP 5985**(或 HTTPS 的 **TCP 5986**)。
#### 远程主机上的快速设置
```
# 选项 1 — Enable-PSRemoting(推荐,创建防火墙规则 + 启动 WinRM 服务)
Enable-PSRemoting -Force
# 选项 2 — winrm quickconfig(经典方法)
winrm quickconfig
# 验证监听器是否处于活动状态
winrm enumerate winrm/config/listener
```
## 安装
无需安装。克隆或下载脚本并直接运行:
```
git clone https://github.com/BetaHydri/Get-NtlmLogonEvents.git
cd Get-NtlmLogonEvents
```
## 参数
| 参数 | 类型 | 默认值 | 参数集 | 描述 |
|---|---|---|---|---|
| `-Target` | String | `Localhost` | Default, AuditConfig | 目标范围:`Localhost`、`DCs`(域控制器)或 `Forest`(AD 林中的所有 DC)。受 `ValidateSet` 约束。 |
| `-ComputerName` | String[] | — | ComputerName, AuditConfigComputerName | 要查询的一个或多个特定远程主机。在其参数集中是必需的。 |
| `-NumEvents` | Int | `30` | Default, ComputerName | 每个主机返回的最大事件数 |
| `-OnlyNTLMv1` | Switch | Off | Default, ComputerName | 仅返回 NTLMv1 事件(默认:所有 NTLM 版本) |
| `-ExcludeNullSessions` | Switch | Off | Default, ComputerName | 从安全日志中过滤掉 ANONYMOUS LOGON(空会话)事件,并从 NTLM Operational 日志中过滤掉空凭据事件 |
| `-IncludeFailedLogons` | Switch | Off | Default, ComputerName | 同时查询失败的登录尝试(事件 ID 4625) |
| `-CorrelatePrivileged` | Switch | Off | Default, ComputerName | 与事件 ID 4672 关联以识别特权 NTLM 登录会话 |
| `-IncludeNtlmOperationalLog` | Switch | Off | Default, ComputerName | 同时查询 `Microsoft-Windows-NTLM/Operational` 日志(事件 8001-8006 审核 + 4001-4006 阻止) |
| `-CheckAuditConfig` | Switch | — | AuditConfig, AuditConfigComputerName | 检查 NTLM 审核/限制 GPO 注册表设置(独立模式 — 无事件查询)。在其参数集中是必需的。 |
| `-Domain` | String | — | Default, AuditConfig | 使用 `-Target DCs` 时要查询的 AD 域(作为 `-Server` 传递给 `Get-ADDomainController`)。不与 `-Target Forest` 一起使用。 |
| `-StartTime` | DateTime | — | Default, ComputerName | 仅返回此日期/时间之后的事件 |
| `-EndTime` | DateTime | — | Default, ComputerName | 仅返回此日期/时间之前的事件 |
| `-Credential` | PSCredential | — | All | 用于远程连接的备用凭据 |
### 参数集
| 参数集 | 用途 | 关键参数 |
|---|---|---|
| **Default** | 使用 `-Target` 范围进行事件日志查询 | `-Target` (Localhost/DCs/Forest),事件过滤器 |
| **ComputerName** | 在特定主机上进行事件日志查询 | `-ComputerName`(必需),事件过滤器 |
| **AuditConfig** | 使用 `-Target` 范围进行审核配置检查 | `-CheckAuditConfig`(必需),`-Target` |
| **AuditConfigComputerName** | 在特定主机上进行审核配置检查 | `-CheckAuditConfig`(必需),`-ComputerName`(必需) |
## 使用示例
### 基本用法
```
# 本地主机上的所有 NTLM 事件(最近 30 条)
.\Get-NtlmLogonEvents.ps1
# 限制为 10 条事件
.\Get-NtlmLogonEvents.ps1 -NumEvents 10
# 查询特定远程服务器
.\Get-NtlmLogonEvents.ps1 -ComputerName server.contoso.com
# 查询多个远程服务器
.\Get-NtlmLogonEvents.ps1 -ComputerName server1.contoso.com, server2.contoso.com
# 查询所有域控制器
.\Get-NtlmLogonEvents.ps1 -Target DCs
# 查询整个 AD 林中的所有 DC
.\Get-NtlmLogonEvents.ps1 -Target Forest
# 查询特定域中的 DC(多域林或受信任域)
.\Get-NtlmLogonEvents.ps1 -Target DCs -Domain child.contoso.com
# 使用备用凭据查询受信任域中的 DC
.\Get-NtlmLogonEvents.ps1 -Target DCs -Domain partner.fabrikam.com -Credential (Get-Credential)
# 为远程连接使用备用凭据
.\Get-NtlmLogonEvents.ps1 -ComputerName server.contoso.com -Credential (Get-Credential)
# 用于故障排除的详细输出
.\Get-NtlmLogonEvents.ps1 -Target DCs -Verbose
```
### 使用脚本参数进行过滤
```
# 仅 NTLMv1 事件(最不安全 —— 优先处理这些)
.\Get-NtlmLogonEvents.ps1 -OnlyNTLMv1
# 仅来自特定服务器的 NTLMv1
.\Get-NtlmLogonEvents.ps1 -ComputerName server.contoso.com -OnlyNTLMv1
# 排除空会话(ANONYMOUS LOGON)以专注于真实用户
.\Get-NtlmLogonEvents.ps1 -ExcludeNullSessions
# 组合:仅 NTLMv1,无空会话
.\Get-NtlmLogonEvents.ps1 -OnlyNTLMv1 -ExcludeNullSessions
# 最近 7 天的事件
.\Get-NtlmLogonEvents.ps1 -StartTime (Get-Date).AddDays(-7)
# 特定日期范围内的事件
.\Get-NtlmLogonEvents.ps1 -StartTime '2026-02-01' -EndTime '2026-02-28'
# 包含失败的登录尝试(Event ID 4625)
.\Get-NtlmLogonEvents.ps1 -IncludeFailedLogons
# 仅失败的 NTLMv1 尝试
.\Get-NtlmLogonEvents.ps1 -IncludeFailedLogons -OnlyNTLMv1 |
Where-Object EventId -eq 4625
```
### 特权账户关联
具有提升权限的 NTLM 登录是中继和哈希传递攻击的高价值目标。`-CorrelatePrivileged` 开关交叉引用事件 ID 4672(分配给新登录的特殊权限)以标记这些会话。
```
# 查找所有 NTLM 登录并显示哪些获得了提升的权限
.\Get-NtlmLogonEvents.ps1 -CorrelatePrivileged
# 仅显示特权 NTLM 登录(排除空会话)
.\Get-NtlmLogonEvents.ps1 -CorrelatePrivileged -ExcludeNullSessions |
Where-Object IsPrivileged
# 特权 NTLMv1 登录 —— 风险最高的组合
.\Get-NtlmLogonEvents.ps1 -CorrelatePrivileged -OnlyNTLMv1 |
Where-Object IsPrivileged |
Select-Object Time, UserName, TargetDomainName, WorkstationName, IPAddress, PrivilegeList
# 审核最近 7 天内所有 DC 上的特权 NTLM 使用情况
.\Get-NtlmLogonEvents.ps1 -Target DCs -CorrelatePrivileged -ExcludeNullSessions `
-NumEvents 1000 -StartTime (Get-Date).AddDays(-7) |
Where-Object IsPrivileged |
Sort-Object UserName |
Format-Table Time, UserName, WorkstationName, IPAddress, LmPackageName, ComputerName
# 统计特权与非特权 NTLM 登录
.\Get-NtlmLogonEvents.ps1 -CorrelatePrivileged -NumEvents 500 |
Group-Object IsPrivileged |
Select-Object @{N='Category';E={if($_.Name -eq 'True'){'Privileged'}else{'Standard'}}}, Count
```
### Negotiate→NTLM 回退检测
当 Kerberos 协商失败时(例如,缺少 SPN、时钟偏差、DNS 问题),Windows 会通过 Negotiate 包静默回退到 NTLM。这些事件看起来像普通登录,但表明存在 Kerberos 配置问题。
```
# 查找所有 Negotiate→NTLM 回退(尝试了 Kerberos 但失败)
.\Get-NtlmLogonEvents.ps1 -NumEvents 500 |
Where-Object AuthenticationPackageName -eq 'Negotiate'
# 比较直接 NTLM 与 Negotiate 回退 —— 按 auth package 分组
.\Get-NtlmLogonEvents.ps1 -NumEvents 1000 |
Group-Object -Property AuthenticationPackageName |
Select-Object Count, Name
# 仅显示包含工作站和用户详细信息的回退
.\Get-NtlmLogonEvents.ps1 -NumEvents 500 |
Where-Object AuthenticationPackageName -eq 'Negotiate' |
Select-Object UserName, TargetDomainName, WorkstationName, LmPackageName, IPAddress
# 查找域控制器上的回退(可能是 SPN 或信任问题)
.\Get-NtlmLogonEvents.ps1 -Target DCs -NumEvents 200 |
Where-Object AuthenticationPackageName -eq 'Negotiate' |
Sort-Object WorkstationName |
Format-Table Time, UserName, WorkstationName, LmPackageName, IPAddress
```
### 失败登录分析
```
# 仅显示失败的登录尝试
.\Get-NtlmLogonEvents.ps1 -IncludeFailedLogons |
Where-Object EventId -eq 4625
# 按源 IP 分组的失败登录(发现暴力破解攻击)
.\Get-NtlmLogonEvents.ps1 -IncludeFailedLogons -NumEvents 1000 |
Where-Object EventId -eq 4625 |
Group-Object -Property IPAddress |
Sort-Object -Property Count -Descending |
Select-Object Count, Name
# 最近 24 小时内带有状态代码的失败登录
.\Get-NtlmLogonEvents.ps1 -IncludeFailedLogons -StartTime (Get-Date).AddHours(-24) |
Where-Object EventId -eq 4625 |
Select-Object Time, UserName, IPAddress, WorkstationName, Status, SubStatus
# 并排比较成功与失败的登录
.\Get-NtlmLogonEvents.ps1 -IncludeFailedLogons -NumEvents 500 |
Group-Object EventId |
Select-Object @{N='EventType';E={if($_.Name -eq '4624'){'Success'}else{'Failed'}}}, Count
```
### 安全审计配方
```
# 仍在使用 NTLM 的前 10 名用户
.\Get-NtlmLogonEvents.ps1 -NumEvents 1000 -ExcludeNullSessions |
Group-Object -Property UserName |
Sort-Object -Property Count -Descending |
Select-Object -First 10 Count, Name
# 查找仍在发送 NTLMv1 的工作站(风险最高)
.\Get-NtlmLogonEvents.ps1 -OnlyNTLMv1 -NumEvents 500 |
Select-Object -ExpandProperty WorkstationName -Unique
# 查找使用 NTLM 的唯一源 IP
.\Get-NtlmLogonEvents.ps1 -NumEvents 500 |
Select-Object -ExpandProperty IPAddress -Unique
# 完整审核:跨 DC 的所有 NTLM 事件,最近 7 天,无空会话
.\Get-NtlmLogonEvents.ps1 -Target DCs -NumEvents 5000 `
-ExcludeNullSessions `
-StartTime (Get-Date).AddDays(-7) |
Sort-Object Time
# 子域的完整审核
.\Get-NtlmLogonEvents.ps1 -Target DCs -Domain child.contoso.com -NumEvents 5000 `
-ExcludeNullSessions -IncludeFailedLogons `
-StartTime (Get-Date).AddDays(-7) |
Export-Csv -Path .\child_domain_ntlm_audit.csv -NoTypeInformation
# 包含失败登录的完整审核,导出为 CSV
.\Get-NtlmLogonEvents.ps1 -Target DCs -NumEvents 5000 `
-IncludeFailedLogons -ExcludeNullSessions `
-StartTime (Get-Date).AddDays(-7) |
Export-Csv -Path .\ntlm_audit.csv -NoTypeInformation
# 对每个事件进行分类:Direct NTLM vs. Negotiate Fallback vs. Failed
.\Get-NtlmLogonEvents.ps1 -IncludeFailedLogons -NumEvents 500 |
Select-Object Time, UserName, WorkstationName, IPAddress, LmPackageName,
@{N='Category';E={
if ($_.EventId -eq 4625) { 'Failed' }
elseif ($_.AuthenticationPackageName -eq 'Negotiate') { 'Negotiate Fallback' }
else { 'Direct NTLM' }
}} |
Format-Table -AutoSize
```
### 导出选项
```
# 导出为 CSV
.\Get-NtlmLogonEvents.ps1 -NumEvents 1000 |
Export-Csv -Path .\ntlm_audit.csv -NoTypeInformation
# 导出为 JSON
.\Get-NtlmLogonEvents.ps1 |
ConvertTo-Json -Depth 3 |
Set-Content -Path .\ntlm_audit.json
# HTML 报告
.\Get-NtlmLogonEvents.ps1 -NumEvents 200 |
ConvertTo-Html -Title 'NTLM Audit Report' |
Set-Content -Path .\ntlm_report.html
```
### NTLM 审核配置检查
在收集 NTLM 操作事件(8001–8006)之前,必须启用相应的 GPO 审核策略。`-CheckAuditConfig` 开关读取相关的注册表值,并根据 [AD 强化系列 – 第 8 部分](https://techcommunity.microsoft.com/blog/coreinfrastructureandsecurityblog/active-directory-hardening-series---part-8-%E2%80%93-disabling-ntlm/4485782) 中 Microsoft 推荐的设置报告每个策略的当前状态。
```
# 检查本地机器上的 NTLM 审核配置
.\Get-NtlmLogonEvents.ps1 -CheckAuditConfig
# 在所有域控制器上检查
.\Get-NtlmLogonEvents.ps1 -CheckAuditConfig -Target DCs
# 在整个林中的所有 DC 上检查
.\Get-NtlmLogonEvents.ps1 -CheckAuditConfig -Target Forest
# 在特定远程服务器上检查
.\Get-NtlmLogonEvents.ps1 -CheckAuditConfig -ComputerName server.contoso.com
# 在多个远程服务器上检查
.\Get-NtlmLogonEvents.ps1 -CheckAuditConfig -ComputerName server1.contoso.com, server2.contoso.com
# 在受信任域中的 DC 上检查
.\Get-NtlmLogonEvents.ps1 -CheckAuditConfig -Target DCs -Domain partner.fabrikam.com -Credential (Get-Credential)
# 仅显示未处于推荐设置的策略
.\Get-NtlmLogonEvents.ps1 -CheckAuditConfig | Where-Object { -not $_.IsRecommended }
```
### NTLM Operational 日志事件
`Microsoft-Windows-NTLM/Operational` 日志提供了安全日志事件(4624/4625)所缺乏的进程级详细信息。使用 `-IncludeNtlmOperationalLog` 查询这些事件以及安全日志结果。
#### NTLM Operational 日志的先决条件
日志通道(`Microsoft-Windows-NTLM/Operational`)在所有 Windows 机器(包括域控制器)上**默认启用** — 您**无需**手动启用它。但是,除非配置了相应的 NTLM 审核 GPO 策略,否则**不会写入任何事件**:
| 事件 | 先决条件 GPO 设置 |
|---|---|
| **8001–8006**(审核事件) | _Restrict NTLM: Outgoing NTLM traffic_ 设置为 **Audit all**,启用 _Audit Incoming NTLM Traffic_,和/或启用 _Audit NTLM authentication in this domain_(DC) |
| **4001–4006**(阻止事件) | _Restrict NTLM: Incoming/Outgoing NTLM traffic_ 或 _NTLM authentication in this domain_ 设置为 **Deny** 值 |
#### 事件 8001–8006 的 GPO 链接目标
每个事件由不同的 GPO 策略生成,必须将其链接到正确的 OU 或范围:
| 事件 | GPO 策略 | 链接 GPO 到 |
|---|---|---|
| **8001**(传出 NTLM,客户端) | _Restrict NTLM: Outgoing NTLM traffic to remote servers_ = **Audit all** | **域根**(或包含工作站/成员服务器的 OU)— 适用于所有设备 |
| **8002–8003**(传入 NTLM,服务端) | _Restrict NTLM: Audit Incoming NTLM Traffic_ = **Enable auditing for domain accounts** | **域根**(或包含成员服务器/工作站的 OU)— 适用于所有设备 |
| **8004–8006**(DC 端凭据验证) | _Restrict NTLM: Audit NTLM authentication in this domain_ = **Enable all** | 仅 **Domain Controllers OU**(`OU=Domain Controllers,DC=contoso,DC=com`) |
使用 `-CheckAuditConfig` 验证目标机器上是否配置了这些策略:
```
# 在查询操作事件之前验证审核策略是否已启用
.\Get-NtlmLogonEvents.ps1 -CheckAuditConfig
.\Get-NtlmLogonEvents.ps1 -CheckAuditConfig -Target DCs
```
如果 `-IncludeNtlmOperationalLog 未返回事件,请先运行 `-CheckAuditConfig` 以确定需要启用哪些策略。有关详细信息,请参阅 [NTLM 审核 GPO 设置参考](#ntlm-audit-gpo-settings-reference)和[推荐的阻止策略](#recommended-blocking-strategy)部分。
```
# 获取 Security 日志和 NTLM 操作事件
.\Get-NtlmLogonEvents.ps1 -IncludeNtlmOperationalLog
# 仅获取操作事件(按 PSTypeName 过滤)
.\Get-NtlmLogonEvents.ps1 -IncludeNtlmOperationalLog -NumEvents 500 |
Where-Object { $_.PSObject.TypeNames -contains 'NtlmOperationalEvent' }
# 显示哪些进程正在使用 NTLM(来自操作事件)
.\Get-NtlmLogonEvents.ps1 -IncludeNtlmOperationalLog -NumEvents 1000 |
Where-Object ProcessName |
Group-Object ProcessName |
Sort-Object Count -Descending |
Select-Object Count, Name
# 检查 NTLM 阻止事件(4001-4006)—— 表明阻止处于活动状态
.\Get-NtlmLogonEvents.ps1 -IncludeNtlmOperationalLog -NumEvents 500 |
Where-Object EventType -eq 'Block'
# 组合:所有 DC 上的操作事件,最近 7 天
.\Get-NtlmLogonEvents.ps1 -Target DCs -IncludeNtlmOperationalLog -NumEvents 1000 `
-StartTime (Get-Date).AddDays(-7) |
Where-Object EventId -ge 8001 |
Sort-Object Time |
Format-Table Time, EventDescription, UserName, WorkstationName, ProcessName, ComputerName
```
## 示例输出
### 成功登录(事件 ID 4624)
```
EventId : 4624
Time : 2/25/2026 10:23:45 AM
UserName : jsmith
TargetDomainName : CONTOSO
LogonType : 3
LogonProcessName : NtLmSsp
AuthenticationPackageName : NTLM
WorkstationName : WKS-PC042
LmPackageName : NTLM V1
IPAddress : 192.168.1.50
TCPPort : 49832
ImpersonationLevel : Impersonation
ProcessName : -
Status :
FailureReason :
SubStatus :
ComputerName : DC01
```
### Negotiate→NTLM 回退(Kerberos 失败)
```
EventId : 4624
Time : 2/25/2026 10:25:03 AM
UserName : jsmith
TargetDomainName : CONTOSO
LogonType : 3
LogonProcessName : Negotiate
AuthenticationPackageName : Negotiate
WorkstationName : WKS-PC042
LmPackageName : NTLM V2
IPAddress : 192.168.1.50
TCPPort : 50112
ImpersonationLevel : Impersonation
ProcessName : -
Status :
FailureReason :
SubStatus :
ComputerName : DC01
```
### 失败登录(事件 ID 4625)
```
EventId : 4625
Time : 2/25/2026 10:24:12 AM
UserName : admin
TargetDomainName : CONTOSO
LogonType : 3
LogonProcessName : NtLmSsp
AuthenticationPackageName : NTLM
WorkstationName : ATTACKER-PC
LmPackageName : NTLM V1
IPAddress : 10.0.0.99
TCPPort : 55555
ImpersonationLevel :
ProcessName : -
Status : 0xC000006D
FailureReason : %%2313
SubStatus : 0xC0000064
ComputerName : DC01
```
### 特权 NTLM 登录(使用 `-CorrelatePrivileged`)
```
EventId : 4624
Time : 2/25/2026 10:23:45 AM
UserName : admin.jsmith
TargetDomainName : CONTOSO
LogonType : 3
LogonProcessName : NtLmSsp
AuthenticationPackageName : NTLM
WorkstationName : WKS-PC042
LmPackageName : NTLM V2
IPAddress : 192.168.1.50
TCPPort : 49832
ImpersonationLevel : Impersonation
ProcessName : -
Status :
FailureReason :
SubStatus :
TargetLogonId : 0x12cff454c
IsPrivileged : True
PrivilegeList : SeSecurityPrivilege
SeBackupPrivilege
SeRestorePrivilege
SeDebugPrivilege
ComputerName : DC01
```
### NTLM Operational 事件(使用 `-IncludeNtlmOperationalLog`)
```
EventId : 8001
EventType : Audit
EventDescription : Outgoing NTLM authentication (client-side)
Time : 2/25/2026 10:25:10 AM
UserName : jsmith
DomainName : CONTOSO
TargetName : HTTP/intranet.contoso.local
WorkstationName :
SecureChannelName:
ProcessName : C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe
ProcessId : 12456
ComputerName : WKS-PC042
```
### 审核配置检查(使用 `-CheckAuditConfig`)
```
PolicyName : Network security: Restrict NTLM: Audit Incoming NTLM Traffic
RegistryPath : HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0\AuditReceivingNTLMTraffic
RawValue : 1
Setting : Enable auditing for domain accounts
Recommended : Enable auditing for domain accounts
IsRecommended : True
Scope : All devices
ComputerName : DC01
```
## 输出字段
| 字段 | 描述 |
|---|---|
| `EventId` | 事件 ID(4624 = 成功,4625 = 失败) |
| `Time` | 登录事件的时间戳 |
| `UserName` | 登录(或尝试登录)的账户名称 |
| `TargetDomainName` | 目标账户的域 |
| `LogonType` | 登录类型(例如,3 = Network,10 = RemoteInteractive) |
| `LogonProcessName` | 登录过程(`NtLmSsp` = 直接 NTLM,`Negotiate` = SPNEGO 协商) |
| `AuthenticationPackageName` | 使用的身份验证包(`NTLM` = 直接,`Negotiate` = 先尝试 Kerberos → 回退到 NTLM) |
| `WorkstationName` | 源工作站的名称 |
| `LmPackageName` | 使用的 NTLM 版本(`NTLM V1`、`NTLM V2` 等) |
| `IPAddress` | 源 IP 地址 |
| `TCPPort` | 源 TCP 端口 |
| `ImpersonationLevel` | 模拟级别(仅限 4624:Anonymous、Identify、Impersonation、Delegation) |
| `ProcessName` | 发起登录的进程 |
| `Status` | 顶层 NTSTATUS 失败代码(仅限 4625,例如 `0xC000006D`) |
| `FailureReason` | 失败原因替换字符串(仅限 4625,例如 `%%2313`) |
| `SubStatus` | 详细的 NTSTATUS 失败代码(仅限 4625,例如 `0xC0000064`) |
| `TargetLogonId` | 登录会话 ID(仅限 4624)— 用于与事件 ID 4672 关联 |
| `IsPrivileged` | 登录会话是否获得了特殊权限(仅在使用 `-CorrelatePrivileged` 时) |
| `PrivilegeList` | 分配给登录会话的权限(仅在使用 `-CorrelatePrivileged` 时) |
| `ComputerName` | 记录事件的计算机 |
### NTLM Operational 事件字段(使用 `-IncludeNtlmOperationalLog`)
| 字段 | 描述 |
|---|---|
| `EventId` | 事件 ID(8001-8006 = 审核,4001-4006 = 阻止) |
| `EventType` | `Audit` 或 `Block` |
| `EventDescription` | 事件类型的可读描述 |
| `Time` | 事件的时间戳 |
| `UserName` | 正在验证的用户 |
| `DomainName` | 用户域 |
| `TargetName` | 目标服务器 SPN(仅限 8001/4001,例如 `HTTP/server.contoso.local`) |
| `WorkstationName` | 客户端设备名称(8002-8006/4002-4006) |
| `SecureChannelName` | 通过安全通道进行身份验证的服务器(8004-8006/4004-4006,DC 事件) |
| `ProcessName` | 发起或接收 NTLM 的进程名称(8001-8003/4001-4003) |
| `ProcessId` | 进程 ID(8001-8003/4001-4003) |
| `ComputerName` | 记录事件的计算机 |
### 审核配置字段(使用 `-CheckAuditConfig`)
| 字段 | 描述 |
|---|---|
| `PolicyName` | GPO 策略名称 |
| `RegistryPath` | 设置的完整注册表路径 |
| `RawValue` | 注册表中的原始 DWORD 值(如果未配置则为 `$null`) |
| `Setting` | 当前值的可读解释 |
| `Recommended` | 根据 Microsoft AD 强化指南的推荐设置 |
| `IsRecommended` | 如果当前设置符合或超过建议,则为 `$true` |
| `Scope` | 策略是适用于所有设备还是仅适用于域控制器 |
| `ComputerName` | 读取配置的计算机 |
## 登录类型参考
| 值 | 名称 | 描述 |
|---|---|---|
| 2 | Interactive | 本地控制台登录 |
| 3 | Network | 网络登录(文件共享等) |
| 4 | Batch | 计划任务 |
| 5 | Service | 服务启动 |
| 7 | Unlock | 工作站解锁 |
| 8 | NetworkCleartext | IIS 基本身份验证,带有 CredSSP 的 PowerShell |
| 9 | NewCredentials | 带有 `/netonly` 的 RunAs |
| 10 | RemoteInteractive | RDP / 终端服务 |
| 11 | CachedInteractive | 缓存的域凭据 |
## 模拟级别参考
Windows 将模拟级别作为替换字符串(`%%18xx`)存储在安全事件日志中。脚本会自动将这些转换为可读名称。
| 代码 | 名称 | 描述 |
|---|---|---|
| `%%1831` | Anonymous | 服务器无法模拟或识别客户端 |
| `%%1832` | Identify | 服务器可以识别客户端但无法模拟 |
| `%%1833` | Impersonation | 服务器可以在本地系统上模拟客户端的安全上下文 |
| `%%1834` | Delegation | 服务器可以在远程系统上模拟客户端的安全上下文 |
## NTSTATUS 代码参考
事件 ID 4625 中常见的失败状态代码:
| 状态 / 子状态 | 含义 |
|---|---|
| `0xC000006D` | 登录失败 — 用户名或密码错误 |
| `0xC000006A` | 密码不正确 |
| `0xC0000064` | 用户不存在 |
| `0xC0000072` | 账户已禁用 |
| `0xC0000234` | 账户已锁定 |
| `0xC0000193` | 账户已过期 |
| `0xC0000071` | 密码已过期 |
| `0xC0000133` | 客户端与服务器之间的时钟偏差过大 |
| `0xC0000224` | 用户必须在下次登录时更改密码 |
## NTLM 事件 ID 参考
此表总结了不同 Windows 日志中所有与 NTLM 相关的事件 ID。基于 Microsoft 的 [Active Directory Hardening Series – Part 8 – Disabling NTLM](https://techcommunity.microsoft.com/blog/coreinfrastructureandsecurityblog/active-directory-hardening-series---part-8-%E2%80%93-disabling-ntlm/4485782) 指南。
| 事件 ID | 日志 | 描述 | 优点 | 缺点 |
|---|---|---|---|---|
| **4776** | Security | 凭据验证 (DC) | 仅需要收集 DC 日志;建立 NTLM 量基线 | 仅捕获客户端 + 用户;不捕获目标服务器 |
| **4624** | Security | 成功登录 | 捕获用户、客户端、NTLM 版本、目标服务器 | 需要从所有设备收集;无进程名 |
| **4625** | Security | 失败登录 | 捕获带有状态代码的失败 NTLM 尝试 | 需要从所有设备收集 |
| **4672** | Security | 分配特殊权限 | 识别特权 NTLM 登录会话 | 必须通过 TargetLogonId 与 4624 关联 |
| **8001** | NTLM Operational | 传出 NTLM 审核(客户端) | 捕获目标服务器 SPN、进程名、用户 | 需要 GPO:_Outgoing NTLM traffic_ = Audit all |
| **8002** | NTLM Operational | 传入 NTLM 审核(本地/环回) | 捕获被访问的进程名 | 需要 GPO:_Audit Incoming NTLM Traffic_ |
| **8003** | NTLM Operational | 传入 NTLM 审核(域账户,服务器) | 捕获服务器上的客户端名称 + 进程 | 需要 GPO:_Audit NTLM auth in this domain_ (DC) |
| **8004** | NTLM Operational | NTLM 凭据验证 (DC) | 仅来自 DC 的客户端 + 服务器(安全通道) | 需要 GPO:_Audit NTLM auth in this domain_ (DC) |
| **8005** | NTLM Operational | 直接 NTLM 验证到 DC | 检测到 DC 的直接 NTLM | 仅限 DC |
| **8006** | NTLM Operational | 跨域 NTLM 验证 (DC) | 检测跨信任边界的 NTLM | 仅限 DC |
| **4001–4006** | NTLM Operational | NTLM **被阻止**(镜像 8001–8006) | 确认阻止正在起作用 | 仅在阻止策略处于活动状态时记录 |
| **4020,4022,4032** | NTLM Operational | 增强的 NTLM 审核(Win11 24H2 / Server 2025+) | 包括回退原因、SPN、协商标志、NTLM 版本 | 仅在最新操作系统上;尚未广泛可用 |
## NTLM 审核 GPO 设置参考
这些组策略设置控制 NTLM 审核和限制。使用 `-CheckAuditConfig` 验证其状态。
**GPO 位置:** `Computer Configuration\Policies\Windows Settings\Security Settings\Local Policies\Security Options`
**注册表基本路径:**
| 键 | 完整路径 |
|---|---|
| **MSV1_0** | `HKLM\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0` |
| **Netlogon** | `HKLM\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters` |
### 审核策略(首先启用 — 安全,仅审核)
| GPO 设置 | 注册表值 | 值 | 推荐 | 范围 |
|---|---|---|---|---|
| Audit Incoming NTLM Traffic | MSV1_0 \ `AuditReceivingNTLMTraffic` | 0=Disable, 1=Domain, 2=All | **1** — 启用安全 | 所有设备 |
| Outgoing NTLM traffic to remote servers | MSV1_0 \ `RestrictSendingNTLMTraffic` | 0=Allow, 1=Audit, 2=Deny | **1** — 仅审核 | 所有设备 |
| Audit NTLM auth in this domain | Netlogon \ `AuditNTLMInDomain` | 0=Off, 1=Acct→srv, 3=Accts, 5=Srvs, 7=All | **7** — 启用安全 | 仅 DC |
### 阻止策略(修复后强制执行 — 首先彻底测试)
| GPO 设置 | 注册表值 | 值 | 推荐 | 范围 |
|---|---|---|---|---|
| Incoming NTLM traffic | MSV1_0 \ `RestrictReceivingNTLMTraffic` | 0=Allow, 1=Deny domain, 2=Deny all | **1** — 最终目标 | 所有设备 |
| NTLM auth in this domain | Netlogon \ `RestrictNTLMInDomain` | 0=Off, 1=Acct→srv, 3=Accts, 5=Srvs, 7=All | **7** — 最终目标 | 仅 DC |
### 例外列表
| GPO 设置 | 注册表值 | 范围 |
|---|---|---|
| Add remote server exceptions | MSV1_0 \ `ClientAllowedNTLMServers` | 所有设备 |
| Add server exceptions in this domain | Netlogon \ `DCAllowedNTLMServers` | 仅 DC |
### 每个策略生成的 NTLM Operational 事件
| 审核策略 | 事件 | 描述 |
|---|---|---|
| Audit Incoming NTLM Traffic | 8002, 8003 | 服务器上的传入 NTLM |
| Outgoing NTLM traffic = Audit | 8001 | 客户端的传出 NTLM |
| Audit NTLM auth in domain = All | 8004, 8005, 8006 | DC 级别的 NTLM |
| Incoming NTLM = Deny | 4002, 4003 | **已阻止**传入 |
| Outgoing NTLM = Deny | 4001 | **已阻止**传出 |
| NTLM auth in domain = Deny | 4004 4005, 4006 | **已阻止**在 DC 级别 |
## NTLM 修复指南
在使用此脚本识别 NTLM 使用情况后,调查为什么选择 NTLM 而不是 Kerberos。常见根本原因:
| 类别 | 原因 | 如何检测 | 修复 |
|---|---|---|---|
| **SPN 问题** | 缺少或重复的 SPN | `setspn -x`(重复);事件 4769 失败;24H2+ 上的 4020 事件 | 注册正确的 SPN;删除重复项 |
| **基于 IP 的访问** | 客户端通过 IP 连接(Kerberos 需要 DNS 主机名) | TargetName 中带有 IP 的 8001 事件;24H2+ 上的 4020 事件 | 使用 DNS 名称;或设置 `TryIPSPN` 注册表 + 注册 IP SPN |
| **应用程序硬编码 NTLM** | 应用程序显式请求 NTLM 而不是 Negotiate | 显示进程的 8001 事件;4624 中的 `AuthenticationPackageName=NTLM` | 将应用程序重新配置为使用 Negotiate;联系供应商 |
| **Negotiate 回退** | Kerberos 尝试但失败;通过 SPNEGO 使用 NTLM | 4624 中的 `AuthenticationPackageName=Negotiate` + `LogonProcessName=Negotiate` | 修复 SPN、DNS、时钟偏差或信任问题 |
| **DC 连接性** | 客户端无法访问资源域中的 DC 进行 Kerberos 验证 | 具有网络分段的的多域环境 | [KDC Proxy](https://syfuhs.net/kdc-proxy-for-remote-access) 通过 HTTPS 隧道传输 Kerberos([MS-KKDCP 规范](https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-kkdcp));IAKerb(未来) |
| **本地账户** | 本地账户身份验证始终使用 NTLM | 8002 事件;4624 中的本地账户 | 使用域账户;LocalKDC(Server 2025) |
| **RPC Endpoint Mapper** | GPO 强制 RPC EPM 身份验证使用 NTLM | 来自 System 账户用于 RPC 的 8001 事件 | 禁用 _"Enable RPC Endpoint Mapper Client Authentication"_ GPO |
| **环回身份验证** | 系统账户连接到自身 | 同一机器上来自 SYSTEM 的 8001 事件 | 预期行为;如有需要可豁免 |
| **打印后台处理程序** | 具有错误 SPN 的命名管道身份验证(`krbtgt/NT Authority`) | 系统日志中的 Kerberos 错误 | 将打印后台处理程序配置为使用 RPC over TCP |
| **外部信任** | 外部信任默认为 NTLM | 跨域 8006 事件;来自受信任域的 4624 | 转换为林信任 |
### 推荐的阻止策略
1. **基线** — 启用审核 GPO 并收集 2-4 周的 8001-8006 事件
2. **保护特权账户** — 将管理员账户添加到 [Protected Users Group](https://learn.microsoft.com/en-us/windows-server/security/credentials-protection-and-management/protected-users-security-group)
3. **从 Tier 0 开始** — 首先在 PAW 和管理服务器上阻止 NTLM
4. **修复应用程序** — 修复 SPN 问题,将应用程序从 NTLM 重新配置为 Negotiate
5. **阻止出站** — 设置 _Outgoing NTLM traffic_ = Deny all(根据需要设置例外)
6. **阻止入站** — 设置 _Incoming NTLM traffic_ = Deny all domain accounts
7. **全域阻止** — 设置 _NTLM auth in this domain_ = Deny all(最终目标)
8. **监控** — 监视 4001-4006 阻止事件和带有 SubStatus `0xC0000418` 的 4625 失败
## 故障排除
**“No events were found”**
- 确保安全日志中包含带有 NTLM 身份验证的事件 ID 4624(以及在使用 `-IncludeFailedLogons` 时包含 4625)事件
- 验证审核策略:`auditpol /get /subcategory:"Logon"` 应显示已启用 Success(和 Failure)审核
**“Access denied”或权限错误**
- 以管理员身份运行 PowerShell
- 对于远程目标,请确保您的账户在远程安全日志上拥有权限
**“WinRM cannot process the request”**
- 在远程主机上运行 `winrm quickconfig`
- 确保远程主机位于您的 TrustedHosts 中或已加入域
**“ActiveDirectory module not found”**
- 安装 RSAT:`Add-WindowsCapability -Online -Name Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0`
## 测试
该项目包含一个全面的 Pester 测试套件,包含 100 多个测试,涵盖:
- **XPath 过滤器生成** — 默认行为、NTLMv1 过滤、空会话排除、时间范围过滤器、失败登录包含、结构验证
- **事件到对象转换** — 4624 和 4625 事件的字段映射、模拟级别转换、Negotiate→NTLM 回退检测、TargetLogonId 提取、管道输入、输出对象形状
- **NTLM Operational 事件** — `Build-NtlmOperationalXPathFilter` 时间范围过滤器、`Convert-NtlmOperationalEventToObject` 8001-8006/4001-4006 字段映射、事件类型分类、管道输入
- **NTLM 审核配置** — `Test-NtlmAuditConfiguration` 注册表读取、策略名称映射、IsRecommended 评估、输出对象形状
- **特权登录关联** — `Get-PrivilegedLogonLookup` 时间范围查询、`Merge-PrivilegedLogonData` 属性注入、IsPrivileged/PrivilegeList 字段映射、处理无匹配 4672 事件的情况
- **失败登录(4625)映射** — 移位的属性索引、Status/FailureReason/SubStatus 提取、混合事件类型管道
- **脚本参数** — 类型检查、默认值、验证规则、CmdletBinding 支持
- **脚本执行(模拟)** — 无事件警告、带模拟事件的对象输出、ActiveDirectory 模块错误处理
- **脚本文件质量** — 帮助块、编码标准、无已弃用模式
运行测试:
```
Invoke-Pester -Path .\Tests\Get-NtlmLogonEvents.Tests.ps1 -Output Detailed
```
## 版本历史
| 版本 | 日期 | 更改 |
|---|---|---|
| 4.4 | 2026-03-03 | `-ExcludeNullSessions` 现在还过滤 UserName 为空或 `(NULL)` 的 NTLM Operational 日志事件(8001-8006/4001-4006)— 即匿名/空凭据 NTLM 探测(例如 SMB 空会话、DFS 引用、按 IP 进行 GPO 处理)。以前该开关仅适用于安全日志事件(4624/4625)。相应地更新了帮助文本。 |
| 4.3 | 2026-03-03 | 修复了当域控制器上不存在 NTLM 事件时产生误导性的 `Write-Error` — 现在改为发出清晰的 `Write-Warning`(匹配 localhost/远程主机行为)。修复了当事件 `Properties` 集合为空时 NTLM Operational 日志解析中的 `Cannot index into a null array` 崩溃 — 在 `Convert-NtlmOperationalEventToObject` 和远程脚本块中都添加了空值保护,并进行了安全的按索引边界检查。 |
| 4.2 | 2026-02-26 | `-Target Forest` 现在分别查询每个域的 DC,而不是将所有林 DC 批处理到单个 `Invoke-Command` 调用中;如果某个域的 DC 无法访问(例如 WinRM/DNS 故障),脚本会发出警告并继续处理其余域,而不是完全失败。适用于事件查询、NTLM Operational 日志查询和 `-CheckAuditConfig`。 |
| 4.1 | 2026-02-26 | 改进了使用 `-Target DCs` 或 `-Target Forest` 且无法直连域控制器的 Azure AD 加入客户端的错误处理;在修复指南和致谢中添加了 KDC Proxy 文档参考 |
| 4.0 | 2026-02-26 | **破坏性更改:** 重构为正确的 PowerShell 参数集(`Default`、`ComputerName`、`AuditConfig`、`AuditConfigComputerName`);`-Target` 现在使用 `[ValidateSet('Localhost', 'DCs', 'Forest')]`(默认为 `Localhost`);新的 `-ComputerName`(`String[]`)参数取代了 `-Target ` 用于查询特定的远程主机;`-CheckAuditConfig` 在其自己的参数集中是必需的;仅事件的参数限制为事件查询集;`-Domain` 限制为基于 Target 的集 |
| 3.3 | 2026-02-26 | 添加了 `-Target Forest` 以查询 AD 林中每个域的所有域控制器;通过 `Get-ADForest` 枚举域并从每个域收集 DC |
| 3.2 | 2026-02-26 | 添加了 `-CheckAuditConfig` 开关以验证 NTLM 审核/限制 GPO 设置;`-IncludeNtlmOperationalLog` 开关以查询 NTLM Operational 日志(事件 8001-8006 审核 + 4001-4006 阻止);`Build-NtlmOperationalXPathFilter`、`Convert-NtlmOperationalEventToObject` 和 `Test-NtlmAuditConfiguration` 辅助函数;README 中的 NTLM 事件 ID 参考、审核 GPO 设置参考和修复指南;基于 Microsoft 的 [AD Hardening Series – Part 8](https://techcommunity.microsoft.com/blog/coreinfrastructureandsecurityblog/active-directory-hardening-series---part-8-%E2%80%93-disabling-ntlm/4485782) |
| 3.1 | 2026-02-25 | 添加了用于事件 ID 4672 关联的 `-CorrelatePrivileged` 开关;`TargetLogonId`、`IsPrivileged` 和 `PrivilegeList` 输出字段;`Get-PrivilegedLogonLookup` 和 `Merge-PrivilegedLogonData` 辅助函数 |
| 3.0 | 2026-02-25 | 添加了用于事件 ID 4625 的 `-IncludeFailedLogons` 开关;用于多域/林 DC 查询的 `-Domain` 参数;`AuthenticationPackageName` 和 `LogonProcessName` 输出字段以识别 Negotiate→NTLM 回退;EventId/Status/FailureReason/SubStatus 字段;4624 与 4625 布局的单独属性映射 |
| 2.1 | 2023-05-25 | 修复了可选 DateTime 参数的参数喷洒;放宽了可测试性的管道类型约束;添加了全面的 Pester 测试套件(60 个测试) |
| 2.0 | 2023-05-04 | 重大重写:结构化输出对象、XPath 过滤、日期范围支持、凭据支持、模拟级别转换 |
## 贡献
欢迎贡献!请提交 issue 或 pull request。
## 许可证
该项目根据 MIT 许可证授权。有关详细信息,请参阅 [LICENSE](LICENSE) 文件。
## 作者
**Jan Tiedemann**
## 致谢
- [Microsoft Security Auditing Reference](https://www.microsoft.com/en-us/download/details.aspx?id=52630)
- [TechNet: The Most Misunderstood Windows Security Setting of All Time](http://technet.microsoft.com/en-us/magazine/2006.08.securitywatch.aspx)
- [Active Directory Hardening Series – Part 8 – Disabling NTLM](https://techcommunity.microsoft.com/blog/coreinfrastructureandsecurityblog/active-directory-hardening-series---part-8-%E2%80%93-disabling-ntlm/4485782),作者 Jerry Devore
- [Overview of NTLM auditing enhancements in Windows 11 24H2 and Windows Server 2025](https://support.microsoft.com/en-us/topic/overview-of-ntlm-auditing-enhancements-in-windows-11-version-24h2-and-windows-server-2025-b7ead732-6fc5-46a3-a943-27a4571d9e7b)
- [The Evolution of Windows Authentication](https://techcommunity.microsoft.com/blog/windows-itpro-blog/the-evolution-of-windows-authentication/3926848)
- [Auditing and restricting NTLM usage guide](https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-r2-and-2008/jj865674(v=ws.10))
- [KDC Proxy Server (MS-KKDCP) – Protocol specification](https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-kkdcp)
- [KDC Proxy for Remote Access – Deployment guide](https://syfuhs.net/kdc-proxy-for-remote-access),作者 Steve Syfuhs (Microsoft)
- [Configure SSO for Microsoft Entra joined devices](https://learn.microsoft.com/en-us/windows/security/identity-protection/hello-for-business/hello-hybrid-aadj-sso)
标签:Active Directory, AI合规, Conpot, GPO审计, IPv6, Libemu, Libemu, NTLMv1, NTLMv2, NTLM认证, Pass-the-Hash, PE 加载器, Plaso, PowerShell, Terraform 安全, URL发现, Windows安全, 事件ID 4624, 事件ID 4625, 事件日志分析, 凭据攻击, 域控制器, 安全检测, 特权会话, 网络安全, 隐私保护