PolyShell 是一个在 Bash、Windows Batch 和 PowerShell 中同时有效的脚本(即一个多语言脚本)。
这使得 PolyShell 成为渗透测试的有用模板,因为它可以在大多数系统上执行,而无需针对特定目标的 payload。
PolyShell 还专门设计为可通过使用 USB Rubby Ducky、MalDuino 或类似设备的输入注入进行交付。

.sh、.bat 或 .ps1)。exit。输入注入方法的行为与脚本方法略有不同。作为脚本运行时,payload 会在处理完一种语言后立即退出。通过注入交付时,payload 会运行一个读取循环。如果没有它,payload 会关闭终端窗口,但会继续向未知窗口输入。Ctrl-C 使脚本跳出读取循环,从而允许其运行而不会产生意外的副作用。
此外,_粘贴_脚本到终端可能会失败。一旦脚本到达读取循环,某些终端会将剩余的粘贴文本视为读取循环的输入(好),但其他终端可能会在读取循环退出时继续执行脚本(坏)。
主要技巧是让其他语言在我们只想运行其中一种语言的特定代码时“移开视线”。这是通过利用围绕引号、重定向和注释的语言特性来实现的。
考虑以下行:
echo \" <<'BATCH_SCRIPT' >/dev/null ">NUL "\" \`" <#"
每种语言都会看到 echo 命令,但会对该行的其余部分进行不同的解释。
例如,这是每种语言将解释为字符串的内容:
echo \" <<'BATCH_SCRIPT' >/dev/null ">NUL "\" \`" <#"
Bash [-----] [---]
Batch [-----------------------------] [-] [---]
PS [-----------------------------] [-]
执行该行后,bash 脚本将处于 here document 中,PowerShell 脚本将处于 多行注释 中,而 batch 脚本将正常继续执行。每种语言执行完毕后,我们终止它。这使我们无需在脚本后面处理其特性。
显然,制作这个多语言脚本所需的技巧并不遵循_正常_的编码规范。
有许多被利用或必须处理的特性:
\)^)`)< 和 >)在所有三种语言中都具有特殊含义,除非被引用。echo >output.txt "Hello World"> 视为重定向,即使它直接接触字符串,但 PowerShell 不会。GOTO 语句仅在作为脚本运行时有效,在交互式运行时无效。<#)必须立即前面有空白字符。