总体来说分外三步:
- Client与AS交互,验证身份,获取TGT
- Client拿着TGT与TGS交互,获取票据ST
- Client拿着ST与与Server交互,请求服务
细化来说分为三个阶段:
- Client ==> AS
- Client用自己的密码NTLM-hash对 timestamp、client-info、server-info 等数据进行加密,发送给AS;
- AS向AD确认存在此Client后,会从AD取出此Client的NTLM-hash解密,同时生成一个随机密钥key1,利用此Client的NTLM-hash加密key1,生成响应的一部分;
- AS使用特定账户krbtgt的NTLM-hash对 key1、timestamp、 client-info 进行的加密,生产TGT,成为响应的另一部分;
- 将两部分合并返回给Client。
- Client ==> TGS
- Client收到响应后利用自己的密码NTLM-hash解密得到key1,但Client无法又解密TGT,所以防止了Client修改client-info伪造其他用户。Client利用key1对 timestamp、client-info、server-info 进行加密,将TGT一起发送给TGS;
- TGS接收请求,利用账户krbtgt的NTLM-hash解密TGT,得到key1和timestamp、client-info,利用key1解密另一部分由Client加密的 timestamp、client-info 信息,将两部分解密出的数据进行对比,验证是否通过;
- 通过后,TGS生成新的密钥key2,利用key1加密key2,再使用Server NTLM-hash加密数据(key2、timestamp、client-info)生成ST,合并后发送给Client。
- Client ==> Server
- Client收到响应,用key1解密得到key2,利用key2对 timestamp、client-info 进行加密,同时带上接收到的ST发送给Server;
- Server收到后利用Server NTLM-hash解密数据,得到key2,再利用key2解密另一部分,得到数据,将两部分解密的数据进行对比,无误后建立通信。