Kerberos简介
Kerberos是什么
- Kerberos是一种计算机网络认证协议
- Kerberos协议基于对称密码学,并需要一个值得信赖的第三方
- Kerberos协议允许某实体在非安全的环境下建立通信,向另一个实体以安全的方式证明自己身份。主要针对客户端–服务器之间的认证。二者都能验证对方的身份,所以Kerberos协议可以防止窃听和重复攻击。
当有N个人使用该系统时,为确保在任意两个人之间进行秘密对话,系统至少保存有它与每个人的共享密钥,所需的最少会话密钥数为N个。
一个可信赖第三方:
认证服务器和票据服务器组成的一个可信赖第三方
这个可信赖第三方称为KDC(密钥发放中心)
Kerberos原理
由此可以得出,这里对称加密的公钥就是客户端发送用户名的密码
(Kerberos认证过程)
用户登录机器
- 用户输入ID和密码到客户端,客户端运行单向函数把密码转换成密钥(user’s secret key)
客户端认证
- Client向AS(Authentication Server 认证服务器)发送身份认证请求,包括需要登录用户的id
- AS在数据库内查找对应信息,并且通过相同途径将AS数据库内匹配到的密码转换成用户密钥
- KDC确认成功后返回
- A:通过用户密钥加密的**Client/TGS会话密钥(Client/TGS Session Key) **
- B:通过TGS密钥加密的TGT(Ticket Granting Ticket票据授权票据)TGT:包括消息A中的Client/TGS会话密钥,用户id,用户网站,TGT有效期
- Client收到消息A 和B,尝试使用本地的用户密钥解密A,从而得到Client/TGS会话密钥(值得一提的是 Client并不能解密消息B,Client再揭密消息A就足以通过TGS进行认证了,消息B会被用在服务授权的_申请服务_一步中)
服务授权
- Client向服务端发送以下消息,申请特定服务
- C: 消息B中的TGS密钥加密后的TGT和想获取服务的ID
- D:认证符(Authenticator)用户ID和时间戳,并且通过Client/TGS密钥进行加密
- 服务器收到消息先检查有无Client需要的服务,查找到之后,TGS使用自己的TGS密钥解密消息C中的TGT。从而得到之前生成的Client/TGS会话密钥,然后用于解密消息D得到用户ID和时间戳,对Client手中的票据验证是否合法,通过返回
- E: client-server票据,由提供对应服务的服务器密钥加密
- F: Client/SS会话密钥,通过Client/TGS会话密钥及逆行加密
- 客户端用Client/TGS会话密钥解密F,得到Client/SS密钥。最后请求服务
- 在请求服务的过程中,服务器依然会对时间戳和会话密钥进行验证合法性
涉及三方:服务器,客户端,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的白银票据详解