声明
以下内容,均为文章作者原创,由于传播,利用此文所提供的信息而造成的任何直接或间接的后果和损失,均由使用者本人负责,长白山攻防实验室以及文章作者不承担任何责任。
长白山攻防实验室拥有该文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的副本,包括版权声明等全部内容。声明长白山攻防实验室允许,不得任意修改或增减此文章内容,不得以任何方式将其用于商业目的。
0x01 前言
Kerberos 是一种网络认证协议,其设计目标是通过密钥系统为客户机 / 服务器应用程序提供强大的认证服务。该认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全,并假定网络上传送的数据包可以被任意地读取、修改和插入数据。在以上情况下, Kerberos 作为一种可信任的第三方认证服务,是通过传统的密码技术(如:共享密钥)执行认证服务的。
Kerberos认证流程简述:
AS(Authentication Server)= 认证服务器
KDC(Key Distribution Center)= 密钥分发中心
TGT(Ticket Granting Ticket)=票据授权票据,票据的票据
TGS(Ticket Granting Server)=票据授权服务器
SS(Service Server)= 特定服务提供端
当Client想要访问Server的服务时,先要向AS发送能够证明自己身份的验证,验证通过后AS会给Client发送一个TGT,随后Client再向TGS去验证自己的身份通过后,TGS会给Client发送一个ST,最后是Client和Server做双向验证。整体流程分为三个部分:
1. [Client与AS的交互]
2. [Client与TGS的交互]
3. [Client与Server双向验证]
0x02 Client与AS之间的交互
一、请求
1、Client向Server发送认证
Client在向Server发送请求时,会将密码进行hash code,也叫Master Key。
Client会向AS发送 Authenticator(认证者),这里简称为A1。
A1内容为:
(1):Client的信息和用户名。
(2):使用Master Key加密的时间戳。
2、AS验证A1
AS在接受到A1之后,会根据A1携带的用户名去AD中寻找是否存在白名单中,然后查询到密码,并提取Client对应的Master Key,对加密后的时间戳进行解密,如果时间戳是合法的,就证明了Client提供的用户名和密码是存在AD中的。(ps:时间戳不能超过5分钟)
二、响应
1、发放TGT
验证通过后,AS会给Client发送一个由Client的Master Key加密过的Logon Session Key和一个TGT(ps:TGT的内容:经过KDC中的krbtgt的密码HASH加密的 Logon Session Key(登录会话密钥) 和 TimeStamp(时间戳)、TGS会话密钥、Client info、TGT到期时间。)
0x03 Client与TGS的交互
一、请求
1、Client向TGS发送认证
Client首先要通过自己的Master Key去解密Logon Session Key,再通过得到的Logon Session Key去加密自身的信息和时间戳形成Authenticator(以下简称A2),再携带A2和TGT对TGS发送请求。
2、 TGS验证TGT的真伪
TGS接受到Client发送的请求后,验证Client的真实身份。首先要确定Client提供的TGT是否是由AS颁发的,于是使用自身的Master Key(krbtgt的hash处理)对TGT进行解密得到Logon Session Key和Client info,在使用得到的Logon Session Key对A2进行解密,得到Clinet info和时间戳。(TGT中的Client info是AS颁发的,所以只需要比对A2和TGT中的Client info是否一致就可以确定TGT的真伪了)
二、响应
1、发放ST和Session Key
TGS验证通过后,会生成一个使用Logon Session Key加密的用于Client和Server之间通信的Session Key,和一个使用Server的Master Key进行加密的ST(Service Ticket)
Ps:ST中包含以下内容:
(1):Session Key(2):Domain name\Client(3):Ticket的到期时间
2、Client得到Session Key和ST
Client收到响应,使用Logon Session Key解密得到Session Key,有个Session Key和ST就可以直接与Server进行交互了,无需通过KDC。
0x04 Client与Server的双向验证
一、Server验证Client
1、Client向Server发送A3和ST
Client会将Authenticator(以下简称A3)和时间戳提取出来,然后使用Session Key进行加密,随后将A3和ST发送给Server。还有一个flag用于表示是否需要进行双向验证
2、Server验证Client身份
Server接收到A3和ST以后,会使用自身的Master Key(krbtgt的密码hash处理)解密ST,从而获得Session Key,再利用Session Key解密A3,从而验证Client的身份,如果验证成功,且时间戳不超过5min,就让Client访问相应资源,否则就会直接拒绝请求。
3、Client验证Server真实性
Client要确保自己访问的是想要访问的Server。Server收到flag以后就知道了需要向Client证明自己的身份,Server将从A3解密出来的时间戳再次使用Session Key加密发送给Client。Client再使用之前获得的Session Key进行解密,如果时间戳与之前的时间戳完全一致,则可以证明Server就是想要访问的Server。
0x04 Here We Go
小黑去小明家里帮忙给喂狗,小黑来到小明家小区,把身份证给门卫看,门卫确定了你是小黑,会给你一个小区卡,你拿着小区卡去小明家楼下,物业要证明小区卡是门卫给的,物业确认了以后给你小明家的钥匙,然后小明家的防盗门会验证你的钥匙是不是楼下物业给的,是就让你进去,不是就直接拒绝。同时小明家的门口有一坨奥里给,你看到了就知道这确实是小明家
小明=Server 小黑=Client
门卫=AS 物业=TGS
身份证=A1,A2, A3 小区卡=TGT
钥匙=ST flag=奥里给
长白山攻防实验室
学习最新技术知识