
Ein Bash/Batch/PowerShell-Polyglott!
PolyShell ist ein Skript, das gleichzeitig in Bash, Windows Batch und PowerShell gültig ist (d.h. ein Polyglott).
Dies macht PolyShell zu einer nützlichen Vorlage für Penetrationstests, da es auf den meisten Systemen ohne die Notwendigkeit zielspezifischer Payloads ausgeführt werden kann. PolyShell ist außerdem speziell dafür ausgelegt, mittels Eingabeinjektion über einen USB Rubby Ducky, MalDuino oder ein ähnliches Gerät ausgeliefert zu werden.

.sh, .bat oder .ps1).exit aus.Die Eingabeinjektionsmethode verhält sich etwas anders als die Skriptmethode. Bei Ausführung als Skript beendet sich der Payload sofort, sobald eine Sprache verarbeitet wurde. Bei Lieferung per Injektion führt der Payload stattdessen eine Leseschleife aus. Ohne diese würde der Payload das Terminalfenster schließen, aber stattdessen in ein unbekanntes Fenster weitertippen. Strg-C unterbricht die Leseschleife des Skripts und ermöglicht so eine Ausführung ohne unbeabsichtigte Nebeneffekte.
Zusätzlich kann das Einfügen des Skripts in ein Terminal fehlschlagen. Sobald das Skript die Leseschleife erreicht, behandeln einige Terminals den restlichen eingefügten Text als Eingabe für die Leseschleife (gut), andere hingegen führen das Skript möglicherweise weiter aus, wenn die Leseschleife beendet wird (schlecht).
Der Haupttrick besteht darin, die jeweils andere Sprache 'wegschauen' zu lassen, wenn wir nur für eine von ihnen spezifischen Code ausführen wollen. Dies wird erreicht, indem sprachspezifische Eigenheiten bei Anführungszeichen, Umleitungen und Kommentaren ausgenutzt werden.
Betrachten Sie die folgende Zeile:
echo \" <<'BATCH_SCRIPT' >/dev/null ">NUL "\" \`" <#"
Jede Sprache sieht den Befehl echo, interpretiert den Rest der Zeile jedoch unterschiedlich.
Zum Beispiel interpretiert jede Sprache Folgendes als Zeichenkette:
echo \" <<'BATCH_SCRIPT' >/dev/null ">NUL "\" \`" <#"
Bash [-----] [---]
Batch [-----------------------------] [-] [---]
PS [-----------------------------] [-]
Nach Ausführung der Zeile befindet sich das Bash-Skript in einem Here-Dokument, das PowerShell-Skript in einem mehrzeiligen Kommentar und das Batch-Skript wird normal weiter ausgeführt. Nachdem jede Sprache ihre Ausführung beendet hat, beenden wir sie. Dies verhindert, dass wir uns später im Skript mit ihren Eigenheiten auseinandersetzen müssen.
Offensichtlich folgen die Tricks, die für dieses Polyglott benötigt werden, nicht den normalen Codierungskonventionen.
Es gibt einige Eigenheiten, die ausgenutzt oder umgangen werden mussten:
\)^)`)< und >) haben in allen drei Sprachen eine besondere Bedeutung, sofern sie nicht in Anführungszeichen gesetzt sind.echo >output.txt "Hello World"> auch dann als Umleitung, wenn es direkt an eine Zeichenkette grenzt, PowerShell hingegen nicht.GOTO-Anweisungen funktionieren nur, wenn sie als Skript ausgeführt werden, nicht interaktiv.<#) muss unmittelbar ein Leerzeichen vorausgehen.