Polyshell – um poliglota Bash / Batch / PowerShell!
O PolyShell é um script que é simultaneamente válido no 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 cargas úteis específicas do destino. O PolyShell também foi projetado especificamente para ser entregue via injeção de entrada usando um USB Rubby Ducky , MalDuino ou dispositivo similar.



Como usá-lo
como um script autônomo
- Copiar / renomear o script para que ele tenha a extensão de arquivo correto (
.sh
,.bat
ou.ps1
). - Execute o script com um shell Unix, como um arquivo em lotes ou com o PowerShell.
Usando injeção de entrada
- Abra um terminal na máquina de destino.
- Execute a carga útil.
- Pressione Ctrl-C e execute
exit
.
O método de injeção de entrada se comportará de maneira ligeiramente diferente do método de script. Quando executada como um script, a carga será encerrada imediatamente após o processamento de um idioma. Quando entregue por injeção, a carga útil executa um loop de leitura. Sem ele, a carga fecharia a janela do terminal, mas continuaria digitando em uma janela desconhecida. O Ctrl-C interrompe o script do loop de leitura, permitindo a execução sem efeitos colaterais indesejados.
Além disso, colar o script em um terminal pode falhar. Quando o script atinge o loop de leitura, alguns terminais tratam o texto colado restante como a entrada do loop de leitura (boa), mas outros podem continuar executando o script quando o loop de leitura sai (ruim).
Como funciona
O truque principal é fazer com que o idioma “desvie o olhar” quando queremos executar um código específico para apenas um deles. Isso é conseguido através da exploração de peculiaridades de linguagem que envolvem citações, redirecionamentos e comentários.
Considere a seguinte linha:
echo \" <<'BATCH_SCRIPT' >/dev/null ">NUL "\" \`" <#"
Cada idioma vê o echo
comando, mas interpretará o restante da linha de maneira diferente.
Por exemplo, é isso que cada idioma interpretará como uma sequência:
echo \" <<'BATCH_SCRIPT' >/dev/null ">NUL "\" \`" <#"
Bash [-----] [---]
Batch [-----------------------------] [-] [---]
PS [-----------------------------] [-]
Depois de executar a linha, o script bash estará em um documento aqui , o script PowerShell estará em um comentário de várias linhas e o script em lote continuará sendo executado normalmente. Após a execução de cada idioma, nós o encerramos. Isso nos impede de precisar contornar suas peculiaridades posteriormente no script.