通过 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 上导出也是失败了,期待有缘人能够解释这个问题...

参考

相关推荐
xiezhr12 天前
一款带有AI功能的markdown工具
ai·markdown·效率工具·笔记工具
antzou1 个月前
视频转音频
办公软件·效率工具·视频转音频
antzou2 个月前
Apache FOP实践——pdf模板引擎
xml·pdf·办公软件·效率工具·模板引擎·fop·xsl
空中湖2 个月前
【效率工具】255款工作计划表格Excel电子版模板:总结日月周报日历安排提醒时间管理
程序人生·excel·效率工具
antzou2 个月前
Apache PDFBox深入实践
pdfbox·办公软件·apache·效率工具
antzou2 个月前
PDF转图片
pdfbox·办公软件·效率工具·pdf转图片
天府云创3 个月前
[开源]微软 PowerToys 获 0.92 版本更新:新增系统托盘图标开 / 关功能、改进 Command Palette
microsoft·效率工具·powertoys·软件帮手·powertoys下载
耶和博10 个月前
你的文字其实可以轻松遍布全球
效率工具·浏览器插件·文章同步·内容分发
IT技术分享社区1 年前
电脑软件:推荐一款免费且实用的电脑开关机小工具
微软技术·效率工具·电脑技巧·办公
睡觉谁叫~~~1 年前
如何将rust日志输出到android终端
效率工具