
Bash/Batch/PowerShell полиглот!
PolyShell — это скрипт, который одновременно корректен в Bash, Windows Batch и PowerShell (т.е. полиглот).
Это делает PolyShell полезным шаблоном для тестирования на проникновение, так как его можно выполнять на большинстве систем без необходимости в специфичных для цели полезных нагрузках. PolyShell также специально спроектирован для доставки через инъекцию ввода с помощью USB Rubby 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 окажется в heredoc, скрипт PowerShell — в многострочном комментарии, а пакетный скрипт продолжит нормальное выполнение. После завершения выполнения каждого языка мы его завершаем. Это избавляет нас от необходимости обходить его особенности позже в скрипте.
Очевидно, что трюки, необходимые для создания этого полиглота, не следуют нормальным соглашениям о кодировании. Есть несколько особенностей, которые были использованы или которые пришлось обойти:
\)^)`)< и >) имеют специальное значение во всех трех языках, если не заключены в кавычки.echo >output.txt \"Hello World\"> как перенаправление, даже если он непосредственно касается строки, а PowerShell — нет.GOTO в Batch работают только при запуске как скрипт, а не в интерактивном режиме.<#) должен быть непосредственно предшествовать пробелу.