# DACL的利用

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

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

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-05/scaled-1680-/1fWX1GQIfXkAUlHa-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-05/1fWX1GQIfXkAUlHa-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](https://raven-medicine.com/uploads/images/gallery/2023-05/scaled-1680-/uy5YRdmhsV8Qzrou-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-05/uy5YRdmhsV8Qzrou-image.png)

在之前的内容中，我们发现 raven-med 域中的 jason 可被 **ASREPROASTING** 所攻击，并且我们成功地还原出了 **raven-med\\jason** 的明文密码，为 1q2w3e4r。而在 med-factory 也存在 jason 的用户，并且考虑到 raven-med 与 med-factory 这两个森林之间存在信任关系，因此我们推测 med-factory 中的 jason 的密码也为 **1q2w3e4r**，即**密码重用**。

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-05/scaled-1680-/l7MvQC2hYY5tX1jD-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-05/l7MvQC2hYY5tX1jD-image.png)

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-05/scaled-1680-/0AwtbM4dfoLdLFgS-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-05/0AwtbM4dfoLdLFgS-image.png)

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

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

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-05/scaled-1680-/5BlnQcUg3A57CoPe-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-05/5BlnQcUg3A57CoPe-image.png)

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

### **GenericWrite**

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

##### **对象为用户**

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

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-05/scaled-1680-/HqcVCsHCVTfBno4C-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-05/HqcVCsHCVTfBno4C-image.png)

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

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

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-05/scaled-1680-/a6xusHsOJFEw47Wf-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-05/a6xusHsOJFEw47Wf-image.png)

最终，我们得到 app\_security 的密码为 **spongebob**

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-05/scaled-1680-/AwRujJrFRcYjG8Au-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-05/AwRujJrFRcYjG8Au-image.png)

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

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

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-05/scaled-1680-/80JuJc1pcqwSWMaE-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-05/80JuJc1pcqwSWMaE-image.png)

修改后，我们发现 app\_security 增加了不需要预认证的属性。

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-05/scaled-1680-/ymDTEeEbAWRuUi5A-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-05/ymDTEeEbAWRuUi5A-image.png)

最后，使用 rubeus 对其进行 asreproasting 攻击：

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-05/scaled-1680-/qeYpIE1VndDVr2aN-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-05/qeYpIE1VndDVr2aN-image.png)

##### **对象为主机**

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

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-05/scaled-1680-/sfW5mO8U8Mqrgljd-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-05/sfW5mO8U8Mqrgljd-image.png)

### **GenericAll**

GenericAll 的权限范围比GenericWrite 更大，因此除了上述 GenericWrite 的利用思路与步骤可行外，还有一些独有的利用手法。

#### **对象为用户**

我们看到，用户 network\_security 对 backup\_operator 具有 GenericAll 权限。但是首先，我们怎么获得 network\_security 的会话呢？我们刚刚获得了 app\_security 的明文密码，为 spongebob。而 app\_security 与 network\_security 的账户形式较为接近，可能为同一部门/用户所掌管，因此，可能存在密码重用的情况。我们可以稍后创建一个 network\_security 的上下文来验证此猜想。

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-05/scaled-1680-/re52coz7hjdxjSJh-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-05/re52coz7hjdxjSJh-image.png)

既然 GenericAll 的作用对象也是用户，那么一切就很简单了，我们可以直接使用 net.exe 对其进行密码修改。

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-05/scaled-1680-/U7cb69OOfY24CH78-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-05/U7cb69OOfY24CH78-image.png)

如图所示，不仅我们的猜想被验证成功了，而且也修改了 backup\_operator 用户的密码，因此得以进一步扩大我们的访问。

###   


### **更多**

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

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

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-05/scaled-1680-/DgzG9jp3EAJNb8ud-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-05/DgzG9jp3EAJNb8ud-image.png)

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

<table border="1" id="bkmrk-dacl-%E5%AF%B9%E8%B1%A1%E7%B1%BB%E5%9E%8B-%E5%88%A9%E7%94%A8%E6%80%9D%E8%B7%AF-%E5%85%B7%E4%BD%93%E6%AD%A5%E9%AA%A4-" style="border-collapse: collapse; width: 100%; height: 446.953px;"><colgroup><col style="width: 24.9383%;"></col><col style="width: 24.9383%;"></col><col style="width: 24.9383%;"></col><col style="width: 24.9383%;"></col></colgroup><tbody><tr style="height: 29.7969px;"><td style="height: 29.7969px;">DACL</td><td style="height: 29.7969px;">对象类型</td><td style="height: 29.7969px;">利用思路</td><td style="height: 29.7969px;">具体步骤</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">WriteDacl</td><td style="height: 29.7969px;">用户</td><td style="height: 29.7969px;">  
</td><td style="height: 29.7969px;">  
</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">  
</td><td style="height: 29.7969px;">组</td><td style="height: 29.7969px;">  
</td><td style="height: 29.7969px;">  
</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">  
</td><td style="height: 29.7969px;">计算机</td><td style="height: 29.7969px;">  
</td><td style="height: 29.7969px;">  
</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">GenericAll</td><td style="height: 29.7969px;">用户</td><td style="height: 29.7969px;">  
</td><td style="height: 29.7969px;">  
</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">  
</td><td style="height: 29.7969px;">组</td><td style="height: 29.7969px;">  
</td><td style="height: 29.7969px;">  
</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">  
</td><td style="height: 29.7969px;">计算机</td><td style="height: 29.7969px;">  
</td><td style="height: 29.7969px;">  
</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">GenericWrite</td><td style="height: 29.7969px;">用户</td><td style="height: 29.7969px;">为目标用户设置 SPN 然后对其进行 Kerberoasting 攻击

或 为目标用户设置禁用预认证，然后对其进行 ASREPRoasting 攻击

</td><td style="height: 29.7969px;">  
</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">  
</td><td style="height: 29.7969px;">组</td><td style="height: 29.7969px;">  
</td><td style="height: 29.7969px;">  
</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">  
</td><td style="height: 29.7969px;">计算机</td><td style="height: 29.7969px;">  
</td><td style="height: 29.7969px;">  
</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">ForceChangePassword</td><td style="height: 29.7969px;">用户</td><td style="height: 29.7969px;">  
</td><td style="height: 29.7969px;">  
</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">WriteOwner</td><td style="height: 29.7969px;">任意</td><td style="height: 29.7969px;">  
</td><td style="height: 29.7969px;">  
</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">AllExtendedRights</td><td style="height: 29.7969px;">用户</td><td style="height: 29.7969px;">  
</td><td style="height: 29.7969px;">  
</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">  
</td><td style="height: 29.7969px;">组</td><td style="height: 29.7969px;">  
</td><td style="height: 29.7969px;">  
</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">  
</td><td style="height: 29.7969px;">计算机</td><td style="height: 29.7969px;">  
</td><td style="height: 29.7969px;">  
</td></tr></tbody></table>