Skip to main content

票据传递 Pass The Ticket

票据传递技术类似于密钥传递技术,只不过相比使用密钥,用的是票据。在讲解 PTT 之前,我们先来了解一下在 Windows 与 Linux 平台上有关域凭证的文件,它们可以通过工具实现互相转换。

kirbi

我们通过 mimikatz 或者 rubeus 请求与导出的 TGT 或者 TGS票据格式为 .kirbi。对于 mimikatz,我们可以使用命令 sekurlsa::ticket /export 导出所有票据,格式为 .kirbi。

image.pngimage.png

image.pngimage.png

 如果使用 rubeus,可以使用 rubeus.exe dump 命令导出目前所有票据。

image.pngimage.png

image.pngimage.png

当然,我们可以指定导出哪些票据。先通过 rubeus.exe triage 命令查看当前所有的登陆会话以及对应的票据用法请学员们自行探索当作小练习再通过 /luid 参数指定要导出票据的登陆会话

rubeus.exe triage
rubeus.exe dump /luid:<登陆会话 ID> /nowrap

image.png

image.png

至于将文本保存为 kirbi 文件,在Windows端,我们可以通过如下的 powershellPowershell 命令 [System.IO.File]::WriteAllBytes("C:\windows\tasks\example.kirbi", [System.Convert]::FromBase64String("<ticket>")) 保存 kirbi 文件。在 Linux 端,我们可以通过命令 echo '<ticket>' | base64 -d > example.kirbi 实现。

[System.IO.File]::WriteAllBytes("<目标地址>", [System.Convert]::FromBase64String("<票据>"))

image.pngimage.png

image.png

ccache

在 Linux端,如果 Linux 主机上有活跃的会话,那么在 /tmp 目录下会产生该用户的凭证缓存文件,credentialCredential cache,Cache,ccache文 ccache 文件,格式为 krb5cc_xxx,例如krb5cc_1394201122_MerMmG。ccache 文件中保存了该用户的票据信息,例如 TGT,TGS 等。在 Linux 域主机上,环境变量 KRB5CCNAME 指向了票据的地址,以获得域用户的上下文。我们也可以通过命令 export KRB5CCNAME=<ccache 文件地址> 来手动更改环境变量。

image.pngimage.png

image.pngimage.png

我们可以通过 impacketImpacket ticketConverter 脚本将票据在 ccachekirbi 形式中互相转换。

image.pngimage.png

image.pngimage.png

ccache 文件仅对应域用户以及 root 用户可读。如果作为活跃用户,我们可以通过 kinit 申请新的 TGT,以及通过 kvno [SPN] 申请新的 TGS。

 

keytab

keytab 文件包含 Kerberos 主体名称凭证,例如NTLM哈希。我们在之前提到过可以使用脚本 (https://github.com/sosdave/KeyTabExtract)KeyTabExtract) 从中提取凭据,提取出了 NTLM 或者 AES256 凭证,那么在此基础上我们想要获得其他式的票据自然不是难事。每台 linuxLinux 域计算机 /etc/krb5.keytab 中都有文件是其 keytab 文件,默认情况下可由 root 访问。

image.png

类似于 PTH,一些安全工具例如 impacketImpacket 同样支持 直接使用 keytab 进行认证。

image.png

 

好了,在了解了以上几种凭证文件类型后,我们来讨论如何利用及导入票据。

 

Windows 端票据传递

在 Windows 端,我们主要可以使用 mimikatzMimikatz 以及 rubeusRubeus 等工具来导入票据。Cobalt Strike 则支持 kerberos_ticket_use 或 kerberos_ccache_use 命令来实现。

mimikatzCobaltStrike 终端里,执行中通过 make_token 命令生成一个牺牲会话,然后导入要传递的票据。至于创建一个牺牲会话后再导入凭证,原因在 Windows 认证原理小节中有提过,新导入的 TGT 会替换原有的,可能导致认证紊乱,而新创建的牺牲会话中尚无 TGT。

然后,我们能在其他主机上以 kerberos::pttwhite-bird\serveradm <ticket身份顺利访问 文件>Web02 的 C$ 从而导入 .kirbi 格式票据

image.pngimage.png

或者使用 rubeus 的 rubeus.exe ptt /ticket:<base64编码的票据内容或者票据文件> 导入票据。

image.png

 

 

Linux 端票据传递

而在 Linux 端传递票据的话,我们先需要将 kirbi 文件转换为 ccache文件ccache 格式,然后设置 KRB5CCNAME 环境变量,之后就可以使用无密码票据认证了。

image.pngimage.png