Skip to main content

DACL的利用

随着我们拿下越来越多的用户和主机,我们发现其中一些主体对其他域对象具有特定权限。例如,其中一个用户可以直接重置另一个用户的密码。 如果有意地利用这些权限,我们可以接管更多用户实现域内提权和横向移动。为了理解这种攻击,我们需要知道 DACL 的概念。在 AD 的上下文中,DACL 是访问控制条目 (ACE) 的列表,它指定允许或拒绝哪些用户或组访问特定资源,例如计算机、SMB 共享或用户帐户 . DACL 作为对象的属性存储,用于对对象实施访问控制。

DACL 中的每个 ACE 指定了授予或拒绝特定用户或组的访问权限以及适用于这些权限的权限。在我们的 Lab 种,med-factory 域中的用户 jason 可以在不知道 justin 当前密码的情况下重置 justin 的密码。我们可以在下图中看到 justin 上的 DACL。

image.png

从 DACL 来看,这个 ACE 明确指出 jason 可以重置 justin 的密码。除此之外,本 Lab 中还有着其他可利用的 DACL,我们可以通过利用这些配置不当或者沦陷用户/主机的 DACL 来扩大我们的访问范围。接下来,我们讨论一些比较经典的 DACL 利用。

ForceChangePassword

上文提到,med-factory 中的 Jason 对 justin 具有强制修改密码的权限。我们在 ADCS 的利用中见识到了,作为 ADCS Manager 分组中的 Justin,可以利用配置不当的 ADCS 实现域内提权。不过在那时,我们以白盒的视角去讨论 ADCS 的利用的。在黑盒的渗透下,如果我们拿下 jason,可以进而拿下 justin 以及整个 med-factory 域。

image.png

在之前的内容中,我们发现 raven-med 域中的 jason 可被 GenericAllASREPROASTING

所攻击,并且我们成功地还原出了

对象raven-med\jason 的明文密码, 1q2w3e4r。而在 med-factory 也存在 jason 的用户,并且考虑到 raven-med 与 med-factory 这两个森林之间存在信任关系,因此我们推测 med-factory 中的 jason 的密码也为 1q2w3e4r


,即密码重用

image.pngimage.png

image.png

要利用 ForceChangePassword 这个 DACL,创建一个 med-factory\jason 的上下文,导入 powerview 脚本,执行以下语句:

Set-DomainUserPassword -Domain med-factory.local -Identity justin -AccountPassword (ConvertTo-SecureString 'Passw0rd' -AsPlainText -Force) -Verbose

image.png

就这样,我们成功修改了 justin 的密码了。需要注意的是,这类修改或重置目标用户密码的举动,十分容易引起警戒,我们需要权衡好利弊再行动。

GenericWrite

在我们的实验中,也存在着 GenericWrite 的利用。与 ForceChangePassword 不同的是,被该 DACL 所作用的目标可以是用户,可以是群组,可以是计算机。因此,利用的思路与方法也有所不同。在下文我们还会介绍 GenericAll,GenericAll 的权限范围比 GenericWrite 更大,因此我们之后会介绍 GenericAll 所独有的、更快捷的利用手段。

对象为用户


当 GenericWrite 作用的对象是另一个用户时,利用手段是为目标用户添加一个 SPN 然后进行 Kerberosting 攻击,或者设置该用户禁用预认证,然后进行 ASREPRoasting 攻击。如果目标用户的密码强度不足够,那么我们可以获得明文密码。

image.png

我们可以通过以下 PowerView 的语句为 app_security 设置一个 SPN,然后再使用 rubeus 对其进行 kerberoasting 攻击。

Set-DomainObject -Identity app_security -set @{serviceprincipalname='fake/srv01.prod.raven-med.local'}

image.png

最终,我们得到 app_security 的密码为 spongebob

image.png

同样的,我们也可以为其设置禁用预认证,通过修改 UAC 值实现:

Get-DomainUser -Identity app_security | ConvertFrom-UACValue
Set-DomainObject -Identity app_security -XOR @{UserAccountControl=4194304}

image.png

修改后,我们发现 app_security 增加了不需要预认证的属性。

image.png

最后,使用 rubeus 对其进行 asreproasting 攻击:

image.png

对象为主机


如果作用对象为主机,那么大家肯定想到了 RBCD 的利用。因为此前已经讲述过 RBCD 的原理及利用,这里不再赘述。

image.png


 

GenericAll

在我们的实验中,也存在着 GenericAll 的利用。与 ForceChangePassword 不同的是,被该 DACL 所作用的目标可以是用户,可以是群组,可以是计算机。因此,利用的思路与方法也有所不同。在下文我们还会介绍 GenericWrite,GenericAll 的权限范围比其更大,因此我们优先介绍 GenericAll 所独有的、更快捷的利用手段。

对象为用户

我们看到,用户 network_security 对 backup_operator 具有 GenericAll 权限。但是首先,我们怎么获得

image.png

 

更多

考虑到 DACL 利用的情景众多,本实验容纳不下所有的 DACL 利用的案例,大家可以参考 BloodHound 的官方文档 https://bloodhound.readthedocs.io/en/latest/data-analysis/edges.html 来查看特定 DACL 的具体的利用手段,甚至附上了 PowerView 或 Rubeus 的利用步骤与命令,十分实用。

以 WriteDacl 为例,文档分类讲解了对象是组、用户、主机时,利用的思路与步骤是怎样的。根据下图的文档截图,我们可以看到,如果对象是组,那么我们可以赋予当前用户添加成员的权限。如果对象是用户,那么赋予当前用户所有特权,这样,我们可以像 ForceChangePassword 的利用过程一样,修改目标用户的密码。如果对象是主机,同样赋予当前用户所有特权,然后可以阅读该主机的 LAPS 密码 (如果该主机启用了 LAPS),或者进行 RBCD 的利用从而获得远程代码执行。

image.png

作为一个小练习,请学员们完成如下表格,完成后可以当做自己的一个 Cheatsheet。

DACL 对象类型 利用思路 具体步骤
WriteDacl 用户





计算机

GenericAll 用户





计算机

GenericWrite 用户





计算机

ForceChangePassword 用户

WriteOwner 任意

AllExtendedRights 用户





计算机