
PolyShell は Bash、Windows Batch、PowerShell で同時に動作するスクリプトです(つまりポリグロット)。
これにより PolyShell はペネトレーションテストにおいて有用なテンプレートとなります。ほとんどのシステムでターゲット固有のペイロードを必要とせず実行できるからです。また、PolyShell は USB Rubber Ducky、MalDuino、または類似のデバイスを使用した入力インジェクションによる配信に特化して設計されています。

.sh、.bat、.ps1)にします。exit を実行します。入力インジェクションの方法はスクリプトの方法とは若干動作が異なります。スクリプトとして実行すると、ペイロードは言語が処理された直後に終了します。インジェクションで配信すると、代わりに読み取りループが実行されます。これがないと、ペイロードはターミナルウィンドウを閉じるものの、代わりに不明なウィンドウに対して入力を続けてしまいます。Ctrl-C でスクリプトを読み取りループから抜け出させ、意図しない副作用を防ぎます。
また、スクリプトをターミナルに 貼り付け ても失敗する可能性があります。読み取りループに達した後、一部のターミナルは残りの貼り付けテキストを読み取りループの入力として扱います(良好)が、他のターミナルでは読み取りループ終了後もスクリプトを実行し続けることがあります(不良)。
主なトリックは、いずれか一つの言語に固有のコードを実行したいときに、他の言語を「見ないふり」させることにあります。これは、引用符、リダイレクト、コメントに関する言語の癖を利用することで実現します。次の行を考えてみてください。
echo \" <<'BATCH_SCRIPT' >/dev/null ">NUL "\" \`" <#"
各言語は echo コマンドを認識しますが、行の残りの部分を異なる方法で解釈します。
例えば、各言語が文字列として解釈する部分は次のようになります。
echo \" <<'BATCH_SCRIPT' >/dev/null ">NUL "\" \`" <#"
Bash [-----] [---]
Batch [-----------------------------] [-] [---]
PS [-----------------------------] [-]
この行を実行した後、Bash スクリプトは ヒアドキュメント、PowerShell スクリプトは 複数行コメント に入り、バッチスクリプトは通常通り実行を続けます。各言語の実行が終了したら、それを終了させます。これにより、後半のスクリプトでその言語の癖に対応する必要がなくなります。
明らかに、このポリグロットを作るために必要なトリックは 通常の コーディング規則に従っていません。
活用された、または回避しなければならなかった癖はかなり多くあります。
\)^)`)< と >)は引用符で囲まれていない限り、3つの言語すべてで特別な意味を持ちます。echo >output.txt "Hello World"。> を、文字列に直接接していてもリダイレクトとして扱いますが、PowerShell は扱いません。GOTO 文は、スクリプトとして実行された場合にのみ機能し、対話的に実行された場合は機能しません。<#)は、直前に空白がなければなりません。