| ثغرات dll hijacking تحليلها, أسبابها وطرق الحماية |
| الكاتب مصطفى العيسائي |
| الاثنين, 06 سبتمبر 2010 16:03 |
|
مقال يتحدث عن ثغرة Dll Hijacking المنتشرة في الفترة الأخيرة, إذ يتساءل البعض, كيف تعمل وهل كل الأجهزة مصابة بها؟ هل كل البرامج يمكن أن تصاب بها وكيف أحمي نفسي؟ كيف أحمي برامجي منها؟ سنتطرق للعديد من الأمور عنها اليوم في نفس الموضوع.
مقدمة:الكل يعلم عن مكتبات الربط الديناميكي (dll) ودورها في توفير الجهد في التعامل مع النظام , إذ يكفيك للتعامل مع النظام , أن تستدعي المكتبة والدوال الموجودة فيها , فعندما تريد أن تحذف ملفاَ , ستستدعي مكتبة Kernel32.dll وتقوم بإستدعاء دالة DeleteFile التي تقوم بحذف الملف الممرر لها , وعندما تريد الإتصال بمنافذ أو أجهزة أخرى , تقوم بتحميل مكتبة ws2_32 وإستدعاء الدوال الخاصة بالمقابس.
فكرة الثغرة:عندما تقوم بتحميل مكتبة إلى برنامجك , تقوم بإستدعاء دالة LoadLibraryA وتمرير اسم المكتبة لها بالشكل التالي: LoadLibraryA("user32")سيقوم النظام بالبحث عن مكتبة user32 في نفس مجلد البرنامج أو ما يسمى بالـ Current Directory, إذا لم يجد , سيقوم بالإنتقال إلى المجلدات الموجودة في متغير PATH ويبحث عن المكتبة , ويقوم بتحميلها للذاكرة أو يقوم بإرجال قيمة 0 للدالة دلالة على عدم تحميل المكتبة ,
مثال:لدينا هنا برنامج يريد إستدعاء adsnt.dll بعد تحميله عن طريق دالة LoadLibraryA , بالشكل التالي: format PE GUI 4.0entry start include 'win32a.inc' start: push _lib call [LoadlibraryA] int 3 _lib db "adsnt",0 section '.idata' import data readable writeable library kernel32,'kernel32.dll' import kernel32, \ LoadlibraryA , 'LoadLibraryA'
entry DllEntryPoint include 'win32ax.inc' .code proc DllEntryPoint hinstDLL,fdwReason,lpvReserved int 3 mov eax,5 ret endp نقوم بترجمتها وجعلها في نفس مجلد البرنامج, ونقوم بتسميتها بإسم adsnt.dll
سؤال: ماهي المشاكل التي تواجه مطور الثغرة؟ هل الثغرة تعتبر كاملة بالشكل السابق؟ مثلاَ, سترجع الدالة بالقيمة 0 لإن مكتبتك لا تحوي دالة SetWindowHookEx فستظهر لجلب جميع دوال المكتبة و يتم عمل ذلك عن طريق تصدير دوال بنفس أسماء المكتبة وجعل دوالك كـ Proxy أو وسيط بينهم كما في الموضوع التالي من موقع CodeProject. فسنتجاوز أي مشكلة مع هذه الثغرة إن شاء الله. أعمل حالياَ على طريقة تقوم بتغيير قيمة الدالة LoadLibraryA الراجعة للبرنامج بحيث يمكننا إستبدالها بقيمة الدالة الأصلية , بهذا نتفادى مشكلة المصادر والدوال وأي تعامل للبرنامج الأصل سيتم مع المكتبة الأم , لكن الموضوع معقد بالنسبة لي , وسأحاول طرح التحديث بأقرب وقت إن شاء الله. ختاماَ:شكر للأستاذ صالح على وقفته معي وتزويدي بالمراجع اللازمة , شكر لكم أيضاَ على قراءة الموضوع. عن الكاتب:
التعليقات (15)
![]() أرسلت بواسطة: Mohammad AlQarni في September 06, 2010
شكراً لك يا مصطفى على التحليل الرائع
تحياتي لك أرسلت بواسطة: عبد الصمد في September 06, 2010
تحليل أكثر من رائع
بالنسبة للسؤال حول مشاكل الثغرة هو في الحقيقة ليس مشكل بالصعب فتستطيع عند صناعة المكتبة الخاصة بك أن تقوم بعمل DLLEXPORT للدوال المستخدمة من طرف المكتبة الأصلية نحو الدالة المزيفة و هذا مثال http://www.exploit-db.com/exploits/14730/ أرسلت بواسطة: مصطفى في September 06, 2010
حياكم الله إخواني ,
بالنسبة لموضوعك أخ عبدالصمد , مثالك قد يوفر مكتبة تحوي دوال بنفس دوال المكتبة الأصل , لكن هل تستطيع إستدعاء هذه الدوال ؟ لا لإنها ستعرض رسالة MessageBox وترجع قيمة 0 بكل الأحوال , أي أن البرنامج المستهدف لن يعمل بشكل طبيعي :) موضوع الDll Proxy يوفر حل مناسب لمسألة الدوال , لكن تنقصك العديد من الأشياء الأخرى مثل المصادر كما ذكرت في الموضوع :) مشكور على الرد , دمت بود ,, أرسلت بواسطة: عبد الصمد في September 06, 2010
جربت الثغرة و تشتغل عادي و البرنامج يشتغل عادي كذلك
ممكن توضح لو سمحت قصدك من أن البرنامج لن يعمل بشكل طبيعي لأني لم ألاحظ ذلك أرسلت بواسطة: مصطفى في September 06, 2010
أخ عبدالصمد , لنفرض أن هناك مكتبة إسمها files.dll وتحوي دالة إسمها DeleteAllFiles , الدالة تحذف جميع ملفات مجلد محدد.
قمت أنت بعمل مكتبة خاصة بك وسميتها بنفس الإسم , ووضعت نفس الدالة عن طريق : DllExport void DeleteAllFiles() { pwn(); } أي أن مكتبتك أيضاَ توفر دالة بنفس الإسم , لكن دالتك تعرض رسالة فقط , كما في مثالك : int pwn(){ MessageBox(0, "Firefox DLL Hijacking!", "DLL Message", MB_OK); return 0;} قام البرنامج بتحميل مكتبتك , لاحظ أن مكتبتك لم تقم بتحميل المكتبة الأصلية , قام البرنامج بإستدعاء GetProcAddress وجلب عنوان دالة DeleteAllFiles من مكتبتك , وأستدعاها ,, ما الذي سيحصل ؟ ستظهر له رسالة Pwn فقط ! لم يتم تحميل , إستدعاء أو حتى السؤال عن المكتبة الأم , البرنامج سيتعامل مع مكتبتك على عماه , وستعود دالتك بقيمة 0 في جميع الأحوال , فكرة الDll Proxy المطروحة في المقالة من موقع CodeProject تقوم على نفس فكرتك , لكنها بدل أن تستدعي دالة Pwn تستدعي الدالة الأصلية وتعود بقيمتها :) وفكرتي أنا التي أعمل عليها , تقوم على تغيير قيمة LoadLibrary لجعلها تعود بعنوان المكتبة الأصلية وتوفير الكلام المسرود أعلاه كاملاَ :) اي سؤال , موجودين بالخدمة :) دمتم بود ,,, أرسلت بواسطة: عبد الصمد في September 06, 2010
بارك الله فيك أخي لقد فهمت مقصودك الآن
نتمنى أن نرى المزيد من شروحاتك أرسلت بواسطة: اسحاق في September 07, 2010
http://raym0n.com/DLL hijack/
هاذا ليك أخي عبد الصمد اذا كنت مهتم أرسلت بواسطة: مصطفى في September 07, 2010
أخ اسحاق , في الدقيقة 7:40
الثغرة إشتغلت , لكن البرنامج المستهدف لم يعمل . وهذا ما يدور حوله الجدل ^^ أيضاَ أنت قمت بإستيراد أسماء دوال لمجرد أسمائها , دوال مكتبة dwmapi أكثر من التي قمت بإستيرادها بكثير ,, مشكور على مشاركتك , وجزاك الله خير ,, دمت بود ,, أرسلت بواسطة: اسحاق في September 07, 2010
أهلا بك أخي فالدقيقة 7.40 طبعا مارح يشتغل البرنامج
لاننا غيرنا ملف dll الي رح يحمل الملف دام انو تغير الببرنامج مش رح يفتح اما بالنسبة للكلمات انا جبت string عوضا عن function وهيا كلها شغلة واحدة رح يعطيك الدوال الوجودة بالذاك ويمكن تجيبها عن طريق عدة برامج اخرى غير IDA زي olly انا مشيت بطريقة سهلة لكي يفهمها الكل والدوال تميزها من اسمها لكثرة تكرار وتقدر تستعمل دالة واحدة وتحقنها مفش مشكلة أكبر دوال ودمت بود انا ارسلت الفيديو للموقع وانشاء الله اذا نزل مرحبا باستفساراتكم تحياتي أرسلت بواسطة: مصطفى في September 12, 2010
طريقة البحث عن المكاتب في دالة Loadlibrary*:
1 - مجلد البرنامج نفسه. 2 - مجلد نظام ال32بت (system32). 3 - مجلد نظام ال16بت (system). 4 - *مجلد العمل الحالي. 5 - المسارات الموجودة في متغير ال PATH يمكنكم الإستزادة من هذا المقال الذي يشرح عن إمكانية عمل EXE hijacking ومعلومات أخرى :http://blog.acrossecurity.com/2010/09/binary-planting-goes-exe.html مشكور أستاذ صالح للإشارة , دمتم بود ,,, أرسلت بواسطة: محمود مرزوقـ في September 12, 2010
مشكور يا كبير علي الشرح الصعب جدا علي البتدئين امثالي
أرسلت بواسطة: مصطفى في September 13, 2010
الشرح فيه قليل من التعقيد إذ لم يكن عبارة عن أداة أو برنامج جاهز , أيضاَ أنا لم أوضح الفكرة بشكل مبسط , المعذرة على ذلك ..
إذا إطلعت على موضوع الإخوة : محمد القرني و أحمد العنتري ستفهم الموضوع إن شاء الله , موضوعي تحليل كان من وجهة نظر برمجية , جرب أن تتعامل مع المكتبات والدوال وما إلى ذلك وستفهم الموضوع إن شاء الله. أي إستفسار , موجودين بالخدمة :) أضف تعليق
يجب عليك الاشتراك بالموقع لتتمكن من كتابة التعليقات, الاشتراك مجاني ويستغرق بضع ثوان فقط!
اذا كنت مشترك مسبقا في الموقع فضلاً قم بتسجيل الدخول. |











وشكرا على الشرح الوافي