Kerberoast攻击的另一种姿势

李白 内网渗透 2017年3月9日发布

导语:大约在两年前,Tim Medin提出了一种新的攻击技术,他称之为“Kerberoasting”。尽管在这种攻击技术发布时我们还没有意识到其全部的含义,但这种攻击技术已经改变了我们的交战游戏。

大约在两年前,Tim Medin提出了一种新的攻击技术,他称之为“Kerberoasting”。尽管在这种攻击技术发布时我们还没有意识到其全部的含义,但这种攻击技术已经改变了我们的交战游戏。最近,Kerberoasting受到越来越多的关注,@mubix发布了以Kerberoasting为主题的三篇连载系列的博文,Sean Metcalf也发表过一些文章,另外@leonjza也做了一个不错的write-up。

@machosec 在 PowerView 中pull了一个很强大的更新请求,使得使用纯PowerShell进行Kerberoasting要比以往任何时候更加容易。我想在本文中简要介绍这种技术及其背景,包括我们最近使用这种攻击技术的一些情况,以及一些很棒的新发现。

Kerberoasting背景介绍

我第一次听到Kerberoasting,是在2014年的SANS HackFest 上Tim演示了“攻击Kerberos:踢爆守卫者的狗头”的演讲(他还在发布了Kerberoasting工具包)。我将简要地说明这种攻击姿势的一些技术细节,但我强烈建议你阅读Tim的PPT或Sean的一些解释以获取更多详细信息。还有一个微软发布的很不错的文档,标题为“Windows 上的 Kerberos技术补充”,这个文档最终很好的解释清楚了攻击过程中涉及的几个让我感到迷惑的点。

我制作了一个kerberos工作过程的图解,如下图所示:

1488962480866492.png

下面是我对Kerberoasting在这个过程中的理解(如果我的理解有误,请让我知道!):在用户认证到密钥分发中心后(在Windows域中KDC就是域控制器),他们会收到一个票证授予票(TGT),此票证使用域的krbtgt帐户进行了签名,证明他们是谁。然后TGT被用于请求域中的特定资源或服务的服务票证(TGS)。部分服务票证使用了目标服务实例的NTLM哈希进行加密。那么KDC如何确定在加密这些服务票证时使用什么密钥?

Windows实现的Kerberos协议使用服务主体名称(SPN)来确定使用哪个服务帐户的哈希来加密服务票证。在Active Directory中有两种“类型”的服务主体名称:链接到域计算机帐户的“基于主机”的SPN和通常(但不总是)链接到域用户帐户的“任意”的SPN。

微软解释说,“当在Active Directory中创建新的计算机帐户时,将自动为内置服务生成基于主机的SPN …实际上,仅为HOST服务创建了SPN,并且所有内置服务都使用HOST SPN ”。换句话说,“HOST服务代表了托管计算机。 HOST SPN用于访问托管计算机帐户,长期密钥由Kerberos协议在创建服务票据时使用。以下是我测试的域中的默认计算机帐户示例:

1488962515589401.png

你可以看到HOST/WINDOWS1 和WINDOWS1$计算机账户的SPN——HOST/ WINDOWS1.testlab.local。当域用户请求访问 WINDOWS1.testlab.local  C $时,KDC会将此请求映射到HOST/WINDOWS1.testlab.local 这个SPN,这表示WINDOWS1$ 的计算机帐户的NTLM 哈希(存储在WINDOWS1本地和DC/KDC上的NTDS.dit Active Directory数据库中)被用于加密服务器部分的服务票证。然后将签名或加密的票证提供给WINDOWS1.testlab.local,WINDOWS1.testlab.local负责确定请求用户是否应该被授予访问权限。

从Kerberoasting的角度来看,我们通常不关心基于主机的SPN,因为计算机的机器帐户密码默认是随机的,每30天更换一次。但是,请记住,可以为域用户帐户注册任意的SPN。一个常见的例子就是一个服务账户管理着多个MSSQL实例;此用户帐户注册的每个MSSQL实例都有一个<MSSQLSvc/HOST:PORT> 这样的SPN,这个SPN存储在用户的serviceprincipalname属性里(Sean保持的SPN更新列表可以在这里找到)。如果我们有一个为域用户帐户注册的任意SPN,那么该用户帐户的明文密码的NTLM哈希值就将用于创建服务票证。这就是Kerberoasting攻击的关键。

“为什么这是重要的?”

由于Kerberos的工作原理,任何用户都可以请求在Active Directory中的用户或计算机帐户中具有已注册SPN(HOST或任意)的任何服务的TGS。请记住,只是请求此票证并不会授予对请求用户的访问权限,因为服务器或服务才会最终确定是否应授予用户访问资源的权限。 Tim认识到,由于这一点,并且因为请求SPN实例的TGS的一部分是用服务帐户的明文密码的NTLM哈希进行了加密,所以任何用户都可以请求这些TGS票证,然后离线破解服务帐户的明文密码,而不用担心帐户被锁定的风险!

要重申的是,任何具有服务主体名称的域用户帐户都可以被该域中任何用户请求该SPN的TGS,从而允许攻击者离线破解服务帐户的明文密码!这显然取决于一个可破解的服务帐户明文密码的复杂度,但幸运的是,对我们来说,服务帐户往往设置了简单的密码并且很少更改。

Tim在他演示的PPT的第18页提到了如下内容:

1488962582615560.png

“老套的”Kerberoasting攻击姿势

Tim给出的利用方法或工具包是使用工具集的组合来请求票证,并从内存中提取(使用Mimikatz)票证,然后将它们转换为可破解的格式。一般来说,整个过程如下:

1. 使用Tim的GetUserSPNS.ps1脚本或者Sean的Find-PSServiceAccounts.ps1脚本或PowerView的“Get-NetUser -SPN”来枚举域帐户的SPN。

2. 请求这些特定的SPN的 TGS可以使用Windows内置的工具setspn.exe或者在PowerShell中调用.NET的

 System.IdentityModel.Tokens.KerberosRequestorSecurityToken类。

3. 使用Mimikatz的kerberos::list/export命令从内存中提取这些票证,并设置可选的base64导出格式。然后下载票据,或者将base64编码的票证拖到攻击者的机器上进行解码。

4. 使用Tim的tgsrepcrack.py开始离线破解密码,或者使用John the Ripper的kirbi2john.py从原始票证中提取可破解的哈希格式。

5. xan7r给 Tim的工具集增加了一个分支,他添加了一个autokerberoast.ps1脚本,自动化了上述攻击过程。此外,@ tifkin_写了一个Go语言版本的TGS爆破器,比原来的Python版本要快一些。

Kerberoasting攻击的“新姿势”

最近出现了一些东西,简化了我们使用Kerberoasting攻击的过程。首先,Michael Kramer在2015年9月将KRB5TGS格式添加到了John the Ripper中。其次,@ Fist0urs在2016年2月向Hashcat提交了相同的算法,为破解这些票证打开了基于GPU破解的大门。这对我们来说真是一个分水岭,因为它极大地扩展了我们可以破解的服务帐户密码的范围。最后,Matan Hart(@machosec)对PowerView的一个pull请求删除了对Mimikatz的需求。

因为,@machosec意识到在之前使用的.NET类KerberosRequestorSecurityToken中也有一个GetRequest()的方法,它返回Kerberos服务票证的原始字节流。使用位字符串操作,Matan能够轻松地提取加密的TGS(即可破解的哈希)。我们现在可以不再依赖Mimikatz提取票证了!

我最近将一些必要的功能转换成了一个单独的,自包含的脚本文件,其中包含来自PowerView的一些必要组件(这也会在Empire中更新)。我们目前正在重构PowerSploit的一些大型组件,并且更新的功能将会在更改后发布。这个自定义脚本包括Invoke-Kerberoast函数,该函数包装了Get-NetUser -SPN(枚举servicePrincipalName属性值为非null的用户帐户)的逻辑和Get-SPNTicket,以请求关联的TGS票证并输出John the Ripper和Hashcat的可破解字符串。脚本的输出如下图所示:

1488962718801529.png

它也适用于跨域请求!

1488962738721146.png

默认情况下,输出John the Ripper的格式,可以使用-OutputFormat Hashcat输出Hashcat支持的格式。 请注意,-AdminCount参数只有Kerberoasts帐户的AdminCount属性为 1才有意义,这意味着这个账户是受保护的用户帐户,因此,这样的账户几乎总是高权限账户:

1488962815434806.png

下面是更新的Empire模块:

1488962839871884.png

请注意,对于非Empire的用法,当输出PSObject时,你需要将结果传递到Format-List或ConvertTo-Csv -NoTypeInformation,以保留你想要显示的信息。 然后你就可以利用@mubix在他的第三篇文章中所描述的破解方法破解这些票证了。

本文参考来源于harmj0y,如若转载,请注明来源于嘶吼: http://www.4hou.com/technology/3640.html
点赞 0
  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论

    蔡宁宁 2017-03-09 09:50

    好厉害