kerberos协议

发布时间 2023-12-30 23:12:25作者: qingshanboy

内网认证-kerberos

krbtgt用户:这个用户是创建域时系统自动创建的一个账户,它是KDC的服务账户,其密码是系统随机创建,该账户无法正常登录主机。

身份认证请求

1.Client向域控发起身份认证请求,请求包含了用户名。域控的KDC的AS查询AD数据库,找到对应用户的NTLM HASH。

2.AS响应两个消息

Msg A:用该用户的NTLM HASH加密一个复杂的字符串作为CLIENT / TGS SESSIONKEY(这个CLIENT / TGS SESSIONKEY有两份,一份在Msg A给了CLIENT 一份给了TGS)

Msg B:使用TGS密钥加密的TGT,TGS密钥就是krbtgt的NTLM HASH。(客户端没有TGS密钥。所以其无法修改TGT)

TGT包含了:
CLIENT / TGS SESSIONKEY
CLIENT ID
票据有效时间
CLIENT 地址

3.Client收到AS的响应,使用自己的NTLM HASH(Client KEY)解密Msg A得到CLIENT / TGS SESSIONKEY的明文。

在用户登录时,机器会根据其输入的密码生成NTLM HASH,如果输入密码正确,那么这里CLIENT的NTLM HASH和域控的AS用来加密CLIENT / TGS SESSIONKEY的NTLM HASH是一样的。

服务授权请求

1.CLIENT请求访问某个服务,生成两个消息

Msg C:请求服务ID+之前收到的TGT

Msg D:使用CLIENT / TGS SESSIONKEY加密的身份认证信息(包括了CLIENT ID+时间范围)

2.KDC收到请求,先用krbtgt NTLM HASH解密TGT。得到CLIENT / TGS SESSIONKEY,再使用CLIENT / TGS SESSIONKEY解密Msg D。对比TGT和解密的Msg D中的CLIENT ID、有效时间。

3.对比一致则响应服务票据给CLIENT,响应包括:

Msg E:SERVICE密钥(服务器的NTLM HASH)加密的CLIENT-TO-SERVER TICKET(允许访问服务的票据)

CLIENT-TO-SERVER TICKET包括:
CLIENT / SERVER SESSIONKEY
CLIENT 地址
Ticket有效时间
CLIENT ID

Msg F:使用CLIENT / TGS SESSIONKEY加密的CLIENT / SERVER SESSIONKEY

4.上面说了CLIENT可以用自己的NTLM HASH解密得到CLIENT / TGS SESSIONKEY,所以这里可以用CLIENT / TGS SESSIONKEY解密得到CLIENT / SERVER SESSIONKEY。但是服务访问票据无法解密(因为没有SERVICE KEY,无法更改)

发送服务请求

1.CLIENT向SERVER发送的请求消息包括:

之前从域控那得到的Msg E

Msg G:CLIENT / SERVER SESSIONKEY加密的身份认证信息(包括CLIENT ID和时间范围)

2.SERVER收到请求后,先用SERVICE KEY解密Msg E得到CLIENT / SERVER SESSIONKEY,再用CLIENT / SERVER SESSIONKEY解密Msg G,对比解密Msg E和 Msg G中的到的CLIENT ID,如果一致则响应

3.SERVER响应:

Msg H:包含CLIENT / SERVER SESSIONKEY加密的时间范围

4.CLIENT使用CLIENT / SERVER SESSIONKEY解密Msg H,确保时间范围和之前发出去的Msg G中的时间范围一致。

从上述流程来看,获取了krbtgt的NTLM HASH就可以伪造TGT,修改里面的CLIENT / TGS SESSIONKEY,这样伪造的Msg D(也就是服务授权请求的身份认证信息)就可以骗过KDC,也就是伪造黄金票据。

而获取了SERVICE NTLM HASH就可以伪造CLIENT-TO-SERVER TICKET;并可以修改CLIENT / SERVICE SESSIONKEY,这样伪造的Msg G(也就是服务请求时的身份认证信息)就可以骗过SERVER,也就是伪造了白银票据。