Invoke-TheHash
Invoke-TheHash 包含用于执行哈希传递 WMI 和 SMB 任务的 PowerShell 函数。WMI 和 SMB 连接通过 .NET TCPClient 建立。认证通过将 NTLM 哈希传递给 NTLMv2 认证协议完成。客户端无需本地管理员权限。
要求
最低 PowerShell 2.0
导入
Import-Module ./Invoke-TheHash.psd1
或
. ./Invoke-WMIExec.ps1
. ./Invoke-SMBExec.ps1
. ./Invoke-SMBEnum.ps1
. ./Invoke-SMBClient.ps1
. ./Invoke-TheHash.ps1
函数
- Invoke-WMIExec
- Invoke-SMBExec
- Invoke-SMBEnum
- Invoke-SMBClient
- Invoke-TheHash
Invoke-WMIExec
参数:
- Target - 目标主机名或 IP 地址。
- Username - 用于认证的用户名。
- Domain - 用于认证的域。对于本地账户或在用户名后使用 @domain 时,不需要此参数。
- Hash - 用于认证的 NTLM 密码哈希。此函数接受 LM:NTLM 或 NTLM 格式。
- Command - 要在目标上执行的命令。如果未指定命令,该函数将仅检查用户名和哈希是否具有对目标 WMI 的访问权限。
- Sleep - 默认 = 10 毫秒:设置函数的 Start-Sleep 值(以毫秒为单位)。
示例:
Invoke-WMIExec -Target 192.168.100.20 -Domain TESTDOMAIN -Username TEST -Hash F6F38B793DB6A94BA04A52F1D3EE92F0 -Command "command or launcher to execute" -verbose
截图:

Invoke-SMBExec
- SMB (PsExec) 命令执行函数,支持 SMB1、SMB2.1,支持或不支持 SMB 签名。
参数:
- Target - 目标主机名或 IP 地址。
- Username - 用于认证的用户名。
- Domain - 用于认证的域。对于本地账户或在用户名后使用 @domain 时,不需要此参数。
- Hash - 用于认证的 NTLM 密码哈希。此函数接受 LM:NTLM 或 NTLM 格式。
- Command - 要在目标上执行的命令。如果未指定命令,该函数将仅检查用户名和哈希是否具有对目标 SCM 的访问权限。
- CommandCOMSPEC - 默认 = 启用:在 Command 前添加 %COMSPEC% /C。
- Service - 默认 = 20 字符随机:在目标上创建和删除的服务名称。
- Sleep - 默认 = 150 毫秒:设置函数的 Start-Sleep 值(以毫秒为单位)。
- Version - 默认 = Auto:(Auto,1,2.1)强制使用 SMB 版本。默认行为是进行 SMB 版本协商,如果目标支持,则使用 SMB2.1。
示例:
Invoke-SMBExec -Target 192.168.100.20 -Domain TESTDOMAIN -Username TEST -Hash F6F38B793DB6A94BA04A52F1D3EE92F0 -Command "command or launcher to execute" -verbose
示例:
检查目标上的 SMB 签名要求。
Invoke-SMBExec -Target 192.168.100.20
截图:

Invoke-SMBEnum
- Invoke-SMBEnum 通过 SMB2.1(支持或不支持 SMB 签名)执行用户、组、NetSession 和共享枚举任务。
参数:
- Target - 目标主机名或 IP 地址。
- Username - 用于认证的用户名。
- Domain - 用于认证的域。对于本地账户或在用户名后使用 @domain 时,不需要此参数。
- Hash - 用于认证的 NTLM 密码哈希。此函数接受 LM:NTLM 或 NTLM 格式。
- Action - (All,Group,NetSession,Share,User) 默认 = Share:要执行的枚举操作。
- Group - 默认 = Administrators:要枚举的组。
- Sleep - 默认 = 150 毫秒:设置函数的 Start-Sleep 值(以毫秒为单位)。
- Version - 默认 = Auto:(Auto,1,2.1)强制使用 SMB 版本。默认行为是进行 SMB 版本协商,如果目标支持,则使用 SMB2.1。注意,仅签名检查适用于 SMB1。
示例:
Invoke-SMBEnum -Target 192.168.100.20 -Domain TESTDOMAIN -Username TEST -Hash F6F38B793DB6A94BA04A52F1D3EE92F0 -verbose
截图:

Invoke-SMBClient
- SMB 客户端函数,支持 SMB2.1 和 SMB 签名。此函数主要用于提供 SMB 文件共享能力,适用于那些没有远程命令执行权限的哈希。此函数也可用于为 Invoke-WMIExec 和 Invoke-SMBExec 暂存 payload。请注意,Invoke-SMBClient 基于 .NET TCPClient,不使用 Windows SMB 客户端。Invoke-SMBClient 比 Windows 客户端慢得多。
参数:
- Username - 用于认证的用户名。
- Domain - 用于认证的域。对于本地账户或在用户名后使用 @domain 时,不需要此参数。
- Hash - 用于认证的 NTLM 密码哈希。此函数接受 LM:NTLM 或 NTLM 格式。
- Action - 默认 = List:(List/Recurse/Delete/Get/Put) 要执行的操作。
-
-
- Recurse: 递归列出目录及其所有子目录内容。
-
-
-
- Put: 上传文件,并将创建时间、访问时间和最后写入时间设置为与源文件一致。
- Source
-
- List 和 Recurse: 目录的 UNC 路径。
-
-
-
- Put: 要上传的文件。如果未指定完整路径,则文件必须位于当前目录。当使用 'Modify' 开关时,'Source' 必须是一个字节数组。
- Destination
-
-
-
- Get: 如果使用,该值将是下载文件的新文件名。如果未指定完整路径,将在当前目录中创建文件。
-
- Put: 上传文件的 UNC 路径。必须指定文件名。
- Modify
-
- List 和 Recurse: 函数将输出一个包含目录内容的对象。
-
-
- Get: 函数将输出下载文件的字节数组,而不是将文件写入磁盘。建议仅对较小的文件使用此选项,并将输出发送到变量。
-
- NoProgress - 禁止显示上传和下载进度条。
- Sleep - 默认 = 100 毫秒:设置函数的 Start-Sleep 值(以毫秒为单位)。
- Version - 默认 = Auto:(Auto,1,2.1)强制使用 SMB 版本。默认行为是进行 SMB 版本协商,如果目标支持,则使用 SMB2.1。注意,仅签名检查适用于 SMB1。
示例:
列出根共享目录的内容。
Invoke-SMBClient -Domain TESTDOMAIN -Username TEST -Hash F6F38B793DB6A94BA04A52F1D3EE92F0 -Source \\server\share -verbose
示例:
从根开始递归列出共享内容。
Invoke-SMBClient -Domain TESTDOMAIN -Username TEST -Hash F6F38B793DB6A94BA04A52F1D3EE92F0 -Action Recurse -Source \\server\share
示例:
递归列出共享子目录内容并将结果输出到变量。
$directory_contents = Invoke-SMBClient -Domain TESTDOMAIN -Username TEST -Hash F6F38B793DB6A94BA04A52F1D3EE92F0 -Action Recurse -Source \\server\share\subdirectory -Modify
示例:
删除共享上的文件。
Invoke-SMBClient -Domain TESTDOMAIN -Username TEST -Hash F6F38B793DB6A94BA04A52F1D3EE92F0 -Action Delete -Source \\server\share\file.txt
示例:
删除共享子目录中的文件。
Invoke-SMBClient -Domain TESTDOMAIN -Username TEST -Hash F6F38B793DB6A94BA04A52F1D3EE92F0 -Action Delete -Source \\server\share\subdirectory\subdirectory\file.txt
示例:
从共享下载文件。
Invoke-SMBClient -Domain TESTDOMAIN -Username TEST -Hash F6F38B793DB6A94BA04A52F1D3EE92F0 -Action Get -Source \\server\share\file.txt
示例:
从共享子目录下载文件并重命名。
Invoke-SMBClient -Domain TESTDOMAIN -Username TEST -Hash F6F38B793DB6A94BA04A52F1D3EE92F0 -Action Get -Source \\server\share\subdirectory\file.txt -Destination file.txt
示例:
从共享下载文件到字节数组变量(而非磁盘)。
$password_file = Invoke-SMBClient -Domain TESTDOMAIN -Username TEST -Hash F6F38B793DB6A94BA04A52F1D3EE92F0 -Action Get -Source \\server\share\file.txt -Modify
示例:
上传文件到共享子目录。
Invoke-SMBClient -Domain TESTDOMAIN -Username TEST -Hash F6F38B793DB6A94BA04A52F1D3EE92F0 -Action Put -Source file.exe -Destination \\server\share\subdirectory\file.exe
示例:
从字节数组变量上传文件到共享。
Invoke-SMBClient -Domain TESTDOMAIN -Username TEST -Hash F6F38B793DB6A94BA04A52F1D3EE92F0 -Action Put -Source $file_byte_array -Destination \\server\share\file.txt -Modify
截图:

Invoke-TheHash
- 用于对多个目标运行 Invoke-TheHash 函数的函数。
参数:
- Type - 设置所需的 Invoke-TheHash 函数。设置为 SMBClient、SMBEnum、SMBExec 或 WMIExec 之一。
- Target - 目标主机名、IP 地址、CIDR 表示法或 IP 范围列表。
- TargetExclude - 要从目标列表中排除的主机名、IP 地址、CIDR 表示法或 IP 范围列表。
- PortCheckDisable - (开关) 禁用 WMI 或 SMB 端口检查。由于此函数尚未多线程化,端口检查通过在尝试完整的同步 TCPClient 连接之前检查 WMI 或 SMB 端口是否开放来加速函数。
- PortCheckTimeout - 默认 = 100:设置 WMI 或 SMB 端口检查的无响应超时时间(毫秒)。
- Username - 用于认证的用户名。
- Domain - 用于认证的域。对于本地账户或在用户名后使用 @domain 时,不需要此参数。
- Hash - 用于认证的 NTLM 密码哈希。此模块接受 LM:NTLM 或 NTLM 格式。
- Command - 要在目标上执行的命令。如果未指定命令,该函数将仅检查用户名和哈希是否具有对目标 WMI 或 SCM 的访问权限。
- CommandCOMSPEC - 默认 = 启用:仅 SMBExec 类型。在 Command 前添加 %COMSPEC% /C。
- Service - 默认 = 20 字符随机:仅 SMBExec 类型。在目标上创建和删除的服务名称。
- SMB1 - (开关) 强制使用 SMB1。仅 SMBExec 类型。默认行为是进行 SMB 版本协商,如果目标支持则使用 SMB2。
- Sleep - 默认 = WMI 10 毫秒,SMB 150 毫秒:设置函数的 Start-Sleep 值(以毫秒为单位)。
示例:
Invoke-TheHash -Type WMIExec -Target 192.168.100.0/24 -TargetExclude 192.168.100.50 -Username Administrator -Hash F6F38B793DB6A94BA04A52F1D3EE92F0
截图:
