حالة الموضوع:
مغلق
  1. .:: RSS ::.

    .:: RSS ::. عضوية آلية

    الأنتساب:
    ‏9 سبتمبر 2011
    المشاركات:
    14,005
    الإعجابات المتلقاة:
    0
    نقاط الجائزة:
    36
    الإقامة:
    IQ-T34M



    السلام عليكم ورحمة الله وبركاته



    إن شاء الله تكونوا في تمام الصحة والعافية إخواني


    في هذا الشرح الأول من سلسلة شروحات كتابة ثغرات الطفح على الوندوس وهو مرتبط بفهم الشروحات السابقة :
    (لغة الأسمبلي) + (أساسيات البافر أوفر فلو)

    في أي مجال ، يجب علينا دائما تفكيك الأمور فيه إلى أجزاء صغيرة لكي تتضح لنا الصورة الكبيرة له.

    نحن حنتحدث على مجال كتابة ثغرات البرامج طيب .. يعني في الٱخير لدينا هدف محدد وهو تنفيذ الشيل كود تبعنا للسيطرة على جهاز الضحية ،

    هذه المهمة تنقسم إلى مهمات وتختلف أساليب تحقيق كل مهمة من هذه المهمات .

    يعني ببساطة في عالم كتابة الثغرات الهدف واحد وهو كما ذكرت نشبه هذا الهدف مثلا بالسفر إلى جنوب إفريقيا .

    فحتكون هناك خطوات أساسيات يجب أن يتبعها جميع المسافرين بدون إستثناء لتحقيق هذا الهدف .
    فكل الناس يجب أن تتحصل على جواز سفر + فيزا + مال , وسيلة نقل .

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

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





    نفس الشيء بالنسبة لمجالنا :

    عندما يحصل فيض للبيانات في البافر هناك أمران أساسيان يجب أن ننظر فيهما :

    [1]هذا الفيض يجب أن يغير قيمة المسجل EIP(الذي يشير إلى التعليمة التي سينفذها المعالج حاليا)

    [2]يجب أن نجد مسجل واحد من مسجلات المعالج (CPU) يحتوي على هذه البينات التي تسببت في الفيض .

    كل مانحتاج فهمه هو أن مسجل واحد من هئولاء ممكن أن يحتوي على البينات تبعنا مع الشيلكود .





    كيف تتم هذه العملية ؟

    أولا : نرسل للبرنامج بيانات كبيرة الحجم .

    ثانيا : تتسبب هذه البيانات في إستبدال قيمة المسجل EIP وجزء آخر من هذه البيانات يخزن في مسجل آخر تبع المعالج (CPU)

    ثالثا : يجب أن نجد عنوان مؤشر (يحوي على تعليمة) يشير إلى المسجل الذي يحتوي على جزء آخر من البيانات تبعنا المرسلة إلى البرنامج

    رابعا : نضع عنوان هذا المؤشر في المكان المناسب ضمن البيانات التي سنرسلها لكي نتمكن من إستبدال قيمة المسجل EIPببتعليمة هذا المؤشر .

    خامسا : عندما يصل البرنامج إلى عنوان هذا المؤشر تبعنا يقوم بتنفيذ التعليمة التي فيه ثم يقفز إلى المسجل تبع المعالج الذي يحتوي على جزء آخر من البينات تبعنا

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



    السؤال هنا : بأي أداة نرسل هذه البيانات ؟ كيف أعرف أي أداة أستعلمها عندما أريد تحقيق الفيض في برنامج معين ؟

    طيب .. من الخطأ أن نغوص في كل هذه التفاصيل قبل أن نفهم الخطوات الأساسية لكتابة ثغرة لبرنامج .
    وأيضا لتحقيق هذا الفهم الجيد يجب أن نوفر بيئة للتطبيق تكون خالية من الحمايات والمشاكل أقصى مايمكن . لأنه في الٱخير سوى بالحمايات أو من غير حمايات الخطوات الأساسية هي نفسها في تحقيق الهدف الواحد .

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

    ففي هذا السيناريو الأول جهاز الضحية هو : windows xp pack 1 home edition

    وجهاز المهاجم : Backtrack 5


    البرنامج المصاب هو : MiniShare 1.4.1

    والثغرة مسجلة على هذا الرابط :

    كود PHP:
    http://www.exploit-db.com/exploits/616/


    تعالوا الآن نطبق هالأمور :



    أولا : نرسل للبرنامج بيانات كبيرة الحجم .




    طيب نأخذ هذه الفازر البسيطة المكتوبة بلغة البايثون .

    كود PHP:

    #!usr/bin/python

    import sys
    import socket

    zero
    = socket.socket(socket.AF_INET , socket.SOCK_STREAM)

    zero.connect ((sys.argv[1], 8080))

    buffer = ' GET'
    buffer += "A" * 3000
    buffer
    += " HTTP/1.1\r\n\r\n"

    zero.send(buffer)
    zero.close()


    نقوم بإرسال هذه البينات A * 3000وهي تمثل مدخلات للمستخدم كما شرحنا في هذا الدرس :

    كود PHP:
    http://vb.ehcommunity.com/showthread.php?t=72728


    نفس الشيء فقط هنا حنقوم بإرسال هذه البينات عن بعد .

    لفههم أكواد السكريبت وطبيعة العمل الرجاء مشاهدة هذا الشرح :

    كود PHP:
    http://vb.ehcommunity.com/showthread.php?t=72659


    مع وضع شرط نجاح تحقيق الفيض .

    طبعا هذا الشرط ليس أمر أساسي في هذه المرحلة الأولى عموما . لكن كما قلنا سابقا قد تختلف أساليب تحقيق كل مرحلة ففي هذا البرنامج يتحقق الفيض عندما تكون البينات الكبيرة المرسلة إليه من قبل المستخدم موجود في آخرها هذه الرموز :
    كود PHP:
    "r\n\r\n \"


    وكل برنامج له شرطه ولا يمكن أبدا حصر هذه الشروط . وإنما يسهل التوصل إلى الشرط الذي يحقق الفيض حسب تمرسك في هذا المجال fuzzing وفهمك للتفاصيل فيه وليست بضربات حظ .

    طيب في جهاز windows xp نفتح البرنامج minishare مع immunity debugger


    [​IMG]

    ثم

    [​IMG]

    بعد ذلك نظغط على F9 في الكيبورد لتشغيل البرنامج minishare مع immunity debugger.


    وفي جهاز الباكتراك نقوم بإرسال البينات إلى البرنامج minishare .

    كما في الصورة التالية :

    [​IMG]
    كما تشاهدون أسفل الصورة مكتوب :

    كود PHP:
    Access violation when executing 41414141


    وهذا يعني أن المعالج أراد أن ينفذ هذه التعليمة : 41414141 فلم يجدها في البرنامج فتوقف وهكذا قد حققنا الخطوة الأولى .










    ثانيا : تتسبب هذه البيانات في إستبدال قيمة المسجل EIP


    طيب نحن أرسلنا 3000 حرف إلى البرنامج minishare وال A بالآسكي يعني 41

    نشوف قيم المسجلات في لحظة توقف البرنامج .

    لدينا EIP كلها حروف A

    ولدينا أيضا ESP كله حروف A




    طيب الآن يجب أن نعيد تحقيق الكراش وذلك بإنشاء 3000 بايت من الرموز المختلفة وإرسالها إلى البرنامج

    ماسنفعله هو يجب أن نحدد offset تبع لمسجل EIP وoffset تبع المسجل ESP

    يعني يجب أن نعرف بالتحديد بعد كم من بايت يتم إستبدال قيمة المسجل EIPوالمسجل ESPمن 3000 بايت التي سنرسلها .

    ننشئ هذه الرموز بإستخدام الميتاسبلويت كالتالي :

    [​IMG]

    ثم نضعها في السكريبت عوض 3000 * "A"كالتالي :

    [​IMG]

    وقبل إرسالها نعيد تشغيل البرنامج minishare مع immunity debugger من الأول وذلك بالضغط على debug ثم restart

    كما في الصورة التالية :

    [​IMG]

    ثم لضغط F9 أو على كما في الصورة
    ثم يجب أن نجد في أسفل البرنامج على اليمين مكتوب running لنتأكد من تشغيل البرنامج .

    كما في الصورة التالية :

    [​IMG]





    ثم نرسلها للبرنامج minishare .

    [​IMG]



    طيب الآن نحسب offsetتبع EIP و offsetتبع ESPبإستخدام الميتاسبلويت كالتالي :

    [​IMG]


    [​IMG]


    نرسل البينات لنتأكد من حساباتنا طبعا بعد إعادة تشغيل البرنامج ونشوف مذا حصل:



    [​IMG]

    كما توقعنا بالظبط حساباتنا صحيحة كما هو مبين في الصورة .

    أرسلنا AAAAفوجدناهم في EIP والجزئ الأكبر من البيانات المرسلة يشير إليها المسجل ESP
    يعني ماسنقوم به هو عوض إرسال BBBB نرسل عنوان التعليمة التي تقوم بالقفز إلى المسجل ESPأين سنضع الشيلكود تبعنا .

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


    ثالثا :يجب أن نجد عنوان مؤشر (يحوي على تعليمة) يشير إلى المسجل الذي يحتوي على جزء آخر من البيانات تبعنا المرسلة إلى البرنامج

    طيب قلنا أن هذا المسجل هو المسجل ESPوذلك لأنه يشير إلى الجزئ الأكبر من البافر (مكان تخزين البينات) تبعنا .

    ولمزيد التأكد من ذلك نقوم بحساب هذه المساحة أي المساحة التي تحتوي على حروف"C" و على 4 حروف B التي أرسلناها في الصورة السابقة . لأننا قلنا حنضع البايلود مباشرة أين يوجد المسجل ESP يعني كنا نستطيع إرسال حروف C فقط ولكن أرسلت 4 * "B" لأوضح لكم كيف نقوم بحساباتنا وأيضا ليس بشرطه نرسل هذه الحروف بالذات وإنما فقط لنفهم ونميز بين الذي أرسلناه وأين تم تخزينه

    نضع الفأرة على ESPثم نظغط كليك يمين ونظغط على follow in stack كما في الصورة التالية :

    [​IMG]

    لدينا العنوان الذي يشير إليه المسجل ESP وهو مكان بداية هذه الحروف BBBB وهو : 01343908
    ثم نننزل إلى تحت حتى نصل إلى عنوان نهاية هذه الحروف فنجد عنوان نهايتها 01343CF4 كما في الصورة طبعا قد تختلف العناوين عندك

    [​IMG]


    نقوم بحساب المساحة كالتالي :(نطرح العنوان الثاني من الأول)

    01343CF4 - 01343908 = 3EC

    النتيجة بالهيكس فنحولها للديسيمال نجد 1004 فهذه المساحة 1004 بايت كافية جدا لتحوي على الشيلكود تبعنا .

    طيب الآن وجدنا المكان المناسب لوضع الشيل كود تبعنا وهذا المكان يشير إليه المسجل ESP.

    بقي لنا أمران أساسيان :

    يجب أن نجد طريقة للقفز إلى مكان الشيل كود تبعنا وبما أن المسجلESP يشير إلى مكان وجود الشيل كود فحنقوم بالقفز إلى المسجل ESP .

    ويجب علينا أيضا أن نكتب الشيل كود .

    يتبع بإذن الله ...


    لاتنسوني من صالح دعاؤكم

    في أمان الله

     
حالة الموضوع:
مغلق

مشاركة هذه الصفحة