Мне нужна помощь в простом тестовом примере выполнения команды CLI через PowerShell, которая уже была закодирована в Base64.
Предположим Get-ChildItem
был заранее преобразован в строку Base64 R2V0LUNoaWxkSXRlbQ==
.
Далее предположим, что у меня открыт экземпляр CLI DOS, и я хочу протестировать выполнение этой строки в PowerShell:
C:>\ powershell.exe -enc R2V0LUNoaWxkSXRlbQ==
Однако я получаю следующую ошибку:
The term '???????' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:8
*??????? <<<<
+ CategoryInfo :ObjectNotFound: (???????:String) [], CommandNotFoundException
+ FullyQualifiedErrorID: CommandNotFoundException
Я понимаю, что есть способ, который вводит использование переменных и даже включает сам процесс кодирования. Но я хочу знать, можно ли спасти этот метод? Что я делаю не так? Я использую PS версии 2.0 в Win7.
Если его необходимо закодировать, используйте следующее, чтобы получить строку Base64:
[Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes('Get-ChildItem'))
Попытка этого сработала для меня:
powershell.exe -encodedCommand RwBlAHQALQBDAGgAaQBsAGQASQB0AGUAbQA=
Чтобы добавить к ответу @ SomethingElse, разница между вашей строкой Base64, которая не работает, и ее строкой Base64, которая действительно работает, - это кодировка символов, используемая при преобразовании исходной строки в байтовые значения.
Его нужно закодировать как UTF-16-LE, а затем преобразовать в Base64, чтобы он понравился PowerShell, а ваш код был закодирован как UTF8 / plain ASCII.
# Your version, with 1-byte-per-character encoding:
PS> [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes('Get-ChildItem'))
R2V0LUNoaWxkSXRlbQ==
# Working version, with 2-bytes-per-character encoding:
PS> [Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes('Get-ChildItem'))
RwBlAHQALQBDAGgAaQBsAGQASQB0AGUAbQA=
Кодировка символов, используемая powershell
является UTF-16LE
.
Итак, если вы кодируете свою строку из Linux на базе ОС, вы можете использовать iconv
сделать вывод совместимым с powershell
:
$ printf 'whoami' | iconv -t UTF-16LE | base64
dwBoAG8AYQBtAGkA
$ powershell -EncodedCommand 'dwBoAG8AYQBtAGkA'
user1