
Un poliglotta Bash/Batch/PowerShell!
PolyShell è uno script valido contemporaneamente in Bash, Windows Batch e PowerShell (ovvero un poliglotta).
Ciò rende PolyShell un modello utile per i test di penetrazione poiché può essere eseguito sulla maggior parte dei sistemi senza la necessità di payload specifici per il target. PolyShell è anche specificamente progettato per essere distribuito tramite injection di input utilizzando un USB Rubby Ducky, MalDuino, o dispositivo simile.

.sh, .bat, o .ps1).exit.Il metodo di injection tramite input si comporterà leggermente diversamente dal metodo script. Se eseguito come script, il payload terminerà immediatamente una volta elaborato un linguaggio. Quando distribuito tramite injection, il payload esegue invece un ciclo di lettura. Senza di esso, il payload chiuderebbe la finestra del terminale ma continuerebbe a digitare in una finestra sconosciuta. Ctrl-C interrompe lo script dal ciclo di lettura, permettendogli di funzionare senza effetti collaterali indesiderati.
Inoltre, incollare lo script in un terminale potrebbe fallire. Una volta che lo script raggiunge il ciclo di lettura, alcuni terminali tratteranno il testo incollato rimanente come input del ciclo di lettura (buono), ma altri potrebbero continuare ad eseguire lo script quando il ciclo di lettura termina (cattivo).
Il trucco principale è far sì che ogni altro linguaggio 'guardi altrove' quando vogliamo eseguire codice specifico per uno solo di essi. Ciò si ottiene sfruttando le stranezze dei linguaggi relative a quoting, redirezione e commenti.
Considera la seguente riga:
echo \" <<'BATCH_SCRIPT' >/dev/null ">NUL "\" \`" <#"
Ogni linguaggio vede il comando echo, ma interpreterà il resto della riga in modo diverso.
Ad esempio, ecco cosa interpreterà ogni linguaggio come stringa:
echo \" <<'BATCH_SCRIPT' >/dev/null ">NUL "\" \`" <#"
Bash [-----] [---]
Batch [-----------------------------] [-] [---]
PS [-----------------------------] [-]
Dopo aver eseguito la riga, lo script bash si troverà in un here document, lo script PowerShell in un multiline-comment, e lo script batch continuerà ad eseguire normalmente. Dopo che ogni linguaggio ha terminato l'esecuzione, lo terminiamo. Questo ci evita di dover aggirare le sue stranezze più avanti nello script.
Ovviamente, i trucchi necessari per realizzare questo polyglot non seguono le normali convenzioni di codifica.
Ci sono diverse stranezze che sono state sfruttate o che hanno dovuto essere aggirate:
\)^)`)< e >) hanno un significato speciale in tutti e tre i linguaggi se non sono quotati.echo >output.txt "Hello World"> come un redirect anche quando tocca direttamente una stringa, ma PowerShell no.GOTO dello script batch funzionano solo quando eseguite come script, non in modo interattivo.<#) deve essere immediatamente preceduto da spazi bianchi.