导语:打造跨域信任票证 事实上,我们有可能通过伪造域间的信任票证来攻击信任关系。正如 Sean在“关于信任的一切”一文中所描述的那样,我将向你详细介绍他的一些文档来获取更多的操作细节,并且将涵盖这项技术的含义以及它如何适用于我们的信任

打造跨域信任票证

事实上,我们有可能通过伪造域间的信任票证来攻击信任关系。正如 Sean在“关于信任的一切”一文中所描述的那样,我将向你详细介绍他的一些文档来获取更多的操作细节,并且将涵盖这项技术的含义以及它如何适用于我们的信任攻击策略。

回想一下Kerberos跨信任的工作原理的解释:

1517481508958329.png

由此可以看出,当用户将这个跨域TGT票证引用提交给外部域,再由域间信任密钥签名时,用户的TGT将被包括在内。而且,由于外部域信任发布这个引用票证的域,外部域将信任用户的TGT票证,并且认为票证中包含的所有信息都是准确的。

因此,当外部域使用协商的信任密钥解引用票证时,它看到用户的TGT并且说:“OK,另一个域已经认证了这个用户,并且说清楚了他们说了说明或者他们是谁或者是这些是哪个组的用户,所以我相信这些信息是准确的,因为我信任这个域。”

因此,如果我们可以检索域间信任密钥的哈希值,那么我们就可以伪造一张引用票证(如Sean所描述的),这允许我们在请求访问第二个域时伪装成来自第一个域的任何用户。这个哈希检索可以通过正常的密码转储或通过DCSync,通过查询FOREIGN_DOMAIN_SHORTNAME$ 帐户来完成:

image.png

但是,如果我们可以检索域间的信任关键字,那么在几乎所有情况下,我们都可以引用关联域的krbtgt哈希。如果我们有了这个哈希,我们可以为用户引用域构造一张票证,伪装成任何我们想要伪装的外部用户。这就是为什么我没有必要在域内建立跨域的信任推荐票证,但是有一个具体的例子会让人很感兴趣。

早在2015年,在每个人都开始充分认识到黄金票证的含义之后, 微软发布了允许企业或组织改变krbtgt账户密码的脚本。为了使其对单个域的林有效,密码必须更改两次。现在,由于sidHistory-hopping攻击的出现,林中每个域中的krbtgt帐户的密码必须要更改两次才有效。

说一个企业或组织这样做,并为林中的每个域中的每个高权限账户轮换更改密码,那这么做是否安全呢?根据Active Directory技术规范的第6.1.6.9.6.1节,域间信任密钥每30天自动轮换一次,而当krbtgt账户发生了更改,它们不会轮换。因此,如果攻击者拥有了域间密钥,他们仍然可以使用sidHistory方法来获得信任,就像Sean描述的细节那样。另外,有上百万种方法和另一种方式来在活动目录中植入后门。¯\ _(ツ)_ /¯

所以如果你想确保域的安全,那么只有一个解决方案——保持冷静然后重新构建整个林( @gentilkiwi :)

image.png

跨域信任的Kerberoasting攻击

我们喜欢使用 Kerberoasting。这种攻击方式由蒂姆·梅丁(Tim Medin)在2014年提出。如果我们有一个信任我们的域,我们可以在这些信任的界限之间进行攻击,在某些情况下只需稍作调整。

当使用.NET的System.IdentityModel.Tokens.KerberosRequestorSecurityToken类(以及接下来使用的.GetRequest()方法)时,我们指定一个服务主体名称(SPN)来请求TGS-REP,然后使用GetRequest()来检索要发送到目标服务的AP-REQ字节。此AP-REQ包含了我们随后需要提取并用于离线Kerberoasting 和密码破解的服务票证。

KerberosRequestorSecurityToken.ServicePrincipalName的文档将格式很好地描述为“host/<hostname>@<domain>或<hostname>,其中hostname是托管目标Web服务的计算机的名称,domain是完全限定的域名主机所在的Kerberos域。”因此,如果你在跨信任的Kerberoasting攻击过程(特别是外部和林信任)方面有任何问题,请尝试使用SERVICE/[email protected] 格式,你可能会获得更多成功。这是PowerView的Get-DomainSPNTicket 和Invoke-Kerberoast 所构建的功能。

结语:SID过滤

所以我们先前讨论了怎么样以及为什么林是Active Directory中的信任边界,而不是域。其中很大一部分原因是我曾经提到过的几次被称为SID过滤的安全保护。SID过滤的最佳参考是[MS-PAC]“特权属性证书数据结构”文档,具体请 参见该文档的第4.1.2.2节“SID过滤和断言转换”。我将尽我所能解释一些要点。

当用户的TGT通过引用呈现给新的域时,该TGT包含特权属性证书(PAC),其包含了用户的安全标识符(SID),他们所在的组的安全标识符以及任何存在于先前所讨论的SID历史字段(即,在Trustpocalypse 章节所描述的PAC的ExtraSids部分)。PAC中的安全识别信息由信任域进行解析和分析,并根据信任的类型执行各种过滤器。

与特定模式相匹配的SID在各种情况下被信任域拒绝,作为一种安全保护机制。SID过滤旨在阻止具有提升的凭证的恶意用户在受信任的域或林中控制信任域/林。这在微软官方的“ 信任安全注意事项 ”文档中也有所描述。

有一组SID被设置为“AlwaysFilter”,这意味着它们总是被信任域过滤掉,不管信任类型是什么样的。我们感兴趣的SID主要是“Enterprise Admins”( S-1-5-21-<Domain>-519),它允许我们执行sidHistory跳跃攻击,并被设置为“ForestSpecific”进行过滤。正如微软官方文档所描述的那样,“ ForestSpecific规则适用于PAC中从来不允许在源于林之外的那些SID,也可能来自已经标记为QuarantinedWithinForest的域,除非它属于该域。”这再一次解释了为什么林是信任边界,而不是域,因为除了目标域在同一个林之外,这个提升的SID(以及许多其他)是不能跨越信任边界的。

QuarantinedWithinForest?恰巧林内的域可以被设置为“隔离”,即使它在林内,也可以为域实施版本SID过滤。但是,正如文档所述,“ 允许从这样的域传递的唯一SID是“企业域控制器(Enterprise Domain Controllers)”(S-1-5-9)SID和可信域对象(TDO)描述的SID。”因此,由于“企业域控制器”SID不会被过滤掉林内的隔离域,因此仍然有一种方法可以“跳跃”林信任链并危及林根:

image.png

这是 几年前试图解释的问题,但没有正确理解这个问题,但是在阅读了微软的一堆文档之后,现在它变得更有意义了:)

最后的总结

信任不是一个简单的话题。大多数渗透测试人员(以及许多系统管理员)不能正确地理解信任和各种信任错误所暴露的风险。不幸的是,对于我们来说,一些坏人会这样做,信任几乎从Active Directory出现就开始被滥用,以便利用一个域中的访问权来转移到另一个域中。

如果你的域信任体系结构安装不正确,那么结果会是什么呢?不幸的是,正如许多此类性质的主要构建缺陷一样,并不是一个简单的解决办法。重新构建主要的Active Directory部署可能是一个漫长而昂贵且痛苦的过程,但仍有一个不错的解决方案: 增强安全管理环境(ESAE),通常称为“红色森林”,它是一个安全的Active Directory架构,可以减少大量的Active Directory漏洞/错误配置。虽然微软公布了这个架构的各个方面,但是我现在知道如何拥有ESAE / Red Forest的唯一方法就是向微软付钱去购买它。¯\ _(ツ)_ /¯

我很乐意最终发布关于企业或组织如何实施“红色森林”环境的指导,虽然不是“官方正式”的参考架构,但仍然会比许多企业或组织当前的实施方案更好一些。如果有人有相关的文件或知道如何能做到这一点,请与我联系(@ harmj0y),我会感到非常高兴的。

源链接

Hacking more

...