利用域委派获取域管理权限

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

0x01 背景知识

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

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

上图是经典的应用场景。一个域内普通用户jack通过Kerberos协议认证到前台WEB服后,前台运行WEB服务的服务账号websvc模拟(Impersonate)用户jack,以Kerberos协议继续认证到后台服务器,从而在后台服务器中获取jack用户的访问权限,即域中跳或者多跳的Kerberos认证。按照图中红色字体的数字,具体步骤如下:

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

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

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

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

从网络攻击的角度看,如果攻击者控制了服务账号B,并诱骗管理员来访问服务A,则可以获取管理员的TGT,进而模拟管理员访问任意服务,即获得管理员权限。越是大型网络、应用越多的网络,服务账号越多,委派的应用越多,越容易获取域管理员权限。

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

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

在Windows系统中,普通用户的属性中没有委派(Delegation)这个选项卡,只有服务账号、主机账号才有。如下图所示。

 

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

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

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

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

Get-DomainUser -TrustedToAuth -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto| fl

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

 

0x03 攻击样例

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

测试主机为域内Windows 7系统,现在以普通域用户eviluser登录系统,IPC方式连接域服务器,访问域服务器的C盘目录,显示被拒绝,权限不够。

现在已知域内服务账号sqlsvc的口令明文,则可使用kekeo工具构造sqlsvc服务账号的票据。命令和执行结果如下,

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

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

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

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

 

样例2:已控制约束性委派服务账号所在的服务器

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

 

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

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

 

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

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

 

0x03 防范措施

从第一、二节可以看到委派带来的安全性隐患巨大,但委派又是经常要用到的、非常实用方便的应用模式,所以不能直接粗暴的禁止委派这种类型的应用,下面介绍几种降低这种安全隐患的方法。

  • 高权限的用户,设置不能被委派,如图所示。

  • 主机账号需设置委派时,只能设置为约束性委派;
  • Windows 2012 R2及更高的系统建立了受保护的用户组,组内用户不允许被委派,这是有效的手段。受保护的用户组,当这个组内的用户登录时(windows 2012 R2域服务器,客户端必须为Windows 8.1或之上):
  • 不能使用NTLM认证;
  • Kerberos预认证时不能使用des或者RC4等加密算法;
  • 不能被指定为委派;
  • 4个小时后TGT失效,需要重新认证。
(完)