在使用Kerberos票证时,我发现了一个问题,该问题允许我跨外部非传递信任向Active Directory(AD)林中的其他域进行身份验证。这意味着事实上不存在“不可传递的信任”。这个术语充其量是误导,并为系统管理员提供了一种错误的安全感。作为本文讨论的问题的一部分,攻击者可以跨非传递信任向其他域进行身份验证,并可能提升信任域的林中的权限。此帖子详细说明了发现的问题。
向Microsoft报告此问题后,我收到了以下响应:
图1. MSRC响应
由于Microsoft确定此问题不会影响安全性,因此不打算更改此行为,因此无法避免此问题-除了简单地 不使用外部信任。
信任与传递性
注: 这篇文章假设你对信托有一个基本的了解,并知道它们是如何运作的。(For关于这些主题的更多信息,我建议阅读 威尔·施罗德 的 信托的重要职位 .)该员额不包括森林内信托(即:单个林中的信任)-除了它们应用于所讨论的特定攻击路径之外-或选择性身份验证信任-这在真实的环境中非常罕见。
其余的信任是林信任和外部信任。
•森林信托 是两个林之间的信任。更准确地说,它们是 传递的两个林的根域之间的信任。来自受信任林中任何域的任何用户都可以向信任林中的任何域进行身份验证。
•外部信托 是两个域之间的信任。这些信托是 非传递的。只有受信任域中的用户才能根据进行身份验证 仅 信任域 (英文) 图二).
图2.外部不可传递信任
Microsoft 对信任传递性的描述 如下:
传递性确定信任是否可以扩展到与之形成信任的两个域之外。
•
–可传递信任可用于扩展与其他域的信任关系。
–不可传递信任可用于拒绝与其他域的信任关系。
这个描述很清楚:对于不可传递的信任,只有信任中涉及的两个域可以相互进行身份验证,而不能超越。
不幸的是,正如我将在这篇文章中证明的那样,事实并非如此。
实验室设置
为了正确地演示不可传递的信任问题,我用几个共享外部信任的多域森林建立了实验室(图3)。
图3.实验室设置
此设置涉及三(3)个目录林。其中两(2)个林包含三(3)个域。第三个目录林包含两(2)个域。域 semperis.lab 和 treetest.lab 共享一个双向外部非传递信任(图4)。
图4.外部信托1
域 grandchild1.child1.semperis.lab 和 semperisaz.lab 还共享一个双向外部非传递信任(图5)。
图5.外部信托2
此设置使演示不可传递信任问题的含义和限制成为可能。
Kerberos交叉信任身份验证的工作原理
要使用Kerberos跨信任向服务进行身份验证,您需要一个引用(也称为引用票证授予票证[TGT])。这是从外部域的本地域控制器(DC)请求的票证。为了演示如何跨信任执行票证请求,本节将重点介绍Semperis.lab林。但是,此信息适用于任何“允许的”信任路径。
注意:本文假设您对普通的Kerberos身份验证流程有基本的了解。(For有关该流程的详细说明,请参阅SeanMetcalf的DetectingKerberoasting活动帖子。)文章的其余部分使用Rubeus手动请求票证。
交叉信任身份验证的最简单示例是对与本地域直接信任的域上的服务进行身份验证。该域的信任 grandchild1.child1.semperis.lab 与 child1.semperis.lab (英文) 图五)就是这种信任的一个例子。在这种情况下,获取初始TGT后,获取中帐户的服务票证的第一步 grandchild1.child1.semperis.lab 到服务 child1.semperis.lab 就是获得一份 child1.semperis.lab (英文) 图6、图7).
图6. child1.semperis.lab的转诊请求
图7.转介请求
已向DC( SGC1DC1.grandchild1.child1.semperis.lab )在域( grandchild1.child1.semperis.lab )认证用户本地( 低级).已提出服务请求儿童实验室服务领域(srealm)是本地域( grandchild1.child1.semperis.lab )显示此票据是推荐。
此转介现在可用于从外部DC请求服务票据(ST)( SC1DC1.child1.semperis.lab )的服务 主机/SC1DC1.child1.semperis.lab ( 图8、图9).
图8.推荐使用示例
图9.通过转诊请求ST
要进一步执行此步骤,如果林根域上的服务( semperis.lab ),则无法直接从本地( grandchild1.child1.semperis.lab)域。转诊 krbtgt/永久性实验室 从本地DC请求 sgc1dc1.grandchild1.child1.semperis.lab。但是,DC会返回服务的票证 儿童实验室 ,指示此引用是针对域的 child1.semperis.lab ,不适用于 semperis.lab ( 图10、图11).
图10. Semperis.lab的转诊请求
图11.请求转诊至semperis.lab
您可以通过尝试使用此票证为请求ST来查看此问题 semperis.lab领域。这样做会导致 AP错误不良_完整性错误。这是因为引用票证是使用的信任密钥加密的 grandchild1.child1.semperis.lab -> child1.semperis.lab信任。位于 semperis.lab 根域不知道该密钥,因此不能解密该票据( 图十二、图十三).
图12.根域ST请求
图13.向semperis实验室申请ST
请求根域的服务票证 semperis.lab ,首先推荐 semperis.lab 必须从域中的DC请求 child1.semperis.lab,使用此推荐。& nbsp; 图14和图15 显示向外地DC作出的请求( sc1dc1.child1.semperis.lab ),使用域的引用 child1.semperis.lab 请求根域的进一步引用 semperis.lab。
图14. Semperis.lab的转诊请求
图15.请求转诊至semperis.lab
请注意,要请求此票证,需要*/targetdomain*参数。默认情况下,Rubeus使用传递给它的票证中的域来填写TGS-REQ中的域。在这种情况下,该域将是grandchild1.child1.semperis.lab,并将导致ERR_WRONG_REALM错误,因为DC的本地域是child1.semperis.lab。此信息在下一节中将非常重要。
最后,由此产生的 semperis.lab 可用于为请求ST semperis.lab域。
图十六 显示了用户发出的ST请求 [email protected] 到华盛顿特区 SDC1.semperis.lab 对于SPN 主机/SDC1.semperis.lab。由于信任路径是允许的,因此即使涉及的两个域没有直接信任关系( 图十七).
图16. Semperis实验室的ST请求
图17.主机/sdc1.semperis.lab的ST请求
这种请求信任域的转介的方法可用于请求信任路径允许的任何域内的任何服务的ST。
使不可传递的信任可传递
那么,如何才能遍历外部信任以验证到应该被禁止的域呢?
所述域 semperisaz.lab 以及 grandchild1.child1.semperis.lab具有双向外部信任。因此,在为域中的任何帐户检索TGT之后 semperisaz.lab ,可以请求转介 grandchild1.child1.semperis.lab (英文) 图18、图19).
图18.转介至granchild1.child1.semperis.lab
图19.请求转介1.child1.semperis.lab
此引用可用于请求域上服务的ST grandchild1.child1.semperis.lab。但是,试图获得对同一林中其他域的引用(例如,child1.semperis.lab )按预期返回ERR_PATH_NOT_ACCEPTED错误( 图二十 ).
图20.路径不被接受错误
发生此错误的原因是semperisaz.*lab-granchild>1. child 1. semperis. lab信任不可传递。因此,从 semperisaz.lab到child1.semperis.lab**的路径是不允许的(图21*)。
Figure 21. Requesting referral for child1.semperis.lab
但是你 罐 请求a 局部 TGT用于 grandchild1.child1.semperis.lab.& nbsp;我将其称为本地TGT,因为与引用不同,引用的ServiceRealm(srealm)为 semperisaz.lab – 此TGT的服务领域为 grandchild1.child1.semperis.lab (英文) 图22、图23).
图22.1.child1.semperis.lab请求本地TGT
图23.请求本地TGT
使用此本地TGT,将 child1.semperis.lab 现在可以被请求( 图24、图25).
图24.1.semperis.lab
图25.当地TGT请求1.semperis.lab
现在,您有了一个可用的推荐,可用于请求以下对象的ST child1.semperis.lab ,使用 任何 帐户,从 semperisaz.lab 域,而无需 任何更改AD中的信托或帐户。& nbsp; 图二十六 以及 图二十七 显示来自DC的ST请求 sc1dc1.child1.semperis.lab 为服务 主机/sc1dc1.child1.semperis.lab 作为用户 [email protected]。
图26.
图27.正在为主机/sc1dc1.child1.semperis.lab请求ST
此外,此方法还可用于在同一林中的任何域中跳跃,其中 grandchild1.child1.semperis.lab存在。我们可以通过请求对根域的引用来演示这一点 semperis.lab.& nbsp;已请求转介 semperis.lab 从华盛顿特区 sc1dc1.child1.semperis.lab 作为用户[email protected]( 图28、图29).
图28.请求转诊至semperis.lab
图29.请求转至semperis.lab
幸运的是,使用此方法不可能在林之外的其他信任(外部信任或林信任)之间跳转。如 图3 所示,根域semperis.lab与treetest.lab之间存在双向外部信任。这种信任可以用来证明这种限制(图30、图31)。
图30.请求转至Treetest.lab
图31.请求转至Treetest.lab
这至少可以阻止使用此方法的攻击者信任跳转到另一个林。& nbsp;但是,对于试图跨信任提升林中权限的攻击者来说,此不可传递的信任问题显然很有用。攻击者可以从假定不允许的域中查询域信息,查询更敏感的域或安全性可能较弱的域,或者对假定不允许的域执行Kerberoasting攻击或NTLM强制身份验证。
跳得更远
虽然攻击者无法单独使用本文中描述的方法进一步跳跃,但该问题可能会打开新的攻击途径。我以前写过一篇文章,演示了跨信任创建机器帐户的能力及其含义。通过将该域跳变方法与该新方法结合,可以克服在前一节结尾处描述的限制。
使用检索的推荐 semperis.lab (在上一节结束时),您可以申请一张 LDAP协议 DC上的服务 semperis.lab.& nbsp;这里,ST代表 ldap/sdc1.semperis.实验室 已使用的转介请求 semperis.lab 作为用户[email protected]( 图32、图33).
图32.为ldap请求ST
图33.为ldap/sdc1.semperis.lab请求ST
此ST可直接注入并用于在中创建计算机帐户 semperis.lab 如果配置允许 已验证用户 ,这是默认值( 图三十四).
图34.在semperis.lab中创建机器帐户
此操作将导致DC sdc1.semperis.lab 创建计算机帐户 测试组件 在 semperis.lab 领域( 图三十五).
图35.创建计算机帐户TestComp
新的 测试组件 计算机帐户是域中的本地帐户 semperis.lab。现在,您可以检索该计算机帐户的TGT( 图36、图37).
图36.机器帐户TGT
图37.为测试组件请求TGT
允许此计算机帐户TGT请求到信任域的引用 treetest.lab。该 计算机帐户TGT可用于请求 treetest.lab DC中的域 SDC1.semperis.lab (图38、图39).
图38.请求转诊至Treetest.lab
图39.请求转诊至Treetest.lab
最后,这篇文章中描述的问题可以用来获得访问不可访问的 dsptest.lab领域。首先,请求本地TGT treetest.lab.& nbsp;使用转介请求本地TGT treetest.lab 作为帐户 [email protected] 从华盛顿特区 TDC1.treetest.lab (英文) 图40、图41).
图40.请求当地TGT进行树检测实验室
图41.请求当地TGT进行树检测实验室
接下来,使用此本地TGT请求引用 dsptest.lab.& nbsp; 图四十二 以及 图四十三 显示已为域请求引用 dsptest.lab 从华盛顿特区 TDC1.treetest.lab 作为用户 [email protected]。
图42.要求转诊至dsptest.lab
图43.要求转诊至dsptest.lab
显然,将这两种方法结合起来,可以使用对林中任何域具有外部信任的域上的任何低特权帐户,非常深入地跳到AD企业基础结构中。
信任传递性漏洞检测
不幸的是,考虑到微软的回应,避免这个问题的唯一方法是删除外部信任。
如果无法删除所有外部信任,则需要监视Windows事件4769(请求Kerberos服务票证)。要查找的第一个迹象是从不同林中的帐户请求了本地TGT(图44)。
图44. 4769用于本地TGT
在这里,“ 帐户域”字段是属于不同林的域,“服务名”是krbtgt。此事件之后是另一个事件4769,请求转介(图45)。
图45. 4769转介
这里, 帐户域是不同林中的域,服务名称是本地林中的另一个域。
请注意,这两个事件可能发生在同一域中的不同DC上。事件 不需要发生在同一DC上。此时,任何使用此引用的请求ST(事件4769)都将具有一个“帐户域”,其中包含一个不应允许向本地域进行身份验证的域。
在Semperis的未来版本中,可以监视这些事件并检测此类攻击 目录服务保护器(DSP)。
你能相信谁?
正如你所看到的,官方对外部非传递信托的描述是误导性的。就目前情况而言, 创建外部不可传递信任时,必须接受受信任域中的任何帐户都能够对其进行身份验证 *任何* 中的域 *整个的* 信任域所在的目录林。
正如本文的“进一步跳转”部分所示,最佳实践是禁止经过身份验证的用户创建机器帐户。如果不这样做,不仅会使林中的域面临更高的攻击风险,而且还会使与林中任何域具有外部信任的任何域(以及它们所在的林)面临更高的风险,因为它们能够跨信任创建计算机帐户,并针对应被禁止的域进行身份验证。(More关于机器帐户配额和如何防止低特权机器帐户创建的信息可以在KevinRobertson的优秀帖子“MachineAccountQuota isUSEFULSometimes“上找到。
如果没有别的,我希望这篇文章能让系统管理员了解实现外部信任所涉及的真实的的全林性风险。
翻译自网络
原文始发于微信公众号(闲聊知识铺):AD安全研究:破坏信任传递性