نص واجهة الأوامر البرمجي

في مجال أمن الحاسوب، يعد نص واجهة الأوامر البرمجي (بالإنجليزية: Shellcode)‏ عبارة عن جزء صغير من كود يتم استخدامه في صورة حمولة في مهاجمة الثغرة الأمنية لأحد البرامج. ويُطلق عليه «نص واجهة الأوامر البرمجي» نظرًا لأنه يبدأ في العادة في صورة واجهة الأوامر يمكن للمهاجم من خلالها السيطرة على الماكينة المُعرضة للخطر. وتتم كتابة كود الواجهة الأوامر في العادة في لغة الآلة، ولكن يمكن أن يُطلق اسم كود الواجهة الأوامر على أي جزء من الكود يؤدي مهمة مماثلة. ونظرًا لأن مهمة الحمولة لا تقتصر على تكوين الواجهة الأوامر فحسب، فقد اقترح البعض بأن اسم كود الواجهة الأوامر ليس كافيًا.[1] ومع ذلك، لم تلق محاولات استبدال المصطلح بآخر قبولاً واسعًا.

أنواع كود الواجهة الأوامر

يمكن أن يكون كود الواجهة الأوامر إما محلي أو عن بُعد، ويعتمد ذلك على ما إذا كان يتيح للمهاجم السيطرة على الماكينة التي يعمل عليها (محلي) أو على ماكينة أخرى عبر الشبكة (عن بُعد).

محلي

تم استخدام كود الواجهة الأوامر المحلي من قِبل أحد المهاجمين الذين يتمتعون بوصول محدود لإحدى الماكينات لكن بإمكانه مهاجمة ثغرة أمنية، على سبيل المثال، فيض الدارئ، في عملية ذات ميزة أعلى بتلك الماكينة. وإذا تم تنفيذه بنجاح، فسيوفر كود الواجهة الأوامر للمهاجم الوصول للماكينة عند نفس مستوى الميزات الأعلى للعملية المستهدفة.

عن بُعد

يتم استخدام كود الواجهة الأوامر عن بُعد عندما يرغب أحد المهاجمين في استهداف عملية معرضة للخطر تعمل على ماكينة أخرى على شبكة محلية أو إنترانت. وإذا تم تنفيذه بنجاح، فيمكن لكود الواجهة الأوامر أو يتيح للمهاجم الوصول للماكينة المستهدفة عبر الشبكة. وتستخدم أكواد الواجهة الأوامر في العادة اتصالات مأخذ توصيل TCP/IP القياسية للسماح للمهاجم بالوصول إلى الواجهة الأوامر الموجودة على الماكينة المستهدفة. ويمكن تصنيف نوع الواجهة الأوامر هذا استنادًا إلى كيفية إعداد هذا الاتصال: إذا كان بمقدور كود الواجهة الأوامر إنشاء هذا الاتصال، فيُطلق عليه اسم كود واجهة الأوامر معاودة الاتصال لأن كود الواجهة الأوامر يعاود الاتصال بماكينة المهاجم. من ناحية أخرى، إذا كان المهاجم بحاجة لإنشاء اتصال، فيُطلع على كود الواجهة الأوامر اسم واجهة الأوامر الربط لأن كود الواجهة الأوامر يرتبط بمنفذ معين يمكن للمهاجم أن يتصل من خلاله للتحكم به. وهناك نوع ثالث، أقل شيوعًا، وهو كود واجهة الأوامر إعادة استخدام مأخذ التوصيل. ويُستخدم هذا النوع من كود الواجهة الأوامر في بعض الأحيان عندما تقوم إحدى عمليات الهجوم بإنشاء اتصال بالعملية المعرضة للخطر التي لا يتم إغلاقها قبل تشغيل كود الواجهة الأوامر. ويمكن لكود الواجهة الأوامر إعادة استخدام هذا الاتصال للتواصل مع المهاجم. ويصعب إنشاء كود واجهة الأوامر لإعادة استخدام مأخذ التوصيل لأن كود الواجهة الأوامر بحاجة لاكتشاف أي اتصال لإعادة استخدامه وقد تتوفر لدى الماكينة الكثير من الاتصالات المفتوحة. يمكن استخدام جدار ناريلاكتشاف الاتصالات الصادرة التي أنشأها كود الواجهة الأوامر لمعاودة الاتصال لقبول الاتصالات الواردة من قِبل كود الواجهة الأوامر. وهذا هو أحد الأسباب وراء استخدام كود واجهة الأوامر إعادة استخدام مأخذ التوصيل: لأنه لا يقوم بإنشاء اتصالات جديدة ومن ثم يصعب اكتشافه وحجبه.

التنزيل والتنفيذ

يعد التنزيل والتنفيذ أحد أنواع كود الواجهة الأوامر عن بُعد التي تقوم بـ تنزيل وتنفيذ بعض أنواع البرامج الضارة على النظام المستهدف. ولا ينتج هذا النوع من كود الواجهة الأوامر أي واجهة الأوامر، بل يقوم بتوجيه الماكينة لتنزيل ملف معين قابل للتنفيذ من الشبكة، وحفظه على القرص ثم تنفيذه. ويشيع في تلك الأيام استخدام هجمات تتم عبر التنزيل، حيث تزور الضحية صفحة ويب ضارة تحاول بدورها تشغيل عملية التنزيل هذه وتنفيذ كود الواجهة الأوامر ليتم تثبيت البرنامج على ماكينة الضحية. ويقوم نوع مختلف من كود الواجهة الأوامر هذا بتنزيل وتحميل إحدى المكتبات.[2][3] وتتمثل ميزات هذا الأسلوب في إمكانية جعل هذا الكود أصغر، لأن الموضوع لا يتطلب من كود الواجهة الأوامر إنتاج عملية جديدة على النظام المستهدف، وأن كود الواجهة الأوامر لا يحتاج لكود لتنظيف العملية المستهدفة حيث يمكن القيام بذلك بواسطة مكتبة تم تحميلها داخل العملية.

مُقسّم مرحليًا

عندما يكون مقدار البيانات التي يمكن للمهاجم حقنها داخل العملية المستهدفة محدودًا للغاية لتنفيذ كود الواجهة الأوامر المفيد مباشرة، فقد يكون من الممكن تنفيذها على مراحل. أولاً، يتم تنفيذ جزء صغير من كود الواجهة الأوامر (المرحلة الأولى). يقوم هذا الكود بعد ذلك بتنزيل جزء كبير من كود الواجهة الأوامر (المرحلة الثانية) في ذاكرة العملية ثم يقوم بتنفيذه.

أسلوب البحث عن البيض

هذا نوع آخر من كود الواجهة الأوامر المُقسّم مرحليًا، والذي يتم استخدامه إذا ما تمكن أحد المهاجمين في حقن كود واجهة الأوامر أكبر داخل العملية لكن يتعذر عليها تحديد أين ستنتهي داخل العملية. ويتم حقن كود واجهة الأوامر البحث عن البيض داخل العملية عند موقع يمكن التنبؤ به ثم يتم تنفيذه. ويقوم ذلك الكود بعد هذا بالبحث عبر مساحة عنوان العملية عن كود الواجهة الأوامر الأكبر (البيضة) ثم تنفيذه.[4]

الأومليت

هذا النوع من كود الواجهة الأوامر مشابه لكود واجهة الأوامر البحث عن البيض، لكنه يبحث عن كتل صغيرة متعددة من البيانات (البيض) ثم يعيد تجميعها في كتلة واحدة أكبر حجمًا (أومليت) يتم تنفيذها في وقت لاحق. ويتم استخدام هذا الأسلوب عندما يكون بمقدور أحد المهاجمين حقن عدد من الكتل الصغيرة من البيانات داخل العملية.[5]

إستراتيجية تنفيذ كود الواجهة الأوامر

ستقوم إحدى الهجمات بحقن كود واجهة الأوامر داخل العملية المستهدفة قبل أو في نفس الوقت الذي تقوم فيه بمهاجمة ثغرة أمنية للتحكم في عدد البرامج. ويتم ضبط عداد البرامج بحيث يشير إلى الجدول؛ والذي يتم إجراؤه بعده وتنفيذ مهامه. ويتم في الغالب حقن كود الواجهة الأوامر عبر تخزين كود الواجهة الأوامر في البيانات المرسلة عبر الشبكة إلى عملية بها ثغرة أمنية، عبر تزويده في ملف تتم قراءته بواسطة عملية بها ثغرة أمنية أو عبر سطر الأوامر أو البيئة في حالة الثغرات الأمنية المحلية.

ترميز كود الواجهة الأوامر

نظرًا لأن أغلب العمليات تقوم بفلترة أو تقييد البيانات التي يمكن حقنها، فغالبًا ما يحتاج كود الواجهة الأوامر لأن تتم كتابته للسماح بتطبيق تلك القيود. ويشمل ذلك جعل الكود صغيرًا أو بدون فراغات أو أبجدي رقمي. وقد تم التوصل للعديد من الحلول للتحايل على تلك القيود، ومنها:

• تصميم وتنفيذ عمليات تحسين لخفض حجم كود الواجهة الأوامر. • تطبيق تعديلات لتفادي القيود في نطاق وحدات البايت في كود الواجهة الأوامر. • كود ذاتي التعديل يقوم بتعديل عدد من وحدات البايت في الكود الخاص به قبل تنفيذها لإعادة إنشاء وحدات البايت التي يستحيل حقنها في العادة داخل العملية.

نظرًا لقدرة ميزة كشف التطفل على اكتشاف توقيعات أكواد الواجهة الأوامر البسيطة التي يتم إرسالها عبر الشبكة، غالبًا ما يتم ترميزها أو جعلها ذاتية فك التشفير أو متعددة الأشكال لتفادي اكتشافها.

ترميز النسبة المئوية

تعمل الهجمات التي تستهدف المتصفحات في العادة على ترميز كود الواجهة الأوامر في سلسلة JavaScript باستخدام ترميز النسبة المئويةأو ترميز "/uXXX" أو ترميز الكيان. وتقوم بعض الهجمات كذلك بالتشويش على سلسلة كود الواجهة الأوامر الذي تم ترميزه للحيلولة دون اكتشافه من قبل نظام اكتشاف التطفل IDS. على سبيل المثال، في الهيكل أي إيه-32، إليك الصورة التي ستبدو عليها تعليمات NOP (بدون تشغيل)، حيث لا يتم ترميزها أولاً:

90  NOP
90  NOP

ثم يتم بعد ذلك ترميزها إلى سلسلة تستخدم ترميز النسبة المئوية (باستخدام وظيفة unescape() لفك التشفير).

unescape("%u9090");

ويتم بعد ذلك ترميزها في سلسلة باستخدام ترميز "uXXX":

"\u9090";

وأخيرًا، يتم ترميزها داخل سلسلة باستخدام ميزة ترميز الكيان:

"邐"

أو

"邐"

كود الواجهة الأوامر بدون قيم خالية

تتم كتابة أغلب أكواد الواجهة الأوامر دون استخدام وحدات بايت ذات قيمة خالية لأنها تهدف لأن يتم حقنها داخل عملية مستهدفة من خلال سلاسل تنتهي بقيمة خالية. وعند نسخ سلسلة تنتهي بقيمة خالية، فسيتم نسخها حتى تشمل أول قيمة خالية إلا أنها لن تعالج وحدات البايت التالية من كود الواجهة الأوامر. وعند حقن كود الواجهة الأوامر الذي يشتمل على قيم خالية بهذه الطريقة، فسيتم حقن جزء واحد فقط من كود الواجهة الأوامر، مما يجعله غير قادر على العمل بنجاح. لإنتاج كود واجهة الأوامر بدون قيم خالية من كود واجهة الأوامر يشتمل على وحدات بايت ذات قيمة خالية، يمكن استبدال تعليمات الماكينة التي تشتمل على أصفار بتعليمات لها نفس التأثير لكنها بدون قيم خالية. على سبيل المثال، في هيكل أي إيه-32 يمكن استبدال هذه التعليمات:

B8 01000000 قائمة أوامر إكس 86 EAX,1  // يضبط المسجل EAX عند قيمة 0x000000001

والتي تشتمل على أصفار كجزء من تكوينها الحرفي (يتوسع 1 ليصير 0x00000001) عبر تلك التعليمات:

33C0  XOR EAX,EAX // يضبط المسجل EAX عند قيمة 0x000000000
40  INC EAX  // يزيد المسجل EAX إلى 0x00000001

والتي تتمتع بنفس التأثير لكنها تحتاج لوحدات بايت أقل للترميز كما أنها بدون قيم خالية.

كود واجهة الأوامر أبجدي رقمي قابل للطباعة

انظر كذلك كود أبجدي رقمي في حالات معينة، تقوم إحدى العمليات المستهدفة بفلترة أي وحدة بايت من كود الواجهة الأوامر الذي تم حقنه والذي لا يمثل رمزًا أبجديا رقميا أو قابلا للطباعة. وفي ظل هذه الحالات، يكون نطاق التعليمات التي يمكن استخدامها لكتابة كود واجهة الأوامر محدودًا للغاية. وقد تم نشر حل لهذه المشكلة بواسطة Rix في مجلة ]]Phrack 57[[[6] عرض فيه إمكانية تحويل أي كود إلى كود أبجدي رقمي. وقد تم استخدام هذا الأسلوب لإنشاء كود ذاتي التعديل، نظرًا لأن هذا يسمح للكود بتعديل وحدات البايت الخاصة به لتضمين وحدات البايت خارج النطاق المسموح به في العادة، وبذلك تقوم بتوسعة نطاق التعليمات التي يمكنها استخدامه. وعند تشغيل كود واجهة الأوامر الإخراج، يمكن لجهاز فك الترميز تعديل الكود الخاص به ليتمكن من استخدام أية تعليمات يحتاجها للعمل بشكل مناسب ثم يواصل فك ترميز كود الواجهة الأوامر الأصلي. وبعد فك ترميز كود الواجهة الأوامر يقوم جهاز فك الترميز بنقل التحكم إليه، بحيث يكون بالإمكان تنفيذه بشكل طبيعي. وقد اتضح أنه بالإمكان إنشاء كود واجهة الأوامر معقد قسرًا يبدو كنص عادي باللغة الإنجليزية.[7]

كود واجهة الأوامر دليل يونيكود

تستخدم البرامج الحديثة سلاسل يونيكودللسماح بتدويل النص. ومع ذلك، ستقوم تلك البرامج بتحويل سلاسل أسكي إلى يونيكود قبل معالجتها. وتستخدم سلاسل يونيكود التي تم ترميزها في يو تي اف-16 وحدتي بايت لترميز كل رمز (أو أربعة بايت لبعض الرموز الخاصة). وعند تحويل سلسلة يو تي اف-16 إلى UTF-16، يتم إدخال وحدة بايت صفرية بعد كل بايت في السلسلة الأصلية. وقد أثبت Obscou في مجلة ]]Phrack 61[[[8] أنه بالإمكان كتابة كود واجهة الأوامر بمقدوره أن يعمل بنجاح بعد عملية التحويل هذه. وهناك برامج يمكنها ترميز أي كود واجهة الأوامر إلى كود واجهة الأوامر دليل UTF-16، وذلك استنادًا لنفس مبدأ جهاز فك الترميز الصغير ذاتي التعديل الذي يفك ترميز كود الواجهة الأوامر الأصلي.

الأنظمة الأساسية

تتم كتابة أغلب أكواد الواجهة الأوامر في لغة الآلةنظرًا لأن المستوى المنخفض الذي تتم مهاجمة الثغرة الأمنية عنده يمنح المهاجم وصولاً للعملية. لذا يتم إنشاء كود واجهة الأوامر لاستهداف مجموعة واحدة محددة من وحدة المعالجة المركزيةونظام تشغيل وحزمة خدمات، يطلق عليها منصة حاسوب. وبالنسبة لبعض الهجمات، بسبب القيود المفروضة على كود الواجهة الأوامر من قبل العملية المستهدفة، يلزم إنشاء كود واجهة الأوامر محدد للغاية. ومع ذلك، فليس من المستحيل بالنسبة لأحد أكواد الواجهة الأوامر أن يعمل لتنفيذ عدة هجمات، وحزم خدمات وأنظمة تشغيل بل وحتى معالجات.[9] ويتم الوصول لتنوع الاستخدامات هذا عبر إنشاء إصدارات متعددة من كود الواجهة الأوامر تستهدف إصدارات الأنظمة الأساسية وتقوم بإنشاء عنوان يتفرع إلى الإصدارات الصحيحة لنظام التشغيل الذي يعمل الكود عليه. وعند تنفيذه، يتصرف الكود بشكل مختلف عن مع أنظمة التشغيل المختلفة ويقوم بتنفيذ الجزء الصحيح من كود الواجهة الأوامر للنظام الأساسي الذي يعمل عليه.

انظر أيضًا

مراجع

  1. ^ Foster، James C.؛ and Price، Mike (12 أبريل 2005). Sockets, Shellcode, Porting, & Coding: Reverse Engineering Exploits and Tool Coding for Security Professionals. Elsevier Science & Technology Books. ISBN:1-59749-005-9. مؤرشف من الأصل في 2020-04-14.
  2. ^ SkyLined (11 يناير 2010). "Download and LoadLibrary shellcode released". مؤرشف من الأصل في 2012-02-23. اطلع عليه بتاريخ 2010-01-19.
  3. ^ SkyLined (11 يناير 2010). "Download and LoadLibrary shellcode for x86 Windows". مؤرشف من الأصل في 2016-04-17. اطلع عليه بتاريخ 2010-01-19.
  4. ^ Skape (9 مارس 2004). "Safely Searching Process Virtual Address Space" (PDF). nologin. مؤرشف من الأصل (PDF) في 2019-05-16. اطلع عليه بتاريخ 2009-03-19.
  5. ^ SkyLined (16 مارس 2009). "w32 SEH omelet shellcode". Skypher.com. مؤرشف من الأصل في 2015-04-03. اطلع عليه بتاريخ 2009-03-19.
  6. ^ Rix (8 نوفمبر 2001). "Writing ia32 alphanumeric shellcodes". Phrack. مؤرشف من الأصل في 2014-03-10. اطلع عليه بتاريخ 2008-02-29.
  7. ^ Mason، Joshua (نوفمبر 2009). "English Shellcode" (PDF). مؤرشف من الأصل (PDF) في 2019-04-28. اطلع عليه بتاريخ 2010-01-10. {{استشهاد ويب}}: الوسيط author-name-list parameters تكرر أكثر من مرة (مساعدة)
  8. ^ Obscou (13 أغسطس 2003). "Building IA32 'Unicode-Proof' Shellcodes". Phrack. مؤرشف من الأصل في 2013-12-31. اطلع عليه بتاريخ 2008-02-29.
  9. ^ Eugene (11 أغسطس 2001). "Architecture Spanning Shellcode". Phrack. مؤرشف من الأصل في 2013-12-31. اطلع عليه بتاريخ 2008-02-29.