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

参考

相关推荐
antzou17 天前
嵌入式数据库管理
数据库·办公软件·h2·效率工具
antzou19 天前
Excel文件拆分
办公软件·效率工具·excel拆分
antzou19 天前
Excel文件合并
办公软件·效率工具·excel合并
antzou20 天前
文本转Excel
办公软件·效率工具·txt转excel·scv转excel
Logic10121 天前
《Windows批处理(BAT)脚本实战大全:41个场景告别重复操作》含文件处理/查找/重命名/清理等)
windows·编程·文件管理·bat·效率工具·批处理·自动化脚本
realhuizhu22 天前
你的接口很好,但在使用者眼里,它可能只是个打不开的黑盒
效率工具·后端开发·api文档·开发者体验·promptengineering
PPT百科2 个月前
PPT 素材版权风险解析与合规素材获取指南
经验分享·powerpoint·效率工具·ppt·ppt模板
PPT百科2 个月前
PPT导出为图片的格式选择:JPG与PNG的区别
人工智能·经验分享·职场和发展·powerpoint·职场·效率工具
CrankZ3 个月前
软软一键开关 --提供多个 Windows 系统开关,例如保持常亮、隐藏桌面图标、显示器亮度、夜间模式等
效率工具·常亮
xiezhr4 个月前
一款带有AI功能的markdown工具
ai·markdown·效率工具·笔记工具