
أداة متعددة اللغات (Bash/Batch/PowerShell)!
PolyShell هو سكريبت صالح في نفس الوقت للاستخدام في Bash وWindows Batch وPowerShell (أي نص متعدد الصيغ).
هذا يجعل PolyShell قالبًا مفيدًا لاختبار الاختراق لأنه يمكن تنفيذه على معظم الأنظمة دون الحاجة إلى أحمال مستهدفة خاصة بكل نظام. كما تم تصميم PolyShell خصيصًا ليكون قابلاً للتسليم عن طريق حقن الإدخال باستخدام USB Rubber 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 في مستند هنا (here document)، وسيكون سكريبت PowerShell في تعليق متعدد الأسطر، وسيستمر سكريبت batch في التنفيذ بشكل طبيعي. بعد انتهاء كل لغة من التنفيذ، نقوم بإنهائها. هذا يمنع الحاجة إلى التعامل مع خصائصها الغريبة لاحقًا في السكريبت.
من الواضح أن الحيل المطلوبة لجعل هذا النص متعدد الصيغ لا تتبع اتفاقيات البرمجة العادية.
هناك العديد من الخصائص الغريبة التي تم استغلالها أو كان لا بد من التعامل معها:
\)^)`)< و >) معنى خاص في جميع اللغات الثلاث ما لم تكن مقتبسة.echo >output.txt "Hello World"> كإعادة توجيه حتى عندما تلامس سلسلة نصية مباشرة، لكن PowerShell لا يفعل ذلك.GOTO في سكريبت Batch تعمل فقط عند تشغيلها كسكريبت، وليس عند تشغيلها تفاعليًا.<#) يجب أن يسبقه مسافة بيضاء مباشرة.