服务主体名称SPN是服务实例的唯一标识符,Kerberos使用SPN将服务实例与服务登录账户相关联,想使用Kerberos来认证服务就必须配置正确的SPN。
类型
SPN分两种类型
1、SPN注册在机器账号
域中的机器会自动注册两个SPN,SPN都注册在机器账户中,分别是
HOST/主机名,HOST/主机名.域名
C:\Users\Administrator>setspn -l DESKTOP-GBE538B$
Registered ServicePrincipalNames 用于 CN=DESKTOP-GBE538B,CN=Computers,DC=sec,DC=com:
RestrictedKrbHost/DESKTOP-GBE538B
HOST/DESKTOP-GBE538B
RestrictedKrbHost/DESKTOP-GBE538B.sec.com
HOST/DESKTOP-GBE538B.sec.com
C:\Users\Administrator>
2、SPN注册在用户账号
1)SPN注册在一个用户账号下,只能归属一个用户账号
2)一个用户可以有多个SPN,默认上限是10个
配置
1、在同一林中SPN不能重复
2、SPN包含4个元素(红色为必要元素)
具体格式:
service class:服务类(如HOST、WWW)
host:运行服务的计算机名称
port:可选端口
service name:可复制服务SPN中使用的可选名称,用于标识数据或者服务
类型
1、基于主机的服务:
RestrictedKrbHost/DESKTOP-GBE538B
HOST/DESKTOP-GBE538B
RestrictedKrbHost/DESKTOP-GBE538B.sec.com
HOST/DESKTOP-GBE538B.sec.com
2、可复制的服务
可复制服务可以有多个服务实例(副本),提供的服务自然相同,如果希望访问指定的服务,可以这样:
MyDBService/host1.sec.com:3306/CN=hrdb,OU=mktg,DC=example,DC=com
MyDBService/host2.sec.com:3306/CN=hrdb,OU=mktg,DC=example,DC=com
MyDBService/host3.sec.com:3306/CN=hrdb,OU=mktg,DC=example,DC=com
使用SetSPN注册SPN
1、默认只有机器账号和管理员账号可以注册SPN
2、机器注册的SPN的
机器账户注册:
# 先用PsExec -i -s cmd进入System用户的控制台
C:\Windows\System32>hostname
DESKTOP-GBE538B
C:\Windows\System32>whoami
nt authority\system
# 证明SPN唯一
C:\Windows\System32>setspn -S MySQL/DESKTOP-GBE538B.sec.com:3306 DESKTOP-GBE538B
正在检查域 DC=sec,DC=com
CN=DESKTOP-GBE538B,CN=Computers,DC=sec,DC=com
MySQL/desktop-gbe538b.sec.com:3306
RestrictedKrbHost/DESKTOP-GBE538B
HOST/DESKTOP-GBE538B
RestrictedKrbHost/DESKTOP-GBE538B.sec.com
HOST/DESKTOP-GBE538B.sec.com
发现重复的 SPN,正在终止操作!
# 证明机器账户注册的SPN必须为当前主机的DNS名称
C:\Windows\System32>setspn -S MySQL/AAA.sec.com:3306 DESKTOP-GBE538B
正在检查域 DC=sec,DC=com
为 CN=DESKTOP-GBE538B,CN=Computers,DC=sec,DC=com 注册 ServicePrincipalNames
MySQL/AAA.sec.com:3306
无法在帐户“CN=DESKTOP-GBE538B,CN=Computers,DC=sec,DC=com”上指定 SPN,错误为 0x200b/8203 -> 指定给目录服务的属性语法无 效。
# 注册成功
C:\Windows\System32>setspn -S PGSQL/DESKTOP-GBE538B.sec.com:5432 DESKTOP-GBE538B
正在检查域 DC=sec,DC=com
为 CN=DESKTOP-GBE538B,CN=Computers,DC=sec,DC=com 注册 ServicePrincipalNames
PGSQL/DESKTOP-GBE538B.sec.com:5432
更新的对象
普通域用户注册
默认情况下,普通域用户没有权限添加SPN账户
C:\Users\testnoadmin>whoami
sec\testnoadmin
C:\Users\testnoadmin>hostname
DESKTOP-GBE538B
C:\Users\testnoadmin>setspn -S MySQL1/DESKTOP-GBE538B.sec.com:3306 DESKTOP-GBE538B
正在检查域 DC=sec,DC=com
为 CN=DESKTOP-GBE538B,CN=Computers,DC=sec,DC=com 注册 ServicePrincipalNames
MySQL1/DESKTOP-GBE538B.sec.com:3306
无法在帐户“CN=DESKTOP-GBE538B,CN=Computers,DC=sec,DC=com”上指定 SPN,错误为 0x2098/8344 -> 访问特权不够,不能执行该操 作。
但是可以在域控上添加权限,需要添加读取和写入ServicePrincipalName的权限
域管用户注册
可以看到给任意host也没问题
Microsoft Windows [版本 10.0.22631.3007]
(c) Microsoft Corporation。保留所有权利。
C:\Users\Oyama>setspn -S test/xxx.sec.com:3308 Oyama
正在检查域 DC=sec,DC=com
为 CN=Oyama,CN=Users,DC=sec,DC=com 注册 ServicePrincipalNames
test/xxx.sec.com:3308
更新的对象
C:\Users\Oyama>
SPN的查询和发现
1、setspn查询
# 查看当前域内所有的SPN
setspn -Q */*
# 删除指定的SPN
setspn -D Mysql/win7.sec.com:11443/MXX hack
# 查找指定用户/主机名注册的SPN
setspn -L username
setspn -L hostname
2、Impacket查询
C:\root> impacket-GetUserSPNs -dc-ip 172.16.80.189 sec.com/administrator:Az123456@
Impacket v0.11.0 - Copyright 2023 Fortra
ServicePrincipalName Name MemberOf PasswordLastSet LastLogon Delegation
---------------------------- ------------- ----------------------------------------------------- -------------------------- -------------------------- ----------
cifs/DESKTOP-GBE538B.sec.com Administrator CN=Group Policy Creator Owners,CN=Users,DC=sec,DC=com 2024-02-17 16:55:04.981324 2024-02-24 14:21:05.183699
test/xxx.sec.com:3308 Oyama CN=Enterprise Admins,CN=Users,DC=sec,DC=com 2024-02-17 16:58:51.888759 2024-02-24 14:21:15.971155
3、其他
还有PowerShellery和PowerShell-AD-Recon等ps1脚本可以查询