Invoke-TheHash
Invoke-TheHashは、Pass the Hashの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
- SMB1、SMB2.1(SMB署名の有無にかかわらず)をサポートするSMB (PsExec) コマンド実行関数。
パラメーター:
- 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は、SMB署名の有無にかかわらず、SMB2.1を介してユーザー、グループ、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
- SMB2.1およびSMB署名をサポートするSMBクライアント関数。この関数は主に、リモートコマンド実行権限を持たないハッシュで動作するためのSMBファイル共有機能を提供します。この関数はInvoke-WMIExecおよびInvoke-SMBExecで使用するペイロードのステージングにも使用できます。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: 関数はファイルをディスクに書き込む代わりに、ダウンロードされたファイルのバイト配列を出力します。これは小さいファイルでのみ使用し、出力を変数に送信することをお勧めします。
-
- Put: バイト配列を新しい宛先ファイルにアップロードします。
- 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
スクリーンショット:
