通过 Wireshark 解密 Kerberos 票据
前言
在使用 Wireshark 分析 Active Directory 的 Kerberos 的流量时,会遇到加密票据的情况,这对进一步探究 AD 下的漏洞篡改事件的详细过程造成了影响。在查询资料时也了解到也有一些攻击流量的 payload 也可能存在被解析为加密存根导致分析中断。
此处记录一下如何在搭建的域控下对加密数据进行解密。
[!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
解密结果
如果成功解密,则会显示蓝色的高亮,并会提示使用的哪个密钥
比如在 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 上导出也是失败了,期待有缘人能够解释这个问题...
参考
- Decrypt Kerberos/NTLM “encrypted stub data” in Wireshark
- PTS2023-Talk-20-Decrypt_Kerberos_NTLM_with_Wireshark.pdf
- Kerberos身份验证流程及Kerberos流量解密 - zpchcbd - 博客园
- forest-trust-tools/keytab.py at master · dirkjanm/forest-trust-tools · GitHub
- 通过将keytab导入wireshark中实现对Kerberos协议加密部分进行直接解包 | CTF导航
通过 Wireshark 解密 Kerberos 票据的更多相关文章
- Wireshark解密HTTPS流量的两种方法
原理 我们先回顾一下SSL/TLS的整个握手过程: Clienthello:发送客户端的功能和首选项给服务器,在连接建立后,当希望重协商.或者响应服务器的重协商请求时会发送. version:客户端支 ...
- 如何利用Wireshark解密SSL和TLS流量
如何利用Wireshark解密SSL和TLS流量https://support.citrix.com/article/CTX135121 1.有server端的private key,直接在wires ...
- wireshark 解密加密报文
wireshark 解密IPSec加密后的报文 序言 wireshark作为一款非常优秀的抓包工具,支持了各种各样的网络协议,成为了网络开发中必不可少的工具之一.一般而言,对于普通的网络数据包,wir ...
- wireshark解密本地https流量笔记
此方式支持firefox,chrome 建立path变量 SSLKEYLOGFILE=c:\ssl.key 重启firefox chrome,访问https网站会自动生成ssl session key ...
- 利用Fiddler和Wireshark解密SSL加密流量
原文地址:http://kelvinh.github.io/blog/2014/01/12/decrypt-ssl-using-fiddler-and-wireshark/ Fiddler是一个著名的 ...
- Wireshark解密HTTPS数据流
如果是chrome浏览器的数据流 直接配置”SSLKEYLOGFILE“就可以解密了. 实现过程: 1.配置系统环境变量 变量名:SSLKEYLOGFILE 变量值:随意指定一个存储路径,以便chro ...
- 利用Wireshark 解密HTTPS流量
在我之前的一篇文章中已经介绍了一种解密HTTPS流量的一种方法,大致方法就是客户端手动信任中间人,然后中间人重新封包SSL流量. 文章地址: http://professor.blog.51cto.c ...
- Kerberos的黄金票据详解
0x01黄金票据的原理和条件 黄金票据是伪造票据授予票据(TGT),也被称为认证票据.如下图所示,与域控制器没有AS-REQ或AS-REP(步骤1和2)通信.由于黄金票据是伪造的TGT,它作为TGS- ...
- 为什么Wireshark无法解密HTTPS数据
为什么Wireshark无法解密HTTPS数据 导读 由于需要定位一个问题,在服务器上tcpdump抓取https数据包,然后下载到本地打开wireshark分析.然后我们下载域名私钥配置到wires ...
- https wireshark抓包——要解密出原始数据光有ssl 证书还不行,还要有浏览器内的pre-master-secret(内存里)
基于wireshark抓包的分析 首先使用wireshark并且打开浏览器,打开百度(百度使用的是HTTPS加密),随意输入关键词浏览. 我这里将抓到的包进行过滤.过滤规则如下 ip.addr == ...
随机推荐
- 一文告诉你如何使用java调用http接口
程序如下: 添加apache相关maven依赖: 1 <dependency> 2 <groupId>org.apache.commons</groupId> 3 ...
- Mac系统,Qt工程转xcode工程,打包pkg
序言: 程序使用Qt开发,程序主要功能是调用摄像头.需要打包成pkg给到用户安装,打包用到的是xcode. 实际操作: 一.Qt工程转xcode工程 // 打开终端,cd到项目根目录(CamScan. ...
- vs报错:RC1004 unexpected end of file found
如图,在编译代码时,出现报错:RC1004 unexpected end of file found 原因是,cpp最后要多一行才行,不然就会报这个错误 错误示例: int main() { ret ...
- 深度优先搜索-overview
深度优先搜索的实现一般有2种方式 递归 //todo 非递归-借助stack 因为栈后进先出的特点,使其很容易实现树/图的深度优先遍历.如果是BFS,那非递归经常借助queue. 整个过程可以被描述为 ...
- sql 语句系列(列举非索引外键)[八百章之第九章]
列举非索引外键 列举出那些外键没有添加索引. 目的: 1.减少锁. 2.外键添加索引,提示了查询性能,因为要与父表做连接查询做笛卡尔积. 下面只要会复制即可,没有会去从新写一遍的. select fk ...
- 通过一个非常简单的SSM项目来将SpringMVC配置整理清晰。
所有的文件在Git上面都能找到,由于把代码搞上来看的很不舒服,结构不清晰. 第一步:确定环境 IDEA MySQL 5.7.19 Tomcat 9 Maven 3.6 第二步:创建数据库 参考GIT上 ...
- NL2SQL技术方案系列(1):NL2API、NL2SQL技术路径选择;LLM选型与Prompt工程技巧,揭秘项目落地优化之道
NL2SQL技术方案系列(1):NL2API.NL2SQL技术路径选择:LLM选型与Prompt工程技巧,揭秘项目落地优化之道 NL2SQL基础系列(1):业界顶尖排行榜.权威测评数据集及LLM大模型 ...
- vue3中动态添加路由刷新无法正确匹配路由组件
1.问题 动态添加路由之后,页面重新匹配路由,匹配到了设置的404 notfound页面 该页面是在路径无法匹配到的时候才会跳转的页面 2. 问题查找 在前置路由守卫打印to 发现当前地址匹配到的组件 ...
- HarmonyOS NEXT应用开发之深色模式适配
介绍 本示例介绍在开发应用以适应深色模式时,对于深色和浅色模式的适配方案,采取了多种策略如下: 固定属性适配:对于部分组件的颜色属性,如背景色或字体颜色,若保持不变,可直接设定固定色值或引用固定的资源 ...
- Docker 安装,常用命令
安装Docker 官方所有操作系统安装教程:Install Docker Engine on CentOS | Docker Documentation,其中CentOS安装docker引擎的代码: ...