使用Kerberoast破解Kerberos TGS票据:利用Kerberos突破活动目录域

http://p1.qhimg.com/t01876a66e1bfd82b39.jpg

译者:興趣使然的小胃

预估稿费:200RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


一、前言

微软在活动目录(Active Directory)中使用了Kerberos机制,在过去几年里,安全研究人员以及攻击者针对Kerberos的具体实现做了许多工作。所发现的问题主要与Kerberos的传统支持(legacy support)特性有关,早在2000年,微软就发布了Windows Server 2000,一起发布的还包括活动目录。当使用Kerberos RC4加密(RC4_HMAC_MD5)方式时,传统支持特性就会启用,因为NTLM密码散列广泛使用了这种加密类型。

有多个Kerberos攻击方法利用了微软在活动目录中使用的传统支持特性。当微软发布Windows 2000以及活动目录时,他们需要支持Windows NT以及Windows 95,在带来了许多安全特性的情况下,同时也带来了一些较不安全的配置问题。这意味着微软需要支持多个不同的客户端,并且让这些客户端能够使用Kerberos特性。一种较为简单的实现方法就是将NTLM密码散列作为Kerberos RC4加密私钥,来加密及签名Kerberos票据。一旦NTLM密码散列暴露,攻击者就将散列值用于各种攻击场景,其中就包括突破活动目录域(大家是否还记得Golden Tickets以及Silver Ticket?)

在15年之后,微软现在依然支持RC4 Kerberos加密。事实上,在Windows Vista以及Windows Server 2008之前,Windows并不支持AES加密。虽然较新的操作系统默认情况下会使用AES Kerberos加密,然而,网络中可能依然在广泛使用RC4 Kerberos加密,甚至许多网络设备在默认情况下会禁用AES Kerberos加密

当在Kerberos加密选项中引入AES后,Windows将AES用于散列中,这是传统Windows密码散列方法的一个突破。这意味着当Kerberos RC4加密使用NTLM密码散列作为加密密钥时,Kerberos AES加密会使用AES哈希.aspx)来加密Kerberos票据。

在2016年9月份,我和Will Schroederblog.harmj0y.net)在DerbyCon 6上做了次演讲,展示了Kerberoast的工作机制。现在大家可以查看我们演讲的幻灯片视频。大家可以在这里找到Will在演讲中做的demo。我在此处汇总了我在演讲中用到的所有幻灯片以及大多数视频资料。

这篇文章介绍了服务主体名称(Service Principal Name,SPN)的工作原理,也介绍了如何使用Kerberoast来离线破解密码。Will也发表了一篇文章,介绍了如何在不使用Mimikatz的情况下使用Kerberoast


二、活动目录Kerberos攻击

现在有各种类型的Kerberos攻击,从信息侦察(SPN扫描),到离线服务账户密码破解(Kerberoast)攻击,再到目标持久化驻留(Silver Ticket和Golden Ticket)等,应有尽有。

常用的活动目录Kerberos攻击方法如下:

SPN扫描:通过请求特定SPN类型的服务主体名称来查找服务。

Silver Ticket:伪造Kerberos TGS服务票据。

Golden Ticket:伪造Kerberos TGT认证票据。

MS14-068伪造PAC(Privilege Attribute Certificate,特权属性证书):利用域控上的Kerberos漏洞。

Diamond PAC:一种混合攻击,用到了Golden Ticket以及MS14-068伪造PAC。

内存中的万能钥匙(Skeleton Key)恶意软件:恶意软件会修改域控内存中LSASS认证进程,启用另一个有效的“万能钥匙(skeleton key)”密码,攻击者可以使用这个密码通过任意域账户的身份认证。

本文介绍了另一类Kerberos攻击,这种攻击使用了Kerberoast来破解Kerberos TGS服务票据。2015年时,我在多个安全会议上发表了多次演讲(BSides、Shakacon、Black Hat、DEF CON以及DerbyCon),2014年,Tim Medin在DerbyCon上也发表了关于“攻击微软Kerberos机制”的相关演讲(大家可以去查看相关的PPT.pdf)以及视频),在那次会议上,他公布了Kerberoast Python TGS cracker这个工具,这些参考资料都是本文研究成果的基础。


三、SPN扫描

传统意义上讲,攻击者会使用网络端口扫描来开展侦察,虽然在活动目录以及Kerberos环境中,这个环节已经不是那么必要了。之前我写过一篇文章,介绍了如何通过SPN扫描来开展侦察,这个过程需要请求域控上的特定服务主体名称(SPN)类型(需具备用户或计算机账户)。对于攻击者来说,需要扫描的最为有用的一种SPN类型就是“SQL”,扫描这种类型可以发现活动目录中所有注册过的SQL服务器。所有使用Kerberos认证机制的服务类型都会在活动目录中注册SPN,因为Kerberos需要SPN才能正常工作。首先,让我们回顾一下Kerberos的工作原理。

我创建了一个服务主体名称(SPN)页面,汇总了最常见的SPN以及这些SPN的具体用途。

利用SPN扫描获取服务信息

http://p2.qhimg.com/t01dfb3dc63ea8c83f4.png

利用SPN扫描来获取服务账户信息

http://p0.qhimg.com/t01cc676b6d9e514d1d.png

一旦攻击者掌握了与服务账户对应的一系列服务主体名称(SPN),就可以使用这些SPN请求Kerberos TGS服务票据,以便在离线条件下破解TGS密码。

请注意:以上两张截图均取自我用PowerShell编写的SPN扫描工具的输出结果,大家可以在我的GitHub页面中找到这个工具。

如果你已经安装了活动目录PowerShell模块,你可以使用Get-ADObject找出具备某个类型的所有SPN。命令如下:

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

我们可以在Windows Server 2008R2以及更高版本的Windows中,使用如下命令安装AD PowerShell模块:

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

四、Kerberos背景知识及通信过程

http://p3.qhimg.com/t01399ce82dff468b49.png

用户使用用户名及密码登录的过程如下。

1a、 密码会被转换为NTLM散列,时间戳使用散列进行加密,然后作为认证票据(TGT)请求(AS-REQ)中的认证因子发送给KDC。

1b、 域控(KDC)检查用户的信息(登录限制、组成员身份等)并创建票据授予票据(Ticket-Granting Ticket,TGT)。

2、TGT经过加密、签名后传送给用户(AS-REP)。只有域内的Kerberos服务(KRBTGT)能够打开并读取TGT数据。

3、当用户请求票据授予服务(Ticket Granting Service,TGS)票据时(TGS-REQ),用户需要向域控(DC)展示TGT数据。DC会打开票据,进行校验和检查。如果DC能够打开票据,并能通过校验和检查,那么会认为TGT为有效票据。此时TGT中的数据会被复制,以创建TGS票据。

4、DC使用目标服务账户的NTLM密码散列对TGS进行加密,然后将结果发送给用户(TGS-REP)。

5、用户访问目标服务,并发送TGS数据(AP-REQ)。目标服务会使用自己的NTLM密码散列打开TGS票据。

6、如果客户端需要双向验证(大家可以回想一下MS15-011:微软在2月份的组策略补丁中添加了UNC强化特性),除非需要PAC验证(这种情况非常少见),目标服务会接受TGS票据中的所有数据,而无需与DC进行通信。

五、使用Kerberoast破解服务账户密码

Kerberoast是一种非常有效的方法,无需向目标系统发送任何报文,就能以普通用户身份从活动目录中提取服务账户凭证。因为人们往往会使用安全性较低的密码,所以这种攻击较为有效。大多数服务账户的密码长度与域密码长度所需的最小值相同(通常情况下为10或12个字符),这意味着即使使用暴力破解方法,所需的时间也不会比密码失效的时间长(即过期时间)。大多数服务密码没有设置过期时效,因此同一个密码可能适用于好几个月甚至好几年。此外,大多数服务账户权限过高,通常属于域管(Domain Admins)组成员,因此就具备活动目录的管理员权限(有时候服务账户只需要修改特定对象类型的属性,或者拥有特定服务器的管理员权限)。

抵御这种攻击的最为有效的一种方法,就是确保服务账户的密码长度大于25个字符。我们可以依托托管服务账户以及组管理服务账户来确保服务账户的密码足够长、足够复杂以及定期修改。提供密码托管服务的第三方产品也是管理服务账户密码的有效方法。

请注意:这种攻击方法不会影响Windows系统中托管的服务,因为这些服务映射到活动目录中的计算机账户,使用了128个字符长度的密码,无法在短时间内被破解。

这种攻击需要为目标服务账户的服务主体名称(SPN)请求Kerberos服务票据(TGS)。为了发起请求,攻击者需要使用一个有效的域用户认证票据(TGT),为目标服务器上的目标服务请求一个或多个服务票据。域控不会去跟踪用户是否真正连接到这些资源(也不会去判断用户是否有访问权限)。域控在活动目录中查找SPN,使用对应的服务账户来加密票据,以便目标服务能够验证用户的访问权限。所请求的Kerberos服务票据的加密类型是RC4_HMAC_MD5,这意味着服务票据使用了服务账户的NTLM密码散列进行加密。因此,Kerberoast可以尝试不同的NTLM散列来打开Kerberos票据,一旦打开成功,就能获取正确的服务账户密码。

获得服务票据的这一过程不需要提升权限,也没有任何流量会发往目标系统。

Tim Medin发布了Kerberoast Python TGS cracker这个工具,并在DerbyCon 2014.pdf)上讨论了相关方法。

http://p4.qhimg.com/t01499c5fddebb239c2.png

攻击者无需掌握目标服务器或目标网络的管理员权限就能破解服务账户密码。突破某台主机后,攻击者就可以使用服务账户请求多个服务的TGS票据,从内存中提取TGS票据,将票据保存到文件,然后上传至网站或者网络服务(如Google Drive)中。攻击者可以通过互联网获取这些文件,然后使用Kerberoast处理这些文件,直到识别出正确的NTLM密码散列为止。成功打开TGS就意味着攻击者已经拿到了服务账户密码。

请注意,攻击者也可以通过嗅探网络流量来实施这种攻击,捕获使用RC4_HMAC_MD5加密的Kerberos TGS票据。

我编写了一个PowerShell脚本,名为Discover-PSMSSQLServers.ps1,用来展示这种攻击过程。这个脚本可以发现域或森林中的所有的SQL服务器,识别对应的服务账户。如果发现域用户账户的存在,所关联的账户密码很有可能不会太强,因此该账户可以作为目标网络的突破口。

1、利用SPN扫描发现具备服务账户的SQL服务器。

http://p1.qhimg.com/t01dc28cbd20be12641.png

http://p8.qhimg.com/t013662425e0d75eed6.png

2、识别目标后,我们使用PowerShell请求特定服务主体名称(SPN)的服务票据

请注意:这里我们所请求的服务票据使用了RC4加密类型。

http://p1.qhimg.com/t011ac06c29936bd0fe.png

观察捕获的数据包,我们可以发现Kerberos通信报文,注意其票据类型为RC4-HMAC-MD5。

http://p8.qhimg.com/t01da7642c5271cab29.png

3、客户端收到票据后,无需提升权限,我们就可以使用Mimikatz(或其他工具)从用户的内存空间中提取所有的Kerberos票据。

http://p3.qhimg.com/t015ae7cbbdf0d302a5.png

4、将服务票据导出为文件后,我们可以将该文件发送给攻击主机,我们的攻击主机使用的是Kali Linux系统,包含Kerberoast工具。结合合适的字典文件(wordlist.txt),我们有可能能破解票据文件所关联的服务账户的密码。

http://p3.qhimg.com/t010538a62ae3106736.png

现在,攻击者已经掌握了目标服务器上有效的服务账户的用户名及密码,因此很有可能掌握了目标服务器的管理员权限。

许多企业内部通常会给服务账户赋予过高的权限,并且这些账户经常会使用弱口令,因此攻击者可以利用这些脆弱性实现从普通域用户到域管用户的提升。

六、缓解策略

请确保所有的服务账户(即带有服务主体名称的用户账户)使用较长的、复杂的密码,密码长度要大于25个字符,最好是30或30以上个字符。这样就能使密码的破解更为困难。具备较高活动目录权限的服务账户应该是重点防护对象,要确保这些账户使用较长且复杂的密码。同时,我们要确保服务账户的密码定期更换(每年至少应当更换一次)。如果有可能的话,我们可以使用组管理服务账户来管理密码,这样活动目录就能自动管理密码,确保账户使用随机且复杂的密码(密码长度大于100个字符)。

七、检测方法

检测这类攻击非常困难,因为每当用户需要访问资源时,都需要请求服务票据(Kerberos TGS票据)。寻找具有RC4加密类型的TGS-REQ报文可能是最为有效的方法,虽然这种检测方法可能会得到假阳性结果。

我们可以启用Kerberos服务票据请求监控功能(“审计Kerberos服务票据操作”),在日志中搜索与4769事件有关的用户,来监控活动目录中大量的Kerberos服务票据请求(4769事件表示的是“请求Kerberos服务票据(A Kerberos service ticket was requested)”)。

八、参考资料

[1] Sean Metcalf关于活动目录安全的演讲

[2] Kerberoast

[3] Tim Medin在DerbyCon 2014上发表的“攻击微软Kerberos机制”的演讲(幻灯片.pdf)及视频材料)。

[4] 我个人的GitHub仓库

(完)