
Bash/Batch/PowerShell 폴리글랏!
PolyShell은 Bash, Windows Batch 및 PowerShell에서 동시에 유효한 스크립트입니다 (즉, 폴리글랏).
따라서 PolyShell은 대상별 페이로드 없이 대부분의 시스템에서 실행될 수 있어 침투 테스트에 유용한 템플릿입니다. 또한 PolyShell은 USB Rubby Ducky, MalDuino, 또는 유사한 장치를 통한 입력 주입(injection)으로 전달 가능하도록 특별히 설계되었습니다.

.sh, .bat 또는 .ps1)를 갖도록 합니다.exit를 실행합니다.입력 주입 방식은 스크립트 방식과 약간 다르게 동작합니다. 스크립트로 실행될 경우 페이로드는 하나의 언어가 처리되자마자 즉시 종료됩니다. 주입을 통해 전달될 경우 페이로드는 대신 읽기 루프(read loop)를 실행합니다. 그렇지 않으면 페이로드가 터미널 창을 닫지만 대신 알 수 없는 창에 계속 입력을 보내게 됩니다. Ctrl-C는 스크립트를 읽기 루프에서 빠져나오게 하여 의도하지 않은 부작용 없이 실행되도록 합니다.
또한, 스크립트를 터미널에 _붙여넣기_하면 실패할 수 있습니다. 스크립트가 읽기 루프에 도달하면 일부 터미널은 남은 붙여넣기 텍스트를 읽기 루프의 입력으로 처리(좋은 경우)하지만, 다른 터미널은 읽기 루프가 종료될 때 스크립트를 계속 실행할 수도 있습니다(나쁜 경우).
주요 트릭은 각 언어가 특정 언어에만 해당하는 코드를 실행할 때 "외면"하도록 만드는 것입니다. 이는 인용(quoting), 리디렉션(redirection), 주석(comments)과 관련된 언어의 미묘한 특성을 이용하여 이루어집니다.
다음 줄을 고려해보세요:
echo \" <<'BATCH_SCRIPT' >/dev/null ">NUL "\" \`" <#"
각 언어는 echo 명령을 보지만, 나머지 줄을 다르게 해석합니다.
예를 들어, 각 언어가 문자열로 해석하는 부분은 다음과 같습니다:
echo \" <<'BATCH_SCRIPT' >/dev/null ">NUL "\" \`" <#"
Bash [-----] [---]
Batch [-----------------------------] [-] [---]
PS [-----------------------------] [-]
이 줄이 실행된 후, bash 스크립트는 여기 문서(here document)에 들어가고, PowerShell 스크립트는 여러 줄 주석(multiline-comment)에 들어가며, 배치 스크립트는 정상적으로 계속 실행됩니다. 각 언어가 실행을 마치면, 이를 종료합니다. 이렇게 하면 나중에 스크립트에서 해당 언어의 특성과 씨름할 필요가 없습니다.
분명히, 이 폴리글랏을 만드는 데 필요한 트릭은 일반적인 코딩 관행을 따르지 않습니다.
활용되거나 해결해야 했던 특이점이 꽤 많습니다:
\)^)`)< 및 >)은 인용되지 않은 경우 세 언어 모두에서 특별한 의미를 가집니다.echo >output.txt "Hello World">가 문자열에 직접 붙어 있어도 리디렉션으로 처리하지만, PowerShell은 그렇지 않습니다.GOTO 문은 스크립트로 실행될 때만 작동하고, 대화형으로 실행될 때는 작동하지 않습니다.<#)은 바로 앞에 공백이 와야 합니다.