• 0
Qnix

الهندسه العكسيه مع LD_PRELOAD

سؤال

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

اليوم سوف اقوم بشرح طريقه جديده من نوعها في عمليه exploiting & hijacking functions في برامج التشغيل

الموصله ديناميكيا ( اتحدث عن ليونكس )

evil-linux1.jpg

هذه التقنيه الجديده من نوعها والخاصه بنظام ليونكس تمكنك من التغيير في فنكشن محدد لتتحكم فيه عن طريق مكتبات ديناميكيه

تقوم بعمل load لها عن طريق LD_PRELOAD .

ال LD_PRELOAD هي خاصيه قويه في ليونكس تعالج المكتبات الديناميكيه التي تستعمل من قبل البرامج .

مثلا لدينا هاذا الكود C

#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
       char passwd[] = "!#$%^&*()(*&^%$%^&*()";

       if(argc < 2)
       {
               printf("%s <passwd>\n",argv[0]);
               return(0);
       }
       if(!strcmp(passwd, argv[1]))
       {
               printf("Correct passwd ...\n");
               return(1);
       }
       printf("Wrong passwd ....\n");
       return(0);
}

مثل ماتشوف الكود هاذا راح يقبل اوامر من سطر الاوامر مباشره ليقارن المدخل الاول argv[1] مع passwd

اذا كان المدخل مشابه ل passwd راح يقولك Correct passwd ... واذا كان المدخل خاطء راح يقولك Wrong passwd ...

لنقوم بتجميع البرنامج وتشغيله

Qnix dev # gcc passwd.c -o passwd
Qnix dev # ./passwd
./passwd <passwd>

قمنا بتجميعه وتشغيله .. والان لنعتبر انني لا اعرف ماهو الباسورد ولدي هاذا البرنامج واريد عمل hijacking ل strcmp()

لكي اقوم بتغير قيمه ال passwd واختيارها بنفسي <_<

الان سوف نقوم بعرض ال dynamic libs المستخدمه من قبل البرنامج

Qnix dev # ldd passwd
       linux-gate.so.1 =>  (0xffffe000)
       libc.so.6 => /lib/libc.so.6 (0x40032000)
       /lib/ld-linux.so.2 (0x40000000)

طبعا جميع هذه المكتبات يتم معالجتها عن طريق LD_PRELOAD ... الان نحن سنقوم بكتابه مكتبه مشاركه تقوم

بعمل hijack ل strcmp() وتغير قيمتها من s1 الى s2 .

سوف نقوم الان بكتابه الكود

#include <stdio.h>
#include <string.h>

int strcmp(const char *s1, const char *s2)
{
       printf("Real passwd : %s\n",s1);
       printf("Hijacked    : %s\n",s2);

       return(0);
}

هاذا الكود سوف يقوم بارجاع fixed value للداله strcmp()

وسوف يعرض لنا ال s1 وال s2

ال s1 : هي القيمه الحقيقه في البرنامج وهي passwd ... كما ترون

في الكود هاذا الكود

if(!strcmp(passwd, argv[1]))

كما مبين في الشكل ان ال

passwd = s1

argv[1] = s2

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

Qnix dev # gcc -fPIC -c hijack.c -o hijack.o
Qnix dev # gcc -shared hijack.o -o hijack.so

قمنا بتجميع البرنامج ... الان سوف نقوم بادخاله عن طريق LD_PRELOAD ( هي خاصه ب bash )

وبعدها نقوم بتشغيل البرنامج مباشره ... فالبرنامج سوف يقوم بتشغيل هذه المكتبه وهي سوف تقوم بتغيير القيمه s1

الى s2 وارجاعها على انها equal

( لاننسى ان ال return 0; دائما يعيد قيمه مساويه )

Qnix dev # LD_PRELOAD="./hijack.so" ./passwd aaaa
Real passwd : !#$%^&*()(*&^%$%^&*()
Hijacked    : aaaa
Correct passwd ...

تمت العمليه تم ارجاع قيمه s2 على انها Equal :lol:

صوره:

rev1.jpg

قمت بأنشاء فيديو عن هذه الطريقه لكي يوضح عملها اكثر .... يمكن الحصول عليه من هنا

http://www.0x11.org/rewlp.html

( اي استفسار ارجو طرحه هنا بدون تردد ... وإن شاء الله نشوف تفاعل مع الموضوع )

تحياتي

تم تعديل بواسطه Qnix
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

3 إجابة على هذا السؤال .

  • 0

السلام عليكم

اولاً اريد ان احيك على مجهودك الرائع, ولكن للاسف جميع الامثلة هى على بيئة اللينكس وقليلين جدين من يستخدم بيئة اللينكس..

لدى سؤال, ما سبب استخدام برنامج password للدالة strcmp الموجودة فى المكتبة الديناميكية وإهمالها الاخرى الموجوده فى المكتبة الإستاتيكيه..

هل يعنى هذا انه فى بيئه اللينكس يمكنك تغير جميع دوال برنامج معين لمجرد انك استخدمت مكتبة ديناميكيه اثناء تحميل البرنامج..

والسلام عليكم

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
اولاً اريد ان احيك على مجهودك الرائع, ولكن للاسف جميع الامثلة هى على بيئة اللينكس وقليلين جدين من يستخدم بيئة اللينكس

حياك الله ... عند كتابتي هذه المواضيع اعلم انه قله من يراها ... لكن ان لم يستفد منها اليوم سوف يستفاد منها غدا . إن شاء الله

لدى سؤال, ما سبب استخدام برنامج password للدالة strcmp الموجودة فى المكتبة الديناميكية وإهمالها الاخرى الموجوده فى المكتبة الإستاتيكيه

كما تعلم برنامج passwd الذي قمت بكتابته هو ديناميكي في الاساس ... طبعا كما تعلم اثناء عمليه الكومبايل

هاذا البرنامج يعتمد ( على حسب ماكتب ) على مكتبات خاصه ... وهي مكتبات موجوده في النظام ...

بعض الاحيان هاذا الهجوم يكون ثغره في مكتبه وليس في البرنامج ... او تكون الثغره في الفنكشن نفسها ...

ال Gcc بشكل اعتيادي سوف يقوم باخراج passwd وسيكون موصل ديناميكيا الا لو اضفت -static

انظر الى هاذا المثال

Qnix dev # gcc passwd.c -o passwd; LD_PRELOAD="./hijack.so" ./passwd aaaa
Real passwd : !#$%^&*()(*&^%$%^&*()
Hijacked    : aaaa
Correct passwd ...

هنا قمت بعمليه تجميع البرنامج على انه موصل ديناميكيا طبعا نجح الهجوم ....

Qnix dev # gcc passwd.c -o passwd -static; LD_PRELOAD="./hijack.so" ./passwd aaaa
Wrong passwd ....

اما هنا لم ينجح الهجوم لاني قمت باضافه خيار -static للكومبايلر على انه يكون موصل ستاتيكيا .

اما الفرق هو هنا

Qnix dev # gcc passwd.c -o passwd; du -h passwd
8.0K    passwd
Qnix dev # gcc passwd.c -o passwd -static; du -h passwd
496K    passwd

كما ترى البرنامج الديناميكي اصغر بكثير من البرنامج الاستاتيكي ... لكنه اكثر حمايه <_<

فهاذا نوع من انواع التصدي لهاذا النوع من الهجمات .....

هل يعنى هذا انه فى بيئه اللينكس يمكنك تغير جميع دوال برنامج معين لمجرد انك استخدمت مكتبة ديناميكيه اثناء تحميل البرنامج..

طبعا ... لكن ليس كل الدوال ...

تم تعديل بواسطه Qnix
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

صار لازم غير للينوكس بسرعة :P

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .