0%

如何在 wireshark 中解密 Kerberos 流量

参考:

Kerberos

前面是我的踩坑过程,后面是解决办法。

在Wireshark的SampleCaptures得到了一个Krb-816.zip的数据包,在指定文件中附带的密钥表文件之后,wireshark对Kerbeos流量进行了解密。

也就是说如果有密钥表文件,就能对Kerberos流量进行解密。

搜索资料后发现,Microsoft提供了一个名为Ktpass的命令行工具,可以生成keytab(密钥表的格式),kali中的krb5-user提供了ktutil可以编辑 keytab,进行添加、合并、删除等操作。

于是我的想法变为了使用该工具导出KDC中的krbtgt账户密钥和一个用户的密钥。

1
2
3
4
ktpass -out krbtgt.keytab -princ kadmin/changepw.0day.org@OWA2010SP3.0day.org -mapUser krbtgt@0day
.org -pass Admin12345 -ptype KRB5_NT_PRINCIPAL
#密码随便填的 ,princ部分是SPN ,具体参数参考官方文档
#Get-ADUser -Identity krbtgt -Properties * |Select-Object servicePrincipalName #查询SPN的命令

到了这里,问题变得复杂了,krbtgt账户无法获取明文密码,普通域用户无法指定SPN。

在搜索之后,发现Wireshark的wiki中提到了一种方案,从 NTDS.dit 文件和system.hive 生成 keytab。

获取ntds.dit

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#获取htds.dit的方式很多,这里使用的是卷影拷贝服务(Volume Shadow Copy Service),使用的工具为ntdsutil.exe,域控默认安装
#该工具可本地、可远程,用于备份和恢复(即使目标文件被系统锁定)
PS C:\Users\Administrator> ntdsutil.exe # 可交互模式和非交互模式
C:\Windows\system32\ntdsutil.exe: snapshot
snapshot: activate instance ntds
Active instance set to "ntds".
snapshot: create
Creating snapshot...
Snapshot set {577af247-22fd-4147-9349-2667abf0f0f6} generated successfully.
snapshot: mount {577af247-22fd-4147-9349-2667abf0f0f6}
Snapshot {75f5268e-ab2c-4166-a9a2-9d2cff572722} mounted as C:\$SNAP_202003221117_VOLUMEC$\
#中括号部分为GUID,注意生成的数字不相同
# 一行命令的版本
ntdsutil snapshot "activate instance ntds" create quit quit #创建快照
ntdsutil snapshot "mount {243aa9a2-29b8-40fb-9664-d2ff77ecb605}" quit quit #挂载快照

#开启另一cmd
copy C:\$SNAP_202003221117_VOLUMEC$\Windows\NTDS\ntds.dit c:\temp\ntds.dit
#注意挂载快照提示的路径
snapshot: unmount {75f5268e-ab2c-4166-a9a2-9d2cff572722}
Snapshot {75f5268e-ab2c-4166-a9a2-9d2cff572722} unmounted.
snapshot: delete {75f5268e-ab2c-4166-a9a2-9d2cff572722}
Snapshot {75f5268e-ab2c-4166-a9a2-9d2cff572722} deleted.
snapshot: list all
No snapshots found.
snapshot: quit
#一行命令的版本
ntdsutil snapshot "unmount {243aa9a2-29b8-40fb-9664-d2ff77ecb605}" quit quit
ntdsutil snapshot "delete {243aa9a2-29b8-40fb-9664-d2ff77ecb605}" quit quit

获取system.hive

1
2
reg save hklm\system system.hive
#system.hive 使用注册表导出

安装编译esedbexport

esedbexport是libesedb库的一部分,所以的编译安装libesedb库。

1
2
3
4
5
6
7
8
9
wget  https://github.com/libyal/libesedb/releases/download/20191220/libesedb-experimental-20191220.tar.gz
tar -zxvf libesedb-experimental-20191220.tar.gz
cd libesedb-20191220/
sudo apt-get install autoconf automake autopoint libtool pkg-config
#安装需要的依赖
./configure
make
make
sudo ldconfig

如果一切顺利,在/usr/local/bin/中有了esedbexport,可以使用esedbexport命令。

使用esedbexport处理ntds.dit,导出Active Directory数据

1
2
esedbexport ntds.dit
#当前目录会生成名为 ntds.dit.export的目录,里面包含了Active Directory数据

使用NTDSXtract导出Kerberos密钥

1
2
3
4
5
6
7
git clone https://github.com/csababarta/ntdsxtract.git
cd ntdsxtract/
python dskeytab.py ../ntds.dit.export/datatable.3 ../ntds.dit.export/link_table.5 ../system.hive /home/kali/ntdsxtract/ ad.keytab
#datatable以及link_table都是esedbexport处理的Active Directory数据
#system.hive 是注册表导出的hive文件
#/home/kali/ntdsxtract 是当前ntdsxtract的工作目录
#ad.keytab是生成的的密钥表文件,可指定目录,我这里生成的为当前目录

使用klist -ekt验证其中的文件,可以看到域中所有账户都记录了密钥

其中机器账户和krbtgt账户均在其中,接下来的事情就很简单了,在wireshark中加载密钥表文件,就能解密 0day.org 域中的全部流量。

如果我的笔记帮助到你,给我一点鼓励可以吗(●ˇ∀ˇ●)