SPN,即Service Principal Name,客户端通过Kerberos请求使用某种服务时,会在请求中附带上需要访问的服务的SPN名称,如文件共享服务cifs/DNS_DOMAIN_NAME,目录访问服务ldap/DNS_DOMAIN_NAME。KDC(密钥分发中心)将通过SPN来确定客户端请求访问的是主机上的哪个具体服务,因为一个主机上通常情况下同时提供多种支持Kerberos认证的服务,随后,KDC将使用该服务账号的密码哈希来对票据进行加密。

SPN(Service Principal Name) - 图1

SPN(Service Principal Name) - 图2

这里列出了域控中常见SPN,通过SPN遍历,不需端口扫描即可发现域内主机及服务。

  1. // 任意域机器上执行即可
  2. # 列出账户或机器相关的SPN
  3. setspn.exe -L win10-pc2
  4. setspn.exe -L ring2\win10
  5. # 列出所有SPN
  6. $search = New-Object DirectoryServices.DirectorySearcher([ADSI]"")
  7. $search.filter = "(servicePrincipalName=*)"
  8. $results = $search.Findall()
  9. foreach($result in $results){
  10. $userEntry = $result.GetDirectoryEntry()
  11. Write-host "Object Name = " $userEntry.name -backgroundcolor "yellow" -foregroundcolor "black"
  12. Write-host "DN = " $userEntry.distinguishedName
  13. Write-host "Object Cat. = " $userEntry.objectCategory
  14. Write-host "servicePrincipalNames"
  15. $i=1
  16. foreach($SPN in $userEntry.servicePrincipalName)
  17. {
  18. Write-host "SPN(" $i ") = " $SPN $i+=1
  19. }
  20. Write-host ""
  21. }

参考

【Windows域】Kerberoasting