Kerberos协议之AS_REQ & AS_REP

警告
本文最后更新于 2020-11-12,文中内容可能已过时。

Kerberos是一种由MIT(麻省理工大学)提出的一种网络身份验证协议。

# 简述Kerberos

Kerberos是一种由MIT(麻省理工大学)提出的一种网络身份验证协议。它旨在通过使用密钥加密技术为客户端/服务器应用程序提供强身份验证。

在Kerberos协议中主要是有三个角色的存在:

  1. 访问服务的Client(以下表述为Client 或者用户)
  2. 提供服务的Server(以下表述为服务)
  3. KDC(Key Distribution Center)密钥分发中心 kerberos 测试工具介绍

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

kerberos的简化认证认证过程如下图

image.png

  1. AS_REQ: Client向KDC发起AS_REQ,请求凭据是Client hash加密的时间戳
  2. AS_REP: KDC使用Client hash进行解密,如果结果正确就返回用krbtgt hash加密的TGT票据,TGT里面包含PAC,PAC包含Client的sid,Client所在的组。
  3. TGS_REQ: Client凭借TGT票据向KDC发起针对特定服务的TGS_REQ请求
  4. TGS_REP: KDC使用krbtgt hash进行解密,如果结果正确,就返回用服务hash 加密的TGS票据(这一步不管用户有没有访问服务的权限,只要TGT正确,就返回TGS票据)
  5. AP_REQ: Client拿着TGS票据去请求服务
  6. AP_REP: 服务使用自己的hash解密TGS票据。如果解密正确,就拿着PAC去KDC那边问Client有没有访问权限,域控解密PAC。获取Client的sid,以及所在的组,再根据该服务的ACL,判断Client是否有访问服务的权限。

本文注重前两个

# AS_REQ

用daiker师傅的工具来发Kerberos包。

配置域账户

image.png

勾上PAPAC_REQUESTENCTIMESTAMPetypes里的rc4hmac加密。发包

image.png

抓包可见两个请求包AS-REQ AS-REP

image.png

AS-REQ中各个字段

  1. pvno Kerberos版本
  2. msg-type Kerberos类型 0x0a对应krb-as-req
  3. padata 存放了PA-ENC-TIMESTAMP和PA-PAC-REQUEST 3.1 PA-ENC-TIMESTAMP是预认证,使用用户hash加密时间戳,AS存放了用户的hash,AS用用户hash解密获得时间戳。如果时间戳在某一个时间则认证成功。 3.2 PA-PAC-REQUEST是微软引入的PAC拓展,include-pac=true,KDC会根据include的值来判断返回的票据中是否携带PAC。
  4. req-body

image.png
4.1 cname PrincipalName 类型。PrincipalName包含type和value。 KRB_NT_PRINCIPAL = 1 意思是只用用户名就行,比如[email protected]这个域用户,只需要填admin KRB_NT_SRV_INST = 2 service and other unique instance (krbtgt) 这个一般指服务账户名 KRB_NT_ENTERPRISE_PRINCIPAL = 10 [email protected]用户全称。 4.2 sname PrincipalName 类型 在AS_REQ里面sname是krbtgt,类型是KRB_NT_SRV_INST 4.3 till 到期时间 4.4 nonce 随机数 4.5 etype hash加密类型

# AS-REP

image.png

KDC使用用户hash解密,如果结果正确返回用krbtgt hash加密的TGT票据。

image.png

各个字段的含义

  1. msg-type krb-as-rep 对应的是0x0b
  2. crealm 域名
  3. cname 用户类型和用户名
  4. ticket tgt票据 这里存在黄金票据的问题,因为返回的tgt是通过krbtgt的hash加密的,如果知道krbtgt的hash,则可以伪造任意用户。
  5. enc-part 这部分可以用daiker师傅的工具解密。key是用户hash,解密后得到Encryptionkey。

image.png

# 参考

  1. https://daiker.gitbook.io/windows-protocol/kerberos/1
  2. https://github.com/daikerSec/windows_protocol/tree/master/tools

吹爆daiker师傅

文笔垃圾,措辞轻浮,内容浅显,操作生疏。不足之处欢迎大师傅们指点和纠正,感激不尽。