域渗透
01-本地认证
02-本地密码抓取
03-网络认证
04-域基础知识
05-域环境部署
06-域认证
07-域密码抓取
08-横向移动
09-凭证传递
10-票据
11-委派
-
+
06-域认证
浏览
1
# 一、来源 Kerberos 这个名字来源于希腊神话中的三头犬 “Cerberus”,它把守着地狱的大门,只允许灵魂进入,不允许他们离开。Kerberos 协议借用这个名字,寓意着它像 Cerberus 一样守护着网络资源的入口,防止未授权的访问。 在 Kerberos 协议诞生之前,网络通信中的身份认证方式存在诸多安全隐患。例如,简单的密码认证方式容易受到中间人攻击、重放攻击等威胁,因为密码在传输过程中可能会被截获和破解。 麻省理工学院(MIT)在 20 世纪 80 年代中期启动了雅典娜项目(Project Athena),旨在为校园用户提供一个便捷、安全的计算环境。在这个项目中,研究人员面临着如何在开放的网络环境中实现安全身份认证的问题,于是 Kerberos 协议应运而生,它通过引入票据授权机制和对称加密技术,为网络认证提供了一种全新的解决方案,有效降低了密码在网络传输中的风险,提高了身份认证的安全性和可靠性。 官网地址:https://web.mit.edu/kerberos/ # 二、概述 Kerberos 是一种网络认证协议,旨在为客户端/服务器应用程序提供强身份认证。 通过使用对称加密和信任第三方认证服务器(密钥分发中心,KDC)来确保网络通信的安全性。 Kerberos 的核心思想是通过票据(Ticket)进行认证,避免了在每次通信时都传输明文密码,从而提高了安全性。 客户端通过密钥分发中心(KDC) 获取访问服务器资源所需的票据,然后凭借票据向服务器证明自己的身份。 票据中包含用户身份信息、服务器身份信息、会话密钥、时间戳和有效期等。 客户端和服务器通过验证票据中的信息来确认彼此的身份,从而无需每次都进行密码验证。 # 三、认证机制 ## 概述  具体流程:  其中: - 预认证时间戳(PA-ENC-TIMESTAMP):客户端使用用户密钥(NT Hash)加密当前时间戳; - krbtgt是每个 AD 域创建时自动生成的内置特殊账号,KDC 的服务账号,用来加密 / 解密所有 TGT 票据; - SPN(Service Principal Name,服务主体名称)是 AD 里用来唯一标识一个网络服务实例的名字,作用是把【服务】和【运行这个服务的 AD 账号(机器账号 / 域服务账号)绑定在一起,Kerberos 协议在 TGS 阶段依靠 SPN 去查找对应的账号密钥,用来加密 ST 服务票据。 ## 客户端与AS 核心目标:客户端向 KDC 证明「我是合法域用户」,换取 TGT(票据授予票据) 和 TGT 会话密钥,作为后续申请服务票据的凭证。 客户端与认证服务器之间的流程: - 用户输入账号密码 - 客户端根据密码派生用户密钥。 - 客户端通过 DNS 找到域控 KDC,默认 Kerberos 端口88 - 客户端向 AS 发送 AS-REQ,AS-REQ 中包含用户密钥加密的时间戳与当前用户名 - AS 查询 AD,验证用户身份 - AS 返回 AS-REP - TGT:用 krbtgt 密钥加密,客户端无法解密。 - 登录会话密钥:用用户密钥加密,客户端可解密 - 客户端保存 TGT 和登录会话密钥 ## 客户端与TGS 核心目标:客户端拿着 TGT,向 KDC 申请访问某一具体业务服务的 ST(服务票据) 和 Client-Service 会话密钥。 客户端与票据授予服务器之间的流程: - 客户端要访问某服务,例如 HTTP/web01、MSSQLSvc/db01 - 客户端向 TGS 发送 TGS-REQ: - TGT - Authenticator,用登录会话密钥加密 - 目标服务 SPN - TGS 用 krbtgt 密钥解密 TGT,验证 Authenticator - TGS 查询 SPN 对应服务账号,生成服务票据 - TGS 返回 TGS-REP: - 服务票据ST:用服务账号密钥加密 - 服务会话密钥:用登录会话密钥加密 - 客户端保存服务票据ST和服务会话密钥 ## 客户端与目标服务 核心目标:客户端用 ST 向目标服务证明身份,服务端完成身份校验和权限判断,最终允许访问资源。 - 客户端向目标服务发送 AP-REQ: - 服务票据 - Authenticator,用服务会话密钥加密 - 服务用自身账号密钥解密服务票据,提取服务会话密钥 - 服务用服务会话密钥解密 Authenticator,验证时间戳和防重放 - 服务检查 PAC,进行授权判断 - 返回 AP-REP 实现双向认证 - 之后客户端与服务进行应用通信 # 四、数据包分析 ## 分析环境 | 机器名 | 用户名 | IP地址 | | ------ | ------------- | -------------- | | win08 | win08 | 192.168.88.202 | | win12 | win12 | 192.168.88.201 | | DC | administrator | 192.168.88.200 | ## 获取AS数据包 在win08机器中,使用kekeo工具完成kerberos攻击,并抓取数据包(域控需要开机): ```cmd tgt::ask /user:域用户 /domain:域名 /password:密码 tgt::ask /user:win12 /domain:abc.com /password:ABCabc123 ```   ## AS-REQ数据包 > 报文头部基础信息  | 字段 | 值 | 含义 | | ----------- | --------------- | ------------------------------------------------------------ | | pvno | 5 | Kerberos 主版本号,Kerberos V5,当前域环境通用标准版本 | | msg-type | krb-as-req (10) | 报文类型码 10,代表这是 AS-REQ 认证请求,RFC 标准定义的类型编号 | | Record Mark | 220 bytes | 整个 Kerberos 报文的总长度 | > padata 预认证数据段  - 第一项:PA-ENC-TIMESTAMP(预认证时间戳) - AS-REQ 全程不发送明文密码、不直接发送密码 Hash,只发送「用用户 Hash 加密的时间戳」,KDC 用 AD 里的用户 Hash 解密这段密文来验证身份。 | 字段 | 值 | 含义 | | ----------- | --------------------------- | ------------------------------------------------------------ | | padata-type | 2 | 类型码 2,代表 PA-ENC-TIMESTAMP,也就是我们讲的「预认证数据」 | | etype | eTYPE-ARCFOUR-HMAC-MD5 (23) | 加密类型:RC4-HMAC-MD5,类型码 23,对应使用用户 NT Hash 作为密钥加密 | | cipher | 一长串密文 | 核心内容:用用户 NT Hash 加密后的当前时间戳 | 第二项:PA-PAC-REQUEST(PAC 请求) | 字段 | 值 | 含义 | | ----------- | ---- | ------------------------------------------------------------ | | padata-type | 128 | 类型码 128,代表 PA-PAC-REQUEST,Windows 域扩展字段 | | include-pac | True | 客户端向 KDC 请求:请在返回的 TGT 票据里包含 PAC 特权属性证书 | - PAC 是 Windows Kerberos 特有的权限凭证,里面存用户 SID、组 SID、权限信息,后续目标服务靠 PAC 做授权判断。 - 这里说明客户端是 Windows 系统,请求带权限信息的票据。 > 请求体部分  客户端身份信息(cname+realm): | 字段 | 值 | 含义 | | ------------ | --------------------- | ------------------------------- | | name-type | kRB5-NT-PRINCIPAL (1) | 名称类型:用户主体(人 / 账号) | | cname-string | win12 | 请求认证的用户名:win12 | | realm | abc.com | 所属域:abc.com | 请求体部分-请求目标服务(sname): | 字段 | 值 | 含义 | | ------------ | ----------------------- | --------------------------- | | name-type | kRB5-NT-SRV-INST (2) | 名称类型:服务实例 | | sname-string | krbtgt、所属域:abc.com | 两段拼接后为 krbtgt/abc.com | AS-REQ 阶段请求的目标服务固定是 krbtgt / 域名,本质就是向 KDC 申请 TGT 票据: - AS-REQ 的 sname 一定是 krbtgt/域 - TGS-REQ 的 sname 是具体业务 SPN(如 cifs/fs01.abc.com) ## AS-REP数据包 > 报文头部基础信息  | 字段 | 值 | 含义 | | ----------------- | --------------- | ------------------------------------------------------------ | | pvno | 5 | Kerberos V5 版本 | | msg-type | krb-as-rep (11) | 报文类型码 11,代表 AS-REP 认证响应 | | crealm | abc.com | 响应所属域 | | cname | win12 | 该响应对应的请求用户:win12@abc.com,和上一条 AS-REQ 一一对应 | | Response to: 18 | | 这是对第 18 号数据包(也就是那条 AS-REQ)的应答 | | Time from request | 1.05ms | 域内 KDC 响应耗时,符合局域网特征 | > ticket 字段数据  | 字段 | 值 | 含义 | | -------- | --------------- | ------------------------------------------------------------ | | tkt-vno | 5 | 票据版本号,Kerberos V5 | | realm | abc.com | 票据所属域 | | sname | krbtgt /abc.com | 票据的目标服务是 krbtgt/abc.com,这就是 TGT 的标志:票据的用途是访问 KDC 的 TGS 服务 | | enc-part | 加密部分 | TGT 的核心加密内容,使用 krbtgt 账号的密钥加密 | TGT 内部封装了 TGT 会话密钥、用户身份、PAC 权限信息、有效期;但因为用 krbtgt 密钥加密,客户端无法解密、无法篡改。 > 外层的enc-part 外层的enc-part部分是加密的 TGT 会话密钥。  | 字段 | 值 | 含义 | | ------ | --------------------------- | ------------------------------------------------------------ | | etype | eTYPE-ARCFOUR-HMAC-MD5 (23) | 加密算法:RC4-HMAC-MD5,类型码 23 | | kvno | 2 | Key Version Number,密钥版本号。=2 说明 win12 这个账号的密码已经修改过 1 次(初始为 1) | | cipher | 一长串密文 | 核心密文:用 win12 用户密码 Hash 加密的 TGT 会话密钥 + nonce + 有效期 | 客户端收到 AS-REP 后,用本地计算的用户 NT Hash 解密这段外层 cipher,取出 TGT 会话密钥,校验 nonce 和请求时一致,认证就完成了一半。 - nonce = Number used once(一次性随机数),是客户端在发起请求时随机生成的、仅本次请求有效的数字,核心作用是校验响应的新鲜度,防御重放攻击(Replay Attack),确保收到的响应是针对「当前这次请求」的,而不是攻击者截获的历史旧报文。 > 当前数据包的两个加密数据分析 | 位置 | 加密密钥 | 里面装的是什么 | 谁能解密 | | ---------------------- | -------------------------------- | -------------------------------------- | ---------------------------- | | ticket 内部的 enc-part | krbtgt 账号密钥 | TGT 会话密钥 + 用户信息 + PAC + 有效期 | 只有 KDC 能解密 | | 外层的 enc-part | win12 用户的 NT Hash(用户密钥) | TGT 会话密钥 + nonce + 票据有效期 | 客户端用自己的密码 Hash 解密 | ## 获取TGS数据包 使用kekeo工具,伪装服务,本地生成ST票据,同时进行Wireshark抓包。 CIFS = Common Internet File System(通用互联网文件系统),是微软基于 SMB 协议扩展而来的网络文件共享协议,是 Windows 环境下最经典的跨主机文件 / 打印机共享协议。 ```bash tgs::ask /tgt:tgt票据 /service:服务名/域名地址 tgs::ask /tgt:TGT_win12@ABC.COM_krbtgt~abc.com@ABC.COM.kirbi /service:ci fs/win12.abc.com ```   ## TGS-REQ数据包 > 头部基础信息  | 字段 | 值 | 含义 | | -------- | ---------------- | ----------------------------------------------------- | | pvno | 5 | Kerberos V5 版本 | | msg-type | krb-tgs-req (12) | 报文类型码 12,TGS 请求,和 AS-REQ 的类型码 10 做区分 | | padata | 1 item | 预认证 / 凭证段 | > req-body请求体  | 字段 | 值 | 含义 | | ----- | ------------------- | ------------------------------------------------------------ | | realm | abc.com | 所属域 | | cname | win12 | 请求用户,和 AS 阶段一致 | | sname | cifs +win12.abc.com | 拼接为 SPN:cifs/win12.abc.com,代表要访问 win12 主机的 CIFS 文件共享服务 | | till | Sep 13, 2037 | 客户端期望的票据有效期,最终以 KDC 为准 | | nonce | 1802073961 | 全新生成的随机数,用于校验本次响应的新鲜度,和 AS 阶段 nonce 无关 | | etype | 3 种算法 | 客户端支持的加密优先级:AES256 (18) > AES128 (17) > RC4 (23),KDC 优先选最高的兼容算法 | > 外层padata封装  | 字段 | 值 | 含义 | | ------------ | -------------- | ------------------------------------------------------------ | | padata-type | PA-TGS-REQ (1) | 预认证类型码 1,代表这是 TGS 请求的凭证结构,是 Kerberos 标准定义的固定格式 | | padata-value | 长密文结构 | 内部封装了一整个完整的 ap-req 报文 | > 内层ap-req 标准的应用请求格式,包含两大部分:ticket 票据 + authenticator 认证。  ap-options标识符: | Bit 位置 | 标志名称 | 含义说明 | | -------- | --------------- | ------------------------------------------------------------ | | bit7 | reserved | 保留位,协议预留,必须为 0 | | bit6 | use-session-key | 是否使用会话密钥加密 Authenticator;False:使用服务的主密钥;True:使用会话密钥 | | bit5 | mutual-required | 是否需要双向认证;False:单向认证,服务端不用返回 AP-REP;True:双向认证,服务端必须返回 AP-REP,客户端校验服务身份 | ticket字段(TGT票据,原样传递给 TGS): | 字段 | 值 | 含义 | | --------------- | ---------------------- | ------------------------------------------------------------ | | tkt-vno | 5 | Kerberos V5 票据版本 | | realm / sname | abc.com/krbtgt.abc.com | 票据目标服务是 krbtgt/abc.com,100% 确认这是 TGT 票据,不是业务服务的 ST | | enc-part.etype | AES256 (18) | TGT 加密算法为 AES-256 | | enc-part.kvno | 2 | krbtgt 账号的密钥版本号 = 2,说明 krbtgt 密码曾修改过 1 次 | | enc-part.cipher | 长密文 | TGT 核心内容,使用 krbtgt 账号密钥加密,只有 KDC 能解密,内部包含 TGT 会话密钥、用户身份、PAC 权限信息 | authenticator 字段: | 字段 | 值 | 含义 | | ------ | ----------- | ------------------------------------------------------------ | | etype | AES256 (18) | 加密算法和 TGT 匹配 | | cipher | 长密文 | 使用 TGT 会话密钥 加密,内部包含客户端身份信息、当前时间戳、序列号 | TGS 收到后,先用 krbtgt 密钥解密 TGT,取出里面的 TGT 会话密钥;再用这个会话密钥解密 Authenticator,校验时间戳和身份,确认请求者确实持有 TGT,不是重放攻击。 ## TGS-REP数据包 返回信息:ST 服务票据 + 加密的 Client-Service 会话密钥。 客户端执行动作:用 TGT 会话密钥解密外层密文,取出 Client-Service 会话密钥,校验 nonce 一致,就拿到了访问目标服务的凭证。  最后的Missing keytype 18 usage 8 or 9 不是报文错误,是 Wireshark 的解密提示。 > 报文头部基础信息 | 字段 | 值 | 含义 | | --------------- | ---------------- | --------------------------------- | | msg-type | krb-tgs-rep (13) | 报文类型码 13,TGS 响应 | | crealm / cname | abc.com/ win12 | 对应用户和域,和请求一一对应 | | Response to: 55 | | 对应第 55 号数据包的 TGS-REQ 请求 | > ticket-ST服务票据本体 | 字段 | 值 | 含义 | | --------------- | ------------------ | ------------------------------------------------------------ | | sname | cifs/win12.abc.com | 票据对应的目标服务 SPN,和请求一致 | | enc-part.etype | AES256 (18) | 加密算法:AES-256,类型码 18 | | enc-part.kvno | 1 | 密钥版本号:该服务账号(win12 机器账号)密码未修改过,初始版本 | | enc-part.cipher | 长密文 | ST 核心密文,使用 目标服务账号的密钥(win12 机器账号的 NT Hash) 加密 | ST 内部封装了:Client-Service 会话密钥、用户身份、PAC 权限信息、有效期;只有目标服务能解密,客户端无法读取和篡改。 > 外层 enc-part | 位置 | 加密密钥 | 内部内容 | 谁能解密 | | ---------------------- | ------------------ | ---------------------------------------- | ----------------------------------- | | ticket 内部的 enc-part | win12 机器账号密钥 | Client-Service 会话密钥 + 用户信息 + PAC | 只有目标服务(win12)能解密 | | 外层 enc-part | TGT 会话密钥 | Client-Service 会话密钥 + nonce + 有效期 | 客户端用之前拿到的 TGT 会话密钥解密 | ## 获取AP数据包 Client/Server Authentication Exchange(客户端 - 服务端认证交换),简称 AP 交换。 使用kekeo工具,伪装域管理员服务票据,访问域控机器。 申请TGT票据 ```txt tgt::ask /user:域用户 /domain:域名 /password:域用户密码 ``` ```txt tgt::ask /user:administrator /domain:abc.com /password:a1b2c3.. ```  查看本地凭证: ```cmd klist ```  访问域控共享磁盘:  申请ST并注入到内存中: ```txt tgs::ask /tgt:tgt票据 /service:服务名\域名地址 /ptt ``` ```cmd tgs::ask /tgt:TGT_administrator@ABC.COM_krbtgt~abc.com@ABC.COM.kirbi /service:cifs/dc.abc.com /ptt ```  再次查看本地凭证:  有了凭证,再次访问域控机器:  将票据凭证删除:   然后再次将ST票据注入内存时,获取数据包:  在wireshark中搜索 smb or smb2,定位到AP数据包。  ## AP-REQ数据包 > 字段描述  | 字段 | 值 | 含义 | | ---------------------------- | --------------------- | ------------------------------------------------------------ | | SMB2 | Session Setup Request | SMB2 协议,**会话建立请求**,用来做身份认证 | | Preauth Hash | 长哈希串 | SMB3 预认证哈希,用于 SMB 会话完整性校验,和 Kerberos 本身无关 | | Security mode:0x02 | Signing required | **强制 SMB 签名**,会话后续所有 SMB 报文必须做签名防篡改 | | Capabilities:0x00000001, DFS | DFS | 客户端支持分布式文件系统 | | Blob Offset / Blob Length | 0x00000058 / 1639 | 标记 Security Blob 在 SMB 报文内的起始位置和长度 | | Security Blob(高亮) | 长串十六进制 | 核心,里面封装了完整的 KRB_AP_REQ(AP 数据包) | > 协商信息  | 字段 | 值 | 含义 | | ------------ | ------------------------------------------------------ | -------------------------------------------------- | | GSS-API | Generic Security Service Application Program Interface | 跨平台统一安全接口 | | SPNEGO OID | 1.3.6.1.5.5.2 | 简单保护协商,用于客户端和服务端协商认证方式 | | negTokenInit | 协商初始化包 | 客户端列出自己支持的认证机制,这里首选 Kerberos V5 | | Kerberos OID | 1.2.840.113554.1.2.2 | 标识本次选用 Kerberos V5 认证 | | krb5_tok_id | KRB5_AP_REQ (0x0001) | 明确 token 类型为 AP 请求 | > Kerberos信息  mutual-required = True:客户端要求双向认证,服务端认证成功后必须返回 AP-REP 报文,向客户端证明自己身份,防止中间人冒充服务器。 ticket 字段:ST 服务票据 | 字段 | 值 | 含义 | | --------------- | ---------------- | ------------------------------------------------------------ | | realm | abc.com | 票据所属域 | | sname | cifs /dc.abc.com | 目标服务 SPN:cifs/dc.abc.com,对应域控的文件共享服务 | | enc-part.etype | AES256 (18) | ST 使用 AES-256 加密 | | enc-part.kvno | 3 | 密钥版本号 = 3,说明 dc$ 机器账号的密码已经修改过 2 次 | | enc-part.cipher | 长密文 | ST 核心内容,使用 dc.abc.com 机器账号的密钥加密,只有目标服务器能解密 | authenticator 字段:会话密钥。 | 字段 | 值 | 含义 | | ------ | ----------- | ------------------------------------------------------------ | | etype | AES256 (18) | 和票据加密算法一致 | | cipher | 长密文 | 使用 Client-Service 会话密钥 加密,内部包含客户端身份、当前时间戳、序列号 | 校验逻辑:服务端解密 ST 取出会话密钥,再用会话密钥解密 Authenticator,校验时间戳和身份,防止重放攻击。 ## AP-REP数据包  SPNEGO部分: | 字段 | 值 | 含义 | | ------------- | -------------------- | ------------------------------------- | | negResult | accept-completed (0) | 协商结果:认证成功,协商完成 | | supportedMech | MS KRB5 | 最终选定微软 Kerberos V5 作为认证机制 | | krb5_tok_id | KRB5_AP_REP (0x0002) | 令牌类型明确为 Kerberos AP 响应 | 对应请求里的 negTokenInit,响应返回 negTokenTarg,表示服务端接受了 Kerberos 认证方式,并且身份校验通过。 enc-part部分: | 字段 | 值 | 含义 | | ------ | ----------- | ------------------------------------------------------------ | | etype | AES256 (18) | 加密算法和请求保持一致,AES-256 | | cipher | 长密文 | 使用 Client-Service 会话密钥 加密,内部核心是服务端返回的校验时间戳(通常是客户端 Authenticator 里的时间戳 +1 单位时间) | # 五、ST票据账号 ST 服务票据的 enc-part 加密密钥,是该票据对应 SPN 所绑定的 AD 账号的密钥。 - 它既可能是目标机器账号(计算机账号)密钥,也可能是自定义域服务账号(域用户账号)密钥,完全取决于这个 SPN 注册在哪个账号下。 - SPN 归属于哪个账号,ST 就用哪个账号的密钥加密。 ## 机器账号 Windows 主机加入域时,会自动注册一批默认服务 SPN(如 `HOST/主机名`、`CIFS/主机名`、`TERMSRV/主机名`、`LDAP/主机名` 等),这些 SPN 全部绑定在**该主机的计算机账号**上。 | 项目 | 说明 | | -------- | ------------------------------------------------------------ | | 账号格式 | `机器名$`(如 `DC$`、`WIN12$`),AD 中的计算机类型账号 | | 密钥来源 | 机器账号的 NT Hash / AES 密钥,系统自动生成,默认每 30 天自动轮换 | | 典型服务 | 文件共享(CIFS)、远程桌面(TERMSRV)、主机通用服务(HOST)、域控 LDAP 等系统默认服务 | ## 域用户账号 当业务服务(如 SQL Server、IIS 应用池、中间件)以指定的域用户账号运行时,管理员需要**手动将该服务的 SPN 注册到这个域用户账号**上。 | 项目 | 说明 | | -------- | ----------------------------------------------------------- | | 账号类型 | 普通域用户账号(如 `sqlsvc`、`iisapppool`) | | 密钥来源 | 该域用户账号的密码 Hash,通常由管理员手动设置、长期不更换 | | 典型服务 | SQL Server、自定义 Web 服务、其他以域用户身份运行的业务服务 | ## 注意事项 关于服务账号: - 广义的服务账号:所有用来运行服务的 AD 账号,既包括机器账号,也包括自定义域用户服务账号 - 狭义的服务账号:通常特指管理员创建的、专门用来跑业务服务的域用户账号 - 机器账号本质上也是一种服务账号,只是它是计算机类型、由系统自动管理 KDC 签发 ST 时的统一逻辑:通过 SPN 查询 AD,找到该 SPN 所属的账号,取出该账号的密钥加密票据,不区分是机器账号还是用户账号。
毛林
2026年11月15日 18:30
转发文档
收藏文档
上一篇
下一篇
评论(0)
登录
后可发表评论
还没有评论,来抢沙发~
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
Word文档
PDF文档(打印)
分享
链接
类型
密码
更新密码
还没有评论,来抢沙发~