0x00 kerberos协议概述
Kerberos是一种由MIT(麻省理工大学)提出的一种网络身份验证协议。它旨在通过使用密钥加密技术为客户端/服务器应用程序提供强身份验证。
在Kerberos协议中主要是有三个角色的存在:
- 访问服务的Client(以下表述为Client 或者用户)
- 提供服务的Server(以下表述为服务)
- KDC(Key Distribution Center)密钥分发中心 kerberos 测试工具介绍
其中KDC服务默认会安装在一个域的域控中,而Client和Server为域内的用户或者是服务,如HTTP服务,SQL服务。在Kerberos中Client是否有权限访问Server端的服务由KDC发放的票据来决定。
kerberos的简化认证认证过程如下图
- ASREQ:Client向KDC发起ASREQ,请求凭据是Client hash加密的时间戳。
- AS_REP:KDC使用Client hash进行解密,如果结果正确就返回用krbtg hash加密的TGT票据,TGT里面包含PAC,PAC包含Client的sid,Client所在的组。
- TGSREQ:Client凭借TGT票据向KDC发起针对特定服务的TGTREQ请求。
- TGS_REP:KDC使用krbtgt hash解密,如果结果正确,就返回服务hash加密的TGS票据(这一步不管用户有没有访问服务的权限,只要TGT正确,就返回TGS票据)。
- AP_REQ: Client拿着TGS票据去请求服务。
- AP_REP: 服务使用自己的hash解密TGS票据。如果解密正确,就拿着PAC去KDC那边问Client有没有访问权限,域控解密PAC。获取Client的sid,以及所在的组,再根据该服务的ACL,判断Client是否有访问服务的权限。
0x01 AS_REQ
用户向KDC发起ASREQ,请求凭据是用户 hash加密的时间戳。请求凭据放在PADATA里面。详情见以下每个字段的详细介绍。
pvno
kerberos 版本号
msg-type
类型,ASREQ对应的就是KRBAS_REQ(0x0a)
PA_DATA
主要是一些认证信息。一个列表,包含若干个认证消息用于认证,我们也可以Authenticator。每个认证消息都有type和value。
type主要有以下一些:
NONE = 0;
TGS_REQ = 1,
AP_REQ = 1,
ENC_TIMESTAMP = 2,
PW_SALT = 3,
ENC_UNIX_TIME = 5,
SANDIA_SECUREID = 6,
SESAME = 7,
OSF_DCE = 8,
CYBERSAFE_SECUREID = 9,
AFS3_SALT = 10,
ETYPE_INFO = 11,
SAM_CHALLENGE = 12,
SAM_RESPONSE = 13,
PK_AS_REQ_19 = 14,
PK_AS_REP_19 = 15,
PK_AS_REQ_WIN = 15,
PK_AS_REQ = 16,
PK_AS_REP = 17,
PA_PK_OCSP_RESPONSE = 18,
ETYPE_INFO2 = 19,
USE_SPECIFIED_KVNO = 20,
SVR_REFERRAL_INFO = 20,
SAM_REDIRECT = 21,
GET_FROM_TYPED_DATA = 22,
SAM_ETYPE_INFO = 23,
SERVER_REFERRAL = 25,
TD_KRB_PRINCIPAL = 102,
PK_TD_TRUSTED_CERTIFIERS = 104,
PK_TD_CERTIFICATE_INDEX = 105,
TD_APP_DEFINED_ERROR = 106,
TD_REQ_NONCE = 107,
TD_REQ_SEQ = 108,
PA_PAC_REQUEST = 128,
S4U2SELF = 129,
PA_PAC_OPTIONS = 167,
PK_AS_09_BINDING = 132,
CLIENT_CANONICALIZED = 133在AS_REQ阶段主要用到的有两个
ENC_TIMESTAMP
这个是预认证,就是用用户hash加密时间戳,作为value 发送给AS服务器。然后AS服务器那边有用户hash,使用用户hash进行解密,获得时间戳,如果能解密,且时间戳在一定的范围内,则证明认证通过
PAPACREQUEST
这个是启用PAC支持的扩展。PAC(Privilege Attribute Certificate)并不在原生的kerberos里面,是微软引进的扩展。PAC包含在ASREQ的响应body(ASREP)。这里的value对应的是include=true或者include=false(KDC根据include的值来判断返回的票据中是否携带PAC)。
- REQ_BODY
kdc-options 一些flag 字段
VALIDATE = 0x00000001,
RENEW = 0x00000002,
UNUSED29 = 0x00000004,
ENCTKTINSKEY = 0x00000008,
RENEWABLEOK = 0x00000010,
DISABLETRANSITEDCHECK = 0x00000020,
UNUSED16 = 0x0000FFC0,
CANONICALIZE = 0x00010000,
CNAMEINADDLTKT = 0x00020000,
OK_AS_DELEGATE = 0x00040000,
UNUSED12 = 0x00080000,
OPTHARDWAREAUTH = 0x00100000,
PREAUTHENT = 0x00200000,
INITIAL = 0x00400000,
RENEWABLE = 0x00800000,
UNUSED7 = 0x01000000,
POSTDATED = 0x02000000,
ALLOWPOSTDATE = 0x04000000,
PROXY = 0x08000000,
PROXIABLE = 0x10000000,
FORWARDED = 0x20000000,
FORWARDABLE = 0x40000000,
RESERVED = 0x80000000
cname
PrincipalName 类型。PrincipalName包含type和value。
- KRBNTPRINCIPAL = 1 means just the name of the principal 如daizhibin
- KRBNTSRV_INST = 2 service and other unique instance (krbtgt) 如krbtgt,cifs
- KRBNTENTERPRISE_PRINCIPAL = 10 如 user@domain.com
在AS_REQ里面cname 是请求的用户,这个用户名存在和不存在,返回的包有差异,可以用于枚举域内用户名。详情见相关的安全问题>用户名枚举
sname
PrincipalName 类型
在ASREQ里面sname是krbtgt,类型是KRBNTSRVINST
realm –> 域名
form –> 发送时间
tll
到期时间,rubeus和kekeo都是20370913024805Z,这个可以作为特征来检测工具。
nonce
随机生成的一个数kekeo/mimikatz nonce是12381973,rubeus nonce是1818848256,这个也可以用来作为特征检测工具。
etype
加密类型,有
des_cbc_crc = 1,
des_cbc_md4 = 2,
des_cbc_md5 = 3,
des3_cbc_md5 = 5,
des3_cbc_sha1 = 7,
dsaWithSHA1_CmsOID = 9,
md5WithRSAEncryption_CmsOID = 10,
sha1WithRSAEncryption_CmsOID = 11,
rc2CBC_EnvOID = 12,
rsaEncryption_EnvOID = 13,
rsaES_OAEP_ENV_OID = 14,
des_ede3_cbc_Env_OID = 15,
des3_cbc_sha1_kd = 16,
aes128_cts_hmac_sha1 = 17,
aes256_cts_hmac_sha1 = 18,
rc4_hmac = 23,
rc4_hmac_exp = 24,
subkey_keymaterial = 65
这个地方要注意的是如果在配置里面选择用hash(不是plaintext)的话,hash的加密类型,要跟etype一样。因为KDC是按照etype类型选择用户对应加密方式的hash,如果是选择明文(plaintext),那么client 会按照etype里面的加密方式将明文加密成hash。
0x02 AS_REP
KDC使用用户 hash进行解密,如果结果正确返回用krbtgt hash加密的TGT票据,TGT里面包含PAC,PAC包含用户的sid,用户所在的组。
msg-type
ASREQ的响应body对应的就是KRBAS_REP(0x0b)
crealm
域名
cname
用户名
ticket
这个ticket用于TGSREQ的认证。是加密的,用户不可读取里面的内容。在ASREQ请求里面是,是使用krbtgt的hash进行加密的,因此如果我们拥有krbtgt的hash就可以自己制作一个ticket,既黄金票据。详情见相关的安全问题>黄金票据.
enc_part
这部分是可以解密的,key是用户hash,解密后得到Encryptionkey,Encryptionkey里面最重要的字段是session key,作为下阶段的认证密钥。
0x03 导出的票据
凭据里面最核心的东西是session-key和加密的ticker。
正常我们用工具生成的凭据是.ccache
和.kirbi
后缀用的,用mimikatz,kekeo,rubeus生成的凭据是以.kirbi后缀的。impacket 生成的凭据的后缀是.ccache。两种票据主要包含的都是session-key和加密的ticket,因此可以相互转化。
kirbi为例介绍下该结构体。
1 | KRB-CRED::= [APPLICATION 22] SEQUENCE { |
其中ticket来自于KRBASREP部分的ticket
1 | EncKrbCredPart ::= [APPLICATION 29] SEQUENCE { |
- 本文作者: y0lo
- 本文链接: http://example.com/2022/03/04/Windows内网之kerberos/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!