导语:域信任通常会在环境之间引入意想不到的访问路径。在许多企业或组织中,信任机制实施了很多年(甚至有可能超过10年),但是在安全性上没有考虑太多。

为什么要关注这些内容呢?

域信任通常会在环境之间引入意想不到的访问路径。在许多企业或组织中,信任机制实施了很多年(甚至有可能超过10年),但是在安全性上没有考虑太多。一些专注于收购其他公司的企业或组织往往只是将“新公司”的Active Directory网络作为子域或外部信任的域“插入”到现有的网络中,而没有充分考虑安全性所带来的影响。

由于历史上没有很多工具集可以让你轻松的映射,列举和显示那些与信任机制出现错误配置相关联的风险,因此许多域架构师不知道Active Directory信任体系结构带来的意想不到的安全风险。@wald0@cptjesus以及我在今年的Derbycon上都谈及过一个话题——“配置错误带来的负债”。正因为如此,各种各样的红队(可能是APTz,我只是假设)多年来一直在滥用Active Directory的信任机制,并取得了非常不错的成功。

一种常见的情况是入侵开发或辅助域,并利用这种访问权限转移到安全的根域中。这也为持久性提供了很多机会——为什么要让代码在安全的环境中运行,何时可以将攻击载荷运行在不太安全的(但是可信的)域中,之后可以用来随意的重新攻破目标?

林内的信任(父/子或树根)引入了一个很不错的攻击媒介,在本文后面的信任分析中会有介绍。外部或林之间的信任不保证任何形式的特权访问,但至少信任关系的存在意味着你可以从信任你的域中查询到任何正常的Active Directory信息(是的,这意味着在某些情况下你可以跨Kerberoast信任,更多内容可以在本文末尾找到)。毕竟,活动目录是作为一个可查询的信息数据库,信任关系是不会改变的!

信任机制攻击策略

在我们讨论如何枚举和滥用域信任之前,我想了解审计信任关系时使用的高层策略。当我谈论“信任机制攻击策略”时,我的意思是说这是一种在内网渗透中从你拿到访问权限的域移动到另一个域的入侵方法。

(1)第一步是列举你当前所在域的所有信任关系以及这些域所具有的任何信任关系,等等。基本上,你希望通过链接信任转介来生成从当前上下文可以到达的所有域的映射。这将使你能够确定你想要达到你的目标所需要跳过的域以及你可以执行什么样的技术(可能)实现这一入侵目标。Sean MetcalfBenjamin Delpy开发了SIDhistory-trust-hopping技术,能够使得在同一个林中映射的“网格”中的任何域(例如,父->子的信任关系)都具有特殊的意义,这一块的内容将会在本问的后续部分进一步介绍。

(2)下一步是枚举一个域中的任何用户/组/计算机(安全主体),这些用户/组/计算机(安全主体)可以1)访问另一个域中的资源(即本地管理员组中的成员资格或DACL ACE条目) 2)或者是在来自另一个域的某个组里,如果安全主体是一个组的话,也有可能是具有来自另一个域的用户。这里的要点是找到以某种方式跨越映射的信任边界的关系,因此可以在网格中提供一种从一个域到另一个域的“访问桥”。尽管跨域嵌套关系不能保证方便的访问,但是信任机制通常是出于某种原因而实现的,这意味着通常可能存在某种类型的跨域用户/组/资源“嵌套”,并且在许多企业或组织中,这些关系被错误地进行配置。如上所述,另一个利用方法是“跨信任边界的Kerberoasting攻击”,这可能是跳转信任边界的另一个攻击向量。更多信息请查看“另一个旁注:跨域信任边界的Kerberoasting攻击 ”章节部分。

(3)现在你已经映射出了信任网格,类型和跨域嵌套关系,你可以获得需要入侵的帐户的映射关系,以便从当前域转到目标域。通过执行有针对性的帐户入侵方法,并利用林内域信任的SID历史跳转,我们就已经能够在该域中通过多达7个以上的域来实现我们的攻击目标。

至少,请记住,如果一个域信任你,即如果信任关系是双向的,或者如果是单向和入站的,那么你可以从信任域查询任何关于Active Directory的信息。请记住,所有的父子(林内的域信任)信任关系都保持着一个隐式的双向传递信任。而且,由于子域的添加方式,“企业管理员”组将自动添加到林中每个域的管理员域的本地组。这意味着信任是从林根源处“流下来”的,而我们的目标是在攻击链的任何适当步骤中从子域移动到林根域。

如何枚举信任?

OK,那么,我怎么去弄清楚我当前的环境中存在哪些信任关系呢?

据我所知,枚举信任有三种主要方法:Win32 API调用,各种.NET方法和LDAP。每个方式返回一组不同的信息,每个方式又有不同的执行方法。我将介绍一种比较古老的方式以及新的姿势,从内置(和外部)二进制文件到.NET,到Win32 API调用,到PowerShell / PowerView和BloodHound。

我将在这篇文章中使用的信任体系结构的示例如下:

image.png

此图是使用了新的 TrustVisualizer输出生成的(在“ 可视化域信任” 部分中进行了介绍)。有了这个新的输出,绿色的边缘意味着“在林之内”,红色意味着“在林之外”,蓝色意味着林之间的信任关系。与@sixdub DomainTrustExplorer一样,单向信任的边缘方向意味着访问的方向,而不是信任的方向。

.NET方法

.NET为我们提供了一些封装的很好的方法,可以枚举一大堆的域和林信任信息。在我们讲Win32 API和LDAP方法之前,这是PowerView实现的第一个方法。

[System.DirectoryServices.ActiveDirectory.Domain] 命名空间具有  GetCurrentDomain()方法,这个方法返回了一个静态方法  System.DirectoryServices.ActiveDirectory.Domain类实例。这个类实现了  GetAllTrustRelationships()方法,这个方法可以很好地“ 检索该域的所有信任关系。”这种方法的优点是利用非常的简单 ——信息以易于阅读和理解的方式进行输出。缺点是它不包含其他枚举方法产生的一些附加信息。

([System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()).GetAllTrustRelationships()

这曾经是PowerView中的Get-DomainTrust 默认使用的枚举方法。我最近将默认方法更改为LDAP,因为此.NET方法默认情况下不会返回林信任,而LDAP枚举则会返回很多额外的信息。所以在使用PowerView时为了执行这个方法,你现在需要运行Get-DomainTrust-NET 。

下图是它如何查找我的示例域设置的信任,从sub.dev.testlab.local 运行枚举:

image.png

林信任在功能上与域信任不同。所以如果你想枚举任何当前的森林->林信任,你需要调用  [System.DirectoryServices.ActiveDirectory.Forest]这个命名空间。生成的林对象也有自己的  GetAllTrustRelationships()方法,它将返回任何当前林的信任关系:

([System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()).GetAllTrustRelationships()

这是作为PowerView的Get-ForestTrust 方法的默认枚举实现。以下是它如何从sub.dev.testlab.local 再次查找我的示例域设置的信任:

image.png

Win32API

你还可以通过使用返回DS_DOMAIN_TRUSTS结构的DsEnumerateDomainTrusts() 这个Win32 API调用来枚举域信任。虽然输出的信息比.NET方法稍微复杂一些,但它会返回了目标域的SID和GUID,以及一些有用的标志和属性。标志在这里有详细的记录说明,并会告诉你信任的方向,信任是否在同一个林中等等。在这份文档的TrustAttributes规范中对属性有详细的记录说明,包括诸如WITHIN_FOREST,NON_TRANSITIVE,FILTER_SIDS等等。FILTER_SIDS与QUARANTINED_DOMAIN是等同的。

你可以使用Get-DomainTrust-API (相同的sub.dev.testlab.local域)调用此方法:

image.png

值得注意的是,这似乎是使用/trusted_domains 参数执行nltest.exe 后的输出结果:

image.png

这也是 BloodHound用来枚举域信任的方法。你可以使用Invoke-BloodHound -CollectionMethod信任语法,使用新的SharpHound.ps1执行此操作。请注意,这也可以与用于外部信任枚举的-Domain <foreign.domain.fqdn> 结合使用。

LDAP

域信任在Active Directory中存储为具有 trustedDomain的objectClass的“受信任的域对象” 。这意味着你可以使用任何LDAP查询方法来查找有关使用LDAP过滤器(objectClass = trustedDomain)存在的任何域信任的信息。

例如,这里是dsquery的执行方式(仅适用于Windows服务器):

dsquery * -filter "(objectClass=trustedDomain)" -attr *

image.png

Joeware的Adfind等效的语法是 \.adfind.exe -f objectclass = trusteddomain 。

最后,PowerView再次将此LDAP枚举方式用作Get-DomainTrust 的默认枚举实现方法:

image.png

由于这个LDAP方法现在是PowerView的Get-DomainTrust 的默认实现,因此我将会分解一些可能会让人困惑的结果属性。

结果属性的介绍请阅读下一篇文章。

源链接

Hacking more

...