Kerberos认证与攻击学习总结

0、背景



聆听了n1nty大佬(90后黑客代表)的谆谆指导,学习了n1nty大佬的基本操作,决定总结一下,做一个简要的读书笔记,也把之前自己记录的关于Windows的安全的一些博客能够串联起来。所以首先鸣谢:90后黑客代表n1nty大佬。

1、Kerberos的基本认证



1.1、NTLM的挑战认证


不啰嗦,直接说要点,server接到client的请求认证后,会回复16字节随机数据,也就是挑战。client使用自己生成的账号的NTLM的hash值对挑战数据进行某种加密运算,发送到server,server对这一数据进行验证,计算方法相同,比对一直即通过,否则不通过。这一段可以查阅之前博客Windows NTLM Hash和Hash传递、Key传递攻击

1.2、Kerberos验证


不啰嗦具体细节可以参考之前的博客Kerberos认证协议分析,这里有分三个步骤

1.2.1、第一步AS验证


核心是:账号口令的hash值加密时间戳(timestamp),记忆账号身份信息给AS服务器(KDC的一部分,KDC是DC的一部分,DC是域控,对应的数据库是AD),AS服务器解密时间戳,核对在五分钟以内,且不是重放,则返回TGT和Session-Key。在Wireshark中,Session-KEY是外侧的enc-part数据,Session-Key由password的hash值加密后,生成新的enc-part数据,存在TGT里面。

1.2.1.1、域内用户枚举攻击:


一张图解决问题,发送AS-REQ,根据AS-REP来判断问题:

1.2.1.2、TGT Session Key离线爆破


一段话解决问题:session-key经过hash加密成为tgt的一部分,拿到tgt后可以尝试离线暴力破解hash的明文,与NTLM的爆破原理一致,明文字典经过hash计算形成hash值,然后尝试加密session-key与tgt的session-key对应,一致,则爆破成功。

1.2.1.3、PtK(Pass the Key)攻击


在AS-REQ中时间戳经过NT hash或者账号的AES128(AES256)的加密,形成加密数据,你可以通过如下方式获取:

server端会依照解密,验证时间戳。获取Key之后可以传递这个Key,获取TGT。

1.2.2、第二步TGS验证

核心是:client给server发送使用使用krbtgt的口令hash加密的TGT和加密的session-key,server端使用krbtgt的口令hash值解密TGT获取加密的session-key与外部加密的session-key进行比较,一致,就返回访问服务使用的普通ticket和新的session-key,否则验证失败。

1.2.2.1、Golden Ticket

使用方法和原理请参见之前博客黄金票据(Golden Ticket)的原理与实践,总结一句话:TGT的伪造很简单,只需要sid,session-key加密所需要的key(NT-hash、AES256KEY、AES128KEY)即可,域名、username即可。session-key的原始值是随机值,可以任意伪造,加密后两个加密的session-key一致即可通过。

1.2.3、第三步AP验证


原理与TGS相同,验证普通ticket中的session-key与新的session-key是否一致。

1.2.3.1、Sliver Ticket


与Golden Ticket的原理一致,不同的是加密的是service ticket(普通ticket),使用的服务启动账号的口令hash值而不是krbtgt的账号的口令的hash值,所以只能访问该账号启动的服务,而不是全域服务。

2、委派


2.1.1 无限制委派


缓存各个账户的TGT进行代理验证,危险。

2.2.2 受限制委派


涉及S4U2Self和S4U2Proxy协议,暂不赘述。

猜你喜欢

转载自www.cnblogs.com/KevinGeorge/p/9557201.html