委派安全知识点
委派是一种域内应用模式,是指将域内用户账户的权限委派给服务账号,服务账号因此能以用户的身份在域内展开活动(请求新的服务等),类似于租房中介房东的关系去理解。
域委派分类:
1、非约束委派(Unconstrained Delegation, UD)
2、约束委派(Constrained Delegation, CD)
3、基于资源的约束委派(Resource Based Constrained Delegation, RBCD)
简而言之,非约束委派是指用户账户将自身的TGT转发给服务账户使用。约束委派通过S4U2Self和S4U2Proxy两个扩展协议限制服务账户只能访问指定服务资源。
RBCD主要就是委派的管理移交给服务资源进行控制,其余和约束性委派基本相同。
账户分类:
机器账户:计算机本身名称的账户,在域中computers组内的计算机。
主机账户:计算机系统的主机账户,用于正常用户登入计算机使用。
服务账户:计算机服务安装时创建的账户,用于运行服务时使用,不可用于登入计算机。
涉及项目:
https://github.com/shanfenglan/test/tree/master/spooler
https://github.com/fortra/impacket(综合利用)
https://github.com/gentilkiwi/kekeo(票据利用)
https://github.com/topotam/PetitPotam(结合ntlm重放)
https://github.com/leechristensen/SpoolSample(打印机利用)
https://www.joeware.net/freetools/tools/adfind/(信息收集)
参考文章:
https://forum.butian.net/share/1591
https://www.cnblogs.com/sup3rman/p/16088447.html
https://mp.weixin.qq.com/s/0UOOMF5s00D-y3fojVKMdA
非约束委派
流程
1 | 具体认证流程: |
原理:
机器A(域控)访问具有非约束委派权限的机器B的服务,会把当前认证用户(域管用户)的的TGT放在ST票据中,一起发送给机器B,机器B会把TGT存储在lsass进程中以备下次重用。从而机器B就能使用这个TGT模拟认证用户(域管用户)访问服务。
利用场景
攻击者拿到了一台配置非约束委派的机器权限,可以诱导域管来访问该机器,然后得到管理员的TGT,从而模拟域管用户。
复现配置:
参考:https://developer.aliyun.com/article/1228233
1、信任此计算机来委派任何服务
2、setspn -U -A MSSQLSvc/mssql.hack.com:1433 test2
开启服务账号test2的委派设置:
设置机器账号为委派:
注意:只有服务账号和主机账号能设置委派
当设置成功后,账号的userAccountControl属性会包含TRUSTED_FOR_DELEGATION
判断查询:
查询域内设置了非约束委派的服务账户:
AdFind -b “DC=god,DC=org” -f “(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))” dn
查询域内设置了非约束委派的机器账户:
AdFind -b “DC=god,DC=org” -f “(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))” dn
利用思路1:诱使域管理员访问机器
利用条件:
1、需要Administrator权限
2、域内主机的机器账户开启非约束委派
3、域控管理员远程访问(主动或被动)
利用过程:参考https://forum.butian.net/share/1591
约束委派
原理:
由于非约束委派的不安全性,微软在windows server 2003中引入了约束委派,对Kerberos协议进行了拓展,引入了SService for User to Self (S4U2Self)和 Service for User to Proxy (S4U2proxy)。
S4U2self:
当服务账户开启了约束性委派时,那么该服务就可以代表访问到该服务的用户请求针对其自身的服务票据(ST),也就是说当user1访问到了服务1,服务1以s4u2self的方式向KDC请求一张可以以user1身份访问自身服务1的、可用于转发的票据,实际还是访问的服务1,但是借助了user1的身份,目的就是拿到user1的授权数据,如果user1是以其他认证方式对服务1进行认证的(web、ntlm等),是获取不到访问服务1自身的st票据的,所以s4u2self就是用来解决这个问题的。
S4U2proxy:
服务1可以以用户的名义请求其它服务的ST,和self最大的区别就是self是请求自身服务,当需要以user1的身份访问其他服务,就需要s4u2proxy上场了,而约束委派就是限制了S4U2proxy扩展的访问范围
流程
1 | (1)用户向 Service1 发出请求,用户已通过身份验证,但 Service1 没有用户的授权数据,这通常是由于用户的身份验证是通过 Kerberos 以外(基于表单的 web 认证、NTLM 认证等)的其他方式验证的。 |
利用场景:
如果攻击者控制了服务A的账号,并且服务A配置了到域控的CIFS服务的约束性委派。
则攻击者可以先使用S4u2seflt申请域管用户(administrator)访问A服务的ST1,然后使用S4u2Proxy以administrator身份访问域控的CIFS服务,即相当于控制了域控。
复现配置:参考https://developer.aliyun.com/article/1228237?spm=a2c6h.24874632.expert-profile.7.2fe45662aTMdZv
1、机器设置仅信任此计算机指定服务-cifs
2、用户设置仅信任此计算机指定服务-cifs
配置服务账户test2对域控机器PANDA的特定服务cifs的约束性委派
不过在实际环境中,基本不会有企业会这么配置的,所以约束性委派用的也不是很多
当服务账号或者主机被设置为约束性委派时,其userAccountControl属性会包含TRUSTED_TO_AUTH_FOR_DELEGATION
而且msDS-AllowedToDelegateTo属性会包含被约束的特定服务
利用思路:使用机器账户票据
利用条件:
kekeo Rubeus getST
1、需要Administrator权限
2、目标机器账户配置了约束性委派
判断查询:
查询机器用户(主机)配置约束委派
AdFind -b “DC=god,DC=org” -f “(&(samAccountType=805306369)(msds-allowedtodelegateto=*))” msds-allowedtodelegateto
查询服务账户(主机)配置约束委派
AdFind -b “DC=god,DC=org” -f “(&(samAccountType=805306368)(msds-allowedtodelegateto=*))” msds-allowedtodelegateto
kekeo利用步骤:参考https://forum.butian.net/share/1591
基于资源的约束委派
基于资源的约束委派(RBCD)是在Windows Server 2012中新加入的功能,与传统的约束委派相比,它不再需要域管理员权限去设置相关属性。RBCD把设置委派的权限赋予了机器自身,既机器自己可以决定谁可以被委派来控制我。也就是说机器自身可以直接在自己账户上配置msDS-AllowedToActOnBehalfOfOtherIdentity属性来设置RBCD。
所以核心就是谁或什么权限能修改msDS-AllowedToActOnBehalfOfOtherIdentity
简单的讲,也就是如果攻击者能够在data的机器上设置msDS-AllowedToActOnBehalfOfOtherIdentity属性为ServiceA,
也就允许ServiceA利用s4u2self协议代表其他用户身份来访问data的话,那我们就可以做到横向移动及提权等操作。
以下这些拥有配置msDS-AllowedToActOnBehalfOfOtherIdentity属性的权限:1.将某机器加入域的域用户2.机器自身3.域管理员
流程
1 | 1)服务A使用自己的服务账户和密码向KDC申请一个可转发的TGT |
我们可以利用域用户添加一个机器账户作为服务1,注意是机器账户,不是普通账户,普通账户没有SPN,因为S4U2self协议会用到SPN,而且通过S4U2Self得到的ST服务票证是不可被转发的,而S4U2Proxy的作用就是将可转发的ST票据转发到其他服务进行委派认证的,但是在基于资源的约束委派过程中,不可转发的ST仍可以通过S4U2Proxy转发到其他服务进行委派认证,并且最后还会返回一张可转发的ST服务票证,如果我们可以在服务2上配置允许服务1的资源约束委派,就可以通过服务1利用S4U2self向KDC请求用于访问自身的票据,在使用S4U2Proxy转发此票据去请求访问服务2的票据,最终就可以模拟任何用户去访问服务2了
通过资源约束委派可以通过普通域用户权限以管理员的身份去访问特定主机的服务(cifs等),可以实现本地权限提升,但是不能完全具有域管的所有权限(如进行dcsync等),或者利用资源约束委派横向拿下所有被该普通域用户拉进域内的机器权限
复现配置:参考https://developer.aliyun.com/article/1228243?spm=a2c6h.24874632.expert-profile.6.2fe45662aTMdZv
用一个域用户test2将机器加入域中
去查看机器用户的mS-DS-CreatorSID属性,域用户拉进来的都有这个属性,如果没有说明是被域管理员拉进来到域内中的
利用条件:
1.机器账户:是由某个域用户创建的主机,只要拿下这个域账户,那么就能拿下这个域用户所创建的所有机器账户的最高权限(默认每个域用户能创10个机器账户)
2.拥有一个有权修改msDS-AllowedToActOnBehalfOfOtherIdentity属性的域用户账号密码(将机器拉进域的域用户)、或者在account operators组内的域用户
3.域控需要是server2012和2012 R2以上的(因为2008及以下没有msDS-AllowedToActOnBehalfOfOtherIdentity属性)
4.任意用户对该主机的属性具有写权限,那么这个用户就可以对该主机进行攻击,所以可以枚举域内ACL策略,查看哪些对主机有GenericAll权限,GenericWrite、WriteProperty、WriteDacl等等权限,都是可以的
判断是否有利用条件:
查询被域用户创建的机器账户列表:
shell AdFind.exe -b “DC=xiaodi,DC=local” -f “(&(samAccountType=805306369))” cn mS-DS-CreatorSID
根据查询出来的sid找出对应的用户名:
shell AdFind.exe -b “DC=xiaodi,DC=local” -f “(&(objectsid=S-1-5-21-1695257952-3088263962-2055235443-1104))” objectclass cn dn