通过 Wireshark 解密 Kerberos 票据

wireshark,kerberos · 浏览次数 : 0

小编点评

**keytab.txt 文件内容:** ``` ! Keytab for Kerberos Key Distribution Service Principal Name: Domain Administrator Key Tab File: /home/kali/Desktop/test/libesedb/ntds.dit.export/ntdsxtract/ntds/dsobjects.py Key Type: AES256 Encryption: PKCS#1 ``` **使用步骤:** 1. 打开 Wireshark。 2. 在协议栏中选择“KRB5解密结果”。 3. 双击“Load Keytab”按钮,选择“keytab.txt”。 4. 启动 Wireshark。 **注意:** * 如果您无法打开密钥文件,请确保密钥文件是可访问的。 * 如果您遇到任何问题,请参阅 Wireshark 的文档或官方支持页面。

正文

前言


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

image

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

image

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

解密过程


获取密钥

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

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

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

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 的数据,因此用到了多组密钥

# 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

image

解密结果

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

image

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

image

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

image

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

参考

与通过 Wireshark 解密 Kerberos 票据相似的内容:

通过 Wireshark 解密 Kerberos 票据

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

[转帖]Wireshark:又一个可以查看https消息内容的工具

https://www.jianshu.com/p/7c16474edd9b 我们在接口测试和故障诊断调试时,需要查看消息里边的内容,如果是http消息可以通过wireshark抓包分析软件看到,但https消息内容在传输过程中是加密的,怎样才能看到https加密后的消息呢? 从技术上来说,需要拿到

Wireshark基础教程

Wireshark是非常流行的网络封包分析软件,可以截取各种网络数据包,并显示数据包详细信息。常用于开发测试过程各种问题定位。本文主要内容包括: 1、Wireshark软件下载和安装以及Wireshark主界面介绍。 2、WireShark简单抓包示例。通过该例子学会怎么抓包以及如何简单查看分析数据

[转帖]Nginx之proxy_redirect详解

今天在做nginx反向代理apache的时候出了一点点问题,原来后端apache用的端口是8080通过反向代理后,使用wireshark抓包发现location头域数值为http://192.168.1.154:8080/wuman/ 如果把这个返回给客户端肯定是不可以的,看起来别扭而且还暴露了ap

金仓数据库全攻略:简化部署,优化管理的全流程指南

通过本篇文章的学习和实践,我们深入了解了如何利用Docker技术快速部署KingbaseES数据库。从下载镜像到编写Docker Compose模板,再到容器的启动和管理,每一步都体现了现代化部署方式的便捷和高效。此外,我们还掌握了KSQL命令行工具的使用,这将极大地提升开发人员与数据库交互的效率。

SVG 标签的用法和应用场景

通过使用 标签,可以在 SVG 图像内部定义可重复使用的任意图案。这些图案可以通过 fill 属性或 stroke 属性进行引用。 使用场景 例如我们要在 中绘制大量的圆点点,可以通过重复使用 标签来实现。

5分钟带你了解RabbitMQ的(普通/镜像)集群

通过本文我们深入了解了RabbitMQ的集群模式及其优缺点。无论是普通集群还是镜像集群,都有其适用的场景和局限性。普通集群利用Erlang语言的集群能力,但消息可靠性和高可用性方面存在一定挑战;而镜像集群通过主动消息同步提高了消息的可靠性和高可用性,但可能会占用大量网络带宽。因此,在选择集群方案时,...

腾讯云 BI 数据分析与可视化的快速入门指南

通过本文的介绍,我们了解了腾讯云 BI 这款商业智能解决方案的基本功能和应用场景。从创建项目、连接数据源、数据表建模到页面搭建和推送功能的设置,我们通过一个互联网运营看板的案例,展示了如何快速入门并利用腾讯云 BI 进行数据分析和可视化。通过简单的数据编辑,我们可以轻松地设计报表,并实现数据的可视化...

赛博斗地主——使用大语言模型扮演Agent智能体玩牌类游戏。

通过大模型来实现多个智能体进行游戏对局这个想对已经比较成熟了无论是去年惊艳的斯坦福小镇还是比如metaGPT或者类似的框架都是使用智能体技术让大模型来操控,从而让大模型跳出自身“预测下一个token”的文字功能去探索更多的应用落地可能性。不过一直没有真正操作过,直到前段时间看到一个新闻《和GPT-4

基于腾讯元器搭建前端小助手

通过本文,我们了解了如何利用腾讯元器搭建一个前端助手智能体。通过使用插件和观察其使用效果,我们可以发现前端助手在解决问题和提供帮助方面的潜力。这个前端助手可以成为我们在前端开发过程中的得力助手,帮助我们提高工作效率和解决难题。随着智能技术的不断进步,我们可以期待前端助手在未来发展中的更多功能和应用。