Kerberos协议初探

作者 f0zz 日期 2022-03-07
Kerberos协议初探

Kerberos简介

Kerberos是什么

  • Kerberos是一种计算机网络认证协议
  • Kerberos协议基于对称密码学,并需要一个值得信赖的第三方
  • Kerberos协议允许某实体在非安全的环境下建立通信,向另一个实体以安全的方式证明自己身份。主要针对客户端–服务器之间的认证。二者都能验证对方的身份,所以Kerberos协议可以防止窃听和重复攻击。

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

一个可信赖第三方:

认证服务器和票据服务器组成的一个可信赖第三方
这个可信赖第三方称为KDC(密钥发放中心)

Kerberos原理

image.png
由此可以得出,这里对称加密的公钥就是客户端发送用户名的密码
image.png
(Kerberos认证过程)
用户登录机器

  1. 用户输入ID和密码到客户端,客户端运行单向函数把密码转换成密钥(user’s secret key)

客户端认证

  1. Client向AS(Authentication Server 认证服务器)发送身份认证请求,包括需要登录用户的id
  2. AS在数据库内查找对应信息,并且通过相同途径将AS数据库内匹配到的密码转换成用户密钥
  3. KDC确认成功后返回
    1. A:通过用户密钥加密的**Client/TGS会话密钥(Client/TGS Session Key) **
    2. B:通过TGS密钥加密的TGT(Ticket Granting Ticket票据授权票据)TGT:包括消息A中的Client/TGS会话密钥,用户id,用户网站,TGT有效期
  4. Client收到消息A 和B,尝试使用本地的用户密钥解密A,从而得到Client/TGS会话密钥(值得一提的是 Client并不能解密消息B,Client再揭密消息A就足以通过TGS进行认证了,消息B会被用在服务授权的_申请服务_一步中)

服务授权

  1. Client向服务端发送以下消息,申请特定服务
    1. C: 消息B中的TGS密钥加密后的TGT和想获取服务的ID
    2. D:认证符(Authenticator)用户ID和时间戳,并且通过Client/TGS密钥进行加密
  2. 服务器收到消息先检查有无Client需要的服务,查找到之后,TGS使用自己的TGS密钥解密消息C中的TGT。从而得到之前生成的Client/TGS会话密钥,然后用于解密消息D得到用户ID和时间戳,对Client手中的票据验证是否合法,通过返回
    1. E: client-server票据,由提供对应服务的服务器密钥加密
    2. F: Client/SS会话密钥,通过Client/TGS会话密钥及逆行加密
  3. 客户端用Client/TGS会话密钥解密F,得到Client/SS密钥。最后请求服务
  4. 在请求服务的过程中,服务器依然会对时间戳和会话密钥进行验证合法性
涉及三方:服务器,客户端,DC下的KDC(AS和TGS)和数据库
客户端认证:
	1. 用户登录到客户端
		客户端:我是xxx(客户端ID等信息),我想请求服务,但我不说是啥
	2. 服务器认证客户端 ———— Kerberos
		AS:看看这人认不认识(检查客户端ID信息是否在数据库内),成功的话就返回消息
			消息A:<一大串>这是你和票据发放服务器TGS的信物(Client/TGS会话密钥),密码是你的NTLM Hash
			消息B:<一大串>这是你的会话密钥,ID,网址和有效期(票据授权票据TGT,TGS的密钥进行加密)
		客户端:收到了,我先解密消息A,拿到了TGS密钥(可以向TGS发起请求),消息2就不解密了。

服务授权
	3. 客户端指定服务,服务器授权客户端
		客户端:
			消息C:TGS,我想访问ID(服务ID)是xxxxx的服务,这是消息B的信息,AS说给你
			消息D:这是我的认证信息(TGS会话密钥加密的ID和时间戳)。
		TGS:让我看看你的服务ID在不在数据库内,然后用TGS会话密钥解密消息C中的消息B信息,得到TGS密钥,然后使用TGS密钥解密消息D,核对完成后告诉客户端:
			消息E:你可以访问服务器了,这是你的票据Client-Server Ticket。里面有Client/SS会话密钥,用户ID,网站和票据有效期。票据使用服务器密钥进行加密
			消息F:Client/SS会话密钥:Client/server session key,使用Client/TGS会话密钥进行加密
		客户端:好的,我收到了。先用消息A的Client/TGS会话密钥解密消息F。消息E无法解密,因为他是使用服务器密钥进行加密的
	4. 客户端请求服务
		客户端:我拿着消息F的Client/SS会话密钥去问问服务器,发送两条消息
			消息G:用服务器密钥加密的票据
			消息H:用Client/SS会话密钥加密的验证信息(ID和时间戳)
		服务器:收到信息,解密消息G,得到Client/SS密钥,然后解密消息F,获取用户ID和时间戳
			消息I:这是新的时间戳,它使用Client/SS会话密钥进行加密
	5. 客户端确认服务器身份,开始向服务器发送请求
		客户端验证服务器发来的时间戳,确认服务器身份,开始访问

金票和银票

黄金票据、白银票据则可以用来对域控进行权限维持。

金票(Golden Ticket)

金票是通过伪造的TGT,可以利用它发送给TGS换取任意服务的ST。可以利用金票再将用户的权限提升到域管权限。

制作条件
1. 域名称
2. 域的SID值
3. 域的KRBTGT账户密码HASH
4. 伪造用户名,可以是任意的

银票(Silver Tickets)

银票用来提升普通用户的权限
白银票据是伪造TGS。这意味着白银票据仅限于特定服务器上的任何服务
大多数服务不验证PAC(通过将PAC校验和发送到域控制器进行PAC验证),因此使用服务帐户密码哈希生成的有效TGS可以完全伪造PAC

制作条件
1. 目标服务账号的密码hash值。
2. 如果目标服务正在使用中的帐户(如MS SQL)下运行,则需要服务帐户密码哈希

Referer:
Kerberos-Wikipedia
Kerberos的白银票据详解