导语:外部关系枚举 现在我们已经映射出了从我们所查询的机器可以到达的所有域信任关系,下一阶段的攻击计划几乎没有遇到多余的问题,这取决于我们遇到的信任的具体类型。接下来的步骤需要执行攻击路径中每个域到另一个域的跳跃。 如果下一个域
外部关系枚举
现在我们已经映射出了从我们所查询的机器可以到达的所有域信任关系,下一阶段的攻击计划几乎没有遇到多余的问题,这取决于我们遇到的信任的具体类型。接下来的步骤需要执行攻击路径中每个域到另一个域的跳跃。
如果下一个域跳板与我们所要拿下的域位于同一个森林中,并且我们能够拿到子域的krbtgt哈希,那么我们可以使用以下Trustpocalypse 部分中描述的方法来入侵林根域。
如果我们无法在当前或主数据域的子域中拿到提升的访问权限,或者信任攻击路径的下一步是外部林信任,那么我们需要枚举当前域中(如果有的话)同样也在目标域中的这一部分用户(或域攻击路径中的下一步)。
不幸的是,这一步有很多警告。你当前的域与你所查询的信任域保留的信任的确切性质将影响你可以检索的信息以及你可以使用的具体方法。一般来说,这个枚举在很大程度上取决于你是在同一个林中查询外部域,还是跨越了外部的林间信任。我会尽我所能解释所有的细微之处。
一个域中的安全主体(用户/组)有三种主要方式可以访问另一个外部/ 信任域中的资源:
· 可以将它们添加到单个机器上的本地组,即服务器上的本地“管理员”组。
· 它们可以被添加到外域的组中。这有一些注意事项,这取决于信任类型和组范围,稍后会介绍。
· 他们可以作为主体被添加到访问控制列表中,对于我们来说最有趣的是DACL中ACE的主体。有关ACL / DACL / ACE的更多背景信息,请查看“ ACE王牌”白皮书。
案例1:本地用户组成员资格
这涉及到通过远程SAM(SAMR)或 通过GPO关联枚举一个或多个系统的本地成员。在这里我将不会涉及这个案例,但是会注意到我们在过去成功地使用高价值服务器或域控制器进行信任跳跃的SAMR枚举。PowerView手动执行此操作的功能函数是Get-NetLocalGroupMember <server> ,BloodHound会自动为你执行此操作。
案例2:外部用户组成员
这种情况下的组成员有点棘手。Active Directory组的成员属性和用户/组对象的memberOf 属性具有特殊类型的关系,称为 链接属性。 在之前的文章中,我深入地介绍过了这一点,但是通过链接属性,Active Directory 从另一个属性的值中计算给定属性的值(称为后端链接,例如,带有用户/组的memberOf ),称为前端的链接(例如一个组的成员)。这里的要点是要点在于组成员最终保存在目标群体内部成员属性,这一切都比信任复杂。希望这会使短期内变得更有意义。用户/组对象保存的memberOf 属性是否反映了他们的外部组成员关系是取决于他们所属的外部组的信任性质和范围。
以下是对三个组范围分解后的内容,可以添加哪些类型的外部成员:
· 域本地组可以具有林内跨域用户(与组相同的林中的用户)以及林间跨域用户(外部安全主体)。
· 全局组不能有任何跨域成员,即使在同一个林中。所以对于我们要达到的目的我们可以忽略这些。
· 通用组可以在林中有任何用户作为成员,但是“外部安全主体”(即林/外部信任的用户)不能成为通用组的一部分。
如果用户/组嵌套到在同一个林中的另一域的一个组中(一个“域本地”或“通用组”),则取决于 对目标组范围内的成员可以在用户/组的更新的memberOf 属性。具有“通用”作用域的组将其成员复制到林的全局编录中,这意味着用户的memberOf 将被更新。如果组的范围内的用户被添加到是“域本地”,则用户的memberOf将不会更新(在全局编录中),因为具有“域本地”作用域的组没有在林中复制其成员。因此,通过仅查看用户对象来告诉用户的外部组成员身份的唯一方法是将其添加到同一个林中的通用组。但是,这也意味着如果我们可以绑定到一个林的全局目录,我们可以很容易地列举所有这些特定的跨域关系。
如果用户在林/外部信任中被嵌套到域中的组中,则事情会有所不同。存在于外部或林信任的用户仍然可以添加到 指定域中的域本地组。这些用户在其添加的域中显示为CN = ForeignSecurityPrincipals,DC = domain,DC = com 中的新条目,这些条目用作允许将外部安全标识符添加到资源中的一种代理域名。
正如微软解释的那样,“ 当林中的域与林之外的域之间建立信任关系时,来自外部域的安全主体可以访问内部域中的资源。Active Directory在内部域中创建外部安全主体对象,以表示来自可信外部域的每个安全主体。这些外部安全主体可以成为内部域中域本地组的成员 ”。如果“域本地”或“组范围”对你来说是外来的,请查看我 以前的文章。
Tl; dr,据我所知,这些ForeignSecurityPrincipals(外部安全实体)充当域/林外部的“真实”用户的别名,而且是实际添加到目标域中的组的ForeignSecurityPrincipal。给定的ForeignSecurityPrincipal的SID与外部用户的SID相同,这可以方便后面的过滤。
案例3:外部ACL主体
幸运的是,大多数Active Directory对象的ntSecurityDescriptor 属性(1)可以被任何域认证用户访问,(2)在全局编录中复制。这意味着如果从你当前的域上下文中,你可以查询信任域中的所有对象的DACL ,并筛选任何外部安全主体在你枚举的对象上具有给定权限的ACE条目。
你可以使用PowerView的Get-DomainObjectACL -Domain <domain.fqdn> 函数来检索这些ACE,但是为了找到跨域DACL关系,你将需要过滤掉与你正在查询的域的SID不匹配的principal / SecurityIdentifiers。我将在未来的PowerView PowerUsage文章中介绍这一点。
操作指南
注意:我将在 后面的“案例研究” 部分中逐步介绍所需的所有步骤,以防其中的部分内容不合理。
如果你当前是在一个林中的子域内并且DO已经提升了访问子域的权限,请参阅Trustpocalypse 部分。
如果你目前位于林中的子域中,并且没有在所述子域中提升访问权限,则可以运行PowerView的Get-DomainForeignUser 函数来枚举处于用户当前域之外的用户。这是一个域的“出站”访问,即可能在同一个林中对其他域组进行某种访问的用户或组。此功能还可用于映射其他林内域用户或组关系:
如果你的目标是外部的林域或同一林中的目标域,则可以使用PowerView的Get-DomainForeignGroupMember -Domain <target.domain.fqdn> 功能。此枚举组在目标域中包含那些在目标域中没有的用户或组。这是一个域的“入站”访问,即在目标域中具有入站成员关系的组:
另外,幸运的是,ForeignSecurityPrincipals被复制到全局编录中,就像受信任的域对象那样(在映射域信任部分中提到的那样)。因此,如果要快速枚举当前或目标林中域内组成员的所有外部安全主体(即任何入站外部组和用户),则可以使用LDAP过滤器查询任何全局目录(objectclass = foreignSecurityPrincipal) 。而且,由于这些外部实体只能被添加到 域本地范围的组中,我们可以从专有名称中提取外部用户添加到的域,假定我们对该目标域具有某种类型的直接或可传递的信任,则直接为具有成员的域本地范围的组查询该域。这使我们可以将这些域本地组的成员资格与外部用户列表进行比较:
$ForeignUsers = Get-DomainObject -Properties objectsid,distinguishedname -SearchBase "GC://sub.dev.testlab.local" -LDAPFilter '(objectclass=foreignSecurityPrincipal)' | ? {$_.objectsid -match '^S-1-5-.*-[1-9]d{2,}$'} | Select-Object -ExpandProperty distinguishedname $Domains = @{} $ForeignMemberships = ForEach($ForeignUser in $ForeignUsers) { # extract the domain the foreign user was added to $ForeignUserDomain = $ForeignUser.SubString($ForeignUser.IndexOf('DC=')) -replace 'DC=','' -replace ',','.' # check if we've already enumerated this domain if (-not $Domains[$ForeignUserDomain]) { $Domains[$ForeignUserDomain] = $True # enumerate all domain local groups from the given domain that have any membership set Get-DomainGroup -Domain $ForeignUserDomain -Scope DomainLocal -LDAPFilter '(member=*)' -Properties distinguishedname,member | ForEach-Object { # check if there are any overlaps between the domain local groups and the foreign users if ($($_.member | Where-Object {$ForeignUsers -contains $_})) { $_ } } } } $ForeignMemberships | fl
这很快就为我们映射了所有的外部用户和用户组的嵌套关系,并入站到我们当前(或目标)的林中。
如果你正在使用BloodHound的新的SharpHound提取器,那么你仍然可以将提取器与 -Domain <domain.fqdn> 一起使用并联合-CollectionMethod 选项(参数有 Group,LocalGroup和ACL)来查询更多信息。BloodHound在模式中使用名称@<domain.fqdn> 语法来模拟用户和组节点。这消除了在收集数据之后不得不执行复杂分析以提取这些关系的要求。如果[email protected] 是[email protected]的成员,则memberOf关系会自动建模。如果该嵌套组关系出现在任何攻击路径中,它将自动包含在你的图形中,无需额外的工作。
完美的感觉,对吗?:)如果你不熟悉相关内容的话,这就是一个复杂的话题,所以重读前面几节,直到有意义地弄清楚这些跨域关系。查看 案例研究 这一部分,了解我在整篇文章中使用的参考架构的真实情况。