Kerberos 认证机制
Kerberos协议是由MIT提出的一种网络身份验证协议,是一种在开放的非安全网络中认证并识别用户身份信息的方法。它旨在使用密钥加密技术为客户端/服务端应用程序提供强身份验证。
在古希腊神话故事中,kerberos是一只具有三颗头颅的地狱恶犬,他守护在地狱之外,能够识别所有经此路过的亡灵,防止活着的入侵者闯入地狱。

0x01 Windows的三大认证机制
本地认证:自己登录自己的电脑是本地认证
网络认证:两台电脑之间要访问资源,可以通过网络认证后进行访问
Kerberos认证:域环境中的认证方式
1.1 本地认证
密码存储在本地,可使用mimikatz抓取
- 由
winlogon.exe进程接受用户输入的密码; - 调用
lsass.exe进程队用户输入的密码进行加密,将其转换为NTLM Hash; - 将有密码转换成的NTLM Hash与SAM文件中存储的NTLM Hash进行比较,如相同,将groupsid和usersid发送给winlogon.exe准备登录,如不同则登陆失败。
winlogon.exe即windows logon process,是windows NT用户登录程序,用于管理用户登录和退出。
lsass.exe即local security authority service,是windows系统的安全机制,用于本地安全和登录策略。用到的mimikatz.exe就是劫持该进程,来获取明文密码。
SAM,是指securtiy account manager,windows对用户账户的安全管理使用的安全账号管理器,SAM文件即账号密码数据库文件。存储在%SystemRoot%\system32\config\sam。
1.2 网络认证
两个电脑之间的认证 (NTML中间人劫持)( 无法证明自己是自己)

明显前两种认证都有很明显的缺陷,来通过例子了解一下kerberos认证是不是解决了这部分缺陷
工作组环境下,一般采用NTLM协议进行网络认证;域环境下,一般采用Kerberos协议进行网络认证。
1.3 Kerberos认证
kerberos协议中也存在三个角色,分别是:
- 客户端(client) :发送请求的一方
- 服务端(Server) :接收请求的一方
- 密钥分发中心(KeyDistribution Center, KDC)
而KDC一般又分 为两部分,分别是:
- AS (Authentication Server) : 认证服务器,专用来认证客户端的身份并发放客户用于访问TGS的TGT (票据授予票据)
- TGS (Ticket Granting Server) :票据授予服务器,用来发放整个认证过程以及客户端访问服务端时所需的服务授予票据(ST)

这里例子最大的问题是: 售票窗口 凭什么卖票给你? 你是合法公民吗?
解决办法就是建立一个身份检验窗口 AS
先去AS认证你的身份,再去TGS发放票据

那到底是如何认证的?
1.3.1 动物园买票理解kerberos认证流程
第一步: client 拿着身份去 AS(认证服务器)认证, 认证通过后返回一张去用于去访问TGS(票据授予服务器)的TGT(票据授予票据)

第二步: client 拿着TGT去 TGS 获取访问server的Ticket, ST

第三步:clinet 拿着 ST 去访问 server

计算机如何实现kerberos认证呢?

1.3.2 计算机kerberos认证详解
认证第一步:
依然是clinet拿信息(Name、IP、Time等)去AS进行认证,认证成功则获取 TGT返回给clinet(用户认证成功则有tgt返回,失败则无,域内用户枚举 密码喷洒 攻击的原理其实就是认证第一步)

PS: AS返回给client的TGT 分为两部分:
一部分是AS用client的hash进行了加密 。 所以client可以解密这部分信息,获得TGT这部分的CT_SK (SessionKey)
一部分是AS用krbtgt的hash进行了加密 。不可被解密(存储了client的信息等)。(这部分TGT就是所谓的黄金票据)
认证第二步:
client 拿着重新构造的TGT去 TGS 获取访问server的ST

clinet再次发送给TGS的TGT有3部分构成:
servername: 记录client想要请求的server。 这里没啥可说的,告诉TGS自己想要请求什么服务
AS用krbtgt的hash进行加密的部分。 这部分clinet没有动过,这部分传给TGS后被解密,获取到client的信息和CT_SK
这部分是client用第一步获得的CT_SK将自己的信息进行了加密。
巧妙的是TGS解密krbtgt加密部分后 能获得CT_SK和 clinet的信息, 再通过CT_SK对加密的clinet信息部分进行解密。结果与刚获得的client信息对比,结果一致则认证成功,可以下发ST。
认证第三步:
clinet将TGS下发的ST 发给目标server ,server处理ST认证

下发的ST client不做任何操作 直接转给server
看下ST结构:
一部分是使用CS_SK加密的clinet信息
server hash加密的。 server收到后解密,拿到CS_SK和client信息, CS_SK解密被加密的信息后对比, 完成认证。
0x02 总结kerberos认证流程
现在用各个文章书籍常用的名词来总结一下流程
AS-REQ与AS-REP:AS验证客户端身份
TGS-REQ与TGS-REP:客户端通过TGS获得ST
AP-REQ、AP-REP:客户端请求服务
REQ就是request REP就是response, 相信都能理解
1.(AS-REQ):client发送用户信息到KDC,向AS请求TGT票据
2.(AS-REP):KDC收到请求,看看client是否在AD的白名单中,在的话,AS生成随机Session Key,并用用户的NTLM HASH对Session Key 加密得到密文A,再用krbtgt的NTLM HASH 对Session Key、客户端信息Client Info、客户端时间戳timestamp加密得到TGT,并将A 和 TGT一起返回客户端client
3.(TGS-REQ):client收到请求,用自身的NTLM HASH 解密 密文A 得到Session Key,再用Session Key加密Client Info与timestamp 得到密文B , 把密文B 和 TGT一起发给KDC 给TGS
4.(TGS-REP):TGS 用krbtgt的NTLM HASH 解密TGT ,得到Session Key和timestamp和Client Info。再用这个由TGT解密出来的Session Key解密密文B得到timestamp与Client Info。 两相对比是否一致。如果一致,TGS生成新的随机 Session Key,叫它Session Key2 吧,用它加密timestamp和Client Info得到密文Enc。再用服务端server的NTLM HASH对Session Key2和timestamp和Client Info加密得到ticket,返回给客户端client
5.(AP-REQ):客户端client把ticket和Enc向服务端server发送,请求服务
6.(AP-REP):服务端server用自己的NTLM HASH 对ticket进行解密得到Session Key2和timestamp和Client Info,再用解密出来的Session Key2解密密文Enc,得到timestamp和Client Info,进行信息校验,成功授权访问
0x03 Kerberos认证过程中的常见攻击
