
Un polyglotte Bash/Batch/PowerShell !
PolyShell est un script valide simultanément en Bash, Windows Batch et PowerShell (c'est-à-dire un polyglotte).
Cela fait de PolyShell un modèle utile pour les tests de pénétration, car il peut être exécuté sur la plupart des systèmes sans avoir besoin de charges utiles spécifiques à la cible. PolyShell est également conçu spécifiquement pour être délivré par injection d'entrée à l'aide d'un USB Rubby Ducky, d'un MalDuino, ou d'un appareil similaire.

.sh, .bat ou .ps1).exit.La méthode d'injection d'entrée se comportera légèrement différemment de la méthode script. Lorsqu'il est exécuté en tant que script, la charge utile se termine immédiatement une fois qu'un langage a été traité. Lorsqu'elle est délivrée par injection, la charge utile exécute plutôt une boucle de lecture. Sans cela, la charge utile fermerait la fenêtre du terminal mais continuerait à taper dans une fenêtre inconnue. Le Ctrl-C sort le script de la boucle de lecture, lui permettant de s'exécuter sans effets secondaires indésirables.
De plus, coller le script dans un terminal peut échouer. Une fois que le script atteint la boucle de lecture, certains terminaux traiteront le texte restant collé comme l'entrée de la boucle de lecture (bon), mais d'autres peuvent continuer à exécuter le script lorsque la boucle de lecture se termine (mauvais).
L'astuce principale est de faire en sorte que chaque autre langage « détourne le regard » lorsque nous voulons exécuter du code spécifique à un seul d'entre eux. Ceci est accompli en exploitant les particularités des langages concernant les guillemets, la redirection et les commentaires.
Considérez la ligne suivante :
echo \" <<'BATCH_SCRIPT' >/dev/null ">NUL "\" \`" <#"
Chaque langage voit la commande echo, mais interprète le reste de la ligne différemment.
Par exemple, voici ce que chaque langage interprétera comme une chaîne :
echo \" <<'BATCH_SCRIPT' >/dev/null ">NUL "\" \`" <#"
Bash [-----] [---]
Batch [-----------------------------] [-] [---]
PS [-----------------------------] [-]
Après avoir exécuté la ligne, le script bash sera dans un here document, le script PowerShell sera dans un commentaire multi-ligne, et le script batch continuera à s'exécuter normalement. Après que chaque langage a fini de s'exécuter, nous le terminons. Cela nous évite d'avoir à contourner ses particularités plus tard dans le script.
Évidemment, les astuces nécessaires pour réaliser ce polyglotte ne suivent pas les conventions de codage normales.
Il y a pas mal de particularités qui ont été exploitées ou contournées :
\)^)`)< et >) ont une signification spéciale dans les trois langages sauf si elles sont entre guillemets.echo >output.txt "Hello World"> comme une redirection même lorsqu'il touche directement une chaîne, mais PowerShell non.GOTO du script Batch ne fonctionnent que lorsqu'il est exécuté en tant que script, pas de manière interactive.<#) doit être immédiatement précédé d'un espace.