Kerberos 是一种由麻省理工学院提出的一种网络身份验证协议,它通过使用密钥加密技术为客户端/服务器应用程序提供强身份验证。

Kerberos协议中的角色

在Kerberos协议中主要是有三个角色:

  • 访问服务的客户端 Client

  • 提供服务的服务端 Server

  • 密钥分发中心KDC(Kerberos协议的核心组成)

KDC 服务会默认安装在域控中,而Client和Server分别是域内的客户和服务,在Kerberos中Client是否有权限访问Server端的服务,是由KDC发放的票据来决定的。

KDC中分成两个部分:

  • 身份验证服务AS:验证Client的身份,验证通过之后,AS就会发放TGT票据给Client。

  • 票据授予服务TGS:当Client获取的TGT票据后,TGS会给Clinet换取访问Server端的ST服务票据。

关键名词

  • DC 域控制器 Domain Controller

  • KDC 密钥分发中心 Key Distribution Center

  • AS 身份验证服务 Authentication Service

  • TGS 票据授予服务 Ticket Granting Service

  • TGT 认证票据 Ticket Granting Ticket

  • ST 服务票据 Service Ticket

  • PAC 特权属性证书 Privilege Attribute Certificate

  • AD 账户数据库 Account Database(存储所有Client的白名单)

  • krbtgt账户(KDC的服务账户)

Kerberos协议的工作流程

  1. 客户端向KDC的AS认证服务请求TGT票据

  2. 客户端通过AS认证后,KDC将会给客户端发放TGT票据

  3. 客户端带上TGT票据,向TGS认证服务请求ST服务票据

  4. 客户端通过TGS认证后,TGS将会给客户端发放ST服务票据

  5. 客户端使用ST服务票据向服务端请求服务

  6. PAC校验:服务端拿到PAC询问KDC客户端是否有权限,KDC将客户端的权限信息返回给服务端,判断客户端是否有权限访问该服务,并把结果返回给客户端

举个例子:

下面来具体地了解Kerberos工作流程,强烈建议使用 windows_protocol 项目开发的Kerberos发包工具来模拟Kerberos认证的过程,从而加强理解。

Kerberos发包工具地址:https://github.com/daikerSec/windows_protocol/tree/master/tools

AS_REQ & AS_REP

首先是客户端与KDC中AS之间的认证,使用 AS_REQ & AS_REP 模块:

AS_REQ

AS_REQ指的是客户端向KDC发起AS认证服务请求TGT票据,请求凭据是客户端hash加密的时间戳。

这里ENC_TIMESTAMP是预认证,就是用客户端用户hash加密时间戳,发送给AS服务器。在AS服务器中有用户hash,然后使用用户hash进行解密,获得时间戳。如果能解密,并且时间戳在一定的范围内,则认证通过。

这里PA_PAC_REQUEST是启用PAC支持的扩展,PAC信息将包含在AS_REP中。这里的value对应的是include=true或者include=false(KDC根据include的值来判断返回的票据中是否携带PAC)。

AS_REP

AS_REP指的是AS预认证通过,接着AS认证服务会返回用krbtgt hash加密的TGT票据和用户hash加密的session key及其他信息。

这里ticket就是用于向TGS认证服务请求ST服务票据的认证,ticket中的这个enc-part是由krbtgt hash加密的,用户不可读取。

而在ticket下方的这个enc_part是使用用户hash加密的一个session key,用户解密后可以拿到这个session key作为下阶段的认证密钥。

TGT票据凭据里面最核心的东西就是krbtgt hash加密的ticket和用户hash加密的session key。

在AS_REP里面的ticket中的enc-part是使用krbtgt hash加密的。所以如果我们拥有krbtgt的hash,就可以给我们自己签发任意用户的TGT票据,这个票据也被称为黄金票据。

TGS_REQ & TGS_REP

当客户端获取TGT票据之后,可以去向KDC的TGS申请特定服务的访问权限,使用 TGS_REQ & TGS_REP 模块:

TGS_REQ

TGS_REQ指的是客户端带上从AS那里获得TGT票据,向TGS认证服务请求ST服务票据。

这里ar-req这部分会携带AS_REP里面获取到的TGT票据。图中可以看到ar-req中的ticket和AS_REP的ticket部分是完全一致的。TGS通过krbtgt的hash解密TGT票据,然后验证客户端的身份。

TGS_REP

TGS_REP指的是客户端通过了TGS认证服务后,TGS将会给客户端用户发放ST服务票据。TGS生成的ST服务票据其中包括ticket和一个新的session key。

这里ticket就是最终用户用于请求特定服务AP_REQ的认证(ST票据),里面的enc_part也是加密的,是使用要请求的服务的hash加密的,用户不可读取。

在ticket下方的enc-part这部分是可以解密的,密钥就是上一轮AS_REP里面返回TGT票据中的session key,解密以后的这个新session key同样用来作为下阶段的认证密钥。

在TGS_REQ里面是使用要请求的服务(host)的hash加密的。因此如果我们拥有服务的hash就可以自己制作一个ticket,既白银票据。

AP_REQ

AP_REQ指的是最后客户端用户使用ST票据去访问特定的服务。

客户端首先将ST票据中解密后的session key缓存,然后客户端将ST服务票据和session key加密的时间戳一起发送给服务端。

服务端使用自己的hash解密ST票据提取session key,然后使用session key验证加密的时间戳,确认客户端的身份并建立会话。

PAC

TGS_REP这里其实存在一个隐患:在这一步中,不论用户是否有权限访问服务,只要TGT解密无误,都将返回ST服务票据。那么任何一个用户,只要hash正确,就可以请求域内任何一个服务的票据。

为了解决上面的这个问题,微软引进了PAC(Privilege Attribute Certificate)即特权属性证书,用来验证用户权限和模拟用户操作的凭证。

引进PAC之后的kerberos流程变成:

  1. 用户向KDC发起AS_REQ,请求凭据是用户hash加密的时间戳,KDC使用用户hash进行解密,如果结果正确返回用krbtgt的hash加密的TGT票据,TGT票据里面包含PAC,PAC包含用户的sid,用户所在的组。

  2. 用户凭借TGT票据向KDC发起针对特定服务的TGS_REQ请求,KDC使用krbtgt的hash进行解密,如果结果正确,就返回用服务hash加密的ST票据。

  3. 用户拿着ST票据去请求服务,服务使用自己的hash解密TGS票据。如果解密正确,就拿着PAC去KDC那边询问用户有没有访问权限,域控解密PAC。获取用户的sid,以及所在的组,再判断用户是否有访问服务的权限。

总结

以上就是Kerberos工作流程的三个主要部分简单分析,Kerberos还有很多细节内容值得学习,包括PAC,委派等,还有在认证的过程中引发的一系列安全问题,比如常听到的黄金票据和白银票据等。持续学习!

参考文章:

https://daiker.gitbook.io/windows-protocol/kerberos

https://xz.aliyun.com/t/8187?time__1311=n4%2BxuDgDBDyGKiKPe05DK3hrDcDAo42u%2BGirD&alichlgref=https%3A%2F%2Fxxe.icu%2F

https://xxe.icu/domain-security.html#域用户名枚举

https://zhuanlan.zhihu.com/p/266491528


若有错误,欢迎指正!o( ̄▽ ̄)ブ

域渗透之初识Kerberos认证过程的更多相关文章

  1. 域渗透基础之Kerberos认证协议

     本来昨晚就该总结整理,又拖到今天早上..6点起来赶可还行 0x01 Kerberos前言 Kerberos 是一种由 MIT(麻省理工大学)提出的一种网络身份验证协议.它旨在通过使用密钥加密技术为客 ...

  2. [Kerberos] Kerberos 认证过程整理

    Kerberos是一种安全认证协议,意在提供 more secure authentication simplified management of password convenience of s ...

  3. 域渗透基础之NTLM认证协议

    域渗透基础的两个认证协议ntlm和Kerberos协议是必须总结的~ 这篇简单总结下ntlm协议 晚上写下kerberos 0x01 NTLM简介 NTLM使用在Windows NT和Windows ...

  4. 在kerberos认证过程中Active Directory的作用

    LDAP介绍 1),ladp(Lightweight Directory Access Protocol),轻量级目录访问协议,提供被称为目录服务的信息服务,特别是基于X.500(构成全球分布式的目录 ...

  5. Kerberos认证过程学习理解

    概念: Kerberos服务器:AS认证服务器,TGS服务授权服务器 Client 客户端,代表使用应用的用户 AppServer 服务端,应用提供各种服务的服务器 Client在Kerberos注册 ...

  6. 域渗透 | kerberos认证及过程中产生的攻击

    ​文章首发于公众号<Z2O安全攻防>​ 直接公众号文章复制过来的,排版可能有点乱, 可以去公众号看. https://mp.weixin.qq.com/s/WMGkQoMnQdyG8UmS ...

  7. 域渗透-凭据传递攻击(pass the hash)完全总结

    总结下PtH具体形式(wmicexec.powershell.msf等) 0x01 PtH攻击原理 && 黄金白银票据 PtH攻击原理 wiki  https://en.wikiped ...

  8. Kerberos认证浅析

    1 引言 在希腊神话中Kerberos是守护地狱之门的一条凶猛的三头神犬,而我们在本文中所要介绍的Kerberos认证协议是由美国麻省理工学院(MIT)首先提出并实现的,是该校雅典娜计划的一部分.这个 ...

  9. 域渗透-Kerberos身份验证流程

    域渗透-Kerberos身份验证流程 Kerberos协议框架 在 Kerberos 协议中主要是有三个角色的存在: 1. 访问服务的 Client: 2. 提供服务的 Server: 3.KDC(K ...

  10. 配置两个Hadoop集群Kerberos认证跨域互信

    两个Hadoop集群开启Kerberos验证后,集群间不能够相互访问,需要实现Kerberos之间的互信,使用Hadoop集群A的客户端访问Hadoop集群B的服务(实质上是使用Kerberos Re ...

随机推荐

  1. 阿里云图床(PicGo+阿里云OSS)搭建

    阿里云图床搭建方法: 1.登录阿里云,搜索对象存储oss,新用户免费使用3个月20G,到期后,一年也就9元左右,还是很划算的. 2.在左侧列表里,点击Bucket列表,创建Bucket 3.Bucke ...

  2. 常用 DNS 查询速度测试

    测试工具 DNS-Benchmark | GitHub 总结 进过多轮测试,我认为: 223.5.5.5 和 223.6.6.6 平均响应时间最短(223.5.5.5 在教育网内疑似无法连通) 114 ...

  3. python pyqt6 QComboBox 设定下拉框背景颜色

    设定QComboBox 的背景颜色,边框设定,以及下拉框的背景颜色以及边框设定, selection-background-color 不生效可忽略 xxx_source = QComboBox(se ...

  4. el-form 自定义验证规则,手动触发某项验证

    1. ui <el-form ref="xXXForm" :rules="XXXFormRules" > <el-form-item labe ...

  5. 爬虫案例2-爬取视频的三种方式之一:requests篇(1)

    @ 目录 前言 爬虫步骤 确定网址,发送请求 获取响应数据 对响应数据进行解析 保存数据 完整源码 共勉 博客 前言 本文写了一个爬取视频的案例,使用requests库爬取了好看视频的视频,并进行保存 ...

  6. Vue3.5中解构props,让父子组件通信更加丝滑

    前言 在Vue3.5版本中响应式 Props 解构终于正式转正了,这个功能之前一直是试验性的.这篇文章来带你搞清楚,一个String类型的props经过解构后明明应该是一个常量了,为什么还没丢失响应式 ...

  7. Python计算傅里叶变换

    技术背景 傅里叶变换在几乎所有计算相关领域都有可能被使用到,例如通信领域的滤波.材料领域的晶格倒易空间计算还有分子动力学中的倒易力场能量项等等.最简单的例子来说,计算周期性盒子的电势能\(k\sum_ ...

  8. android中的render线程是什么?

    在 Android 中,Render 线程(也称为渲染线程)是一个专门用于处理 UI 绘制和动画的线程.它的主要职责是确保用户界面在屏幕上流畅且高效地呈现.这个线程的引入是为了将渲染任务从主线程(UI ...

  9. Pytorch常用的交叉熵损失函数CrossEntropyLoss()详解

    本篇借鉴了这篇文章,如果有兴趣,大家可以看看:https://blog.csdn.net/geter_CS/article/details/84857220 1.交叉熵:交叉熵主要是用来判定实际的输出 ...

  10. 区分::after和:before中的单冒号和双冒号的作用

    单冒号:一般指的是伪类,如鼠标悬停状态设置样式:选择器:hover {设置样式} 双冒号一般指伪元素,给元素的前面/后面添加内容.内容数据按堆栈数据结构存储.