通过 Wireshark 解密 Kerberos 票据

前言


在使用 Wireshark 分析 Active Directory 的 Kerberos 的流量时,会遇到加密票据的情况,这对进一步探究 AD 下的漏洞篡改事件的详细过程造成了影响。在查询资料时也了解到也有一些攻击流量的 payload 也可能存在被解析为加密存根导致分析中断。

此处记录一下如何在搭建的域控下对加密数据进行解密。

!tip

这不仅可以解密 Kerberos 的交换,TGT 申请过程,对于 NTLM、NTLMSSP 之类的流量也是可以解密的。

解密过程


获取密钥

Wireshark 可以通过提供其所需密钥来对流量尽心解析,密钥类型取决于 Kerberos 在交换过程中所需的算法,如:RC4、AES128、AES256 等。如果不确定需要什么密钥,尽可能地多添加密钥,常用的密钥有

  • krbtgt 密钥
  • 域控用户密钥
  • 服务用户密钥
  • 机器账户密钥
  • 机器名密钥(需要添加$符号)

对于这些密钥,我们可以使用 mimikatz 的 DCSync 功能进行获取,可以全部进行获取,也可以根据协议交换过程中用到的账户进行选择性获取,此处以 AD 的 administrator 为例

cmd 复制代码
lsadump::dcsync /user:adsec2016\administrator

结果如下

复制代码
mimikatz # lsadump::dcsync /user:adsec2016\administrator
[DC] 'adsec2016.com' will be the domain
[DC] 'WIN-P44GKINISTG.adsec2016.com' will be the DC server
[DC] 'adsec2016\administrator' will be the user account
[rpc] Service  : ldap
[rpc] AuthnSvc : GSS_NEGOTIATE (9)

Object RDN           : Administrator

** SAM ACCOUNT **

SAM Username         : Administrator
Account Type         : 30000000 ( USER_OBJECT )
User Account Control : 00000200 ( NORMAL_ACCOUNT )
Account expiration   : 1601/1/1 8:00:00
Password last change : 2024/4/15 6:58:22
Object Security ID   : S-1-5-21-552453423-3366154315-3546583025-500
Object Relative ID   : 500

Credentials:
  Hash NTLM: e50d929fa1dfd9264dde5b6b0b6d8572
    ntlm- 0: e50d929fa1dfd9264dde5b6b0b6d8572
    ntlm- 1: 1fefaf6822cb97df439bda03271776fc
    lm  - 0: 7113517266eada9bd68b839872dec574

Supplemental Credentials:
* Primary:NTLM-Strong-NTOWF *
    Random Value : 5a797b7ce28d94017963dd136b9e9d28

* Primary:Kerberos-Newer-Keys *
    Default Salt : ADSEC2016.COMAdministrator
    Default Iterations : 4096
    Credentials
      aes256_hmac       (4096) : c5947b5050d16a08f1464ddac9b58d973e7a9f5104b6079ecdfcf12a0b2aa2a8
      aes128_hmac       (4096) : e3f5b5669995f7f0dd7e2fab8626f9d2
      des_cbc_md5       (4096) : 0e6dd56268c75280
...

通过上述结果可以得到我们想要的信息

复制代码
RC4:e50d929fa1dfd9264dde5b6b0b6d8572 (NTLM哈希通常用于Kerberos预认证过程中,特别是在使用RC4加密类型的情况下)
AES256:c5947b5050d16a08f1464ddac9b58d973e7a9f5104b6079ecdfcf12a0b2aa2a8
AES128:e3f5b5669995f7f0dd7e2fab8626f9d2

制作 keytab

根据 MIT 介绍

一个 keytab(简称"密钥表")存储一个或多个主体的长期密钥。通常,keytab 以标准格式的文件表示,尽管在极少数情况下,它们可以以其他方式表示。keytab 最常用于允许服务器应用程序接受客户端的身份验证,但也可以用于为客户端应用程序获取初始凭据。

Wireshark 官方提供了一些 keytab 的制作方法,这里选择由 Dirk-jan @_dirkjan Mollema 编写的 keytab.py 脚本文件,该工具不需要明文密码,只需要原始密钥。

下载地址: https://github.com/dirkjanm/forest-trust-tools/blob/master/keytab.py ,需要注意的是需要安装 impacket 依赖

打开该脚本,并编辑 112 行,将所需的密钥填进去,此处由于在看 CVE-2021-44487 的数据,因此用到了多组密钥

python 复制代码
# Add your own keys here!
105 # Keys are tuples in the form (keytype, 'hexencodedkey')
106 # Common keytypes for Windows:
107 # 23: RC4
108 # 18: AES-256
109 # 17: AES-128
110 # Wireshark takes any number of keys in the keytab, so feel free to add
111 # krbtgt keys, service keys, trust keys etc
112 keys = [
113     (23, 'bc6e1d2921a500d638d801f3898515a4'), # krbtgt
114     (18, '9b33632bb69ccdcd0e3eb89166dd3d461e1e1c7a13bc530f2bedaf0777821bbf'),
115     (17, '1d4d7dcf199c72e5af2d10bb7ae985c0'),
116     (23, 'e50d929fa1dfd9264dde5b6b0b6d8572'), # Administrator
117     (18, 'c5947b5050d16a08f1464ddac9b58d973e7a9f5104b6079ecdfcf12a0b2aa2a8'),
118     (17, 'e3f5b5669995f7f0dd7e2fab8626f9d2'),
119     (23, 'e9507d46f1df250c472c3e83f1f7aca5'), # guest01
120     (18, 'c0a40b6e5b746632439056d4df1588bb3d44eed05b4f6e72df026a5bbb65b66f'),
121     (17, '8f8702291ae9554166823d260da81634'),
122     (23, '2709a0739a51f5a79b0d6ce7c8f9e0b1'), # guest02
123     (18, '9b3b828d094b9c0734b8a247805e8690c2787ad3ad649efd8ecbff9e5eb6ea8d'),
124     (17, 'b4ac44a6bbe4cae8dc6ad5a5de47aa9e'),
125     (23, '3c7aa1d1613ceff062049ac898513319'), # 域控$
126     (18, 'd389e0cef8e2a6afe7f3212141b1be81c735ecc774b744efa7459a36556ef0bd'),
127     (17, '5f73be69ede5ffd9a80ec850973055af'),
128     (23, '58a478135a93ac3bf058a5ea0e8fdb71'), # demo11
129     (18, '69e230af518a4c2bb58261cd478e59db0c9bfb0eceb7fdfec0806d5fc571d9e2'),
130     (17, '996f1d0c0937f8b33d09678ec3661b5a')
131 ]

填写完毕后,运行

复制代码
python3 keytab.py keytab.txt

生成 keytab.txt 文件,并导入 Wireshark,位置 编辑->首选项->Protocols->KRB5

解密结果

如果成功解密,则会显示蓝色的高亮,并会提示使用的哪个密钥

比如在 AS-REP 中可以看到 PAC 的解密信息

如果高亮字段是黄色,则说明解密失败,可以根据 etype 字段确定失败原因,如下图的提示 Missing kettype 18 usage 3 missing in frame 82 keytype 18 说明是第 82 个 frame 缺少对应的 AES256 密钥,根据提示重新填充即可。

更新 keytab

Wieshark 的 keytab 在更新后不会立即生效,需要先在更新 keytab 的位置选择禁用解密后重新启用;或者在保存 pcap 后重启 wireshark 进行解密

其他札记

还有一些文章介绍了 wireshark 的 keytab 制作方法,用的比较多的是通过域控的 ntds.dit 和 system.hiv 进行解密,具体可以参考文章 通过将keytab导入wireshark中实现对Kerberos协议加密部分进行直接解包,但是根据该文章的步骤使用 NTDSXtract 导出需要的 keytab 失败

复制代码
python2 dskeytab.py ../datatable.4 ../link_table.7 /home/kali/Desktop/system.hiv  /home/kali/Desktop/test/libesedb/ntds.dit.export/ntdsxtract 1.keytab

[+] Initialising engine...
[+] Loading saved map files (Stage 1)...
[+] Loading saved map files (Stage 2)...
Processing principal Administrator.
Error in sys.excepthook:
Traceback (most recent call last):
  File "/home/kali/Desktop/test/libesedb/ntds.dit.export/ntdsxtract/ntds/__init__.py", line 31, in simple_exception
    sys.stderr.write("[!] Error!", value, "\n")
TypeError: function takes exactly 1 argument (3 given)

Original exception was:
Traceback (most recent call last):
  File "dskeytab.py", line 263, in <module>
    dsAddPrincipalEntries(principal, keytabFile)
  File "dskeytab.py", line 145, in dsAddPrincipalEntries
    kerberosKeys = dsGetPrincipalKerberosKeys(principal)
  File "dskeytab.py", line 163, in dsGetPrincipalKerberosKeys
    creds = principal.getSupplementalCredentials()
  File "/home/kali/Desktop/test/libesedb/ntds.dit.export/ntdsxtract/ntds/dsobjects.py", line 254, in getSupplementalCredentials
    return dsSupplCredentials(tmpdec)
  File "/home/kali/Desktop/test/libesedb/ntds.dit.export/ntdsxtract/ntds/dsobjects.py", line 506, in __init__
    self.ParseUserProperties(text)
  File "/home/kali/Desktop/test/libesedb/ntds.dit.export/ntdsxtract/ntds/dsobjects.py", line 533, in ParseUserProperties
    assert reserved1 == 0
AssertionError

根据 ntdsxtract 脚本的开发者的 github issue,该脚本支持 WinServer 2008 的解密,对于之后更高版本的 WinServer 由于 system.hiv 结果改变而不支持,但是我在 WinServer2008 上导出也是失败了,期待有缘人能够解释这个问题...

参考

相关推荐
浪潮BB机3 天前
2026年语音识别软件实测横评及准确率排名
人工智能·语音识别·效率工具·ai工具·录音转写·会议纪要
MUMUFD3 天前
【无标题】
效率工具·广告投放·批量搭建
浪潮BB机4 天前
2026主流采访录音转文字工具实测横评记者该怎么选
语音识别·效率工具·ai工具·录音转写·会议纪要
SamChan904 天前
PDF 拆分的 6 种模式怎么选?从页码范围到书签章节的完整指南
效率工具·文档处理·pdf拆分·浏览器本地工具·pdftranslator
随手工具-Excel, pdf, SQL7 天前
多个 PDF 怎么合并成一个?免费在线工具,还能混入图片和 Word
pdf·word·效率工具·在线工具·pdf合并·合并pdf
浪潮BB机10 天前
2026腾讯会议随身鹿等五大项目交接录音工具实测横评
语音识别·效率工具·腾讯会议·ai工具·录音转写·会议纪要
SunShaoLu16 天前
实测7款思维导图工具图片导出能力:PNG/SVG/PDF全支持,附选型指南
职场和发展·效率工具·思维导图
半甜柠檬16 天前
群晖 NoteStation 批量迁移到思源笔记完整教程:从 nsx 导出到 Markdown 导入
笔记·效率工具·群晖nas·思源笔记·notestation·笔记迁移
qetfw18 天前
MXU:Tauri 2 + React 的 MaaFramework 跨平台 GUI 源码
前端·python·react.js·前端框架·开源项目·效率工具
qetfw19 天前
MWU:Vue 3 + FastAPI 的 MaaFramework 跨平台 WebUI 源码
前端·vue.js·python·fastapi·开源项目·效率工具