كود القشرة

من ويكيبيديا، الموسوعة الحرة
اذهب إلى: تصفح، ‏ ابحث

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


أنواع كود القشرة[عدل]

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

محلي[عدل]

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

عن بُعد[عدل]

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

التنزيل والتنفيذ[عدل]

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

مُقسّم مرحليًا[عدل]

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

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

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

الأومليت[عدل]

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

إستراتيجية تنفيذ كود القشرة[عدل]

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

ترميز كود القشرة[عدل]

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

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

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

ترميز النسبة المئوية[عدل]

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

90             NOP
90             NOP

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

unescape("%u9090");

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

"\u9090";

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

"邐"

أو

"邐"

كود القشرة بدون قيم خالية[عدل]

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

B8 01000000    MOV EAX,1          // يضبط المسجل EAX عند قيمة 0x000000001

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

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

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

كود قشرة أبجدي رقمي قابل للطباعة[عدل]

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

كود قشرة دليل يونيكود[عدل]

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

الأنظمة الأساسية[عدل]

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

انظر أيضًا[عدل]

مراجع[عدل]

  1. ^ Foster، James C.؛ and Price، Mike (April 12, 2005). Sockets, Shellcode, Porting, & Coding: Reverse Engineering Exploits and Tool Coding for Security Professionals. Elsevier Science & Technology Books. ISBN 1-59749-005-9. 
  2. ^ SkyLined (11 January 2010). "Download and LoadLibrary shellcode released". اطلع عليه بتاريخ 2010-01-19. 
  3. ^ SkyLined (11 January 2010). "Download and LoadLibrary shellcode for x86 Windows". اطلع عليه بتاريخ 2010-01-19. 
  4. ^ Skape (9 March 2004). "Safely Searching Process Virtual Address Space". nologin. اطلع عليه بتاريخ 2009-03-19. 
  5. ^ SkyLined (16 March 2009). "w32 SEH omelet shellcode". Skypher.com. اطلع عليه بتاريخ 2009-03-19. 
  6. ^ Rix (8 November 2001). "Writing ia32 alphanumeric shellcodes". Phrack. اطلع عليه بتاريخ 2008-02-29. 
  7. ^ Mason، Joshua؛ Small, Sam; Monrose, Fabian; and MacManus, Greg (November 2009). "English Shellcode". اطلع عليه بتاريخ 2010-01-10. 
  8. ^ Obscou (13 August 2003). "Building IA32 'Unicode-Proof' Shellcodes". Phrack. اطلع عليه بتاريخ 2008-02-29. 
  9. ^ Eugene (11 August 2001). "Architecture Spanning Shellcode". Phrack. اطلع عليه بتاريخ 2008-02-29. 

وصلات خارجية[عدل]