可能我们平时接触到的ACL更多的是指在路由交换里面设置的ACL列表来对相关流量的访问控制。其实在域内也有ACL,这里的ACL与与路由交换的访问控制类似但是不大一样,一个是流量基于数据包的,而域内是基于权限的访问控制。

在 Active Directory 中设置权限,其方式与在文件中设置权限的方式几乎相同image.png
image.png
记得把高级功能点上
image.png

要讲述ACL攻防,首先知道的概念要有如下

1、windows 访问控制模型(ACM)

windows 访问控制模型是由两部分组成。分别由访问令牌和安全描述符组成。
访问令牌包括:
包含用户的标识(User SID,Group SID),以及特权列表。

  1. 访问令牌(Access Tokens)是Windows操作系统安全性的一个概念。当用户登陆时,系统创建一个访问令牌,里面包含登录进程返回的SID和由本地安全策略分配给用户和用户的安全组的特权列表。以该用户身份运行的的所有进程都拥有该令牌的一个拷贝。系统使用令牌控制用户可以访问哪些安全对象,并控制用户执行相关系统操作的能力

安全描述符包括:
被访问的安全对象的相关安全信息

  • NTFS卷上的文件和目录
  • 注册表项
  • 网络共享
  • 服务
  • 进程等等
  • Active Directory对象

    1. 安全描述符包含自主决定的访问控制表(DACL),里面包含有访问控制项(ACE),因此可以允许或拒绝特定用户或用户组的访问。它们还包含一个系统访问控制列表(SACL)以控制对象访问请求的日志(logging)。ACE可以显式应用于对象,或者从父对象继承。ACE的顺序在ACL中很重要,拒绝访问的ACE应该比允许访问的ACE更早出现。安全描述符还包含对象所有者。

    说到这里可能大部分人还不大明白是怎么回事。但是我们可以用一段话来进行总结:
    1、我们用sid来标识用户的身份属性,它在Access Token里存在。
    大体流程为:当对象A来访问B的时候,A会出示自己的Access Token,包含自己的用户sid,自己所在的组的sid,以及特权列表。而B这个安全对象,有自己的ACL

    • B首先判断是不是需要特权才能访问,如果需要特权,则查看A的Access Token看有没有那个特权。
    • B通过A的Access Token,来判断A的用户 sid以及组sids,跟自己的ACL做比对,来判断是否让A进行访问。

于是涉及到了第二个概念ACL

2、ACL

ACL包含了两个东西,分别为DACL和SACL
权限访问控制DACL

  • 一个用户能不能访问安全对象

日志记录功能SACL

  • 访问成功与否

    1、DACL

    可以看到下面的统称DACL,起到访问控制的作用,是拒绝,还是允许。而一条一条的东西我们单个分开叫做ACE,ACE构成了DACL
    1627460980(1).jpg
    针对DACL例子的话,dailker大佬给出了详细的例子,大家也可以看看。
    https://daiker.gitbook.io/windows-protocol/ldap-pian/11
    但是我这里总结的话,其实域内的ACL和路由交换的ACL是非常像的,总结:
    1、遵循默认拒绝原则,即没匹配赛允许,也没匹配赛拒绝,那就是拒绝。
    2、优先看拒绝规则,如果同时有允许和拒绝的ACE规则,那就先匹配上拒绝规则。

2、SACL

这个比较简单,就是记录日志,查看对象的访问成功或失败
1627461664(1).jpg

ACE在DACL和SACL都存在,我们来看DACL,因为在SACL里的ACE就是一条条的日志。

3、ACE

所有的可访问对象都有三种ACE,分别是Access-denied ACE,Access-allowed ACE,System-audit ACE。
Access-denied ACE用于拒绝账户访问,Access-allowed ACE用于允许账户访问,而System-audit ACE用于 SACL
一条一条的列我们叫它ACE,可以看到ACE有五个属性:
1、类型
2、名称
3、权限
4、继承于
5、应用于

总结有无个方面
谁对你有权限——名称
是允许还是拒绝——类型
有什么权限——权限
这个权限能不能被继承——继承与
用在谁身上——应用于

在ACE中有Access Mask这个字段,它代表着此条ACE所对应的权限,比如完全控制(GenericAll)、修改密码(ResetPassword)、写入属性(WriteMembers)等等。
1627480987(1).png

4、SDDL

安全描述符定义语言,定义了ConvertSecurityDescriptorToStringSecurityDescriptor和
ConvertStringSecurityDescriptorToSecurityDescriptor函数来进行文本与安全描述符之间的转换

具体字段的分析可以查看daiker大佬的文章
其实就是ACL权限控制的字符串版本


3、关于实战的利用

在域内各种各样的权限太多了,但是你想在实战情况下遇到一个配置不恰当的ACL权限控制的确是非常难,但是并不是不可能,我们大部分使用ACL来制作后门,或者通过一些配置来寻找攻击路径

特殊的权限配置

(1) 对某些属性的WriteProperty ,有以下属性

  • member(bf9679c0-0de6-11d0-a285-00aa003049e2)
  • servicePrincipalName(28630EBB-41D5-11D1-A9C1-0000F80367C1)
  • GPC-File-Sys-Path(f30e3bc1-9ff0-11d1-b603-0000f80367c1)

(2) 扩展权限有

  • User-Force-Change-Password(0299570-246d-11d0-a768-00aa006e0529)可以在不知道当前目标用户的密码的情况下更改目标用户的密码
  • DS-Replication-Get-Changes(1131f6aa-9c07-11d1-f79f-00c04fc2dcd2) 和 DS-Replication-Get-Changes-All(1131f6ad-9c07-11d1-f79f-00c04fc2dcd2)对域对象具有这两个扩展权限的用户具备dcsync 权限

(3) 通用权限有

  • WriteDacl
  • AllExtendedRights
  • WriteOwner
  • GenericWrite
  • GenericAll
  • Full Control

具体的利用在dailker大佬的文章里写了,这里简单做个总结
1、member——addmember
可以将任意用户,组或计算机添加到目标组
2、servicePrincipalName
设置SPN,如果对一个对象有写入spn的权限,那么就可以对这个对象进行kerberosting了,如果密码强度不强的话,有机会获取到密码。
3、GPC-File-Sys-Path
可以修改组策略配置信息的内容
4、User-Force-Change-Password
可以在不知道当前目标用户的密码的情况下更改目标用户的密码
5、DS-Replication-Get-Changes
拥有可以进行Dcsync的权限,做后门很好用
6、WriteDACL
可以将新ACE写入目标对象的DACL的功能。例如,攻击者可以向目标对象DACL写入新的ACE,从而使攻击者可以完全控制”目标对象
7、AllExtendedRights
顾名思义,所有扩展权限。比如,User-Force-Change-Password权限
8、WriteOwner
这个权限这个修改Owner为自己。
9、GenericWrite、GenericAll、Full Control
拥有几乎全部权限,这个不用多说了

寻找了配置错误的ACL的用户

当域管给某个普通域用户委派了一些权限时,我们可以找到这个域用户然后直接干,如果它拥有创建、删除和管理用户账户的权限,那么域管也是可以拿下的
image.png
image.png
这里设置的委派控制本质是更改了用户权限的ACL
查看ACL,可以看到ACL已经变了
image.png

ADACLScanner
https://github.com/canix1/ADACLScanner

  1. powershell -exec bypass -c "&{.\ADACLScan.ps1 -Base 'DC=iceice,DC=com' -output html}"
  2. powershell .\ADACLScan.ps1 -Base "DC=iceice,DC=com" -output html -scope subtree -filter "(objectclass=*)"

image.png
image.png
dsacls(域控自带)
dsacls “CN=Users,DC=iceice.com,DC=com”


制作DSYNC后门

获得任意个用户的权限:Domain Admins组内的用户、Enterprise Admins组内的用户
操作:
111为低权限的普通域账户

给111添加账户的DCSync权限
import-module .\powerview.ps1
Add-DomainObjectAcl -TargetIdentity “DC=iceice,DC=com” -PrincipalIdentity 111 -Rights DCSync
image.png
此时就会看到出现了这两条权限
image.png
即可使用相关账户导出域内用户hash。
可以看到直接使用111账户dump出了域内所有的hash
mimikatz.exe “lsadump::dcsync /domain:0day.org /all /csv” exit
image.png

是不是非常简单!!!
除去ACL相关的权限控制,域内还可以配置SeEnableDelegationPrivilege和AdminSDHolder来当做后门

本文仅做自我总结
https://github.com/RedTeamWing/Hunting-Active-Directory
https://daiker.gitbook.io/windows-protocol/ldap-pian/11
https://www.cnblogs.com/zpchcbd/p/12374668.html
https://blog.csdn.net/weixin_43804472/article/details/84578796
https://mp.weixin.qq.com/s/Eo7h1cNnN5_8QYse7qrJXQ
https://mp.weixin.qq.com/s/YCf-0FiqFfQ7WW0V5JR7jA