
Um poliglota Bash/Batch/PowerShell!
PolyShell é um script que é simultaneamente válido em Bash, Windows Batch e PowerShell (ou seja, um poliglota).
Isso torna o PolyShell um modelo útil para testes de penetração, pois pode ser executado na maioria dos sistemas sem a necessidade de payloads específicos para o alvo. PolyShell também é projetado especificamente para ser entregue via injeção de entrada usando um USB Rubby Ducky, MalDuino, ou dispositivo similar.

.sh, .bat ou .ps1).exit.O método de injeção de entrada se comportará de forma ligeiramente diferente do método de script. Quando executado como script, o payload sai imediatamente após o processamento de uma linguagem. Quando entregue via injeção, o payload executa um loop de leitura. Sem ele, o payload fecharia a janela do terminal mas continuaria digitando em uma janela desconhecida. O Ctrl-C interrompe o script do loop de leitura, permitindo que ele execute sem efeitos colaterais indesejados.
Além disso, colar o script em um terminal pode falhar. Uma vez que o script atinge o loop de leitura, alguns terminais tratarão o texto colado restante como entrada do loop de leitura (bom), mas outros podem continuar executando o script quando o loop de leitura sair (ruim).
O truque principal é fazer com que cada linguagem "desvie o olhar" quando queremos executar código específico para apenas uma delas. Isso é conseguido explorando peculiaridades das linguagens em relação a citações, redirecionamento e comentários.
Considere a seguinte linha:
echo \" <<'BATCH_SCRIPT' >/dev/null ">NUL "\" \`" <#"
Cada linguagem vê o comando echo, mas interpretará o resto da linha de forma diferente.
Por exemplo, isto é o que cada linguagem interpretará como uma string:
echo \" <<'BATCH_SCRIPT' >/dev/null ">NUL "\" \`" <#"
Bash [-----] [---]
Batch [-----------------------------] [-] [---]
PS [-----------------------------] [-]
Após executar a linha, o script bash estará em um here document, o script PowerShell estará em um comentário multilinha, e o script batch continuará executando normalmente. Após cada linguagem terminar a execução, nós a terminamos. Isso nos impede de precisar contornar suas peculiaridades mais tarde no script.
Obviamente, os truques necessários para fazer este poliglota não seguem as convenções normais de codificação.
Existem algumas peculiaridades que foram aproveitadas ou tiveram que ser contornadas:
\)^)`)< e >) têm significado especial nas três linguagens a menos que sejam citados.echo >output.txt "Hello World"> como redirecionamento mesmo quando toca diretamente uma string, mas PowerShell não.GOTO do script batch funcionam apenas quando executadas como script, não quando executadas interativamente.<#) deve ser imediatamente precedido por espaço em branco.