域之间信任之间的攻击



只要在其中一个域中有任何权利,在渗透测试中迟早都会出现损害整个森林的任务。 在这样的时刻,关于信任,它们的属性和攻击本身的问题很多。 让我们尝试解决所有问题。

域之间的信任用于在另一个域的控制器上对一个域的用户进行身份验证。 换句话说,域A的用户可以访问域B的资源。域结构可以有两种类型:

  • 域树
  • 域林。



在域之间创建域树时,默认情况下会建立传递信任。 所有计算机都有共同点:

  • 全球目录
  • 命名空间
  • 方案。

域树可以合并为森林。 创建域目录林时,将建立传递信任,并且目录林中的所有计算机共享以下内容:

  • 全球目录
  • 方案。

下表显示了域之间的信任类型及其属性。

不行信托类型传递性方向认证机制内容描述
1个外在的非传递性单向或双向仅NTLM它们安装在属于不同林的域之间或带有Windows NT 4.0域。
2境界传递式或非传递式单向或双向仅Kerberos使用Kerberos协议在Windows和非Windows域之间安装。 这种信任可用于在Windows和UNIX系统上提供端到端身份验证。
3森林森林传递性的单向或双向Kerberos或NTLM设置在森林之间。 同时,管理员可以自行决定是双边关系还是单边关系。
4捷径传递性的单向或双向Kerberos或NTLM在属于同一森林的不同树的域之间设置。 用于减少信任路径,从而提高两个域之间的交互效率。
5亲子传递性的两路Kerberos或NTLM在树中创建新域时,将自动安装它们。 在域树中,关系由父子模式描述。
6树根信任传递性的两路Kerberos或NTLM在现有林中创建新的域树时自动安装。 实际上,在目录林的根域和创建的域之间建立了信任,该域将成为新树的根。

更清楚地,下图说明了域之间的信任类型。



传递性


需要传递性来定义在其之间形成的两个域之外的信任,并用于扩展与其他域的信任关系。 如果我们将子域添加到该域,则父域和子域之间将建立双向信任关系。 这些关系是可传递的,即 如果域A信任域D并且域D信任域E,则域A也信任域E。



非传递信任可用于拒绝与其他域的信任。

方向


信任关系路径是必须向其接收身份验证请求的域之间的一系列信任关系。 换句话说,在认证用户之前,确定域之间的信任。 为了使域A的用户访问域D的资源,域D必须信任域A。

信任的方向有两种:

  • 单面
  • 双边的。

单向信任是在两个域之间创建的单向身份验证路径。 在域A和域B之间的单向信任中,域B中的用户可以访问域A中的资源。但是,域A中的用户不能访问域B中的资源。这种类型的信任是不可传递的。

双边信任是两个单向信任关系的组合。 在域A和B之间的双向信任中,他们的用户可以访问两个域的资源。 这种信任是可传递的。

信任的方向总是与访问的方向相反。 微软的代表图如下:

更多深入信任类型的链接:


受信任域之间的Kerberos


考虑一个例子。 客户端正在尝试访问服务器。

从点1到3,使用Kerberos协议时会发生标准操作。
  • 密码将转换为NTLM哈希,使用哈希对时间戳进行加密,然后将其作为TGT票证请求(AS-REQ)中的身份验证器发送给KDC。 域控制器(KDC)检查用户信息并创建TGT票证。
  • TGT票证已加密,签名并发送给用户(AS-REP)。 仅Kerberos服务(KRBTGT)可以打开和读取TGT票证中的数据。
  • 用户在请求TGS票证(TGS-REQ)时向域控制器提交TGT票证。 域控制器打开TGT票证并检查PAC校验和。


更改从第4点开始:出现了域间TGT票证,即所谓的推荐票证,该票证已使用从受信任密码创建的域间密钥进行了加密/签名。 建立信任时设置信任密码,并且两个域控制器都知道该密码。 使用域间TGT票证,域1用户可以请求TGS票证访问域2资源。



信任域之间的NTLM




  1. 客户端直接将身份验证请求发送到它要访问的另一个域中的资源本身。
  2. 服务器从客户端接收请求,并向其发送响应CHALLENGE_MESSAGE,该响应包含8个字节的随机序列。 这称为服务器挑战。
  3. 客户端从服务器接收到服务器质询序列,然后使用其密码对该序列进行加密,然后向服务器发送包含24个字节的响应。
  4. 服务器将请求和响应发送到其域B的控制器。
  5. 对于信任之间的认证,将执行以下逻辑:

    • 检查方向信任关系。
      • 客户端凭据将发送到域A进行身份验证。
      • 如果没有信任关系,则使用域A检查传递性。

    • 域之间的可传递性验证
      • 如果域之间存在传递性,则将身份验证请求发送到信任路径中的下一个域。 该域控制器重复此过程,对照其安全帐户数据库检查用户凭据。
      • 如果没有传递性,则将拒绝访问消息返回给客户端。


    6-8。 决定对客户端进行身份验证的答案。

    域之间信任之间的攻击


    因此,要进行攻击,我们需要有关域中信任关系的信息。

    上市信托


    列出域中信任的主要方法有3种:

    1. 通过Win32 API;
    2. 通过.NET方法;
    3. 通过LDAP。

    Win32 API

    通过调用函数DsEnumerateDomainTrusts执行枚举,该函数返回结构DS_DOMAIN_TRUSTSA 。 使用此方法,将返回目标域的SID和GUID,表征该域中当前信任的标志属性

    标志
    DS_DOMAIN_DIRECT_INBOUND枚举直接信任以ServerName为成员的域的域。
    DS_DOMAIN_DIRECT_OUTBOUND枚举以ServerName为成员的域直接信任的域。
    DS_DOMAIN_IN_FOREST枚举属于具有ServerName作为成员的同一林的成员的域。
    DS_DOMAIN_NATIVE_MODE枚举主域在Windows 2000纯模式下运行的域。
    DS_DOMAIN_PRIMARY枚举作为ServerName作为成员的域的主域的域。
    DS_DOMAIN_TREE_ROOT枚举以ServerName为成员的目录林根目录中的域。


    属性


    TRUST_ATTRIBUTE_NON_TRANSITIVE禁止传递。
    TRUST_ATTRIBUTE_UPLEVEL_ONLY对于Windows 2000之前的客户端操作系统,信任链接无效。
    TRUST_ATTRIBUTE_FILTER_SIDS隔离域。
    TRUST_ATTRIBUTE_FOREST_TRANSITIVE信任链接可能包含林信任信息。
    TRUST_ATTRIBUTE_CROSS_ORGANIZATION这种信任是针对不属于该企业的域/林的。
    TRUST_ATTRIBUTE_TREAT_AS_EXTERNAL出于信任边界的目的,信任被视为外部信任。
    TRUST_ATTRIBUTE_WITHIN_FOREST信任是这个森林的内部。


    BloodHound使用Win32 API方法收集信息。



    .Net

    使用[System.DirectoryServices.ActiveDirectory.Domain]命名空间中的GetCurrentDomain方法,该方法返回System.DirectoryServices.ActiveDirectory.Domain类的实例。 此类实现GetAllTrustRelationships方法,该方法返回当前域的所有信任。

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

    PowerView的Get-DomainTrust模块中实现了使用此方法。



    该方法的优点之一是其简单性。 信息易于阅读和理解,但是其容量比通过其他方法进行枚举时要小得多。

    LDAP

    域信任信息作为TrustedDomain类的objectClass存储在Active Directory中。

    用法示例:

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



    PowerView默认情况下使用此方法。



    利用有关域和信任类型的信息,您可以直接进行攻击本身。 考虑2个选项:

    1. 我们设法入侵了域,并且我们拥有域管理员权限。
    2. 我们没有域管理员权限。

    具有对其中一个域的管理员权限


    根据受到攻击的域,可以区分几种攻击媒介:


    不行启动域 攻击者位置被攻击的域攻击技巧信任关系
    1个根源小孩儿金票+企业管理小组跨域(2路)
    2小孩儿小孩儿SID历史记录操作跨境亲子(2路)
    3小孩儿根源SID历史记录操作
    信托票务操作
    跨域树根(2路)
    4森林1森林2打印机错误跨域森林或外部信任(2路)

    值得注意的是,为了成功实现所有媒介,域之间的双边信任是必要的。

    1.操作SID历史


    引入了SID历史记录以促进用户从一个域迁移到另一个域。 该属性包含先前的SID对象。 每当对象从一个域移动到另一个域时,都会创建一个新的SID,该SID成为objectSID。 先前的SID被添加到sIDHistory属性中。

    每个目录林都有一个Enterprise Admins用户组,该用户组仅存在于根域中,并且在目录林中所有子域的域控制器上具有本地管理员权限。 肖恩·梅特卡夫Sean Metcalf)美国黑帽(BlackHat)2015年首次展示了这种攻击。 攻击的实质是,我们将发行“黄金票”,并添加Enterprise Admins组的其他SID。 这是通过在结构KERB_SID_AND_ATTRIBUTES中添加ExtraSids来完成的,该结构在KERB_VALIDATION_INFO中发送。



    攻击演示:



    Impacket具有可自动执行所有操作的脚本

    2.金票+企业管理员组


    在Root域中具有管理员权限,我们可以在Enterprise Admins组中添加用户并将其添加到Golden Ticket(519)。

     Kerberos::golden /domain:<domain> /sid:<domain_SID> /krbtgt:<ntlm_hash_krbtgt_user> /user:<user> /groups:500,501,513,512,520,518,519 /ptt 

    如上所述,Enterprise Admin对DC子域具有本地管理员权限。 因此,我们将能够危害森林中的所有子域。

    3.信托票证的运作


    要使用Kerberos协议访问资源,您需要一个TGS票证,该票证已使用服务帐户密码的NTLM哈希进行加密。 域控制器仅存储其域的用户密码的哈希值,因此,当来自域A的用户需要访问域B中的资源时,将使用域间密钥。 该密钥是基于受信任的密码创建的,该密码是在同一林中的域之间创建信任关系时设置的。 在域控制器的密码数据库(NTDS.dit)中,您可以找到结尾带有$符号的用户。 他们的密码也用于创建域间密钥。 要创建跨域TGT票证,我们需要此帐户的密码哈希。

     Kerberos::golden /user:<user> /domain:<domain> /sid:<sid_domain> /sids:<extra_sid_entrprice_admin_group_from _another_domain> /aes256:<aes256_trust_user_password> /service:krbtgt /target:<target_domain> /ptt 

    攻击演示:



    当IS服务发现威胁并两次更改密码krbtgt时,该攻击尤其重要。 在这种情况下,我们将能够使用域之间的可信密码来创建黄金票。

    4.打印机错误


    Windows打印系统远程协议(MS-RPRN)默认情况下启用了RpcRemoteFindFirstPrinterChangeNotification(Ex)方法,该方法允许您在使用Kerberos或NTLM协议在指定主机上运行后台打印程序服务的任何计算机上强制进行身份验证。 对于c NTLM,我们可以运行NTLM-relay,或开始破解计算机密码(切勿取消)。 对于Kerberos,需要具有不受限制的委派的受感染计算机。 然后我们可以领取TGT票并发动攻击。

    攻击演示:



    下图显示了视频中显示的步骤。



    我们没有域管理员权限


    有点理论。 卡洛斯·加西亚Carlos Garsia)在他的报告中提供了一张出色的表格,阐明了不同类型群体的性质。



    在这些功能中,值得考虑的是,“ AD域本地”和“ AD全局”组是在没有组成员的情况下复制到全局目录的,而“ AD通用”组是与用户一起复制的。
    由于全局目录枚举组的方式,反向链接的结果[即,成员搜索可能会有所不同,具体取决于您搜索的是全局目录(端口3268)还是域(端口389),即用户所属的组(全局组与域本地组)。
    如果我们没有域管理员权限,则将枚举对象。 我们感兴趣的是:
    1. 在我们域中的计算机上具有本地管理员权限的另一个域的用户。
    2. 来自其他域的用户是用户域组的成员。 包含来自另一个域的用户的组。
    3. 外国ACL负责人。

    1.在我们域中的计算机上具有本地管理员权限的另一个域的用户


    在BloodHound中搜索来自另一个域的用户,这些用户是我们域中主机的本地管理员:

     MATCH (c:Computer) OPTIONAL MATCH p1 = (u1)-[:AdminTo]->(c) WHERE NOT u1.domain = c.domain WITH p1,c OPTIONAL MATCH p2 = (u2)-[:MemberOf*1..]->(:Group)-[:AdminTo]->(c) WHERE NOT u2.domain = c.domain RETURN p1,p2 



    PowerView中的命令:

     Get-NetLocalGroupMember <server> 

    2.来自其他域的用户,由用户域组组成。 包含来自其他域的用户的组


    如上所述,只有通用组成员的用户被复制到全局目录中。 为了演示此功能,我们将查询全局目录中的组,这些组包含至少一个用户和对域控制器的直接ldap请求。

     Get-DomainGroup -Properties name, grouptype, member, DistinguishedName -LDAPFilter '(member=*)' -SearchBase "GC://jet.lab" 



    当执行对全局目录的查询时,我们只能从域one.jet.lab中看到一个类型为AD Universal的Universal Group组。

    如果执行对one.jet.lab的直接LDAP查询,我们将看到其他类型为AD Domain local和AD Global的组。



    枚举用户和组时,必须考虑这一点。

    PowerView中的命令:

     Get-DomainForeignUser -Domain <Domain> Get-DomainForeignGroupMember -Domain <Domain> 





    3.外国ACL负责人


    ntSecurityDescriptor安全描述符(https://docs.microsoft.com/zh-cn/windows/win32/adschema/a-ntsecuritydescriptor)可用于所有来自受信任域的用户,并将其复制到全局目录中。 因此,我们可以在所有DACL中查询信任域中的所有对象,并过滤其他域中的用户。

     Get-DomainObjectAcl -Domain jet.lab -ResolveGuids | ?{$_.SecurityIdentifier -like 'SID_Domain*'} 



    因此,我们设法从forestc.lab域中识别了用户Mike,该用户对jet.lab域中的Global Group拥有权限。

    PS SID筛选和选择性身份验证用于森林之间的保护。 使用SID筛选的森林之间的攻击在他的博客启用了dirkjan 。 同样在7月9日,Microsoft发布了一个更新 ,默认情况下禁用目录林之间的TGT委派。 现在,使用Kerberos协议无限委派和从一个森林到另一个森林的妥协的故事不再起作用。

Source: https://habr.com/ru/post/zh-CN466445/


All Articles