BetaHydri/Get-NtlmLogonEvents

GitHub: BetaHydri/Get-NtlmLogonEvents

用于审计Windows环境中NTLM身份验证事件的PowerShell脚本,帮助识别遗留NTLM使用、特权会话和Kerberos回退问题,为禁用不安全认证协议提供决策依据。

Stars: 0 | Forks: 0

# Get-NtlmLogonEvents [![PowerShell](https://img.shields.io/badge/PowerShell-5.1%2B-blue.svg?logo=powershell)](https://docs.microsoft.com/en-us/powershell/) [![平台](https://img.shields.io/badge/Platform-Windows-0078D6.svg?logo=windows)](https://www.microsoft.com/windows) [![许可证](https://img.shields.io/github/license/BetaHydri/Get-NtlmLogonEvents)](LICENSE) [![GitHub stars](https://img.shields.io/github/stars/BetaHydri/Get-NtlmLogonEvents)](https://github.com/BetaHydri/Get-NtlmLogonEvents/stargazers) [![GitHub issues](https://img.shields.io/github/issues/BetaHydri/Get-NtlmLogonEvents)](https://github.com/BetaHydri/Get-NtlmLogonEvents/issues) [![GitHub last commit](https://img.shields.io/github/last-commit/BetaHydri/Get-NtlmLogonEvents)](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, 事件日志分析, 凭据攻击, 域控制器, 安全检测, 特权会话, 网络安全, 隐私保护