通过 Wireshark 解密 Kerberos 票据

打印 上一主题 下一主题

主题 885|帖子 885|积分 2655

媒介

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

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

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

获取密钥

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

  • krbtgt 密钥
  • 域控用户密钥
  • 服务用户密钥
  • 机器账户密钥
  • 机器名密钥(必要添加$符号)
对于这些密钥,我们可以利用 mimikatz 的 DCSync 功能进行获取,可以全部进行获取,也可以根据协议交换过程中用到的账户进行选择性获取,此处以 AD 的 administrator 为例
  1. lsadump::dcsync /user:adsec2016\administrator
复制代码
结果如下
  1. mimikatz # lsadump::dcsync /user:adsec2016\administrator
  2. [DC] 'adsec2016.com' will be the domain
  3. [DC] 'WIN-P44GKINISTG.adsec2016.com' will be the DC server
  4. [DC] 'adsec2016\administrator' will be the user account
  5. [rpc] Service  : ldap
  6. [rpc] AuthnSvc : GSS_NEGOTIATE (9)
  7. Object RDN           : Administrator
  8. ** SAM ACCOUNT **
  9. SAM Username         : Administrator
  10. Account Type         : 30000000 ( USER_OBJECT )
  11. User Account Control : 00000200 ( NORMAL_ACCOUNT )
  12. Account expiration   : 1601/1/1 8:00:00
  13. Password last change : 2024/4/15 6:58:22
  14. Object Security ID   : S-1-5-21-552453423-3366154315-3546583025-500
  15. Object Relative ID   : 500
  16. Credentials:
  17.   Hash NTLM: e50d929fa1dfd9264dde5b6b0b6d8572
  18.     ntlm- 0: e50d929fa1dfd9264dde5b6b0b6d8572
  19.     ntlm- 1: 1fefaf6822cb97df439bda03271776fc
  20.     lm  - 0: 7113517266eada9bd68b839872dec574
  21. Supplemental Credentials:
  22. * Primary:NTLM-Strong-NTOWF *
  23.     Random Value : 5a797b7ce28d94017963dd136b9e9d28
  24. * Primary:Kerberos-Newer-Keys *
  25.     Default Salt : ADSEC2016.COMAdministrator
  26.     Default Iterations : 4096
  27.     Credentials
  28.       aes256_hmac       (4096) : c5947b5050d16a08f1464ddac9b58d973e7a9f5104b6079ecdfcf12a0b2aa2a8
  29.       aes128_hmac       (4096) : e3f5b5669995f7f0dd7e2fab8626f9d2
  30.       des_cbc_md5       (4096) : 0e6dd56268c75280
  31. ...
复制代码
通过上述结果可以得到我们想要的信息
  1. RC4:e50d929fa1dfd9264dde5b6b0b6d8572 (NTLM哈希通常用于Kerberos预认证过程中,特别是在使用RC4加密类型的情况下)
  2. AES256:c5947b5050d16a08f1464ddac9b58d973e7a9f5104b6079ecdfcf12a0b2aa2a8
  3. 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 的数据,因此用到了多组密钥
  1. # Add your own keys here!
  2. 105 # Keys are tuples in the form (keytype, 'hexencodedkey')
  3. 106 # Common keytypes for Windows:
  4. 107 # 23: RC4
  5. 108 # 18: AES-256
  6. 109 # 17: AES-128
  7. 110 # Wireshark takes any number of keys in the keytab, so feel free to add
  8. 111 # krbtgt keys, service keys, trust keys etc
  9. 112 keys = [
  10. 113     (23, 'bc6e1d2921a500d638d801f3898515a4'), # krbtgt
  11. 114     (18, '9b33632bb69ccdcd0e3eb89166dd3d461e1e1c7a13bc530f2bedaf0777821bbf'),
  12. 115     (17, '1d4d7dcf199c72e5af2d10bb7ae985c0'),
  13. 116     (23, 'e50d929fa1dfd9264dde5b6b0b6d8572'), # Administrator
  14. 117     (18, 'c5947b5050d16a08f1464ddac9b58d973e7a9f5104b6079ecdfcf12a0b2aa2a8'),
  15. 118     (17, 'e3f5b5669995f7f0dd7e2fab8626f9d2'),
  16. 119     (23, 'e9507d46f1df250c472c3e83f1f7aca5'), # guest01
  17. 120     (18, 'c0a40b6e5b746632439056d4df1588bb3d44eed05b4f6e72df026a5bbb65b66f'),
  18. 121     (17, '8f8702291ae9554166823d260da81634'),
  19. 122     (23, '2709a0739a51f5a79b0d6ce7c8f9e0b1'), # guest02
  20. 123     (18, '9b3b828d094b9c0734b8a247805e8690c2787ad3ad649efd8ecbff9e5eb6ea8d'),
  21. 124     (17, 'b4ac44a6bbe4cae8dc6ad5a5de47aa9e'),
  22. 125     (23, '3c7aa1d1613ceff062049ac898513319'), # 域控$
  23. 126     (18, 'd389e0cef8e2a6afe7f3212141b1be81c735ecc774b744efa7459a36556ef0bd'),
  24. 127     (17, '5f73be69ede5ffd9a80ec850973055af'),
  25. 128     (23, '58a478135a93ac3bf058a5ea0e8fdb71'), # demo11
  26. 129     (18, '69e230af518a4c2bb58261cd478e59db0c9bfb0eceb7fdfec0806d5fc571d9e2'),
  27. 130     (17, '996f1d0c0937f8b33d09678ec3661b5a')
  28. 131 ]
复制代码
填写完毕后,运行
  1. python3 keytab.py keytab.txt
复制代码
天生 keytab.txt 文件,并导入 Wireshark,位置 编辑->首选项->rotocols->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 失败
  1. python2 dskeytab.py ../datatable.4 ../link_table.7 /home/kali/Desktop/system.hiv  /home/kali/Desktop/test/libesedb/ntds.dit.export/ntdsxtract 1.keytab
  2. [+] Initialising engine...
  3. [+] Loading saved map files (Stage 1)...
  4. [+] Loading saved map files (Stage 2)...
  5. Processing principal Administrator.
  6. Error in sys.excepthook:
  7. Traceback (most recent call last):
  8.   File "/home/kali/Desktop/test/libesedb/ntds.dit.export/ntdsxtract/ntds/__init__.py", line 31, in simple_exception
  9.     sys.stderr.write("[!] Error!", value, "\n")
  10. TypeError: function takes exactly 1 argument (3 given)
  11. Original exception was:
  12. Traceback (most recent call last):
  13.   File "dskeytab.py", line 263, in <module>
  14.     dsAddPrincipalEntries(principal, keytabFile)
  15.   File "dskeytab.py", line 145, in dsAddPrincipalEntries
  16.     kerberosKeys = dsGetPrincipalKerberosKeys(principal)
  17.   File "dskeytab.py", line 163, in dsGetPrincipalKerberosKeys
  18.     creds = principal.getSupplementalCredentials()
  19.   File "/home/kali/Desktop/test/libesedb/ntds.dit.export/ntdsxtract/ntds/dsobjects.py", line 254, in getSupplementalCredentials
  20.     return dsSupplCredentials(tmpdec)
  21.   File "/home/kali/Desktop/test/libesedb/ntds.dit.export/ntdsxtract/ntds/dsobjects.py", line 506, in __init__
  22.     self.ParseUserProperties(text)
  23.   File "/home/kali/Desktop/test/libesedb/ntds.dit.export/ntdsxtract/ntds/dsobjects.py", line 533, in ParseUserProperties
  24.     assert reserved1 == 0
  25. AssertionError
复制代码
根据 ntdsxtract 脚本的开发者的 github issue,该脚本支持 WinServer 2008 的解密,对于之后更高版本的 WinServer 由于 system.hiv 结果改变而不支持,但是我在 WinServer2008 上导出也是失败了,期待有缘人可以或许解释这个问题...
参考


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

南飓风

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表