SPN

什么是SPN

SPN,ServicePrincipal Names,即服务主体名称,是服务实例(比如:HTTP、SMB、MySQL等服务)在使用 Kerberos 身份验证的网络上的唯一标识符,其由服务类、主机名和端口组成。

Kerberos 认证过程使用 SPN 将服务实例与服务登录账户相关联,如果想使用 Kerberos 协议来认证服务,那么必须正确配置SPN。

在使用 Kerberos 身份验证的网络中,必须在内置计算机帐户或域用户帐户下为服务器注册 SPN。

对于内置机器帐户,SPN 将自动进行注册。但是,如果在域用户帐户下运行服务,则必须为要使用的帐户手动注册 SPN。

对于“Kerberoasting”利用而言,我们主要还是关注域用户账户下运行的服务。因为内置计算机账户无法远程登录。

SPN 分为两种类型:

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

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

SPN的语法格式

<service class>/<host>:<port> <servername>
    服务类型    /对应机器名:服务端口[默认端口可不写]

#其中 <service class> 和 <host> 为必需元素

<service class> 可以理解为服务的名称,常见的有 WWW、LDAP、SMTP、DNS、HOST 等,例如 MSSQLSvc/WIN-TL226LF48RT.corp.vk.local:1433

<host> 有两种形式,FQDN 和 NetBIOS 名,例如 WIN-TL226LF48RT.corp.vk.local 或者是 WIN-TL226LF48RT

如果服务运行在默认端口上,则端口号 <port> 可以省略

查询SPN

由于每台服务器都需要注册用于 Kerberos 身份验证服务的 SPN,因此这为在不进行大规模端口扫描的情况下收集有关内网域环境的服务运行信息提供了一个更加隐蔽的方法。

对域控制器发起LDAP查询,这是正常kerberos票据行为的一部分,因此查询SPN的操作难以被检测到。

使用 SetSPN 查询

SetSPN 是 Windows 系统自带的工具,可以查询域内的 SPN:

setspn -Q */*    # 查看当前域内所有的 SPN
setspn -T mumsec.com -Q */*    # 查看指定域 mumsec.com 注册的SPN, 如果指定域不存在, 则默认切换到查找本域的 SPN
setspn -L <username>/<hostname>    # 查找指定用户/主机名注册的 SPN

使用 GetUserSPNs.ps1 脚本

https://github.com/nidem/kerberoast.git

GetUserSPNs 是 Kerberoast 工具集中的一个 PowerShell 脚本,可以用来查询域内用户注册的 SPN。

Import-Module .\GetUserSPNs.ps1

使用 PowerView.ps1 脚本

https://github.com/PowerShellMafia/PowerSploit/

PowerView 是 PowerSploit 框架中 Recon 目录下的一个 PowerShell 脚本,PowerView 相对于上面几种是根据不同用户的 objectsid 来返回,返回的信息更加详细。

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