简单的总结了一下来自这篇文章的知识点
https://www.kroll.com/-/media/kroll/pdfs/publications/rootedcon2019-pentesting-active-directory-forests-carlos-garcia.pdf
视频录像为
https://www.youtube.com/watch?v=6aV5tZlQ2EQ&t=10s&themeRefresh=1
森林
-
域是由树和森林构成的
- 树是一系列相关的域
- 森林是一系列彼此信任的树的集合
-
在一个森林当中只有一个
Enterprise Admins
组- 该组只存在于根域当中
- 不存在于任何子域当中
- 被添加在每一个子域控制器的本地管理员组中
信任关系
- 允许认证流量在两个域之间传递
- 让用户拥有在一个域内向另一个域内的资源进行认证的能力
信任流向
-
单向信任
- B域信任A域
- 在A域的用户可以访问在B域的资源,在B域的用户无法访问A域的资源
-
双向信任
- A域信任B域,B域信任A域
- A域的用户和B域的用户可以相互访问资源
信任的可传递性
决定了一个信任关系能否能两个域间延伸出来
-
可传递
- 可以将信任关系延伸至别的域
-
不可传递
- 不允许信任关系延伸至别的域
信任类型
类型 | 方向 | 可传递性 | 描述 |
---|---|---|---|
父子信任 | 双向 | 可传递 | 当一个新的域在域树中被创建时自动和其父域建立 |
林根信任 | 双向 | 可传递 | 当一个域树被添加到森林时新域树的根域和林根域之间自动创建 |
外部信任 | 单向或双向 | 不可传递 | 在一个域林中的域和在另一个不同的域林之间的域手动创建,这两个域林之间并没有信任关系 |
林间信任 | 单向或双向 | 可传递 | 在一个域的林根域和另一个林根域之间手动创建 |
快捷信任 | 单向或双向 | 可传递 | 在同一个林中的域手动创建,用于缩短在复杂域树或者域林中的信任路径,提升认证时间 |
领域信任 | 单向或双向 | 可传递或不可传递 | 在一个AD域和非Windows的Kerberos V5领域中手动创建 |
有关信任的总结
- 在同一个域森林中的信任关系都是双向且可传递的,这就是为什么在同一个森林内的域都是彼此信任的原因。
- 在同一个域森林中,来自任意域的用户都能访问另一个任意域的资源,前提是他们有对指定资源的权限和连通的网络。
林中信任关系:
跨域信任关系:
B域信任A域,则A域能访问B域的资源。
通过信任关系进行的NTLM认证
- A域中的用户向B域中的服务器发起认证请求
- B域中的服务器向A域中的用户发送challenge请求
- A域中的用户向B域中的服务器发送response响应
- B域中的服务器将A域中的用户名称,challenge以及response都发送给B域的域控制器
- B域中的域控制器将用户的认证请求发送信任路径的下一个域
- A域中的域控制器将会比较chanllenge和response,从而对用户A的身份进行认证
通过信任关系进行的Kerberos认证
当一个用户请求访问另一个域中的资源时:
- 用户所在的DC是没有办法生成另一个域的ST的,这是因为ST只能通过目标服务的密码构造,而用户所在的域控制器只包含自己所在域的密码信息
- 在同一个域森林中的不同两个域间存在一个信任密码,信任密码用于跨域的Kerberos认证
- A域用户使用自己的哈希加密时间戳
- A域的域控制器使用A域的krbtgt账户哈希加密TGT
- A域的用户请求B域的资源和服务
- A域的域控制器向A域的用户发送一张使用A域和B域间的
inter-realm key
加密的TGT - A域的用户使用这张
inter-realm key
加密的TGT向B域的域控制器请求特定服务 - B域的域控制器返回指定的ST
- A域的用户使用ST请求B域中的指定服务
通过信任进行枚举
当进入域环境后,渗透测试的路径取决于:
- 当前身处的域环境和当前域的信任关系
- 获取到的权限
- 用户在外部域的权限
枚举指定外部域的信任关系:
Get-DomainTrust -Domain FOREIGN DOAMIN FQDN
一般是指定为主域控制器
枚举当前或指定的林的信任关系:
Get-ForestTrust -Domain FOREIGN DOMAIN FQDN
在如图所示的域中,假如我们所处的位置为test.dev.ciyilab.local
。
-
此时我们使用
Get-DomainTrust -Domain test.dev.ciyilab.local
查询,只能查询到和dev.ciyilab.local
的父子信任关系。 -
再使用
Get-DomainTrust -Domain dev.ciyilab.local
去查询dev.ciyilab.local
的信任关系,只能查询到和ciyilab.local
的双向父子信任关系以及canete.local
的单向外部信任。 -
最后使用
Get-DomainTrust -Domain ciyilab.local
查询根域的信任关系。此时能查询到和dev.ciyilab.local
的双向父子信任关系,和assuan.local
的双向树根信任关系以及和tricia.local
的双向林间信任关系。
也就是说我们完全可以处于整个Windows域林的任意一个节点当中,获得整个Windows域林的结构。
假如我们处于canete.local
中,我们可以查看到dev.ciyilab.local
的域信任关系,本地组成员等信息,但由于外部信任关系无法传递的原因,攻击者是无法查看到ciyilab.local
的任何信息。
总结
- 如果某个域信任你当前所在的域,那么你就可以查询到它AD中的信息。
- 如果失去了域林中任意一个域的krbtgt账户密码,就等同于你失去了对整个域林的控制。