目录

基于域委派的攻击

基于域委派的攻击

域委派

Identity delegation is a feature of Active Directo ry Federation Services (AD FS) that allows administrator-specified accounts to impersonate users. The account that impersonates the user is called the dele gate

This delegation capability is critical for many distributed applications for which there is a series of access control checks that must be made sequentially for each application, database, or service that is in the authorization chain for the originating request

Many real-world scenarios exist in which a Web application “front end” must retrieve data from a more secure “back end”, such as a Web service that is connected to a Microsoft SQL Server database.

域委派是大型网络中经常部署的应用模式,给多跳认证带来很大的便利,同时也带来很大的安全隐患,利用委派可获取域管理员权限,甚至制作深度隐藏的后门

域委派是指,将域内用户的权限委派给服务账号,使得服务账号能以用户权限开展域内活动。

服务账号(Service Account),域内用户的一种类型,服务器运行服务时所用的账号,将服务运行起来并加入域。例如 MS SQL Server 在安装时,会在域内自动注册服务账号 SqlServiceAccount,这类账号不能用于交互式登录。

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200505104626.png-water_print

一个域内普通用户 jack 通过 Kerberos 协议认证到前台 WEB 服后,前台运行 WEB 服务的服务账号 websvc 模拟(Impersonate)用户 jack,以 Kerberos 协议继续认证到后台服务器,从而在后台服务器中获取 jack 用户的访问权限,即域中跳或者多跳的 Kerberos 认证。

流程

  1. 域内用户 jack 以 Kerberos 方式认证后访问 Web 服务器;
  2. Web 服务以 websvc 服务账号运行,websvc 向 KDC 发起 jack 用户的票据申请;
  3. KDC 检查 websvc 用户的委派属性,如果被设置,则返回 jack 用户的可转发票据 TGT;
  4. websvc 收到 jack 用户 TGT 后,使用该票据向 KDC 申请访问文件服务器的服务票据 TGS;
  5. KDC 检查 websvc 的委派属性,如果被设置,且申请的文件服务在允许的列表清单中,则返回一个 jack 用户访问文件服务的授权票据 TGS;
  6. websvc 收到的 jack 用户的授权票据 TGS 后,可访问文件服务,完成多跳认证。

委派类型

域内委派主要有 3 种应用方式:

一是非约束性委派(Unconstrained Delegation),服务账号可以获取某用户的 TGT,从而服务账号可使用该 TGT,模拟用户访问任意服务

如果某个服务 A 的服务账号 B 被设置为非约束委派,当用户 C 通过 Kerberos 认证访问服务 A 时,KDC 会检查服务账号 B 的属性,发现是非约束性委派时,KDC 会将用户 C 的 TGT 放在 TGS 中,这样 B 在验证 TGS 的同时获取了 A 用户的 TGT,从而可以模拟用户 A 访问任意服务

二是约束性委派(Constrained Delegation),即 Kerberos 的扩展协议 S4U2Proxy,服务账号只能获取某用户的 TGS,从而只能模拟用户访问特定的服务;

三是协议传递,即 Kerberos 的扩展协议 S4U2Self,服务账号针对某一个特定服务,可查询获取任意用户的 TGS,从而能模拟任意用户访问该特定服务。

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200505111706.png-water_print

筛选具有委派属性的服务账号

服务账号被设置为非约束性委派时,其 userAccountControl 属性会包含为 TRUSTED_FOR_DELEGATION

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200505111857.png-water_print

当被设置为约束性委派时,其 userAccountControl 属性包含 TRUSTED_TO_AUTH_FOR_DELEGATION(T2A4D),且 msDS-AllowedToDelegateTo 属性会被设置为哪些协议

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200505112138.png-water_print

在域内的可以委派的账户有两种一种是主机账户(NetComputer)另一种是用 setspn 手动添加的服务账户(NetUser),不管是非约束还是约束的例子是以主机账户举例,因为用主机账户来委派的环境好搭并且便于理解,不过服务账户和主机账户从攻击委派这个视角来看是等价的。

可通过 PowerShell 脚本枚举域内所有的服务账号,查看哪些账号被设置了委派,以及是何种类型的委派设置

约束性委派的发现:

1
2
3
Get-DomainUser TrustedToAuth -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto| fl
Get-DomainUser -TrustedToAuth -Domain beta.com
Get-DomainComputer -TrustedToAuth -Domain beta.com

非约束性委派的发现:

1
2
3
4
5
6
通过Import-Module PowerView.ps1加载PowerView脚本之后使用下面的命令进行查询
查询域中配置非约束委派的账户
Get-NetUser -Unconstrained -Domain <domain>

查询域中配置非约束委派的主机:
Get-NetComputer -Unconstrained -Domain <domain>

当一个用户具备对某个服务账号的 SeEnableDelegationPrivilege 权限时,表示可以更改服务账号的委派设置,一般情况下只有域管理员才具备这个权限。因此也可以利用 SeEnableDelegationPrivilege 属性,制作极其隐蔽的后门

攻击样例

已知被设置非约束性委派属性的服务账号的口令明文,则可以获取域管理权限

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200505112605.png-water_print

现在已知域内服务账号 sqlsvc 的口令明文,则可使用 keke 工具构造 sqlsvc 服务账号的票据。

1
tgt::ask /user:sqlsvc /domain:testlab.com /passw ord:1qaz@WSX3edc /ticket:sqlsvc.kirbi

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200505112611.png-water_print

由于 sqlsvc 被设置为非约束性委派,因此可以利用刚才伪造的 sqlsvc 票据,向域服务器发起申请访问域服务器 CIFS 服务的管理员权限的 TGS 的命令

1
Tgs::s4u /tgt:service_account_tgt_file /user:administrator@testlab.com /service:service_to_access

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200505113020.png-water_print

此时内存中已经有了访问域服务器 CIFS 服务的域管理员的 TGS 票据,需要将该票据注入当前的会话中,使用 mimikatz 的 kerberos::ptt 命令可完成票据的注入。注入票据后,当前的会话具备了访问域服务器 C 盘目录的权限

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200505113149.png-water_print

已控制非约束性委派服务账号所在的服务器

攻击者控制了服务器,与样例 1 类似。由于攻击者控制了服务器,可直接利用 mimikatz 从内存获取服务账号的 TGT,所以可以省去 tgt::ask 步骤,直接从 tgs:s4u 步骤开始,后续和样例 1 相同

已获取配置了约束性委派的服务账号的口令 NTLM

和样例 1 相同,样例 1 用明文口令生成 NTLM,然后向域服务器申请获取服务账号的 TGT。Kekeo 提供了该功能 ,可直接从 NTLM 开始,向域服务器申请 TGT。

一个主机账号被设置了约束性委派,已获取该主机账号的口令NTLM

方法和样例 1 也是类似,只不过样例 1 中是服务账号,而本样例中是主机账号。测试结果截图分别如下,不再过多解释。测试可在任何域内主机中进行,不需要在主机账号所在的主机。

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200505113609.png-water_print

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200505113722.png-water_print

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200505113740.png-water_print