Persistence: Kerberoasting Attack Methods in Windows Domain Pentest
在22年国护远程红的时候,有几台靶标用到了这个方法,现在重新整理一下发出来。
认识Kerberos
一般来说,Kerberos在建立客户端-服务端连接的时候,分为三个角色,分别是DC(域控)、域客户端和提供应用服务的AS(应用服务器),其中域服务器主要涉及到了Kerberos的KDC(Key Distribution Center,密钥分发中心),并且Kerberos默认使用的端口遵循RFC4120并使用88端口进行TCP数据传输
- Domain Controller,DC
- Client
- App Server,AS
其主要认证步骤分为下面几个步骤,下面图例为k0e1y师傅所画的,这里直接引用
具体协商过程:
KRB_AS_REQ:用户向 KDC 发送 TGT 请求来获取
用户向身份验证服务器(KDC 的 AS 部分)发送请求,包含以下信息:
- 用户的身份(如用户名)。
- 目标服务的名称(如果有的话,通常是用于后续 TGS 请求)。
- 时间戳和客户端生成的随机数(用于防止重放攻击)。
KDC 通过此请求来识别客户端,并生成一个临时的会话密钥(Session Key)。
TGT KRB_AS_REP:用户收到了来自 KDC 的 TGT
KDC 返回 TGT(Ticket-Granting Ticket)以及一个加密的会话密钥。回复信息通常包括:
- TGT(包含用户的身份信息、时间戳、会话密钥等信息,使用 KDC 的密钥加密)。
- 会话密钥(用 TGT 加密,这样只有客户端可以解密)。
客户端使用其密码解密会话密钥,以便后续操作。
KRB_TGS_REQ:用户使用 TGT 向 KDC 发送 TGS 请求
客户端将之前获得的 TGT 发送给 TGS(Ticket-Granting Server),请求访问特定的服务。请求中包含:
- 客户端的 TGT。
- 服务的名称(如希望访问的应用或服务)。
- 客户端生成的时间戳(用于防止重放攻击)。
客户端通过加密信息证明自己是合法用户,并且有权请求该服务的访问权限。
KRB_TGS_REP:用户收到了来自 KDC 的 TGS
- TGS 使用 TGT 解密并验证请求,若验证通过,TGS 会返回服务票证(Service Ticket)以及一个新的会话密钥,具体内容:
- 服务票证(加密的服务端信息和会话密钥)。
- 新的会话密钥,供客户端和目标服务端进行后续加密通信使用。
- TGS 使用 TGT 解密并验证请求,若验证通过,TGS 会返回服务票证(Service Ticket)以及一个新的会话密钥,具体内容:
KRB_AP_REQ:使用 TGS 的用户发送请求对服务进行身份验证
客户端向目标服务端发送服务请求,并将之前获得的服务票证(TGS)发送给目标服务端。请求中包含:
- 服务票证。
- 客户端和服务端的会话密钥(加密的时间戳等信息,用于验证用户身份)。
该请求的目的是验证用户是否拥有访问该服务的权限。
KRB_AP_REP:(可选)服务用来针对用户标识自身
目标服务端收到请求后,使用自己的密钥解密服务票证,并验证请求是否合法。服务端会做以下处理:
- 验证票证和客户端信息。
- 验证客户端是否使用了正确的会话密钥。
- 如果一切验证通过,服务端生成一个加密的确认消息,回复给客户端,表示身份验证成功。
该过程可以是可选的,依据具体的服务需求来决定是否需要这个步骤。
KRB_ERROR:用于交流错误条件的消息
- 在任何一个步骤中,如果发生错误(如身份验证失败、票证失效等),KDC 或目标服务端将返回一个 KRB_ERROR 消息,表明发生了错误,并给出具体的错误码。
简述Kerberoasting
这种攻击方法是一种域口令攻击方法,Tim Medin发布了配套的攻击工具Kerberoast(https://github.com/nidem/kerberoast.git),在此前,获取域口令的方法是破解NTLM、社工等其他方法。
原理
Kerberoasting是通过请求服务票据(TGS)并离线破解,获取服务账户密码的攻击手法,攻击步骤包括枚举 SPN、请求 TGS、导出票据并离线破解。防御措施为强密码、定期更改密码和监控异常行为。
Kerberoasting详细攻击步骤如下
1.发现SPN服务
2.使用工具向 SPN 请求 TGS 票据
3.转储 .kirbi 或 ccache 或服务 HASH 的 TGS 票据
4.将 .kirbi 或 ccache 文件转换为可破解格式
5.使用hashcat等工具配合字典进行暴力破解
上面提到了一个SPN(服务器主体名称),其格式为
1 | "serviceclass"/"hostname[":"port]["/"servicename]" |
其中serviceless表示服务种类,如www表示web服务,host尽量用FQDN表示
攻击姿势
首先对域控发起LDAP查询,看看SPN服务
或者用系统自带的
1 | # 看所有SPN |
然后按照SPN格式进行拼接整理
1 | "serviceclass"/"hostname[":"port]["/"servicename]" |
然后使用Rubeus来获取票据
1 | Rubeus kerberoast |
接着转存TGS票据获取对应的哈希值
Reference
Persistence: Kerberoasting Attack Methods in Windows Domain Pentest
https://iloli.moe/2022/10/12/Persistence-Kerberoasting-Attack-Methods-in-Windows-Domain-Penetest/