导语:信任类型: · DOWNLEVEL (0x00000001) – 没有运行Active Directory的可信Windows域。在PowerView中,对于那些不熟悉专业术语的用户来说,会以WINDOWS_NON_ACTIVE_DIRECTORY 形式作为输出。 · UPLEVEL (0x00000002) – 运
信任类型:
· DOWNLEVEL (0x00000001) – 没有运行Active Directory的可信Windows域。在PowerView中,对于那些不熟悉专业术语的用户来说,会以WINDOWS_NON_ACTIVE_DIRECTORY 形式作为输出。
· UPLEVEL (0x00000002) – 运行Active Directory的可信Windows域。在PowerView中,对于那些不熟悉专业术语的用户,这将作为WINDOWS_ACTIVE_DIRECTORY 作为输出。
· MIT (0x00000003) – 运行非Windows(* nix),兼容RFC4120的Kerberos发行版的受信任域。由于麻省理工学院发布了RFC4120,所以这也被称为MIT。
信任属性:
· NON_TRANSITIVE (0x00000001) – 信任不能被传递使用。也就是说,如果DomainA信任DomainB并且DomainB信任DomainC,则DomainA不会自动信任DomainC。另外,如果信任是非传递性的,那么你将无法从非传递性的点上查询信任链中的任何一个Active Directory的信息。外部信任隐含了信任的不可传递性。
· UPLEVEL_ONLY (0x00000002) – 只有Windows 2000操作系统和较新的客户端才能使用该信任。
· QUARANTINED_DOMAIN (0x00000004) – 启用SID过滤(稍后会详细介绍)。为简单起见, PowerView 使用FILTER_SIDS 作为输出。
· FOREST_TRANSITIVE (0x00000008) – 至少运行了域功能级别为2003或更高的两个域林的根之间的跨林信任。
· CROSS_ORGANIZATION (0x00000010) -对于不是企业或组织的一部分的域或林的信任,其添加了OTHER_ORGANIZATION SID标志。这是一个比较奇怪的属性。我不记得我遇到过这个标志,但是根据 这篇文章 这意味着启用了选择性认证安全保护。有关更多信息,请查看 此MSDN文档。
· WITHIN_FOREST (0x00000020) – 受信任的域是在同一个林中,这意味着这是一个父->子或交叉链接的信任关系
· TREAT_AS_EXTERNAL (0x00000040) – 被视为外部信任这是信任边界的目的。根据 这个文档 的说法,“ 如果设置了这个位,那么对于域的跨林信任将被视为用于SID过滤目的的外部信任。跨林信任比外部信任会更加严格地过滤。这种属性放松了这些跨林信任,相当于外部信任。“这听起来很诱人,而且我也不是100%肯定这个陈述所说明的安全含义,但是如果有任何新的发现,我会及时更新本文的内容。
· USES_RC4_ENCRYPTION (0x00000080) – 如果TrustType是MIT,则指定支持RC4密钥的信任。
· USES_AES_KEYS (0x00000100) -在微软官方文档的相关链接中没有列出此属性,但根据 我已经通过在线查找的这些文档,它指定AES密钥用于加密KRB TGT。
· CROSS_ORGANIZATION_NO_TGT_DELEGATION (0x00000200 ) – “ 如果这个位被设置,在这个信任下授予的票证不能被委托信任。”这在 [MS-KILE] 3.3.5.7.5(跨域信任和推荐)中有更多的描述。
· PIM_TRUST (0x00000400) – “ 如果设置了此位和TATE(视为外部标志位)位,则跨域信任到域将被视为特权身份管理信任,用于SID过滤。”根据[MS-PAC] 4.1.2.2(SID过滤和声明转换),“域可以由林之外的域进行外部管理。信任域允许其本地的SID通过PrivilegedIdentityManagement信任。”我没有深入研究这个领域,只有域功能级为2012R2及以上才支持,它还需要进一步的研究:)
所有这些方法也可以针对当前信任你的域执行。这意味着,如果你当前的域与外部域具有双向信任关系,或者信任是单向和入站的(即所述的域信任你,因此你拥有某种访问权限),则可以针对所述域执行这些方法来为那个域查找信任。如果你想用PowerView来做到这一点,只需提供-Domain <domain.fqdn> 参数,下一节将详细介绍这块的内容。
使用PowerView进行信任数据枚举
去年我写了一篇文章描述了我 对PowerView的重写。提到的其中一个变化是,现在,任何Get-Domain * 函数都使用LDAP枚举,这意味着我们可以从信任我们的域中获取所述信息。这是通过-Domain <domain.fqdn> 参数完成的:
那么实际上究竟发生了什么?
很长一段时间以来,我认为这将通过当前域中的域控制器和信任域中的域控制器“反射”LDAP查询。这将是一个很好的方式来解决网络边界,但可惜我错了。实际发生的事情是,当前正在与之通信的域控制器将返回一个引用,这会指示你的搜索方法绑定到外部域(即该域的主域控制器/ PDC)。如果与外域有信任关系,则将返回跨域TGT,以便在与外域进行通信时使用。
这意味着如果你正在查询的计算机与信任域的PDC之间存在网络分段,则将无法检索到任何结果> _ <
从Kerberos的角度来看,这意味着一系列域间引用票证被自动发布,允许我们的用户最终从目标域请求一个LDAP服务票据。我们用我们的搭建的域环境来描述一下,假设我们目前在sub.dev.testlab.local 查询prod.contoso.local ,这里的klist的输出的内容如下:
你可以看到-域间票证过滤了信任链testlab.local ,然后最终到了contoso.local 又最终到了prod.contoso.local 。
映射域信任
我知道有几种方法可以映射环境中存在的一个或多个信任关系的“网格”。首先是通过全局目录。我在我之前写的文章 “ 渗透测试人员指南之组作用域”的文章里提到过这一点,但我会在这里重申的一些信息。
在 全局编录的所有对象的部分副本中的Active Directory林中,一些对象属性(但不是全部)都包含在其中。这些数据将在所有标记为林的全局编录的域控制器中复制一份。受信任的域对象被复制到全局目录中,因此我们可以枚举每一个内部和外部的信任,我们当前林中的所有域运行都非常快速,通过运行PowerView中的Get-DomainTrust -SearchBase“GC://$($ENV:USERDNSDOMAIN)” 则只有我们当前的PDC会有流量产生。下面是从sub.dev.testlab.local 域运行该函数的方式:
这比Get-DomainTrust得到了更多的结果 !
第二种方法较慢,但会提供更多的结果。由于我们可以枚举当前域上下文所具有的任何信任关系,并且通过LDAP的引用方式,我们可以从当前信任我们域的域中查询任何(objectClass = trustedDomain)对象,然后我们可以继续发出这些查询请求来获得任何结果,“抓取”任何可到达的域。任何标记为非传递的域可能会混淆这些结果,但是我们仍然可以获得很多结果。
PowerView中实现这个功能的函数是Get-DomainTrustMapping (以前是Invoke-MapDomainTrust)。这些结果可以通过管道符将Get-DomainTrustMapping 的结果输出到| Export-CSV-NoTypeInformation trusts.csv 来将最终的结果保存到一个CSV文件中。
最后一种方法是通过BloodHound / SharpHound 。同样,你可以通过使用Invoke-BloodHound-CollectionMethod信任语法来使用新的SharpHound.ps1接收器来执行此操作,并且这可以与用于外部信任枚举的-Domain <foreign.domain.fqdn> 组合使用。
关键要记住的是,你得到的确切信任映射将取决于你当前所在的域。由于external.local 和sub.dev.testlab.local 域之间的信任是单向的非传递的外部信任,如果你从external.local 查询,你将无法看到contoso.local 所具有的信任,因为sub.dev.testlab.local不会将你的TGT重新打包为可以转发到任何其他域的域之间的TGT。此外,如果你要枚举外部域的信任,则需要能够绑定到你正在查询的外部域中的域控制器(通常是PDC /主域控制器)。所以,即使有一个可以让你查询信息的传递信任,如果网络分割阻止你与目标外部域进行通信,那么在这种情况下你就比较倒霉了。
可视化域信任
数据是一回事,可视化是另一回事。几年前,我的一个同事Justin Warner看到了所有这些原始数据,并构建了一个名为 DomainTrustExplorer的工具,可以使用PowerView的映射信任数据执行一些节点的分析和可视化。
由于默认的信任输出已经改变,并且BloodHound负责为我们节点分析,所以我将Justin的项目重写为一个简化的表单,它将采用更新后的信任.CSVs, TrustVisualizer:
得到的graphml可以使用yEd进行可视化,描述文档在这里。这就是我如何创建本文之前提到的那个示例的信任体系结构的可视化的:
对于这个新产出的结果,绿色边缘意味着“在林内”,红色意味着外部,蓝色意味着林间的信任关系。与@sixdub的 DomainTrustExplorer一样,单向信任的边缘方向意味着访问的方向,而不是信任的方向。
当使用SharpHound收集信任数据,使用BloodHound进行可视化时,同样使用上面的数据会得到下面的结果: