Kerberos无约束委派的攻击和防御
0x00 前言简介
当Active Directory首次与Windows 2000 Server一起发布时,Microsoft就提供了一种简单的机制来支持用户通过Kerberos对Web服务器进行身份验证并需要授权用户更新后端数据库服务器上的记录的方案。这通常被称为Kerberos double-hop issue(双跃点问题),需要委派才能使Web服务器在修改数据库记录时模拟用户操作。
0x01 Kerberos Unconstrained Delegation(Kerberos无约束委派)
Microsoft在Windows 2000中已添加了Kerberos“无约束委派”功能。域管理员可以通过勾选第二个复选框来启用此委派级别。第三个复选框用于“约束委派”,它要求在启用了委派的计算机上列出特定的Kerberos服务。
使用Active Directory PowerShell模块的Get-ADComputer发现Kerberos无约束委派的计算机是比较容易。
无约束的委托:TrustedForDelegation = True
约束委派:TrustedToAuthForDelegation = True
0x02 Kerberos通信流程
让我们遵循标准的Kerberos通信流程,这是一个描述Kerberos如何工作的快速示例:
用户使用用户名和密码登录
1A.密码转换为NTLM哈希且时间戳用哈希加密,并把它作为身份验证票证(TGT)请求(AS-REQ)的身份验证者发送到KDC(密钥分配中心)
1B.域控制器(KDC)检查用户信息(登录限制,组成员等)并创建票据授予票证(TGT)
2. TGT经过加密和签名并发送给用户(AS-REP)。只有域中的Kerberos服务(KRBTGT)才能打开和读取TGT数据
3.当请求票证授予服务(TGS)票证(TGS-REQ)时,用户将TGT发送给DC。DC打开TGT并验证PAC校验----如果DC可以打开票证并校验和检出,则TGT 是有效的,TGT中的数据被有效地复制来创建TGS票证
4.使用目标服务帐户的NTLM密码哈希对TGS进行加密并发送给用户(TGS-REP)
5. 用户连接到服务器托管服务的适当的端口并发送给TGS(AP-REQ)。 该服务使用其NTLM密码哈希打开TGS票证。
当托管在TGS-REQ中引用的服务主体名称中指定的服务的服务器上启用Kerberos无约束委派时(步骤3),DC控制器的域控制器将用户的TGT副本存放到服务票证中。当用户的服务票证(TGS)被提供给服务器以进行服务访问时,服务器打开TGS并将用户的TGT放入LSASS以方便以后使用。Application Server现在可以无限制地模拟该用户操作!
注意:为了使应用程序服务器配置“Kerberos Unconstrained Delegation”,域管理员或企业管理员需要在域中的计算机帐户上配置此设置。此权限可以委派给其他组,因此请谨慎在Active Directory中授权用户权限。
0x03 无约束委派盗取凭证
作为攻击者,一旦找到具有Kerberos无约束委派的服务器,那么下一步可以如下:
1.通过管理员或服务帐户攻击服务器。
2.通过社会工程学使用Domain Admin连接到服务器上的任何服务,并且具有无约束委派权限。
3.当管理员连接到此服务时,管理员的TGS服务票证(使用TGT)将发送到服务器并存入LSASS中,以方便以后使用。
4.可以提取并重新使用域管理员身份验证(TGT)票证(直到票有效期为止)。
5.可以立即使用该票证以获取域KRBTGT帐户密码哈希(当域管理员被泄露时),在这种情况下,我们使用PowerShell远程操作作为域管理员连接到域控制器。
0x04 防御措施
1.不要使用Kerberos无约束委派权限 -----配置需要使用约束委派进行委派的服务器
3.从Windows Server 2012 R2域功能级别开始提供的“受保护用户”组也可以缓解此问题,因为此组中的帐户不允许委派。
注意:
当受保护用户的组帐户升级到Windows Server 2012 R2域功能级别时,将自动应用基于域控制器的保护。对Windows Server 2012 R2域进行身份验证的受保护用户组的成员无法再使用以下身份进行身份验证:Windows 8.1设备连接到Windows Server 2012 R2主机时.
默认凭据委派(CredSSP):即使启用了“ 允许委派默认凭据组策略”设置,也不会缓存纯文本密码凭据。
Windows摘要(Windows Digest):即使启用了Windows摘要,也不会缓存纯文本密码凭据。
NTLM:NT单向函数NTOWF的结果不会被缓存
Kerberos长期密钥:来自Kerberos初始TGT请求的密钥通常被缓存,因此不会中断身份验证请求。对于此组中的帐户,Kerberos协议会在每个请求中验证身份验证。
离线登录:登录时不会创建缓存的验证程序