官方公众号企业安全新浪微博
FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。
FreeBuf+小程序
前言
上篇文章介绍了kerberos的协议的认证流程以及可能出现的安全问题,也简要说了一下kerberoast攻击,本篇文章就具体介绍一下kerberoasting具体原理以及如何进行操作。
关于内网相关的文章已经发了两篇了,大家感兴趣的话可以找以前的文章看一下,后面会继续出关于内网方面的知识。
什么是Kerberoasting攻击?
首先再来回顾一下Kerberoast协议的认证过程。kerberoast认证过程算上PAC可以说有四个个阶段。如下图所示
下面这张图总结了每个阶段可能出现的安全问题
从上图可以看出kerberoasting攻击是在TGS REQ阶段的。TGS REQ阶段是请求服务票据ST的过程,在这个阶段最终会得到访问服务的票据,这个票据用服务账号的NTLM hash进行签名。而且我们是可以获取到任意服务的ST,加密算法为RC4-HMAC,如果获得这个ST票据,我们可以尝试穷举口令,模拟加密过程,进行破解。
一句话来说就是由于ST是用服务的Hash进行加密的,因此客户端拿到该ST后可以用于本地离线爆破。如果字典够牛逼,那么就很有可能爆破出SPN链接用户的明文密码
如果该服务在域内被配置为高权限运行,那么攻击者可能接管整个域。
其核心在于,攻击者和KDC协商ST加密的时候,协商的是使用RC4_HMAC_MD5加密算法,而该加密算法容易被破解,因为攻击者可以在本地进行离线爆破
Kerberoasting的前提:服务SPN必须注册在域用户账户下,因为机器账户的密码是随机生成的,基本爆破不了
这种方式的优点就是不用与服务器进行交互,减少了被发现的风险,而且我们可以对所有的服务票据来进行尝试,增加破解的几率,直到拿到管理权限。
其中,域内注册的服务是用SPN进行表示的,我们可以通过查询SPN来获取域内注册了那些服务。
攻击流程
根据上面的介绍,那么整个的攻击过程可以总结如下:
- 攻击者提供一个正常的域用户密码进行认证,获得TGT
- 攻击者使用该TGT请求针对指定SPN的ST
- KDC在验证身份后,返回服务Hash加密的ST,不管提供的域用户有没有对指定SPN服务的访问权限
- 攻击者本地离线爆破ST,获得SPN所链接账户的明文密码(重点是密码字典)
SPN服务主体
kerberoasting攻击首先就是要获取请求服务的SPN,那么首先介绍一下SPN到底是什么以及常用的SPN操作。
SPN是什么
SPN(ServicePrincipal Names)服务主体名称,是服务实例(比如:HTTP、MSSQL、MySQL等服务)的唯一标识符。个人认为就是服务实例注册到域控中的一个标识,域控用SPN来表示是那个服务。
Kerberos 身份验证:使用 SPN 将服务实例与服务登录帐户相关联
如果在整个林或域中的计算机上安装多个服务实例,则每个实例都必须具有自己的SPN。如果客户端可能使用多个名称进行身份验证,则给定服务实例可以具有多个 SPN。
SPN 始终包含运行服务实例的主机的名称,因此服务实例可以为其主机的每个名称或别名注册SPN。
一个用户账户下可以有多个SPN,但一个SPN只能注册到一个账户。
在内网中,SPN扫描通过查询向域控服务器执行服务发现。这对于红队而言,可以帮助他们识别正在运行重要服务的主机。SPN的识别是kerberoasting攻击的第一步。
SPN的语法格式
格式:服务类型/对应机器名:服务端口[默认端口可不写]
<service class>/<host>:<port> <servername>
1、<service class>可以理解为服务的名称,常见的有www, ldap, SMTP, DNS, HOST等,例如mysql/WIN-security.test:1433
2、host有两种形式,FQDN和NetBIOS名,例如WIN-test.security或者是WIN-test
3、如果服务运行在默认端口上,则端口号(port)可以省略
查询已经注册的SPN
查询当前域内所有的SPN
setspn -Q */*