0x01[基础认知]

  • Kerberos认证可以满足以下几个需求

    • client访问server的某服务时,如何证明自己的身份
    • 在授权过程中通讯内容即使被拦截或者篡改也不影响通讯安全性

0x02[协议框架]

  • Kerberos主要有三个角色

    • Client 访问服务
    • Server 提供服务
    • KDC (Key Distribution Center) 密钥分发中心
  • KDC会默认安装在DC中,Client和Server为域内的用户或者服务,比如HTTP服务,SQL等等
  • Client是否有权限访问Server由KDC发放的票据来决定
  • KDC服务框架中包含一个 krbtgt 账户,它是在创建域时系统自动创建的一个账号,无法登陆

0x03[认证流程]

Image.png

  • 以上流程可以这样理解

    • 游客想到外国旅游
    • 他先到公安局认证了身份办理了护照 Client->AS
    • 然后拿着护照去了海关,海关看了护照后给了其他的出国材料 Client->TGS
    • 最后游客可以上飞机出国旅游了 Client->Server
    • (以上流程可能与现实不符,我瞎编的呜呜呜)

0x04[具体流程]

  • TheAuthentication Service Exchange

    • Client->AS:Client 先向 KDC 的 AS 发送 Authenticator1,内容为通过 Client 密码 Hash 加密的时间戳、ClientID、网络地址、加密类型等内容
    • AS->Client:发送 Client 密码加密的 sessionkey-as 和票据 TGT(KRBTGT HASH 加密的 sessionkey-as 和 TimeStamp)
    • 关于TGT票,在KDC中存储了所有域用户的密码HASH,AS收到Client的请求之后会根据KDC中存的密码来解密,解密成功且验证信息。验证成功就返回给Client由Client密码HASH加密的sessionkey-as和TGT(KRBTGT HASH 加密的 sessionkey-as 和 TimeStamp)
  • TheTicket-Granting Service (TGS) Exchange

    • Client->TGS:Client向TGS发送 Authenticator2 (sessionkey-as 加密 TimeStamp) 和票据 TGT(KRBTGT HASH 加密的 sessionkey-as 和 TimeStamp)
    • Clien拿到了AS返回给他的TGT与加了密的sessionkey-as后会有以下三步操作

      • 首先是TGT,前面说到TGT是用的域用户KRBTGT HASH加密的sessionkey-as和TimeStamp等信息形成,而Client不知道KRBTGT的HASH,所以无法解密
      • 然后是加密后的sessionkey-as,前面提到它是由Client的HASH加密的,所以Client能够自己解开
      • Client用解开的sessionkey-as加密TimeStamp和TGT一起发送给KDC中的TGS票据授权服务器换取ST
    • TGS 收到 Client 发送过来的 TGT 和用 sessionkey-as 加密的 TimeStamp 之后会有以下动作

      • 检查自身是否存在 Client 所请求的服务,如果服务存在,则用 KRBTGT 密码解密 TGT。一般情况下 TGS 会检查 TGT 中的时间戳查看 TGT 是否过期,且原始地址是否和 TGT 中保存的地址相同
      • 验证成功之后将用 sessionkey-as 加密的 sessionkey-tgs 和用 Server 密码 HASH 加密的 Sessionkey-tgs 发送给 Client
    • 关于TGT和ST的时间过期策略

      • TGT票据过期配置,默认时间是两小时,当用户在2个小时(7200秒)之内不移动鼠标或者进行系统超过8个小时(28800秒)
      • ST票据过期配置,默认时间是10秒钟,使用次数为1次或者超过10秒没有应用均会引起ST过期
  • TheClient/Server Authentication Exchange

    • Client ->Server 发送 Authenticator3(sessionkey-tgs 加密 TimeStamp) 和票据 ST(Server 密码 HASH 加密 sessionkey-tgs)
    • Client 收到 sessionkey-as 加密的 sessionkey-tgs 和 Server 密码 HASH 加密的 sessionkey-tgs 之后用 sessionkey-as 解密得到 sessionkey-tgs,然后把 sessionkey-tgs 加密的 TimeStamp 和 ST 一起发送给 Server
    • Server-> Client:server 通过自己的密码解密 ST,得到 sessionkey-tgs, 再用 sessionkey-tgs 解密 Authenticator3 得到 TimeStamp,验证正确返回验证成功