1.什么是SPN
服务主体名称 (SPN) 是服务实例的唯一标识符。 Kerberos 身份验证使用 SPN 将服务实例与服务登录帐户相关联。 这允许客户端应用程序请求服务对帐户进行身份验证,即使客户端没有帐户名称。
如果在计算机的整个目录林上安装多个服务实例,那么每个实例都必须有自己的 SPN。 如果客户端有多个名称可用于身份验证,则给定的服务实例可以有多个 SPN。 例如,SPN 始终包含运行服务实例的主机的名称,因此服务实例可能会为其主机的每个名称或别名注册 SPN。
在 Kerberos 身份验证服务可以使用 SPN 对服务进行身份验证之前,必须在服务实例用来登录的帐户对象上注册 SPN。 只能在一个帐户上注册给定的 SPN。 对于 Win32 服务,服务安装程序在安装服务实例时指定登录帐户。 然后,安装程序编写 SPN 并将其作为帐户对象的属性写入Active Directory 域服务。 如果服务实例的登录帐户发生更改,则必须在新帐户下重新注册 SPN。
以上是微软官方解释
其实说白了就利用Kerberos身份验证去访问某项服务的一个前提。
2.提出问题
2.1有多少呢?
微软为我们进行了一项整理:
https://adsecurity.org/?page_id=183
2.2非得都注册?
其实不用,我们在之前进行RBCD烂番茄利用时,拿着从s4u2self那里获取到的ST作为验证信息再去请求一张用于访问sr机器CIFS spn的ST票据,就直接获取到目标文件列表

但是特定的服务是需要单独进行注册的,例如:sqlserver
2.3为什么会这样?
其实是HostSPN的原因,这里微软是偷懒的
https://adsecurity.org/?page_id=183
Domain Controllers automatically map common SPNs to the “HOST” SPN. The HOST SPN is automatically added to the ServicePrincipalName attribute for all computer accounts when the computer is joined to the domain.
HOST这个ServiceName实际上是很多个ServiceName的映射,相关属性被称作SPNMappings,当个访问集合中的成员时,会被映射到HOST。
3.HostSPN
为什么我们上面可以直接能获取到CIFS spn的ST票据?
因为host其中包含很多我们常用到的service,比如cifs,ldap等。
当我们拥有这个映射列表中的任意一张服务票据(包括HOST)的时候, 我们就可以将其转成列表中其他的任意一张服务票据。
Host票据实际上是一种万能票据,具体有哪些映射呢?
host=alerter,appmgmt,cisvc,clipsrv,browser,dhcp,dnscache,replicator,eventlog,eventsystem,policyagent,
oakley,dmserver,dns,mcsvc,fax,msiserver,ias,messenger,netlogon,netman,netdde,netddedsm,nmagent,
plugplay,protectedstorage,rasman,rpclocator,rpc,rpcss,remoteaccess,rsvp,samss,scardsvr,scesrv,
seclogon,scm,dcom,cifs,spooler,snmp,schedule,tapisrv,trksvr,trkwks,ups,time,wins,www,http,w3svc,
iisadmin,msdtc
不管是impacket还是Rubeus,其实都已经兼容都已经兼容, 但是并没有具体文章说明

4.利用
这里提供一个后门思路
在拿下域控后,我们利用委派,将test/DC委派给某个后门用户, 之后我们就可以随意获取到test/DC的TGS, 并可以将其转变成CIFS/LDAP等服务的票据。