hacktricks/windows-hardening/windows-local-privilege-escalation/acls-dacls-sacls-aces.md

19 KiB
Raw Blame History

ACLs - DACLs/SACLs/ACEs


使用Trickest可以轻松构建和自动化由全球最先进的社区工具提供支持的工作流程。
立即获取访问权限:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

访问控制列表ACL

ACL是一个有序的ACE列表用于定义应用于对象及其属性的保护措施。每个ACE标识一个安全主体并指定该安全主体被允许、拒绝或审计的一组访问权限。

对象的安全描述符可以包含两个ACL

  1. 一个DACL用于标识被允许或拒绝访问的用户和组
  2. 一个SACL用于控制访问的审计方式

当用户尝试访问文件时Windows系统会运行AccessCheck并将安全描述符与用户的访问令牌进行比较评估用户是否被授予访问权限以及访问的类型取决于设置的ACE。

自主访问控制列表DACL

DACL通常称为ACL标识被分配或拒绝对对象的访问权限的用户和组。它包含一个对可保护对象的配对ACE帐户+访问权限)的列表。

系统访问控制列表SACL

SACL使得监视对受保护对象的访问成为可能。SACL中的ACE确定在安全事件日志中记录哪些类型的访问。使用监视工具如果恶意用户尝试访问受保护的对象这可能会向相关人员发出警报并且在事件发生的情况下我们可以使用日志追溯步骤。最后您可以启用日志记录以排除访问问题。

系统如何使用ACL

每个登录到系统的用户都持有一个包含安全信息的访问令牌。当用户登录时系统会创建一个访问令牌。代表用户执行的每个进程都有一个访问令牌的副本。令牌标识用户、用户的组和用户的特权。令牌还包含一个登录SID安全标识符用于标识当前的登录会话。

当线程尝试访问可保护对象时本地安全机构LSASS要么授予访问权限要么拒绝访问。为此LSASS搜索SDS数据流中的DACL自主访问控制列表查找适用于线程的ACE。

对象的DACL中的每个ACE指定了允许或拒绝给定安全主体或登录会话的访问权限。如果对象的所有者没有为该对象创建任何DACL中的ACE系统会立即授予访问权限。

如果LSASS找到ACE它会将每个ACE中的受托人SID与线程访问令牌中标识的受托人SID进行比较。

ACEs

在AD中可以应用于所有可保护对象的ACE有三种主要类型:

ACE 描述
拒绝访问ACE 在DACL中使用表示用户或组被明确拒绝访问对象
允许访问ACE 在DACL中使用表示用户或组被明确授予访问对象
系统审计ACE 在SACL中使用当用户或组尝试访问对象时生成审计日志。记录访问是否被授予以及发生的访问类型

每个ACE由以下四个组成部分组成:

  1. 具有访问对象权限的用户/组的安全标识符SID或以图形方式表示的主体名称
  2. 表示ACE类型的标志拒绝访问、允许访问或系统审计ACE
  3. 一组指定子容器/对象是否可以从主对象或父对象继承给定ACE条目的标志
  4. 一个访问掩码它是一个32位值定义了授予对象的权限

系统按顺序检查每个ACE直到发生以下事件之一

  • 拒绝访问ACE明确拒绝线程访问令牌中列出的受托人的任何请求的访问权限。
  • 线程访问令牌中列出的受托人的一个或多个允许访问ACE明确授予所有请求的访问权限。
  • 已检查所有ACE并且仍然至少有一个请求的访问权限未明确允许,在这种情况下,访问将被隐式拒绝

ACE的顺序

因为当请求的访问权限被明确授予或拒绝时系统会停止检查ACE所以DACL中ACE的顺序很重要。

DACL中ACE的首选顺序被称为“规范”顺序。对于Windows 2000和Windows Server 2003规范顺序如下

  1. 所有显式ACE放置在任何继承ACE之前的一个组中。
  2. 显式ACE组内拒绝访问ACE放在允许访问ACE之前。
  3. 继承组内,首先是从子对象的父对象继承的ACE,然后是从祖父对象继承的ACE,以此类推。之后,拒绝访问ACE放在允许访问ACE之前。

下图显示了ACE的规范顺序

ACE的规范顺序

ACE

规范顺序确保了以下情况发生:

  • 显式的拒绝访问ACE会被强制执行而不管是否有显式的允许访问ACE。这意味着对象的所有者可以定义允许一组用户访问并拒绝该组的子集的权限。
  • 所有显式ACE在任何继承ACE之前被处理。这与自由访问控制的概念一致:对于子对象(例如文件)的访问取决于子对象的所有者,而不是父对象(例如文件夹)的所有者。子对象的所有者可以直接在子对象上定义权限。结果是继承权限的效果被修改。


使用Trickest可以轻松构建和自动化工作流程,使用全球最先进的社区工具。
立即获取访问权限:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

GUI示例

这是一个显示ACL、DACL和ACE的文件夹的经典安全选项卡

如果我们点击高级按钮,我们将获得更多选项,如继承:

如果您添加或编辑安全主体:

最后在审核选项卡中有SACL

示例:显式拒绝访问给一个组

在这个示例中允许访问的组是Everyone拒绝访问的组是Marketing是Everyone的一个子集。

您想要拒绝Marketing组访问Cost文件夹。如果Cost文件夹的ACE按照规范顺序排列拒绝Marketing的ACE会在允许Everyone的ACE之前。

在访问检查期间操作系统按照它们在对象的DACL中出现的顺序依次处理ACE因此拒绝的ACE在允许的ACE之前被处理。结果属于Marketing组的用户被拒绝访问。其他人可以访问该对象。

示例:显式优先于继承

在这个示例中Cost文件夹有一个可继承的ACE拒绝Marketing父对象的访问。换句话说属于Marketing组的所有用户或子对象都被继承拒绝访问。

您想要允许Marketing总监Bob访问Cost文件夹。作为Marketing组的成员Bob被继承拒绝访问Cost文件夹。子对象用户Bob的所有者定义了一个显式ACE允许访问Cost文件夹。如果子对象的ACE按照规范顺序排列允许Bob访问的显式ACE会在任何继承的ACE之前包括继承拒绝Marketing组访问的ACE。

在访问检查期间操作系统在到达拒绝Marketing组访问的ACE之前先到达允许Bob访问的ACE。结果尽管Bob是Marketing组的成员他被允许访问该对象。其他Marketing组的成员被拒绝访问。

访问控制条目

如前所述ACL访问控制列表是ACE访问控制条目的有序列表。每个ACE包含以下内容

  • 一个标识特定用户或组的SID安全标识符
  • 指定访问权限的访问掩码。
  • 一组位标志确定子对象是否可以继承该ACE。
  • 指示ACE类型的标志。

ACE在本质上是相似的。它们的区别在于它们对继承和对象访问的控制程度。有两种类型的ACE

  • 通用类型,附加到所有可安全对象。
  • 对于Active Directory对象的ACL中才能出现的特定对象类型。

通用ACE

通用ACE对可以继承它们的子对象类型的控制有限。基本上它们只能区分容器和非容器。

例如在NTFS的文件夹对象上的DACL自由访问控制列表可以包括一个通用ACE允许一组用户列出文件夹的内容。因为列出文件夹的内容是只能在容器对象上执行的操作所以允许该操作的ACE可以被标记为CONTAINER_INHERIT_ACE。只有文件夹中的容器对象即其他文件夹对象继承父对象的ACE。非容器对象即文件对象不继承父对象的ACE。

通用ACE适用于整个对象。如果通用ACE给了特定用户读取权限该用户可以读取与对象关联的所有信息-包括数据和属性。对于大多数对象类型来说,这不是一个严重的限制。例如,文件对象只有少数属性,这些属性都用于描述对象的特征,而不是存储信息。文件对象中的大部分信息都存储为对象数据;因此,对文件属性的单独控制几乎没有必要。

特定对象ACE

特定对象ACE对可以继承它们的子对象类型提供了更高程度的控制。

例如OU组织单位对象的ACL可以有一个特定对象ACE只标记为User对象继承。其他类型的对象如计算机对象将不会继承该ACE。

这就是为什么特定对象ACE被称为特定对象的原因。它们的继承可以限制在特定类型的子对象上。

这两种类型的ACE如何控制对对象的访问也存在类似的差异。

特定对象ACE可以应用于对象的任何单个属性或该对象的一组属性。这种类型的ACE仅在Active Directory对象的ACL中使用与其他对象类型不同Active Directory对象将大部分信息存储在属性中。通常希望对Active Directory对象的每个属性都放置独立的控制而特定对象ACE使这成为可能。

例如当您为User对象定义权限时可以使用一个特定对象ACE允许Principal Self即用户对Phone-Home-PrimaryhomePhone属性进行写访问并使用其他特定对象ACE拒绝Principal Self对Logon-HourslogonHours属性和设置用户帐户限制的其他属性的访问。

下表显示了每个ACE的布局。

访问控制项布局

ACE字段 描述
类型 表示ACE类型的标志。Windows 2000和Windows Server 2003支持六种ACE类型三种通用ACE类型适用于所有可安全对象三种特定于对象的ACE类型适用于Active Directory对象。
标志 一组位标志,用于控制继承和审核。
大小 为ACE分配的内存字节数。
访问掩码 32位值其位对应于对象的访问权限。位可以设置为打开或关闭但设置的含义取决于ACE类型。例如如果打开了对应于读取权限的位并且ACE类型为拒绝则ACE拒绝读取对象的权限。如果相同的位被设置为打开但ACE类型为允许则ACE授予读取对象权限。访问掩码的更多详细信息请参见下表。
SID 标识由此ACE控制或监视其访问权限的用户或组。

访问掩码布局

位(范围) 含义 描述/示例
0 - 15 对象特定访问权限 读取数据,执行,追加数据
16 - 22 标准访问权限 删除写ACL写所有者
23 可访问安全ACL
24 - 27 保留
28 通用ALL读取写入执行 以下所有内容
29 通用执行 执行程序所需的所有内容
30 通用写入 写入文件所需的所有内容
31 通用读取 读取文件所需的所有内容

参考资料

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥


使用Trickest可以轻松构建和自动化工作流程,使用全球最先进的社区工具。
立即获取访问权限:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}