目录
pass the hash 和pass the key(凭据传递攻击)
目录
pass the hash 和pass the key(凭据传递攻击)
讲在前面:
该文章不是以科普的形式书写,而是在学习前辈的基础上进行的自我笔记记录以及复习。
Kerberos协议概述
kerberos协议是一种由麻省理工大学提出的一种网络身份认证协议。它旨在通过使用密钥系统为客户端/服务端应用程序提供强大的身份验证——援引百度百科
几个比较重要的知识点
1:Kerberos协议分为两个基础认证模块(AS_REQ&AS_REP,TES_REQ&TES_REP),以及微软扩展的两个认证模块(S4U和PAC)
2:Kerberos协议主要有三个角色的存在
1:访问服务的Client
2:提供服务的Server
3:KDC(Key Distribution Center)密钥分发中心
一般在域内KDC会默认安装在一台域控中,而Client和Server为域内的用户或者是服务,在Kerberos中Client是否有权限访问Server端的服务由KDC发放的票据决定
Kerberos认证流程
kerberos简化认证流程如下:
- AS_REQ:Client向KDC中心发起AS_REQ的请求,请求凭据是Client hash加密的时间戳
- AS_REP:KDC接收到请求后,KDC使用Client hash解密,如果结果正确就返回用Krbtgt hash加密的TGT票据,TGT里面包含PAC,PAC包含Client‘的sid,Client所在组。
- TGS_REQ:Client凭借TGT票据向KDC发起特定服务的TGS_REQ请求
- TGS_REP:KDC使用kbrtgt hash进行解密,如果结果正确,就返回用服务hash 加密的TGS票据(这一步不管用户有没有访问服务的权限,只要TGT正确,就返回TGS票据)
- AP_REQ:Client拿着票据去请求服务
- AP_REP:服务使用自己的hash解密TGS票据,如果票据正确,就拿着PAC去KDC那边问Client有没有访问权限,域控解密PAC.获取Client的sid以及所在组,再根据该服务的ACL,判断Client是否有访问服务的权限
Kerberos协议产生的安全问题——之AS
安全问题产生在下列认证流程中的详细数据包内,具体截图后续补上,目前只做文字介绍:
用户名枚举
1.AS_REQ:
漏洞点:在AS_REQ发起请求后的返回数据包内,该包内的cname字段是请求的用户名,这个用户名存不存在,返回的包有差异,可以用于枚举域内用户名
黄金票据
2.AS_REP:
漏洞点:返回数据包内包含ticket字段,这个ticket用于TGS-REQ的认证,是加密的,用户不可读取里面的内容,在AS_REQ请求里面是,使用kbrtgt的hash进行加密的,因此如果我们拥有了krbtgt的hash就可以自己制作一个ticket,即黄金票据
pass the hash 和pass the key(凭据传递攻击)
漏洞点:域内是允许直接使用hash进行认证的,在连接配置的时候设置,并不是只有账号密码才能认证,就是由于在认证的时候,是用用户hash加密时间戳,即使在使用密码的情况下,也是先把密码加密成hash,然后在进行认证。
因此在只有用户hash,没有明文密码的情况下也是可以进行认证的,有众多脚本可以支持直接使用hash进行认证(rubeus、impacket等),其中如果ntlm hash的加密方式是rc4,那么这种攻击就叫做pass the hash,如果hash是ase key的加密方式,那么这种攻击就叫做pass the key
Password Spraying(密码喷洒)
同样,在请求中,密码的正确与否的返回包内容是有所不同,在实践中,通常使用叫密码喷洒攻击的手段来爆破密码。这种针对所有用户的自动密码爆破是为了避免账户被锁定。
普通的爆破是用户名固定,爆破密码。密码喷洒是密码固定,跑用户名
AS-REPRoasting
如果域用户设置了"Do not require Kerberos preauthentication"(不要求Kerberos预身份验证),此时向域控制器的88端口发送AS_REQ请求,对收到的AS_REP内容重新组合,能够拼接成Kerberos 5 AS_REP etype23(18200)的格式,接下来就可以使用hashcat进行爆破
Kerberos协议产生的安全问题之——TGS
pass the ticket
Kerberos除了第一步AS_REQ是使用时间戳加密用户hash验证外,其他的步骤的验证都是通过票据,这个票据可以是TGT票据或者TGS票据,因为票据里面的内容主要是session_key和ticket(使用服务hash加密的,服务包括krbtgt),拿到票据后,我们就可以用这个票据来作为下阶段的验证了。
白银票据:
在AS-REQ请求里面是使用krbtgt的hash进行加密的,而在TGS_REQ里面是使用要请求的服务的hash加密的,因此如果我们拥有服务的hash就可以自己制作一个ticket,即白银票据