通过将keytab导入wireshark中实现对Kerberos协议加密部分进行直接解包

百家 作者:Chamd5安全团队 2021-09-17 14:06:31
        本文主要记录了如何通过一些列操作,将生成的keytab导入wireshark,实现可以在wireshark中直接对Kerberos协议加密部分进行解密的一个过程,避免大家踩坑。

        keytab是可以理解为一个密钥表,是key table的缩写,用途类似于用户的密码,keytab中包含一个或多个条目,每个条目包含一个条目创建时的时间戳,主体名,密钥版本号,加密类型以及密钥本身。具体关于keytab的信息可以上MIT的Kerberos实现网站上具体查看,这里只大概介绍。

具体操作过程如下:

1.在域控上复制出一份ntds.dit文件,这里用卷影复制的方法,复制的时候要和自己的卷影副本卷名对应。

vssadmin create shadow /for=C:
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy2\Windows\NTDS\NTDS.dit C:\ntds.dit

2.复制system.hive文件。

reg save hklm\system system.hive
或者
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy2\Windows\System32\config\SYSTEM C:\system.hiv

复制完成后删除之前创建的卷影副本。

vssadmin delete shadow /all

3.整一个esedbexport程序,下载地址https://github.com/libyal/libesedb,可以在各种平台编译,我这里在Ubuntu机器上编译,不容易出错,Windows编译太麻烦了。

wget https://github.com/libyal/libesedb/releases/download/20210424/libesedb-experimental-20210424.tar.gz
tar -xzvf libesedb-experimental-20210424.tar.gzcd libesedb-20210424/
sudo apt-get install autoconf automake autopoint libtool pkg-config
#安装依赖包
./configure
make
make install
sudo ldconfig

如果都比较顺利的话,可以在/usr/local/bin下找到esedbexport命令。

这里做一下知识扩展。

        这里我们要先了解的是,ntds.dit文件是一种ESE数据库文件,而ESE即Extensible Storage Engine ,可扩展存储引擎,是微软提出的一种数据存储技术,文件后缀是.edb,Windows内使用ESE存储的有Microsoft Exchange Server,Active Directory,Windows Search,Windows Update,Help and Support Center。这里的esedbexport可以理解为将ntds.dit文件内的表进行了一个导出。如果想直接查看ESE数据库文件,可以使用ESEDatabaseVies,使用ESEDatabaseVies也可以进行一个导出。

4.将复制出来的ntds.dit以及system.hive复制到Linux中,我这里复制到了/usr/local/bin下,并执行命令,可以将ntds.dit导出成多个文件,文件会存放在当前目录的ntds.dit.export目录内。

esedbexport ntds.dit

5.使用NTDSXtract导出需要的keytab。

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 /usr/local/bin/ntdsxtract/ 1.keytab
#datatable以及link_table都是esedbexport处理过ntds.dit之后存在ntds.dit.export中的文件
#system.hive 是之前导出的文件
#/usr/local/bin/ntdsxtract/ 是当前ntdsxtract目录
#1.keytab是最后我们需要的keytab文件

执行后即可生成1.keytab文件。

6.生成完成后,我们可以使用ktutil查看当前keytab内的信息。想要使用ktutil命令,需要安装Kerberos客户端,我这里安装的是heimdal-clients,命令执行完,即可看到当前keytab中包含的信息。

        可以看到所有账户的信息都已经包含了,因为是从域控导出的文件,不仅是krbtgt,所有所有在域控中注册的服务,用户,主机,都列了出来,包括我加入域内的一台Linux主机,也就是说在后面我们可以使用wireshark同时解开Kerberos协议中的TGT票据,ST票据以及用户hash加密部分,而不用去再单独生成每一个要解密的keytab了,就很nice。

sudo apt-get install heimdal-clients
ktutil -k 1.keytab list
#-k命令制定要keytab


7.最后,打开我们装有wireshark的主机,打开"编辑"——"首选项",选择"Protocols",找到KRB5,勾选"Try to decrypt Kerberos blobs",并在下面导入我们刚才生成的1.keytab,就可以对Kerberos数据包进行解密了。

        加载完keytab文件后,wireshark会自动对当前的数据包进行解密尝试,如果解密成功,就会是显示蓝色,不成功就是黄色。

        这里再简单说一下Kerberos部分可以使用keytab解密的原理,Kerberos中的加密部分是使用的hash,是将"密码明文+盐+密钥版本号"通过一个单向的string-to-key函数来获得的,密码存储在KDC中,盐一般是域名和用户名的组合,密钥版本号即kvno,这些信息都包含在了这个keytab中。在as-req过程中,加密部分是使用client用户密钥生成的hash加密的,as-rep过程中,TGT票据部分是使用的krbtgt的密钥hash进行的加密,而剩下的一部分加密是使用client用户密钥进行的加密,随后的tgs-rep中的ST票据的加密部分,是使用的服务对应密钥的hash进行的加密,所以当wireshark内导入了keytab后,就可以通过固定算法对相应的部分进行解密。

        通过观察图中其实也可以看到,wireshark对于每一个被解密的部分都进行了说明,是使用keytab中的哪个主体进行解密的。比如下图的as-req中的加密时间戳部分,就很清楚的说明了是使用了keytab中user1的信息进行了解密,这里user1是我注册的一个域用户。


as-req中的用于身份预认证的加密时间戳,解密后的样子。

        as-rep中的TGT加密部分解密后的样子,这里的key中的keyvalue就是TGS服务器生成的session key。解密使用的krbtgt。

如果包含PAC,甚至可以看到PAC中的数据。

tgs-req流程中Authenticator的解密。


域内Linux主机登录时的最后两个数据,用GSS-API进行传输的。

        能直接在wireshark中解开Kerberos协议,对于我们进一步详细学习Kerberos协议的认证过程是有着非常大的帮助,结合rfc就可以非常深入且清晰的了解到协议的整个认证过程,最后wireshark,yyds。

end


招新小广告

ChaMd5 Venom 招收大佬入圈

新成立组IOT+工控+样本分析 长期招新

欢迎联系admin@chamd5.org



关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接