Skip to content
Wireshark Wiki 中文翻译整理专题首页原始页面

Kerberos

Kerberos 是一种在网络用户与服务之间提供相互认证的协议,常见于 Unix 环境和 Windows Active Directory 环境。在 Wireshark 中,本页主要用于识别 Kerberos 流量、理解 AS/TGS/AP 交换,以及在有 keytab 的情况下解密 Kerberos ticket 和部分使用 GSS-API/Kerberos 的上层协议。

什么时候用:

  • 排查登录、单点登录、服务票据申请、委派或认证失败问题。
  • 分析 UDP/TCP 88 端口上的 Kerberos v5 流量。
  • 在具备共享密钥或 keytab 的前提下,让 Wireshark 解密 Kerberos tickets,并进一步解密 LDAP、DCE/RPC 等使用 GSS-API 和 Kerberos 的协议。

不要混淆:

概念含义排查时注意
PrincipalKerberos 中的身份名称,可代表用户或服务例如用户 principal 或 cifs/host.example.com@REALM 这类服务 principal。
TicketKDC 发给客户端、用于向服务证明身份的票据Wireshark 解密 ticket 通常需要对应密钥或 keytab。
KDCKey Distribution Center,Kerberos 的密钥分发中心通常包含 AS 与 TGS 角色;在 AD 中由域控制器承担。
AS exchange客户端向认证服务申请初始凭据常见消息为 AS-REQ / AS-REP。
TGS exchange客户端用已有凭据申请访问某服务的票据常见消息为 TGS-REQ / TGS-REP。
AP exchange客户端向目标服务出示票据常见消息为 AP-REQ / AP-REP。
Keytab保存 principal 密钥的文件Wireshark 可用它解密可匹配的 Kerberos 数据;不要把 keytab 当普通配置文件公开。

历史

Kerberos 最初作为 Athena 项目的一部分开发和部署,当时的协议版本是 Kerberos v4。Kerberos v4 没有官方规范,除 AFS 环境中仍有有限使用外,其他环境基本已被 Kerberos v5 取代。

Kerberos 5 已标准化,并存在多种实现。原页列出的常见实现包括 Heimdal Kerberos、MIT Kerberos,以及 Microsoft 在 Windows 2000 及更高版本中使用的实现。

Kerberos 最初是纯认证系统;如今也通过 PKINIT/X.509 和 Microsoft PAC 结构等扩展承载授权数据。

协议依赖

最初 Kerberos 使用 UDP 作为传输协议;现代实现也支持 TCP,以克服 UDP 中的 PDU 大小限制。所有现代客户端都支持 TCP,但较旧客户端可能不支持。

常见捕获过滤器:

text
udp port 88
text
tcp port 88

仅显示 Kerberos v5 流量:

text
kerberos

仅显示 Kerberos v4 流量:

text
kerberos4

Kerberos 交换流程速查

交换参与方目的Wireshark 中常见线索
AS exchangeClient 与 KDC/AS获取初始凭据,通常是 TGTAS-REQ、AS-REP、预认证相关字段。
TGS exchangeClient 与 KDC/TGS用 TGT 申请访问目标服务的 service ticketTGS-REQ、TGS-REP、服务 principal。
AP exchangeClient 与目标服务向服务出示 ticket,完成服务访问认证AP-REQ、AP-REP,可能嵌在 LDAP、SMB、DCE/RPC 等上层协议中。

排查时可按时间顺序先看 AS,再看 TGS,最后看 AP。若只有 AP 交换,可能抓包开始时间晚于用户登录或票据申请。

Wireshark 中的 Kerberos 解析与解密

Kerberos dissector 功能完整。如果 Wireshark 编译并链接了 Heimdal 或 MIT Kerberos 库,并且提供了包含共享密钥的 keytab 文件,就可以解密 Kerberos tickets。原页说明此功能可用于 Linux/Unix;Windows 支持在 0.99.3 中加入。

此支持还可用于若干使用 GSS-API 和 Kerberos 的协议解密,例如 LDAP 和 DCE/RPC。

可在 KRB5 preferences 中指定 keytab 文件:

  • GUI:Edit -> Preferences -> Protocols -> KRB5 -> Kerberos keytab file
  • 命令行:使用 -K option 指定要加载的 keytab file;可以多次使用以加载多个 keytab。

旧版限制(原页历史记录):

  • Wireshark 1.10.3 左右的 Windows 版本曾有 bug,只能指定文件名而不能指定完整路径;当时需要把 keytab 放在 capture file 同目录。
  • 同期 64-bit Windows version 曾未启用 Kerberos 支持;可通过 About Dialog 查看是否 “without Kerberos”。这些问题原页记录为已修复。

创建 keytab 文件

使用 ktutil

MIT 和 Heimdal Kerberos 都提供 ktutil。如果已知 principal 的密码或 Kerberos key,可用它创建 keytab。

已知密码时的原页示例(Windows domain 用户,MIT ktutil):

text
ktutil
ktutil: addent -password -p username/domain.com@DOMAIN.COM -k <kvno> -e aes256-cts-hmac-sha1-96
ktutil: wkt ./keytab.file
ktutil: quit

原页说明,现代 Windows 环境默认使用 AES256;较旧环境使用 rc4-hmac。实际算法应以抓包中的 etype 字段为准。

已知 key 时的原页示例,使用 rc4-hmac,因为该 key 实际上是 NT hash:

text
$ ktutil
ktutil: addent -p adm-drp@inscorp.com -k 1 -key -e rc4-hmac
Key for adm-drp@inscorp.com (hex): 5c4dbe6a8a44446f8d2899ff08ea14f2
ktutil: wkt ins.keytab
ktutil: q

使用 ktpass.exe

Windows 2003 support tools 中的 ktpass.exe 也可以创建 keytab。原页提醒:只有 Windows 2003 SP1 support tools 中的较新版本支持 RC4 keys。

用于导出 computer account principal 的原页示例:

text
C:\temp> ktpass /out quark.keytab /mapuser quark$@FOO.NET /princ cifs/quark.foo.net@FOO.NET /crypto RC4-HMAC-NT /rndpass /ptype KRB5_NT_PRINCIPAL
Targeting domain controller: dc1.foo.net
Using legacy password setting method
Successfully mapped cifs/quark.foo.net to quark$.
WARNING: Account quark$ is not a user account (uacflags=0x1021).
WARNING: Resetting quark$'s password may cause authentication problems if quark$ is being used as a server.
Reset quark$'s password [y/n]? y
WARNING: pType and account type do not match. This might cause problems.
Key created.
Output keytab to quark.keytab:
Keytab version: 0x502
keysize 64 cifs/quark.foo.net@FOO.NET ptype 1 (KRB5_NT_PRINCIPAL) vno 3 etype 0x17 (RC4-HMAC) keylength 16 (0xd0fc81746c2bed1da5d505b491634ce5)

原页特别提醒:在已加入 domain 的机器的 computer account 上重置密码可能造成问题;可考虑使用不会重置密码的替代方法。

使用 ktexport.exe 或 NTDSXtract

原页还描述了从 Windows domain controller 导出 Kerberos keys 的方法:

方法原页要点风险提示
ktexport.exe可将 domain controller 上的 RC4 keys 转储到 keytab;不会像 ktpass 那样重置密码。需要在目标 domain controller 上运行;keytab 中除 RC4 keys 外的部分数据可能不准确,但原页称 Wireshark 不在意。
NTDSXtract可从 SYSTEM 与 NTDS.DIT 中导出 Kerberos keys;不会修改 Domain Controller。涉及域控数据库和密钥材料,敏感度极高;应只在合法授权和取证流程中使用。

原页给出了提取 SYSTEM 与 NTDS.DIT、使用 ntdsutil、Volume Shadow Copy、esedbexport、Python 2、PyCrypto、NTDSXtract dskeytab.py 等历史步骤。这些内容依赖旧工具和旧系统环境,本文不展开重写;实际操作应以当前工具文档、授权范围和取证要求为准。

示例捕获文件

原页提到:

  • SampleCaptures/krb-816.zip:包含 Kerberos traffic capture 和 keytab file。
  • SampleCaptures/kerberos-Delegation.zip:Windows Active Directory 中 Kerberos Delegation 的示例,也包含 keytab file。
  • SampleCaptures/constained-delegation.zip:Windows 2003 domain 中 Kerberos constrained delegation (s4U2Proxy) 的示例。

外部链接

  • Wikipedia article on Kerberos
  • Kerberos:A visual description of Kerberos
  • RFC 4120:The Kerberos Network Authentication Service (V5)
  • RFC 3961:Encryption and Checksum Specifications for Kerberos 5
  • RFC 3962:Advanced Encryption Standard (AES) Encryption for Kerberos
  • draft-ietf-krb-wg-kerberos-clarifications:RFC 1510 Clarifications

已废弃:

  • RFC 1510:The Kerberos Network Authentication Service (V5)

Imported from https://wiki.wireshark.org/Kerberos on 2020-08-11 23:15:46 UTC

相关 Wireshark Wiki 页面

网络分析技术档案