Kerberos 是一种身份验证协议,它作为一种可信任的第三方认证服务,通过使用对称加密技术为客户端 / 服务器应用程序提供强身份验证。在域环境下,AD 域使用 Kerberos 协议进行验证,熟悉和掌握 Kerberos 协议是学习域渗透的基础。
Kerberos 协议中主要的三个角色:
1. 访问服务的 Client
2. 提供服务的 Server
3.KDC:密钥分发中心,默认安装在域控上
AS:身份验证服务
TGS:票证授予服务
Kerberos 协议认证过程:
协议可以分为三个步骤:一是获得票据许可票据,二是获取服务许可票据,三是获得服务。
第一步:获得票据许可票据
KRB_AS_REQ:用于向 KDC 请求 TGT
当用户在客户端输入域用户和密码时,客户端将用户密码转换为 hash 作为加密密钥,对时间戳进行加密作为请求凭据。
cipher:加密的时间戳,即客户端的当前时间与用户的 hash 加密后的结果
KRB_AS_REQ 数据包如下:
KRB_AS_REP:用于通过 KDC 传递 TGT
收到请求后,KDC 从 AD 域数据库中找到对用用户的 hash 解密时间戳来验证用户身份。如果时间戳在允许的时间范围内,那么它就会生成一个会话密钥(Session key),以 AS_REP 数据包进行响应。
AS_REP 包含信息:
ticket:使用 krbtgt hash 加密,包含用户名 / 会话密钥和到期时间等信息.
enc-part:使用用户 hash 加密,包含会话密钥 /TGT 到期时间和随机数(防重放)
KRB_AS_REP 数据包如下:
第二步:获得服务许可票据
KRB_TGS_REQ:使用 TGT 向 KDC 请求 TGS
客户端获得 TGT 和用户密钥加密的 enc-part,使用用户 hash 解密 enc-part 获得会话密钥(Session key),然后使用会话密钥将用户名 / 时间戳进行加密,生成 authenticator 和 TGT 发送给 TGS。
ticket:实质上就是一张 TGT,客户端没有 krbtgt hash,故无法解密 TGT.
KRB_TGS_REQ 数据包如下:
KRB_TGS_REP:通过 KDC 传递 TGS
TGS 收到 KRB_TGS_REQ 请求后,使用 krbtgt hash 解密 ticket 获取会话密钥(Session key),然后使用会话密钥解密 authenticator 获取用户名和时间戳进行身份验证。确认信息后,创建一个服务会话密钥(Service Session key)。
ticket:使用对应的服务密钥进行加密,包含服务会话密钥 / 用户名 / 到期时间等信息,本质上就是一张 ST(Service Ticket)。
enc-part:包含使用会话密钥加密的服务会话密钥(Service Session key)
KRB_TGS_REP 数据包如下:
第三步:获得服务
KRB_AP_REQ:使用 TGS,服务对用户身份验证
客户端已经拥有了有效的 TGS 可以与服务进行交互,使用会话密钥解密 enc-part,得到 服务会话密钥(Service Session key),将用户名 / 时间戳等信息使用服务会话密钥(Service Session key)进行加密,得到新的 Authentication。
KRB_AP_REP:由服务用来针对用户标识自身
服务端接收到请求,使用自己的 hash 解密 TGS 获得服务会话密钥(Service Session key)和授权用户信息,然后使用服务会话密钥解密 Authentication,比对用户名和时间戳等信息,如果有相互验证标记,服务端使用服务会话密钥加密时间戳发给客户端,客户端解密时间戳验证服务端,然后开始请求服务。
Kerberos SSP支持不同的加密类型,密钥的长度也各不相同。虽然密钥的长度决定着这种加密方法保护程度,密钥的长度不意味着票据的强度。下表列出 Kerberos SSP 支持的不通加密方法的密钥长度。
不通加密类型的密钥长度
加密算法 | 密钥长度 |
RC4-HMAC | 128 |
DES-CBC-CRC | 56 |
DES-CBC-MD5 | 56 |