
¡Un políglota de Bash/Batch/PowerShell!
PolyShell es un script que es válido simultáneamente en Bash, Windows Batch y PowerShell (es decir, un políglota).
Esto convierte a PolyShell en una plantilla útil para pruebas de penetración, ya que se puede ejecutar en la mayoría de los sistemas sin necesidad de cargas útiles específicas del objetivo. PolyShell también está diseñado específicamente para ser entregable mediante inyección de entrada utilizando un USB Rubber Ducky, MalDuino, o un dispositivo similar.

.sh, , o )..bat.ps1exit.El método de inyección de entrada se comportará ligeramente diferente al método de script. Cuando se ejecuta como script, la carga útil saldrá inmediatamente una vez que se haya procesado un lenguaje. Cuando se entrega mediante inyección, la carga útil ejecuta un bucle de lectura en su lugar. Sin él, la carga útil cerraría la ventana de la terminal pero seguiría escribiendo en una ventana desconocida. Ctrl-C interrumpe el script del bucle de lectura, permitiéndole ejecutarse sin efectos secundarios no deseados.
Además, pegar el script en una terminal podría fallar. Una vez que el script llega al bucle de lectura, algunas terminales tratarán el texto pegado restante como la entrada del bucle de lectura (bueno), pero otras pueden continuar ejecutando el script cuando el bucle de lectura sale (malo).
El truco principal es lograr que cada otro lenguaje "mire hacia otro lado" cuando queremos ejecutar código específico para solo uno de ellos. Esto se logra explotando peculiaridades de los lenguajes en torno a las comillas, la redirección y los comentarios.
Considere la siguiente línea:
echo \" <<'BATCH_SCRIPT' >/dev/null ">NUL "\" \`" <#"
Cada lenguaje ve el comando echo, pero interpretará el resto de la línea de manera diferente.
Por ejemplo, esto es lo que cada lenguaje interpretará como una cadena:
echo \" <<'BATCH_SCRIPT' >/dev/null ">NUL "\" \`" <#"
Bash [-----] [---]
Batch [-----------------------------] [-] [---]
PS [-----------------------------] [-]
Después de ejecutar la línea, el script bash estará dentro de un here document, el script de PowerShell estará dentro de un comentario multilínea, y el script batch continuará ejecutándose normalmente. Una vez que cada lenguaje termina de ejecutarse, lo terminamos. Esto evita que necesitemos trabajar alrededor de sus peculiaridades más adelante en el script.
Obviamente, los trucos necesarios para hacer este políglota no siguen las normales convenciones de codificación.
Hay bastantes peculiaridades que se aprovecharon o que tuvieron que ser resueltas:
\)^)`)< y >) tienen un significado especial en los tres lenguajes a menos que estén entre comillas.echo >output.txt "Hello World"> como una redirección incluso cuando toca directamente una cadena, pero PowerShell no.GOTO de Batch solo funcionan cuando se ejecutan como script, no cuando se ejecutan de forma interactiva.<#) debe estar inmediatamente precedido por un espacio en blanco.