基础知识

定义

Kerberos(三头犬)是一种域内认证协议,其设计目标是通过密钥系统为客户机/服务器应用程序提供强大的认证服务。该认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全,并假定网络上传送的数据包可以被任意地读取、修改和插入数据。在以上情况下, Kerberos 作为种可信任的第三方认证服务,是通过传统的密码技术 (如: 共享密钥) 执行认证服务的。 Active Directory 活动目录,可以将其理解就是域服务。

image-20240628161751187

负责域内机器管理,用户管理,资源管理,桌面配置,应用支撑等等。

Kerberos的特点

  • 不依赖于主机认证。
  • 不怕中间人攻击。
  • 使用密钥系统提供认证服务。

参与的角色

  • Client
  • Server
  • KDC(Key Distribution Center 密钥分发中心)(小结:性质类似于 Web 中的session)

细分 KDC 中的角色

  • AD: account database 的缩写,其储存了 Client 白名单,只有在白名单内的 Client 才能申请 TGT
  • AS:Authentication Service 的缩写,验证 Client 端的身份并为 Client 生成 TGT 的服务器
  • TGS:Ticket Cranting Service 的缩写,为 Client 生成指定服务ticket。

物理层面AD和KDC都是域控

Kerbroes认证分析

从 KDC 的参与角色中可以了解到认证分为三块六小步,即一发一收的三个来回。

  1. Client 请求 Kerberos 服务(请求中包含了Client Name 也就是用户名),如果主机名存在于 AD 中,就放回 TGT 给 Client
  2. Client 拿着 TGT 去向 Kerbroes 发起请求说需要指定服务的权限,AS 返回 Ticket 给 Client。
  3. Client 拿着 Ticket 去请求登录服务,服务那边又会去问 Kerbroes 这个 ticket 是否是真实的,是就给通过,认证完成。

个人的理解是这样 将 Kerbroes 比作购票 APP。认证流程比作买票。

  1. 首先你使用身份证(Client name)去购票 APP 进行注册,购票 APP 需要核实你是我国公民。不是就直接拒绝(Client Name没再AD白名单中),没有后续,是公民,但是上了征信黑名单也拒绝。(Client在AD中,但是是在黑名单中),正常通过后就发放一个账号给你(TGT)
    1. 使用账号(TGT)发起买去xxxx的票的请求,买完APP返回了一张去xxxx的票给你(访问指定server的TGS)
  2. 拿到票后去车站坐车,乘务员会对你的票进行检验,查看是否为真实的票据。
  3. 抓包分析

以下为域用户登录认证包

TGT 获取

  • AS-REQ:

image-20240628161757559

Client 向 KDC 发起 AS_REQ,请求凭据是 Client hash 加密的时间戳 AS-REP

image-20240628161802364

KDC使用Client hash进行解密,如果结果正确就返回用krbtgt hash加密的TGT票据 TGS获取 TGS-REQ

image-20240628161806456

请求访问指定服务 TGT-REP

image-20240628161810673

返回Ticket。

TGS登录服务

image-20240628161814477

涉及字段比较多,每个字段得含义分析不清楚,查阅资料可以看到详细流程如下:

  • AS_REQ: Client 向 KDC 发起 AS_REQ,请求凭据是 Client hash 加密的时间戳
  • AS_REP: KDC使用Client hash进行解密,如果结果正确就返回用krbtgt hash加密的TGT票据,TGT里面包含PAC,PAC包含Client的sid,Client所在的组。
  • TGS_REQ: Client凭借TGT票据向KDC发起针对特定服务的TGS_REQ请求
  • TGS_REP: KDC使用krbtgt hash进行解密,如果结果正确,就返回用服务hash 加密的TGS票据(这一步不管用户有没有访问服务的权限,只要TGT正确,就返回TGS票据)
  • AP_REQ: Client拿着TGS票据去请求服务
  • AP_REP: 服务使用自己的hash解密TGS票据。如果解密正确,就拿着PAC去KDC那边问Client有没有访问权限,域控解密PAC。获取Client的sid,以及所在的组,再根据该服务的ACL,判断Client是否有访问服务的权限。
学前沿IT,到英格科技! all right reserved,powered by Gitbook本文发布时间: 2025-04-15 20:07:18

results matching ""

    No results matching ""