Kerberos协议作为企业级网络身份验证的基石,其安全性直接关系到整个域环境的稳固。传统Kerberos中继攻击(Kerberos Relay Attack)需要攻击者能够拦截或重定向受害者的Kerberos认证流量,这种攻击方式受限于网络中间人条件,使得防御方可以通过限制SMB签名、启用LDAP通道绑定等措施有效防护。
最新披露的攻击变种(CVE-2023-XXXX)通过巧妙利用DNS基础设施中的CNAME记录,实现了对传统防护措施的绕过。这种攻击方式不再依赖传统的网络层中间人攻击,而是通过污染DNS解析过程,将Kerberos认证请求引导至攻击者控制的服务器。
CNAME(Canonical Name)记录作为DNS系统中的别名记录,允许将一个域名解析为另一个域名。在企业环境中,常见以下应用场景:
攻击者正是利用CNAME解析过程中的两个关键特性:
完整攻击链包含以下阶段:
信息收集阶段:
基础设施搭建:
DNS投毒阶段:
powershell复制# 示例:通过PowerShell添加恶意CNAME记录
Add-DnsServerResourceRecord -ZoneName "contoso.com" -CName -Name "sqlsrv" -HostNameAlias "attacker.contoso.com"
认证劫持阶段:
强制协议硬化配置:
xml复制<!-- 组策略配置示例(KB5008380补丁后) -->
<ComputerConfiguration>
<WindowsSettings>
<Security>
<Kerberos>
<RequireStrictKDCValidation>1</RequireStrictKDCValidation>
<RestrictCrossForestRealmAuth>1</RestrictCrossForestRealmAuth>
</Kerberos>
</Security>
</WindowsSettings>
</ComputerConfiguration>
DNS监控关键指标:
实施资源约束委派(RBCD):
powershell复制# 仅允许特定账户对指定服务进行委派
Set-ADComputer -Identity "SQLSRV" -PrincipalsAllowedToDelegateToAccount "SVC_SQL"
Kerberos装甲(Armoring)配置:
Splunk查询规则:
code复制index=windows (EventCode=4768 OR EventCode=4769)
| stats count by ServiceName, ClientAddress, ServerAddress
| where ServiceName!="krbtgt" AND ClientAddress!=ServerAddress
Azure Sentinel查询:
kql复制SecurityEvent
| where EventID == 4769
| extend ServiceName = tostring(parse_json(EventData).ServiceName)
| where ServiceName contains "CNAME"
隔离阶段:
取证阶段:
dnscmd /info /debuglevel 0xFFFFF)wevtutil qe Security /q:"*[System[(EventID=4768 or EventID=4769)]]")恢复阶段:
powershell复制Get-ADObject -Filter * -Properties servicePrincipalName |
Where-Object {$_.servicePrincipalName -ne $null}
网络分段策略:
认证流程加固:
自检项目清单:
自动化测试脚本框架:
python复制from ldap3 import Server, Connection
from dns.resolver import resolve
def check_spn_dns_alignment(domain):
server = Server(f'ldap://{domain}')
conn = Connection(server)
conn.bind()
conn.search('dc='+domain.replace('.',',dc='),
'(servicePrincipalName=*)',
attributes=['sAMAccountName', 'servicePrincipalName'])
for entry in conn.entries:
for spn in entry.servicePrincipalName.values:
service, host = spn.split('/')
try:
dns_result = resolve(host, 'CNAME')
if 'attacker' in str(dns_result[0].target):
print(f'VULNERABLE: {host} -> {dns_result[0].target}')
except:
continue
优先级矩阵:
| 系统类型 | 紧急程度 | 补丁验证方法 |
|---|---|---|
| 域控制器 | 紧急 | 测试环境72小时稳定性监测 |
| 关键业务服务器 | 高 | 业务连续性测试+认证流程验证 |
| 工作站终端 | 中 | 抽样测试核心业务应用兼容性 |
性能基线指标:
审计日志配置:
powershell复制# 启用详细Kerberos日志
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters" `
-Name "LogLevel" -Value 1
# 配置DNS调试日志
dnscmd /config /debuglevel 0xFFFFF
实际部署中发现,在启用严格KDC验证后,某些旧版应用(如Java 7的Kerberos实现)可能出现兼容性问题。这种情况下建议采用临时例外策略,通过组策略针对特定子网放宽验证要求,同时加速应用升级进程。