导语:在过去几年中,微软在Active Directory中为了保证安全而实施的Kerberos身份验证的方式已经被许多安全研究人员和攻击者盯上并发现了多个安全漏洞。

译者注:建议读者在阅读此文之前,最好先去了解一下Kerberos协议的通信过程和“黄金票证”,“白银票证”,“万能钥匙”的攻击原理和方法以及“Mimikatz”的一些用法。

可以参考以下几篇文章:

域渗透的金之钥匙 – Mickey http://t.cn/RJkooX3
Mimikatz 非官方指南和命令参考Part1-3 – Her0in
Part.1 http://t.cn/RJkoks4
Part.2 http://t.cn/RJkKfgB
Part.3 http://t.cn/RJkKXnq
从活动目录获取域管理员权限的各种姿势 - 修码的马修  http://t.cn/RJkKdKt

在过去几年中,微软在Active Directory中为了保证安全而实施的Kerberos身份验证的方式已经被许多安全研究人员和攻击者盯上并发现了多个安全漏洞。安全问题产生的主要原因与Kerberos早起版本所支持的一些特性有关,在2000年,微软发布了 Windows Server 2000 ,在此版本的Windows Server 中也发布了Active Directory。RC4加密算法(RC4_HMAC_MD5)是Active Directory中最早支持并用在Kerberos协议中的一种加密算法,同时也是一种被广泛用于加密NTLM密码哈希的加密类型。

目前,已经有几种针对 Kerberos 的攻击方式,这些方式均利用了Active Directory中所支持的一些早期特性。当发布Windows 2000和Active Directory时,微软打算在 Windows NT 和 Windows 95 上也支持Active Directory,这意味着不仅会产生各种各样的安全问题也会导致更多不安全的配置方式。同时,也意味着,微软要保证在多个不同版本的 Windows 客户端上均支持Kerberos协议。要实现这个想法的一个简单的办法就是在Kerberos协议中使用RC4加密算法,并将NTLM密码哈希作为该加密算法的私钥,该私钥可用于加密或签名Kerberos票证。因此,对于攻击者来说,一旦发现了 NTLM 密码哈希,就可以随意使用,包括重新拿回Active Directory域权限(比如:黄金票证和白银票证攻击)。

即使是现在(15年后的今天 “译者注:原文的发表时间是2015年”),Kerberos 协议中仍然支持RC4加密算法。实际上,在Windows Vista和Windows Server 2008 中,也可以选择使用AES加密算法。虽然在较新的操作系统上默认情况下Kerberos协议使用的是AES加密,但是在网络上仍然有一些攻击者感兴趣的网络设备在Kerberos协议中使用了RC4加密,这些网络设置在默认情况下禁用了Kerberos使用AES进行加密。

更新:在2016年9月的DerbyCon 6 的演讲议题中,harmj0y和我演示了Kerberoast攻击的工作原理

议题的PPT:https://adsecurity.org/wp-content/uploads/2016/09/DerbyCon6-2016-AttackingEvilCorp-Anatomy-of-a-Corporate-Hack-Presented.pdf

议题的视频:https://youtu.be/nJSMJyRNvlM?t=16

其他的一些议题:https://adsecurity.org/?page_id=1352

本文主要会介绍 服务主体名称的工作原理,以及如何使用Kerberoast离线破解密码。

Active Directory中的Kerberos攻击:

有几种针对Kerberos攻击的不同类型的手段,从信息探测(SPN扫描)到离线破解服务帐户密码(Kerberoast),到权限持久控制(黄金票证和白银票证攻击)。

下面是几个非常流行的AD Kerberos攻击方式:

SPN扫描 – 使用SPN Class/Type 请求特定的服务主体名称来查找主机是否提供了对应的服务。
白银票证 - 伪造Kerberos TGS服务票证
黄金票证 - 伪造Kerberos TGT身份验证票证
MS14-068伪造PAC的漏洞 - 利用域控上的Kerberos漏洞。
钻石PAC - 使用黄金票证和MS14-068伪造PAC漏洞的组合式攻击类型。
万能钥匙 - 恶意软件在内存中对域控的LSASS身份验证过程进行“补丁”,启用了第二个有效的“万能钥匙”密码,该密码可以验证通过任何一个域帐户。

本文的内容包含了另外一种针对Kerberos协议的攻击类型——利用Kerberoast破解Kerberos TGS服务的票证。这些内容是基于我在2015年参加过的几次安全会议上的演讲议题(BSides, Shakacon, Black Hat, DEF CON, & DerbyCon)以及 Tim Medin 在 DerbyCon 的演讲和一些开源工具。

SPN扫描

传统的网络渗透中,攻击者通常使用网络端口扫描进行内网信息探测,不过在使用了Active Directory和Kerberos的当代内网中,根本没必要这么做。我以前也写过关于利用“SPN扫描”探测内网端口的文章,那篇文章的内容涉及到了请求域控的特定服务主体名称(SPN)类型(需要一个用户或计算机帐户)获取主机提供的服务。对于攻击者来说,最有用的SPN类型之一就是“SQL”,通过“SPN扫描”就可以发现在Active Directory中已注册的所有SQL Server 服务器。使用Kerberos身份验证的所有服务类型都会在Active Directory中注册SPN,因为Kerberos的验证过程需要SPN。首先,让我们回顾一下Kerberos是如何工作的。

维护了一个服务主体名称(SPN)目录,其中包含了最常见的一些SPN及其用途。

利用SPN扫描主机提供的服务:

1490523797878189.png

利用SPN扫描主机提供的服务对应的服务账户:

1490523838847779.png

一旦攻击者有了与服务帐户相关联的服务主体名称(SPN)的列表,那么,攻击者就可以利用这些SPN去请求一些主机,拿到Kerberos TGS服务票证,这些票证可用于离线破解TGS密码。

注意:以上两张截图中执行SPN扫描的PowerShell函数都是我写的,可以在我的GitHub存储库中找到。

如果已安装了Active Directory PowerShell模块,则可以使用Get-ADObject轻松找到特定类型的所有SPN。

get-adobject -filter {serviceprincipalname -like“* sql *”} -prop serviceprincipalname

可以使用下面的命令在Windows Server 2008R2及更高版本上快速安装Active Directory PS模块:

import-module servermanager; add-windowsfeature RSAT-AD-PowerShell

Kerberos概述和通信流程:

1490523897852894.png

用户使用用户名和密码进行登录。

1a.将原始的明文密码转换为NTLM哈希,再将这个哈希和时间戳一起加密。最后,将加密的结果作为身份验证者发送到KDC进行身份验证的票据(TGT)请求(AS-REQ)。

1b.域控(KDC)检查用户信息(登录限制,组成员等)并创建票证授权票证(Ticket-Granting Ticket 

-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票证。

6.如果客户端需要进行相互之间的身份验证(可以想想MS15-011:在2月份发布的强化UNC的组策略补丁)就会执行这一步。

除非需要验证PAC(很少有这样的情况),否则托管的服务会接受TGS票证中的所有数据,而且不会与DC进行通信。

使用Kerberoast破解服务帐户密码

Kerberoast是一种可以作为普通用户从Active Directory中提取服务帐户凭证而不需要向目标系统发送任何数据包的有效方法。这种攻击的效果非常好,因为人们会倾向于创建一些不是很强壮的密码。此攻击之所以能够成功的原因是因为大多数服务帐户密码的长度与域密码的最小长度相同(长度通常为10或12个字符),这意味着即使使用暴力破解所花费的时间也不可能超过密码的有效期。同时,大多数服务帐户没有设置密码的过期时间,因此很可能相同的密码会在很长时间内没有修改过而一直有效。此外,大多数服务帐户的权限都是过度授权的,而且通常情况下这些账户也是域管理员组的成员,在Active Directory中具有完全的管理权限(即使服务帐户的用途只是需要修改特定对象类型上的属性或特定服务器上的管理员权限)。

缓解这种攻击的最有效的措施是确保服务帐户密码的长度超过25个字符。

托管服务帐户组托管服务帐户是确保服务帐户密码够长,够复杂以及定期修改的一个好方法。提供密码保管的第三方产品也是管理服务帐户密码的一种很不错的解决方案。

注意:如果是由Windows系统托管的服务,那么此攻击是不会成功的,因为在Active Directory中这些服务会映射关联到一个具有128个字符长度密码的计算机帐户,这种长度的密码不可能很快就被破解出来。

此攻击方式主要是利用了请求目标服务帐户的服务主体名称(SPN)的Kerberos服务票证(TGS)。此请求需要使用有效的域用户的身份验证票证(TGT)去请求运行在服务器上的一个或多个目标服务的服务票证。域控不会跟踪或记录用户是否实际连接到了这些资源(即使用户有访问权限)。域控在Active Directory中查找SPN,并使用与SPN关联的服务帐户加密票证,以便服务能够验证用户是否可以访问。请求的Kerberos服务票证的加密类型是RC4_HMAC_MD5,这意味着服务帐户的NTLM密码哈希用于加密服务票证。于是,利用Kerberoast就可以尝试通过不同的NTLM哈希值来打开Kerberos票证,直到成功打开票证为止,此时,正确的服务帐户密码也就爆破出来了。

不需要提升权限来获取服务票证,也不会向目标服务器发送任何流量。

Tim Medin发布了Python版的Kerberoast TGS 破解器,并在DerbyCon 2014上讨论了这些方法。

1490523976402758.png

攻击者可以破解服务帐户密码,而无需提前获得服务器或网络的管理权限。攻击者在内网拿到一台“跳板”计算机,并向服务帐户请求多个服务的TGS票证。之后,从内存中导出TGS票证,将其保存到文件中,并上传到自己的网站或网络服务中(如:Google网盘)。攻击者下载了这些文件,并利用Kerberoast对服务账户密码进行爆破,直到成功打开了TGS,此时也爆破出了正确的NTLM密码哈希,同时,也意味着拿到了服务帐户的密码!

注意,这种攻击也可以通过嗅探网络流量或者离线抓取使用RC4_HMAC_MD5加密的Kerberos TGS票证。

接下来,我将使用PowerShell脚本演示攻击过程,我写了一个名为Discover-PSMSSQLServers.ps1的脚本文件。此脚本可以发现域或林中的所有SQL Server服务器,并标识出关联的服务帐户。如果这个服务账户是一个域用户,那很可能这个账户的密码不是很强壮,所以可以对该帐户发起Kerberoast攻击。

1.     通过“SPN扫描”获取具有服务帐户的SQL服务器。

1490524022840926.png

1490524044644889.png

2.识别目标之后,我们使用PowerShell请求此服务主体名称(SPN)的服务票证。

请注意,请求的服务票证的加密类型为RC4。

1490524082632406.png

查看捕获的数据包,我们可以看到Kerberos协议通信的过程,并注意票证的加密类型是RC4-HMAC-MD5。

1490524115764961.png

3.客户端接收到票证后,我们就可以使用Mimikatz(或其他工具)在用户的内存空间中导出所有Kerberos票证,此操作无需提升权限。

1490524148649876.png

4.将服务票证导出到文件后,放到Kali Linux中并使用Kerberoast进行爆破。爆破能否成功取决于字典文件是否强大,事实上,我们很可能会破解出与票证(文件)相关联的服务帐户的密码。

1490524183818585.png

攻击者如果知道了一台服务器(或多台服务器)上的服务帐户的用户名和密码,并且这些账户可能具有管理员权限,那么攻击者就可以进一步渗透内网了。

由于在许多企业内网中,服务帐户通常过度授权而且设置了非常弱的密码,因此这也是一种攻击者从域用户提升权限到域管理员的一种简单方法。

缓解措施

确保所有的服务帐户(具有服务主体名称的用户帐户)的密码够长,够复杂,密码长度要大于25个字符,最好是30个左右或更长。这会使得破解这些密码变得更加困难。具有AD高权限的服务帐户更应该确保有足够长而且足够复杂的密码。另外,确保定期修改所有的服务帐户密码(至少每年更改一次)。如果可能的话,请使用组管理服务帐户,它会提供足够随机,复杂的密码(长度大于100个字符)并且可以由Active Directory自动管理。

攻击检测

检测是非常困难的,因为在用户需要访问资源时本来就会请求服务票证(Kerberos TGS票证)。

寻找具有RC4加密的TGS-REQ数据包可能是最好的方法,尽管很可能会有“误报”。

可以在Active Directory中监视许多Kerberos服务票证请求,启用Kerberos服务票据请求监视(“审计Kerberos服务票证行为”)并搜索事件ID为4769的用户(Eventid 4769“请求了Kerberos服务票证”)。

参考:

Sean Metcalf关于Active Directory安全的演讲议题

Kerberoast(GitHub)

Tim Medin在2014年的DerbyCon的“攻击Microsoft Kerberos Kicking the Guard Dog of Hades”演讲文稿(PPT视频)。

我的GitHub地址

源链接

Hacking more

...