محترف الحاسوب: isecur1ty

ليس العار في أن نسقط ولكن العار ألا نستطيع النهوض

محترف الحاسوب مدونة تهتم بكل ما هو جديد بعالم التكنولوجيا والانترنت والحاسوب بشكل وتقدم اخر الاخبار و افضل البرامج و تضم مجموعة من المواضيع المفيدة في شتى مجالات التقنية

يتم التشغيل بواسطة Blogger.

محترف الحاسوب


‏إظهار الرسائل ذات التسميات isecur1ty. إظهار كافة الرسائل
‏إظهار الرسائل ذات التسميات isecur1ty. إظهار كافة الرسائل

الاثنين، 29 أغسطس 2016

شرح أساسيات الهندسة العكسية على تطبيقات Java

تحدثنا في العديد من المقالات السابقة عن الهندسة العكسية سواء كانت بشرح مفاهيم أو مصطلحات أو حتى تطبيقات عملية لبعض البرامج بشكل سريع ,  في هذا المقال إن شاء الله سوف نتحدث عن كيفية تحليل برنامج بسيط جداً مكتوب بلغة java وإستخراج السورس كود الخاص به , تفيدنا طبعاً هذه العملية بشكل كبير جداً في حال كنا نريد تحليل فايروس معين فنقوم بعمل هندسة عكسية وقرأة السورس كود الخاص به , وطبعاً تدخل عملية الهندسة العكسية بهذا الشكل للفايروسات ضمن مرحلة Static Malware analysis حيث تقوم بتحليل الملف ضار دون تشغيله من الأساس , أي أنك فقط تقوم بمحاولة عمل هندسة عكسية عليه أو حتى إستخراج بعض الأمور دون الحاجه لعمل هندسة عكسية.
كما ذكرت في هذا المقال إن شاء الله سوف نقوم بعمل هندسة عكسية على تطبيق بسيط مكتوب بلغة Java يطلب من المستخدم إدخال كلمة مرور وفي حال كانت الكلمة متطابقه يقوم بعرض معلومات معينه للمستخدم أما في حال كانت خاطئه سوف يقوم بطباعة رسالة خطأ لك , سوف نتعرف كيفية تطبيق الهندسة العكسية بشكل مباشر على هذا التطبيق وقرأة السورس كود الخاص به ومن ثم فهم عمله وبالنهاية إستخراج كلمة المرور الصحيحة.
حسناً كما نرى هذا هو البرنامج الخاص بنا والصور التالية توضح كيفية عمله :
الصورة التالية توضح ظهور شاشة تسألنا عن كلمة المرور.
password_java
وهذه الصورة توضح الخطأ الذي يظهر في حال قمنا بإدخال كلمة مرور خاطئه :
error

عندما طلب مني البرنامج إدخال كلمة المرور , قمت بإدخال رقم عشوائي فكانت النتيجة كما بالصورة الثانية.
الأن سوف نبدأ بتحليل البرنامج وسوف نحاول معرفة كلمة المرور الصحيحة , دعونا نلقي نظرة على البرنامج بإستعراض جميع الملفات الموجودة بمجلد العمل الحالي:
ls_java
كما نشاهد إسم البرنامج الخاص بنا هو file.class ومن المعروف أن .class هي صيغة لتطبيقات java وطبعاً يكون هذا الملف مترجم من قبل مترجم لغة java وعليه فإننا لا نستطيع تصفحه من خلال محرر النصوص العادي وقرأة السورس كود الخاص بهذا البرنامج وهنا سوف يأتي دور الهندسة العكسية بمحاولة فهم ما يجري بالضبط وإستخراج السورس كود الخاص بهذا البرنامج.
طبعاً كما ذكرنا يتم تحويل السورس كود الخاص بالبرنامج  إلى ملف جافا مترجم لا يمكن قرأته وهو بصيغة .class , هذه الصورة توضح ألية التحويل :
compiler

كما نشاهد يتم تحويل السورس كود بصيغة .java إلى برنامج مترجم بصيغة .class وهنا سوف يأتي دورنا بعكس هذه العملية وهذا ما سوف نقوم به من خلال برنامج Java Decompiler حيث يقوم بإستعراض السورس كود الخاص ببرنامج .class كسورس كود ملف جافا طبيعي.
من الممكن أن لا يظهر السورس كود ما هو بنسبة 100% ولكن يظهر بشكل برمجي منطقي كامل بأغلب الأحيان.
حسناً هذه صورة برنامج Java Decompiler بعد تشغيله , سوف أرفق رابط تحميل البرنامج بأسفل التدوينة.
JD_img
سوف نقوم بالذهاب إلى file – open file ومن ثم إختبار file.class حيث سوف يظهر لنا التالي :
JD_COde

كما نشاهد إستطعنا قرأة السورس كود الخاص بالبرنامج وظهر لنا البرنامج بشكل بسيط جداً , حيث أننا نرى إستدعاء JOtionPane لكي يتم التعامل مع إدخال المستخدم وطباعة الرسائل وأيضاً نقوم بعمل تعريف للمتغير i ومقارنته مع ما يتم إدخاله مع المستخدم ومن ثم طباعة card number , حيث أن المتغير i يشكل كلمة المرور التي نبحث عنها وهي 741852963 , وفي حال قمنا بإدخال الرقم 741852963 سوف نحصل على التالي :
done_java
كما نشاهد تمكنا من قرأة المعلومات السرية التي تظهر للمستخدم فور إدخال كلمة المرور الصحيحة , وبهذا نكون قد قمنا بعملية هندسة عكسية بسيطة جداً على هذا البرنامج.
كما ذكرت مسبقاً أن السورس كود لا يكون دقيق 100% والصورة الحقيقة للسورس الخاص بالبرنامج توضح إختلاف بعض المتغيرات والأمور البسيطة.
code_java
بإذن الله سوف يكون هنالك شرح للمزيد من الأمور المتعلقه بالهندسة العكسية سواء كانت على تطبيقات سطح المكتب أم على تطبيقات Android إن شاء الله.
الموقع الرسمي ل Java Decompiler

تطبيق عن الهندسة العكسية تحليل خوارزمية CrackMe

بسم الله الرحمن الرحيم,

منذ فترة, تحدثنا عن برامج الـ CrackMe, و بعدها قمنا بتحليل احد تلك البرامج و كتابة برنامج KeyGen يقوم بتوليد Valid Serial Numbers للبرنامج.
اليوم بأذن الله سنقوم بتحليل برنامج آخر من برامج الـ CrackMes و تحليل خوارزميته و فهمها.
كما تعودنا, برنامج اليوم سيكون متاح للتحميل في قسم المراجع آخر المقال.
تستطيع الضغط على الصورة لمشاهدتها بدقة عالية.
في البداية, سنقوم بتحميل برنامج الـ CrackMe داخل برنامج Immunity Debugger و نقوم بالبحث عن الـ Strings للبحث عن الكلمات و الجمل التي يمكن ان تساعدنا في معرفة مكان وجود (أو مكان قريب من) خوارزمية مقارنة الـ strings المُدخلة و المُولدة من خوارزمية توليد الـ Valid Serial Number.
snap1

نستطيع أن نرى الجملتين ( Right Pass ) و ( Wrong Pass ) و هذا مؤشر جيد, لأن جملة ( Wrong Pass ) هى التي تظهر في حال ادخال مدخل غير صحيح لبرنامج الـ CrackMe.
الآن لنضغط ضغطة مزدوجة على كلمة ( Wrong Pass ) لنتوجه للـ Text Section أو الجزء الذي يحتوي كود البرنامج الذي ذُكرت فيه تلك العبارة. و سنرى أننا قد توقفنا عند العنوان 0x004014C1, و من هنا نستطيع أن نرى دوال مشهورة (أو على الأقل أسمائها معلومة و ذات دلالة واضحة بالنسبة للرائي) و هى دلالة gets المسؤولة عن تخزين المدخلات من المستخدم للذاكرة و دالة strcmp المسؤولة عن مقارنة نصوص strings.

snap2
دعونا الآن نقوم بتحليل سطر النداء على الدالة strcmp من خلال وضع نقطة توقف BreakPoint عندها و اعادة تشغيل البرنامج من خلال Ctrl+F2 و ادخال أي نص كمدخل Input لبرنامج الـ CrackMe لنلاحظ توقف البرنامج بعد الضغط على Enter, و هنا توقف البرنامج عند مقارنة النص الذي ادخلناه بالنص الذي تم توليده من خوارزمية البرنامج نفسه الذي نسعى لتحليلها. أيضا اذا نظرنا لذاكرة المكدس, نستطيع رؤية مدخلات الدالة strcmp parameters و هما النص الذي ادخلناه و النص المُولد من برنامج الـ CrackMe.
snap3

الآن نريد تتبع هذا النص المُولد من خوارزمية البرنامج. نستطيع أن نلاحظ من خلال النظر لكود البرنامج في الـ Text Section أن النص يُحفظ في الذاكرة في العنوان 0x0022FE11 و يتم الإشارة عليه من خلال الـ EBP Register و المؤشر هنا قيمته EBP-137.
أيضا نلاحظ أن البرنامج يقوم بتوليد الرقم الصحيح Valid Serial Number قبل أخذ مدخلات المستخدم, و هذا يعني أنه لا يستخدم أي من مدخلات المستخدم في حساب الرقم الصحيح Valid Serial Number. نستطيع التأكد من ذلك من خلال وضع نقطة توقف عند بداية الدالة التي نحن بداخلها الآن أو أي نقطة قبل سطر النداء على الدالة gets, سأقوم بوضع نقطة توقف عند عنوان 0x00401340, بعد ذلك نعيد تشغيل البرنامج, سنجد أن البرنامج قد توقف و قام بتوليد الرقم الصحيح و حفظه في الذاكرة من قبل أن ندخل أي نص في البرنامج, و هذا يؤكد وجهة نظرنا أن الرقم الصحيح المُولد يتم حسابه بدون مدخلات المستخدم. و هذا يتركنا لتفسير منطقي آخر و هو أن البرنامج يستخدم مصادر الجهاز لتوليد الرقم الصحيح مثل الوقت, التاريخ, الـ CPU Speed, سعة الذاكرة RAM, الخ…
دعونا نتأكد من كل تلك التخمينات من خلال التقدم بتعليمة مفردة كل مرة Single Stepping من خلال الضغط على F7 بدأً من عنوان 0x00401340.
snap4
أول ملاحظة شيقة هى عند العنوان 0x0040135A و هي نداء للدالة time و هي دالة من الدوال المكتبية الخاصة بنظام تشغيل Windows API و التي تقوم بحساب عدد الثواني من أول منتصف ليل الأول من يناير عام 1970, و هذا يسمى System Time. سأقوم بوضع رابط للدالة time من على الموقع الرسمي لشركة Microsoft في قسم المراجع.
هنا, يقوم البرنامج بادخال القيمة NULL للدالة time كـ Parameter و يقوم بحفظ القيمة المرتجعة من الدالة في العنوان 0x0022FF34, بعد ذلك نلاحظ نداء لدالة أخرى من الدوال المكتبية لويندوز و هى الدالة localtime و التي تقوم بأخذ القيمة المرتجعة من الدالة time و تعديلها لحساب الوقت المحلي للجهاز.
الدالة localtime تأخد مدخل واحد و هو مؤشر للقيمة المرتجعة من الدالة time و نستطيع أن نلاحظ هنا أنه تم تمرير مؤشر لتلك القيمة للدالة, و ارجاع الوقت المحلي الذي تم حسابه الى البرنامج من خلال هيكلية تسمى struct tm.
على الموقع الرسمي للدوال المكتبية Windows API, نلاحظ أن تلك الهيكلية مكونة من تسعة متغيرات, و هن:
الثواني, الدقائق, الساعات, اليوم (قيمة من 1-31), الشهر (قيمة من 0-11), السنة, اليوم (قيمة من 0-6, و هو اليوم بالنسبة للاسبوع), اليوم (قيمة من 0-365, و هو اليوم بالنسبة للسنة), و طريقة التوقيت (24 ساعة أم 12 ساعة).
بعد الرجوع من الدالة localtime, يقوم البرنامج بنقل الهيكلية المرتجعة من الدالة الى العنوان 0x0022FF10.
بعد ذلك, نرى تعليمة لا تقوم سوى بالدوران 190 مرة بدون القيام بأي شئ مفيد, و هذه الطريقة تسمى Busy Loop و هى تساوي نسبيا استخدام الدالة Sleep لتوقف البرنامج بعض الوقت.
عند العنوان 0x004013CF, نلاحظ دوارة أخرى تقوم بالدوران ثلاث مرات, في كل مرة يتم النداء على الدالة GetCursorPos. تلك الدالة تقوم بأخذ مدخل واحد و هو مؤشر لهيكلية أخرى تسمى POINT structure. حسب الموقع الرسمي للدوال المكتبية Windows API, تلك الهيكلية تحتوي على متغيرين فقط, و هما مكان المؤشر Mouse cursor pointer على الشاشة أفقيا و رأسيا x_position and y_position.
في البرنامج, تلك الهيكلية بدايتها في العنوان 0x0022FD08, في كل دورة من الثلاث دورات, يقوم البرنامج بضرب قيمة الـ x_position بقيمة الـ y_position و جمع الناتج على قيمة في العنوان 0x0022FF38 و هذا العنوان يحتوي منذ بداية البرنامج على القيمة 0x0022FFF0 (هذا ليس عنوان و لكنها قيمة رقمية بالنظام السادس عشري).
بعد ذلك يقوم البرنامج بضرب الناتج في سادس متغير من متغيرات الهيكلية time structure و هي رقم الشهر, ثم يقوم بطرح ثالث متغير في الهيكلية -و هي الساعة- منها, ثم يقوم البرنامج بالنداء على الدالة itoa و هي دالة تأخذ ثلاثة مدخلات:
– رقم
– مؤشر لنص  pointer to a string
– النظام الرقمي (نظام العشري, السادس عشري, الثماني, الخ…)
تقوم الدالة itoa بتحويل الرقم المُدخل بالنظام الرقمي المُدخل لنص, و تقوم بحفظه في المؤشر المُدخل.
أخيرا يقوم البرنامج بعد تحويل الرقم الذي قمنا بحسابه مؤخرا في العنوان 0x0022FF38 لنص, بوضع النص “H!J” في نهاية النص الرقمي المُحول, و بهذا يكون النص الذي يقوم البرنامج بتوليده جاهز لمقارنته بمدخلات المستخدم.
هذا كود pseudocode بلغة شبيهة للغة الـ C و يوضح آلية توليد الرقم الصحيح Valid Serial Number:
PseudoCode
في تلك الحالة, سيكون كتابة برنامج Keygen بالطريقة التقليدية غير فعال, لأن البرنامج يقوم بحساب الرقم الصحيح Valid Serial Number باستخدام الوقت و مكان المؤشر في أثناء تشغيلنا لبرنامج الـ CrackMe, و قطعا ستكون القيمة مختلفة عما اذا قمنا نحن بكتابة برنامج keygen لأن ساعتها – و حتى ان استطعنا أن نجمد مكان مؤشر الفأرة لكي لا تتغير قيم الاحداثيات الرأسية و الأفقية له- لن نتمكن من تجميد الوقت, مما سؤدي لتغيير قيمة الوقت المستخدم في الحسابات, و هكذا سيكون الرقم الناتج من برنامج الـ keygen مختلف عن الرقم الناتج من برنامج الـ CrackMe نفسه!!
احدى الطرق للقيام بهذا هو أن نستخدم طريقة الـ Code Caving و هي طريقة للتعديل على البرنامج التنفيذي بحيث يراقب مكان الرقم المُولد, و بعد ذلك يقوم بطباعته لنا بعد حسابه و قبل اخذ مدخلات المستخدم. قطعا الطرق كثيرة و كل شخص و ابداعه.

المراجع:

تخزين التفضيلات الخاصه بتطبيقات الاندرويد بشكل غير امن


تقنيات الأندرويد لتخزين البيانات المحلية:


يمكن للمطورين تخزين البيانات في تطبيقات الأندرويد محليا بطرق مختلفة، كالتالي :
  • Shared Preferences
وهي عبارة عن ملفات XML لتخزين البيانات البدائية في قيم زوجية اساسية. وتشمل أنواع قيم البيانات المنطقية
Booleans, floats, ints, longs, and strings

  • SQLite Databases
هي قواعد بيانات مستندة إلىlightweight file-based databases . وعادة ما يكون امتدادها “db.” أو “sqlite. ” يوفر أندرويد الدعم الكامل في قواعد بيانات SQLite، قواعد البيانات التي ننشئها في التطبيقات تكون قادرة على الوصول الى أي فئة في التطبيق. لا يمكن للتطبيقات الأخرى الوصول إليها.

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

  • External Storage
هو المكان الذي يمكنك استخدامه لحفظ الملفات. و يمكن أن يكون وسائط التخزين القابلة للإزالة (مثل بطاقة SD الخارجية) أو وسائط التخزين الداخلية (غير قابل للإزالة). بطاقات SD الخارجية قابلة للقراءة من جميع التطبيقات .

في الجزء التالي، دعونا نرى كيف يمكن للمطورين استخدام Shared preferences لتخزين البيانات على الجهاز، وبعد ذلك سوف نرى كيف يمكن للمهاجم الوصول إلى هذه البيانات من جهاز أيضاً
المتطلبات الأساسية لمتابعة خطوات:
  • جهاز كمبيوتر مثبت عليه برنامج Android SDK
  • جهاز محمول (rooted) بالإضافة الى emulator لتثبيت التطبيقات

اختبار وظائف التطبيق:


وقد قمنا بوضع تطبيق للاختبار لتوضيح هذه المشكلة. يمكنك تنزيل نموذج التطبيق من المقال الاصلي. بعد تحميل التطبيق، قم بتثبيته على Android rooted device أو emulator
يمكن تثبيت التطبيق باستخدام adb وأتباع الأوامر التاليه:
adb install <name of the apk>.apk

image1
جميع التطبيقات لديها ميزة لتخزين البيانات داخل التطبيق. عندما نقوم بتشغيلها، فإنها تبدو كما هو موضح في الشكل التالي ( Shared preferences app is used here)
image2

لنبدأ بتشغيل تطبيق shared preferences ثم ندخل بعض البيانات في حقل اسم المستخدم و حقل كلمة المرور.
يتم إنشاء Shared preferences في تطبيقات الأندرويد باستخدام فئة SharedPreferences وفيما يلي جزء من التعليمات البرمجية المستخدمة في نموذج التطبيق المعطى للتحميل.
image3
كما نرى في الشكل أعلاه، قمنا بإنشاء نموذج SharedPreferences وبعد ذلك قمنا باستخدامه لإدراج البيانات في ملف XML بإستخدام object Editor
الآن، دعونا نرى أين يتم تخزين هذه البيانات في التطبيق.
الموقع الشائع لتخزين SharedPreferences في apps Android هو:
/data/data/<package name>/shared_prefs/<filename.xml>
لذا، دعونا نتنقل ونتفقد المسار أعلاه لمعرفة ما إذا تم إنشاء ملف Shared preferences في هذا التطبيق
image4
كما نرى في الشكل أعلاه، هناك مجلد باسم “shared_prefs”. ويتم انشاء هذا المجلد اذا كان هناك تطبيق يستخدم Shared preferences  يمكننا تغيير الدليل إلى shared_prefs واستخدام أمر “cat” لإلقاء نظرة على محتويات هذا التطبيق على الفور.
إذا كنا نريد للحصول على ملف xml على الجهاز المحلي لدينا، يمكننا سحب الملف كما هو موضح أدناه.
image5
كما نرى في الشكل أعلاه، تم نسخ ملف “userdetails.xml” على الجهاز المحلي. يمكننا أن نرى الآن محتويات الملف كما هو موضح في الشكل التالي
image6

إختراق تطبيقات الألعاب لتعديل النقاط:


معظم الألعاب المتوفرة على برامج الهواتف المتنقلة هي تطبيقات محلية ولا تحتاج إلى شبكة الإنترنت عند تشغيلها . لذلك، فمن الواضح أن الإحصاءات المرتبطة باللعبة سيتم تخزينها محليا في مكان ما على الجهاز نفسه. في الأجهزة المضبوطة على برمجيه الروت (Rooted ) ، إذا بحثنا في نظام الملفات المحلي عن الملفات التي تخرن نقاط هذه الالعاب يمكننا تعديلها بسهولة وتجاوز القيود.
دعونا نذهب الى التطبيق الشائع المسمى cricket stick . هذه اللعبة تحظى بشعبية كبيرة على شبكة الإنترنت وشخصيا احبها بسبب الصعوبة في تحقيق نسبة عالية من النقاط. دعونا نرى كيف يمكننا تعديل النقاط في هذا التطبيق من الواجهة الخلفية
متطلبات :
  • جهاز يملك صلاحيات  root
  •  أداة Droid Explorer لتحليل نظام الملفات
  • ADB access on the device
عندما نشغل تطبيق cricket stick ، فإنه يمتلك نشاطاً يظهر افضل النقاط التي تم تسجيلها إلى الآن ، عموماً من الصعب تسجيل , من الصعب تحقيق 150 نقطه من لعب اللعبه خمس مرات فقط
image7
الآن، دعونا نرى كيف يمكننا اختراق هذا التطبيق لزيادة النقاط
دعونا ننتقل إلى نظام الملفات المحلي للتطبيق لمشاهدة الملفات حيث يخزن التطبيق بياناته . هذا مبين في الشكل التالي
image8
فتحنا adb shell على الجهاز ومن ثم قمنا برفع الامتيازات باستخدام أمر “su” . فإن كل التطبيقات المثبتة على جهاز الأندرويد ستكون جميع البيانات الخاصة بتطبيقاتها موجودة في “/ directory / data” data. لذلك، قمنا بالذهاب إلى
/data/data/com.sticksports.stickcricket/
إذا قمنا بتنفيذ أمر “ls” هنا، يمكننا أن نرى بعض الدلائل حيث يقوم التطبيق بتخزين البيانات الخاصة به. والدليل الذي يهمنا هنا هو “shared_prefs”. الآن دعونا ننتقل إلى الدليل shared_prefs لمعرفة ما إذا كان هناك أي ملفات مثيرة للاهتمام بداخله. وهذا مبين في الشكل أدناه
image9

لقد أنتقلنا إلى دليل shared_prefs وقمنا بوضع كافة الملفات داخل هذا الدليل. هناك ثلاثة ملفات XML داخل دليل shared_prefs اذا قمنا ببعض التحليل على هذه الملفات الثلاثة، من خلال النظر في المحتويات باستخدام أمر “cat” ، فمن الواضح أن “Cocos2dxPrefsFile.xml” هو الملف الذي يتم استخدامه لتخزين جميع النقاط. الآن سنستبدل النقاط الموجودة في هذا الملف إلى النقاط التي نتمنى الحصول عليها .
للقيام بذلك، قمنا باستخدام أداة تسمى “Droid Explorer ” في نظام التشغيل Windows
يمكن تحميل Droid Explorer من موقعه الرسمي على الانترنت .
Droid Explorer هو أداة للتفاعل مع الجهاز باستخدام Windows Explorer. واجهة المستخدم الرسومية (GUI) الموجودة فيه تجعل حياتنا أسهل لأداء المهام المختلفة مثل نقل الملفات من جهاز إلى آلة بالإضافة الى إلغاء تثبيت التطبيقات و إنشاء نسخة احتياطية، الخ.
وفيما يلي الخطوات
  • قم بتوصيل جهاز الأندرويد إلى الآلة .
  • تشغيل Explorer Droid وانتقل إلى الدليل المراد
image10

  • اسحب الملفات الى محرر النصوص
image11
  • احذف ملف Cocos2dxPrefsFile.xml من جهاز الأندرويد باستخدامDroid Explorer
image12
  • اضغط على تعديل ملف “Cocos2dxPrefsFile.xml” من الكمبيوتر  إلى الهاتف باستخدام DroidExplorer.
  • إبدأ اللعبة مرة أخرى. الآن يجب أن تكون قادرا على رؤية النتيجة المعدلة والمحدثة في التطبيق كما هو مبين أدناه.
image13

الخلاصة :


في هذه المقالة، رأينا كيف يتم تنفيذ Shared preferences في تطبيقات الأندرويد والقضايا الأمنية المرتبطة بها إذا لم يتم تنفيذها بشكل صحيح. لتأمين بيانات التطبيق، فمن المستحسن إستخدام crypto libraries المتاحة. سوف نناقش كيفية استخدام crypto libraries في تطبيقات الأندرويد في وقت لاحق في هذه السلسلة. في المقال القادم سوف نرى الطرق الأخرى لتخزين البيانات في تطبيقات الأندرويد والقضايا الأمنية المرتبطة بها .

: هجمات Content Provider Leakage على تطبيقات الاندرويد

ما هو مزود المحتوى Content Provider ؟


وفقا لنموذج الأمن الخاص بجوجل ، فإن بيانات التطبيق سرية ولا تعرض للتطبيقات الأخرى ، وبالتالي فإنه ليس من الممكن لأي تطبيق للوصول إلى البيانات تطبيق آخر بشكل افتراضي. عندما تريد التطبيقات تبادل البيانات مع التطبيقات الأخرى، فإن مزود المحتوى يعتبر وسيلة تعمل بمثابة واجهة لتبادل البيانات بين التطبيقات. موفر المحتوى يستخدم طرق الإدراج للوصول الى بيانات التطبيق مثل .
insert(), query(), update(),  delete()
وهناك شكل خاص من عنوان URI يبدأ ب “//:content” تم تعيينه إلى كل موفرات المحتوى. أي ان تطبيق يعرف بعنوان “URI ” يمكنه الإدراج و التحديث و الحذف، والاستعلام عن البيانات من قاعدة بيانات التطبيق الموفر.
image1
قد يكون هناك بعض الحالات حيث لا يقوم مزود المحتوى بتنفيذ تبادل البيانات مع تطبيقات أخرى، أو أن المطور قد يرغب بمنح إذن الوصول فقط للتطبيقات التي تمتلك اذونات خاصة . وفي مثل هذه الحالات، إذا لم يتم فرض الضوابط الأمنية المناسبة في التطبيق، فإن ذلك يؤدي إلى تسرب المعلومات.
تطبيق الرسائل القصيرة ةSMS الموجود في أجهزة الأندرويد يعد مثالاً كلاسيكيا على مزودات المحتوى. إن أي التطبيق يمكنه الاستعلام من الجهاز باستخدام عنوان URI” ” الخاص به
content://sms/inbox
ولكن، يجب إعطاء إذن بقراءة الرسائل القصيرة”READ_SMS permission ” في ملف AndroidManifest.xml على التطبيق من أجل الوصول إلى بيانات تطبيق الرسائل القصيرة .

المتطلبات الأساسية لمتابعة الخطوات:


• تثبيت برنامج SDK Android على جهاز كمبيوتر
• جهاز محمول (non-rooted ) لتثبيت التطبيق

اختبار وظائف التطبيق الرئيسية :


بعد تحميل تطبيق الاختبار، وتثبيته في الجهاز من أجل اختباره واستغلاله. ( يمكن تحميل الملف من المقالة الأصلية )
ويمكن تثبيته من “adb” باستخدام الأمر التالي:
adb install <name of the apk>.apk
يمتع مزود المحتوى بميزة تخزين البيانات داخل التطبيق. عندما نقوم بتشغيله، فإنه يبدو كما هو مبين في الشكل..
image2
والهدف هو معرفة ما إذا كان هناك أي موفر محتوى مضمن في هذا التطبيق، وإذا كان الجواب نعم، نحن بحاجة إلى التحقق إذا كان عرضة لتسرب البيانات.

الموضوعات المتضمنة:


• جمع المعلومات
• مهاجمة موفرات المحتوى الضعيفة
• تأمين التطبيقات

جمع المعلومات:


مثل أي عملية اختبار اختراق  ، دعونا نبدأ بعملية جمع المعلومات. ويفترض أن لدينا ملف APK . لذلك، قم بفك ضغط ملف APK المثبت كما هو مبين في المقال السابق و تحقق من وجود اي موفر محتوى مسجل في ملف AndroidManifest.xml . يجب علينا أيضا التحقق من الملفات smali لجميع عناوين (URI) المستخدمة في التطبيق.
يتم تسجيل مزود المحتوى عادةً في ملف AndroidManifest.xml على الشكل التالي.
image3
لذلك دعونا نبدأ بدراسة الملف .
image4
سجلنا مزود محتوى واحد في ملف AndroidManifest.xml والخبر الجيد انه تم تصديره لتتمكن جميع التطبيقات الأخرى من الوصول اليه

مهاجمة مزودات المحتوى الضعيفة:


هذا هو الجزء الأكثر إثارة للاهتمام. يجب الان ان نحاول الاستعلام عن مزود المحتوى الذي تم العثور عليه. فإذا قام بإعادة أي بيانات هذا يعني انه عرضة للخطر. ويمكننا التحقق بطرق متعددة.
1. باستخدام adb shell
2. عن طريق استخدام تطبيق خبيث للاستعلام
3. باستخدام Mercury Framework”

استخدام “Adb” :


للإستعلام عن مزود المحتوى من” adb”، ينبغي ان يكون التطبيق مثبتا على الجهاز. احصل على “adb shell ” على الجهاز ثم اكتب الأمر التالي للإستعلام عن مزود المحتوي. هنا سنقوم بعملية الاستعلام من عنوان “URI” الذي وجدناه في مزود المحتوى inmyprovider.smali هو الملف الذي يستخرج بإستخدام أداة apk.
Content –query –uri content://com.isi.contentprovider.MyProvider/udetails
يجب علينا الان رؤية جميع المعلومات المخزنة في تطبيق db كما تظهر في الشكل أدناه
image5

استخدام التطبيقات الخبيثة للاستعلام:


يمكننا حتى كتابة تطبيق خبيث ليقوم بالاستعلام عن البيانات من مزود المحتوى الخاص به . وما يلي شفرة مختصرة للاستعلام عن البريد الوارد من الجهاز المحمول.
image6

استخدامMercury Framework:


ويمكن إجراء العملية بأكملها بإستخدام Mercury Framework بطريقة أكثر كفاءة وبساطة.

تأمين التطبيقات:


 Setting android:exported attribute’s value to false:
في ملف AndroidManifest.xml في التطبيق، ينبغي أن نضيف الخصائص التالية إلى مزود المحتوى لتأمينه. وهنا فإن،com.isi.contentprovider.MyProvider هو مزود المحتوى.
image7اذا حاولنا الاستعلام عن مزود المحتوى الذي فيه ال android:exported value is set to false فإنه سيتم طرح استثناء كما هو مبين أدناه.
image8
ملاحظة: القيمة الافتراضية من Android:exported هي “true” لجميع التطبيقات التي تستخدم API بمستوى أقل من 17..
يمكننا أيضا فرض إذونات مستندة إلى قيود عن طريق تحديد أذونات خاصة بنشاط ما . وهذا، مفيد إذا كان المطور يريد أن يحد وصول التطبيقات التي تمتلك اذونات إلى مكونات تطبيقه

مشاكل اخرى خاصة بمزود المحتوى:


  • SQL Injection: إذا كانت الضوابط الأمنية غير موجودة فإن مزود المحتوى يكون عرضة للهجمات مثل SQL Injection.
  • Path Traversal: هذا نوع اخر من الهجمات التي يمكن تنفيذها إذا كان مزود المحتوى مضمن بشكل صحيح وهذا يشبه attack path Traversal على تطبيقات ويب,  وتسمح للمهاجمين بالعبور وعرض ملفات النظام المحلية . الملفات الحساسة يمكن نقلها من الجهاز إلى الجهاز المحلي باستخدام تطبيق عرضة Path Traversal attack. •

مقدمة إلى ثغرات XXE – XML External Entity

ماهي XXE ؟

XXE هي اختصار للعبارة  XML External Entity وهي عبارة عن هجوم يستهدف البرامج التي تعمل على طريقة ادخال البيانات عن طريق XML يمكن استخدامها لحقن الاكواد (RCE) او هجمات الحرمان من الخدمة (DDos) فحص البوراتات وLFI ادراج الملفات المحلية .

يحدد معيار  XML  في صيغة او بنية XML وجود عنصر يسمى عنصر يسمى entity لغرض جلب محتوى او بيانات من وحدات تخزينية اخرى قد تكون داخل السيرفر او خارجه ويتم اضافتها للمستند يعتبر كمتغير في البرمجة حيث يتم تعرفيه في أول النص . يمكن تعرفها كنص , رابط خارجي , ملف , كود , الخ …

تعدد ثغرات XXE نادرة في الويب لعدة أسباب منها قلة استخدام المبرمجين لXML كنوع ادخال معوضين عنها بJSON او JSONP وهناك بعض الالزامات حيث يمكن ادخال XML كمدلاخات يتم لفترة المدلاخات . لكن ماذا لو نسي المبرمج الفلترة ؟ ومكن قابلية أضافة عنصر خارجي entity  ؟

الجواب ببساطة سيكون مصاب بثغرة XXE .
الان لنقوم بتطبيق عملي صغير على الثغرة
بيانات مدخلة ب XML :

<?xml version=”1.0″ encoding=”ISO-8859-1″?>
<!DOCTYPE foo [   <!ELEMENT foo ANY >
<!ENTITY isecur1ty “XXE TEST ” >]>
<foo>&isecur1ty;</foo>

نلاحظ الان عدة عناصر في الصفحة اول سطر هو تعريف لوثيقة XML .
العصنر المهم هو عنصر ENTITY  في حالتنا اسمه isecur1ty  وهو المتغير . وتم استدعاء ENTITY  في الوثيقة بوضع & في اوله و ; في اخره بوصفه متغير ENTITY  لو عرضنا الوثيقة الان

xxe

تم الان استدعاء المتغير وكان المتغير هو &isecur1ty; في منتصف ال<foo> وتم تعريف قيمته في الخانة XXE TEST
<!ENTITY isecur1ty XXE TEST ” >]>
الان اللون الاخضر يشير الى اسم المتغير واللون الاحمر يشير الى قيمة المتغير .
الان تم تعريف المتغير الى نص فقط كيف يمكن الاستفادة من هذا ؟
الجواب بوضع أمر SYSTEM قبل قيمة المتغير وبذلك سوف يقراها معالج XML كأمر سحب او ادراج للملف الموجود في القيمة


حين سيتم ارسال هذا البيانات . سوف يقوم السيرفر بارسال طلب الى موقعنا ويطلب الملف XXE.html يمكن ان نسجله في السجلات الLOG .

الان لو اردنا سحب كلف ETC/PASSWD في السيرفر كل ما علينا القيام به هو طلبه عن طريق ال

123


سوف يرد السيرفر بجلب ملف ال etc/passwd ويعرضه على شكل نص الامر مقارب لثغرة LFI ولكن مع امكانيات اكبر سيتم شرحها لاحقاً

12345


مثال عملي 


الأن لو كنت تبحث في موقع وحين سجلت دخول وجدت ان البيانات يتم ادخالها بصيغة XML

21

واردنا ان نجرب ثغرة XXE سنقوم بتعديل الطلب كالاتي :

1



ونرسل الطلب الأن سوف نحصل على معلومات ملف etc/passwd

3


هذه الثغرة تعتبر ثغرة خطيرة جداً وتعتبر ثغرة حقن اكواد كRCE
عبدالعظيم الهادي2013 : عبدالعظيم الهادي2013