Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[ffffffff0x] Windows认证原理:Kerberos认证

[ffffffff0x] Windows认证原理:Kerberos认证

原创
作者头像
r0fus0d
修改于 2021-01-11 02:10:20
修改于 2021-01-11 02:10:20
2.6K0
举报
文章被收录于专栏:ffffffff0xffffffff0x

前言

在之前的文章中,我们介绍了windows域环境的结构和组成部分。本文,我们将介绍域环境中使用的kerberos认证协议,并着手分析认证过程。


Kerberos

Kerberos 协议

Kerberos 是一种计算机网络授权协议,用来在非安全网络中,对个人通信以安全的手段进行身份认证软件设计上采用客户端/服务器结构,并且能够进行相互认证,即客户端和服务器端均可对对方进行身份认证。可以用于防止窃听、防止重放攻击、保护数据完整性等场合,是一种应用对称密钥体制进行密钥管理的系统。支持 SSO、Kerberos 的扩展产品也使用公开密钥加密方法进行认证。

当有 N 个人使用该系统时,为确保在任意两个人之间进行秘密对话,系统至少保存有它与每个人的共享密钥,所需的最少会话密钥数为 N 个。

Kerberos 协议基于对称密码学,需要一个值得信赖的第三方。Kerberos 协议的扩展可以为认证的某些阶段提供公钥密码学支持。

Kerberos 认证所参与的角色

  • 访问服务的 Client
  • 提供服务的 Server
  • KDC(Key Distribution Center,密钥分发中心) = DC(Domain Controller)

其中 KDC 服务默认安装在一个域的域控中,而 Client 和 Server 为域内的用户或者是服务,如 HTTP 服务、SQL 服务。在 Kerberos 中 Client 是否有权限访问 Server 端的服务由 KDC 发放的票据来决定。

接下来,我们大致概括一下Kerberos的认证过程。


简要概括认证过程

Kerberos 认证用于域环境中,它是一种基于票据(Ticket)的认证方式。该认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全,并假定网络上传送的数据包可以被任意地读取、修改和插入数据。在以上情况下, Kerberos 作为一种可信任的第三方认证服务,是通过传统的密码技术(如:共享密钥)执行认证服务的。

客户端要访问服务器的资源,首先需要购买服务端认可的 ST 服务票据。也就是说,客户端在访问服务器之前需要预先买好票,等待服务验票之后才能入场。但是这张票不能直接购买,需要一张 TGT 认购权证(Ticket Granting Ticket)。也就是说,客户端在买票之前必须先获得一张 TGT 认购权证。这张 TGT 认购权证和 ST 服务票据均由 KDC 发售。

他的整个认证过程涉及到三方:客户端、服务端和 KDC(Key Distribution Center)。在 Windows 域环境中,由 DC(域控)来作为 KDC。

Kerberos 认证过程如下:

  1. client 向 kerberos 服务请求,希望获取访问 server 的权限。 kerberos 得到了这个消息,首先得判断 client 是否是可信赖的,也就是白名单黑名单的说法。这就是 AS 服务完成的工作,通过在 AD 中存储黑名单和白名单来区分 client。成功后,返回 AS 返回 TGT 给 client。
  2. client 得到了 TGT 后,继续向 kerberos 请求,希望获取访问 server 的权限。kerberos 又得到了这个消息,这时候通过 client 消息中的 TGT,判断出了 client 拥有了这个权限,给了 client 访问 server 的权限 ticket。
  3. client 得到 ticket 后,终于可以成功访问 server。这个 ticket 只是针对这个 server,其他 server 需要向 TGS 申请。

获得认购权证

首先,我们来看看客户端如何获得 TGT 认购权证。TGT 是 KDC 的 KAS 认证服务(Kerberos Authentication Service)发放的。

  1. 当某个用户通过输入域账号和密码试图登录某台主机的时候,本机的 Kerberos 服务会向 KDC 的 KAS 认证服务发送一个认证请求。该请求主要包括两部分内容,明文形式的用户名和用户秘钥加密原始 Authenticator 后得到的加密后 Authenticator(Authenticator 是客户端和服务端可以用于验证对方身份的一个东西)。
  2. 当 KDC 接收到请求之后,通过 AD 查询该用户名得到该用户的信息。通过查询得到的密码信息对 Authenticator 进行解密得到原始的 Authenticator。如果解密后的 Authenticator 和已知的 Authenticator 一致,则证明请求者提供的密码正确,即确定了登录者的真实身份。KAS 成功认证对方的身份之后,会生成一个用户密码加密后的用于确保该用户和 KDC 之间通信安全的 Logon Session Key 会话秘钥。KAS 接着为该用户创建 TGT 认购权证TGT 主要包含两方面的内容:用户相关信息和原始 Logon Session Key,而整个 TGT 则通过 KDC 自己的密钥进行加密。最终,被不同密钥加密的 Logon Session KeyTGT 返回给客户端。

获得 ST 服务票据

经过上面的步骤,客户端获取了进入同域中其他主机入场券的 TGT 认购权证和 Logon Session Key,然后用自己的密钥解密 Logon Session Key 得到原始的 Logon Session Key。然后它会在本地缓存此 TGT 和原始 Logon Session Key。如果现在它需要访问某台服务器的资源,它就需要凭借这张 TGT 认购凭证向 KDC 购买相应的入场券。这里的入场券也有一个专有的名称——ST 服务票据(Service Ticket)。具体来说,ST 是通过 KDC 的另一个服务 TGS(Ticket Granting Service)出售的。

  1. 客户端先向 TGS 发送一个 ST 购买请求,该请求主要包含如下的内容:客户端用户名、通过 Logon Session Key 加密的 AuthenticatorTGT 和访问的服务器名(其实是服务)。
  2. TGS 接收到请求之后,通过自己的秘钥解密 TGT 并得到原始 Logon Session Key,然后通过 Logon Session Key 解密 Authenticator,进而验证对方的真实身份。TGS 完成对客户端的认证之后,会生成一个用 Logon Session Key 加密后的用于确保客户端-服务器之间通信安全的 Service Session Key 会话秘钥。然后为该客户端生成 ST 服务票据ST 服务票据主要包含两方面的内容:客户端用户信息和原始 Service Session Key,整个 ST 通过服务器密码派生的秘钥进行加密。最终两个被加密的 Service Session KeyST 回复给客户端。

用 ST 服务票据双向认证

  1. 客户端接收到 TGS 回复后,通过缓存的 Logon Session Key 解密得到原始 Service Session Key,同时它也得到了进入服务器 ST 服务票据。该 Serivce Session KeyST 服务票据 会被客户端缓存。客户端访问某服务器资源,将 ST 服务票据Service Session Key 加密的 Authenticator 发送给服务端。
  2. 服务器收到客户端发来的 ST 服务票据。但是,服务端如何确保客户端发来的 ST 服务票据 是通过 TGS 购买,而不是自己伪造的呢?这很好办,不要忘了 ST 是通过服务器自己密码派生的秘钥进行加密的。具体的操作过程是这样的,服务器在接收到请求之后,先通过自己密码派生的秘钥解密 ST,并从中提取 Service Session Key。然后通过提取出来的 Service Session Key 解密 Authenticator,进而验证了客户端的真实身份。实际上,到目前为止,服务端已经完成了对客户端的验证,但是,整个认证过程还没有结束。谈到认证,很多人都认为只是服务器对客户端的认证,实际上在大部分场合,我们需要的是双向验证(Mutual Authentication),即访问者和被访问者互相验证对方的身份。现在服务器已经可以确保客户端是它所声称的那么用户,客户端还没有确认它所访问的不是一个钓鱼服务呢。为了解决客户端对服务器的验证,服务端需要将解密后的 Authenticator 再次用 Service Session Key 进行加密,并发挥给客户端。客户端再用缓存的 Service Session Key 进行解密,如果和之前的内容完全一样,则可以证明自己正在访问的服务器和自己拥有相同的 Service Session Key。双向认证过后,开始了服务资源的访问。

接下来,通过详细的交互过程描述kerberos的认证原理。


详细概括认证过程

当 Client 想要访问 Server 上的某个服务时,需要先向 AS 证明自己的身份,然后通过 AS 发放的 TGT 向 Server 发起认证请求,这个过程分为三块:

  • The Authentication Service Exchange: Client 与 AS 的交互
    • AS_REQ
    • AS_REP
  • The Ticket-Granting Service (TGS) Exchange: Client 与 TGS 的交互
    • TGS_REQ
    • TGS_REP
  • The Client/Server Authentication Exchange: Client 与 Server 的交互
    • AP_REQ
    • AP_REP

整体过程如图

用户登录

用户登录阶段,通常由用户(AA)输入用户名信息,在客户端侧,用户输入的密码信息被一个单向 Hash 函数生成 Client 密钥,即 AA 的 NTLM Hash:

请求身份认证

客户端向 AS 发送请求认证

KRB-AS-REQ:Client 发送明文 用户名 AAAuthenticator1 信息到 KDC (Key Distribution Center)。Authenticator1 的内容为使用 Client 密码哈希加密的时间戳、Client ID、网络类型、加密类型等。

AS 确认客户端登陆者身份

KRB-AS-REP:AS 收到用户认证请求后,AS 根据请求中的 用户名 AA 信息,从数据库中查找用户名是否存在。如果 用户名 AA 存在,则从 KDC 中可以获取 用户 AA 的密码,使用单向函数为该密码生成一个 Client 密钥(即NTLM Hash)。

AS 生成随机字符串 Client/TGS Session Key,使用 Client 密钥(用户 AA 的密码 NTLM Hash)对 Client/TGS Session Key 加密得到 sessionkey_as

再使用 TGS 密钥(krbtgt 用户的 NTLM Hash)对 Client/TGS Session KeyClient InfoTimestamp 加密,得到 TGT(TGT票据)。

sessionkey_asTGT 一起返回给 Client。

Client 收到 AS 的响应消息后,利用自身的 Client 密钥(AA 的 NTLM Hash)对 sessionkey_as 解密,这样就获取到 Client/TGS Session Key

  • AS 的响应消息中有一条是属于 Client 的,有一条是 TGS 的。
  • TGT 的到期时间为 8 小时,如果超过了 8 小时,还需要重新申请 TGT,不能之间进入下一步获取 Ticket。
  • KDC 返回的 TGT 客户端是无法解密的,因为它没有 KDC Hash,如果有,我们就可以伪造黄金票据

请求授权访问服务

客户端向 TGS 发送请求服务授权请求

KRB-TGS-REQ:Client 收到 sessionkey_asTGT 后,使用 Client 密钥(AA 的 NTLM Hash)对 sessionkey_as 解密就能得到 Client/TGS Session Key,然后使用 Client/TGS Session Key 对 Client Info 和 timestamp 加密得到 Authenticator2

Authenticator2TGTService ID(要请求的服务 ID)发送给 KDC 中的 TGS。

  • 由于 TGT 是使用 TGS 密钥(krbtgt 的 NTLM Hash)加密的,Client 无法对 TGT 解密。
  • 如果假设这个数据被中间人窃取到,也无法在短时间内破解,因为 KDC 会校验时间戳。

TGS 为 Client 响应服务授权票据

TGS-REP:TGS 收到请求后,检查 KDC 数据库中是否存在所请求的服务(Service ID)。如果存在,TGS 使用 TGS 密钥(krbtgt 的 NTLM Hash)解密 TGT,得到 Client/TGS Session Key、timestamp、Client info;同时使用从 TGT 中解密得到的 Client/TGS Session Key 去解密 Authenticator2,得到 Client info 和 timestamp。 比对 Authenticator2TGT 的解密内容以验证通过。

  • TGS 比对 Authenticator2 包含的 Client IDTGT 中的 Client ID
  • 比较时间戳(误差范围在2分钟)
  • 通过生命周期字段检查 TGT 是否过期
  • 检查 Authenticator2 已经不再 TGS 的缓存中
  • 若原始请求中的网络地址不为 NULL,比较 TGT 中的 IP 和请求的 IP

验证成功后,随机生成 Client 所请求服务的会话密钥 Client/Server Session Key

使用 Server 密钥(即服务器计算机的NTLM Hash)对 Client/Server Session KeyClient Info(包含 Client ID)、TimeStamp 加密得到 Client-To-Server Ticket(也称为 ST 票据);

使用 Client/TGS Session KeyClient/Server Session Key 加密得到 sessionkey_tgs

最终将 Client-To-Server Ticketsessionkey_tgs 返回给 Client。

请求服务

Client 向 SS(Service Server)发送服务请求

AP-REQ:Client 收到 Client-To-Server Ticketsessionkey_tgs 之后,使用 Client/TGS Session Keysessionkey_tgs 解密得到 Client/Server Session Key,然后使用 Client/Server Session Key 对 Client Info 和 timestamp 加密得到 Authenticator3

Authenticator3Client-To-Server Ticket 发送给所请求服务的服务器(Service Server)。

Service Server 响应 Client

AP-REP:Service Server 收到客户端的服务访问请求之后,利用 Server 密钥(Server 的 ntlm Hash)对 Client-To-Server Ticket 解密,提取出 Client/Server SessionKey、Client ID 等信息。

Service Server 使用 Client/Server SessionKeyAuthenticator3 解密得到 Client ID 和 TimeStamp。

Service Server 发送最后的验证消息——用 Client/Server SessionKey 加密的 Timestamp 和 Service ID 数据包给 Client。

Client 收到之后,使用缓存的 Client/Server SessionKey 解密提取 Timestamp 信息,然后确认该信息与 Client 发送的 Authenticator3 中的 Timestamp 信息是否一致。验证通过后,在定义的通讯周期内,Client 可以使用票据请求 Service。

由此完成了 Client 和 Service Server 的双向认证。


总结

本文介绍了域环境中使用的Kerberos认证协议,通过解剖每一步认证的过程来介绍认证原理。在实际应用中,Kerberos不仅用于windows域的环境,linux机器也可以配置进行认证,但关键的流程是一致的。


本文作者 r0fus0d

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Kerberos基础入门
当Client想要访问Server上的某个服务时,需要先向AS证明自己的身份,然后通过AS发放的TGT向Server发起认证请求,这个过程分为三块:
Naraku
2022/02/03
1.2K0
Kerberos基础入门
Windows安全认证机制之Kerberos 域认证
Kerberos是由麻省理工学院(MIT)开发的网络身份验证协议,它的主要好处是强大的加密和单点登录(SSO)。Kerberos作为一种可信任的第三方认证服务,是通过传统的密码技术(如共享密钥)实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全,并假定网络上传送的数据包可以被任意地读取、修改和插入数据的情况下保证通讯安全。
一只特立独行的兔先生
2024/01/23
9920
Windows安全认证机制之Kerberos 域认证
全网最详细 | Kerberos协议详解
Kerberos协议是由麻省理工学院提出的一种网络身份验证协议,提供了一种在开放的非安全网络中认证识别用户身份信息的方法。它旨在通过使用密钥加密技术为客户端/服务端应用程序提供强身份验证。Kerberos是西方神话中守卫地狱之门的三头犬的名字。之所以使用这个名字是因为Kerberos需要三方的共同参与才能完成一次认证流程。目前主流使用的Kerberos版本为2005年RFC4120(https://www.rfc-editor.org/rfc/rfc4120.html)标准定义的KerberosV5版本,Windows、Linux和Mac OS均支持Kerberos协议。
谢公子
2023/02/27
8.1K0
全网最详细 | Kerberos协议详解
内网渗透 | Kerberos 协议与 Kerberos 认证原理
如果你了解内网渗透,那么应该都对 IPC、黄金票据、白银票据、、PTT、PTK 这些老生常谈的词汇再熟悉不过了,对其利用也应该是了如指掌了吧。但是如果你对其背后的所使用的原理还不太了解的话,那么这篇(系列)文章你一定不能错过。
HACK学习
2021/07/21
1.9K1
Kerberos协议认证过程
Kerberos 是一种由 MIT(麻省理工大学)提出的一种网络身份验证协议。它旨在通过使用密钥加密技术为客户端/服务器应用程序提供强身份验证。
Gh0st1nTheShel
2021/11/14
1.6K0
windows 认证机制
NTLM主要应用于用于Windows NT 和 Windows 2000 Server(或更高版本) 工作组环境
宸寰客
2020/10/10
1K0
windows 认证机制
Windows认证--Kerberos
Kerberos是一种由MIT(麻省理工学院)提出的一种网络身份验证协议,可通过密钥系统为客户端/服务端提供认证服务。它能够为网络中通信的双方提供严格的身份验证服务,确保通信双方身份的真实性和安全性。该认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全。
鸿鹄实验室
2022/11/02
1.3K0
Windows认证--Kerberos
内网渗透|Kerberos认证和黄金票据
Kerberos是一种计算机网络授权协议,用来在非安全网络中,对个人通信以安全的手段进行身份认证。
亿人安全
2022/12/23
9460
内网渗透|Kerberos认证和黄金票据
NTLM及Kerberos认证流程
NTLM是NT LAN Manager的缩写,NTLM 是指 telnet 的一种验证身份方式,即问询/应答身份验证协议,是 Windows NT 早期版本的标准安全协议,Windows 2000 支持 NTLM 是为了保持向后兼容。Windows 2000内置三种基本安全协议之一。
Y5neKO
2022/01/13
1.9K0
NTLM及Kerberos认证流程
轻松理解 Kerbreos 的认证过程
前几天在给人解释 Windows 是如何通过 Kerberos 进行 Authentication 的时候,讲了半天也别把那位老兄讲明白,还差点把自己给绕进去。
信安之路
2018/08/08
1.3K0
轻松理解 Kerbreos 的认证过程
windows域环境下认证和攻击初识
Kerberos是一种认证机制。目的是通过密钥系统为客户端/服务器应用程序提供强大的可信任的第三方认证服务:保护服务器防止错误的用户使用,同时保护它的用户使用正确的服务器,即支持双向验证。kerberos最初由MIT麻省理工开发,微软从Windows 2000开始支持Kerberos认证机制,将kerberos作为域环境下的主要身份认证机制,理解kerberos是域渗透的基础。
谢公子
2022/01/20
9870
windows域环境下认证和攻击初识
一文了解黄金票据和白银票据
该攻击方式在BlackHat 2014被提出,演讲者为Alva Duckwall & Benjamin Delpy(@gentilkiwi)进行了演示,该演讲提出了Kerberos协议实现过程中的设计逻辑缺陷,也就是说Windows所有使用Kerberos的场景中都可以进行此类攻击
中龙技术
2022/09/29
9.5K0
一文了解黄金票据和白银票据
Windows安全认证是如何进行的?[Kerberos篇]
最近一段时间都在折腾安全(Security)方面的东西,比如Windows认证、非对称加密、数字证书、数字签名、TLS/SSL、WS-Security等。如果时间允许,我很乐意写一系列的文章与广大网友
蒋金楠
2018/02/07
1.6K0
Windows安全认证是如何进行的?[Kerberos篇]
一文搞定Kerberos
Kerberos 是一种身份认证协议,被广泛运用在大数据生态中,甚至可以说是大数据身份认证的事实标准。本文将详细说明 Kerberos 原理。
数据仓库践行者
2020/10/29
1.5K0
一文搞定Kerberos
Windows认证及抓密码总结
windows的认证方式主要有NTLM认证、Kerberos认证两种。同时,Windows Access Token记录着某用户的SID、组ID、Session、及权限等信息,也起到了权限认证的作用。
HACK学习
2019/08/06
1.8K0
Windows认证及抓密码总结
windows内网基础
工作组可以认为是同一网络内,功能相似的电脑进行的分组。 举个例子: “在一个网络内,可能有成百上千台电脑,如果这些电脑不进行分组,都列在“网上邻居”内,可想而知会有多么乱。为了解决这一问题,Windows 9x/NT/2000就引用了“工作组”这个概念,将不同的电脑一般按功能分别列入不同的组中,如财务部的电脑都列入“财务部”工作组中,人事部的电脑都列入“人事部”工作组中。你要访问某个部门的资源,就在“网上邻居”里找到那个部门的工作组名,双击就可以看到那个部门的电脑了。 ” 这就是工作组,但是在工作组中的电脑还是各自管理。当其中一台计算机访问另一台计算机时还是要经过另一台计算机的认证的
ConsT27
2022/02/11
8020
windows内网基础
windows的认证方式
在本地登陆的情况下,操作系统会使用用户输入的密码作为凭据去与系统中的密码进行校验,如果成功的话表明验证通过。操作系统的密码存储在C盘的目录下:
黑白天安全
2020/04/28
2.7K0
windows的认证方式
Kerberos认证流程详解
Kerberos 是一种网络认证协议,是通过密钥系统为客户机/服务器应用程序 提供认证服务。该认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址 的信任,不要求网络上所有主机的物理安全,并假定网络上传送的数据包可以被任意的读取、 修改和插入数据。
红队蓝军
2024/07/26
8100
Kerberos认证流程详解
干货 | 全网最详细的Kerberos协议及其漏洞
krbtgt 用户,该用户是在创建域时系统自动创建的一个账号,其作用是密钥发行中心的服务账号,其密码是系统随机生成的,无法正常登陆主机。
HACK学习
2021/07/21
5.7K0
[原创]谈谈基于Kerberos的Windows Network Authentication - Part II
四、引入Ticket Granting  Service 通过上面的介绍,我们发现Kerberos实际上一个基于Ticket的认证方式。Client想要获取Server端的资源,先得通过Server的认证;而认证的先决条件是Client向Server提供从KDC获得的一个有Server的Master Key进行加密的Session Ticket(Session Key + Client Info)。可以这么说,Session Ticket是Client进入Server领域的一张门票。而这张门票必须从一个合法
蒋金楠
2018/02/07
1K1
[原创]谈谈基于Kerberos的Windows Network Authentication - Part II
相关推荐
Kerberos基础入门
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档