السلام عليكم...
هناك غلطات برمجيه يقع فيها كثير من المبرمجين , وهي انهم يقومون بوضع الملفات التنفيذيه في دوال
بدون تحديد مسارها "System Call"
مثلا عندنا هذا الكود
هناك غلطات برمجيه يقع فيها كثير من المبرمجين , وهي انهم يقومون بوضع الملفات التنفيذيه في دوال
بدون تحديد مسارها "System Call"
مثلا عندنا هذا الكود
#include <%stdlib.h%>
int main() {
system("uname");
return 0;
}
للوهله الاولى بتقول الكود سليم ومافيه شي, ومافي مجال لاستغلاله.
بس كل شي ممكن في اللينكس, الثغره هذي انك ممكن تلعب على مسارات البحث.
لو كتبت الامر
env
او كتبت
echo $PATH
بتشوف المسارات الي يبحث فيها الشل الي انته تستخدمه مثلا "الباش" عن البرامج والملفات.
مثلا اذا كتبت الامر
uname
بتشوفه اشتغل مباشره بدون اضافة مساره الحقيقي.
اكتب الامر
whereis uname
بتشوف مساره , مثلا
/bin
المسار هذا بتشوفه موجود عندك على
echo $PATH
المهم نرجع لثغره واستغلالها, بكل بساطه روح على اي مسار مثلا
/tmp
واكتب اي كود تريد و غير اسمه الى
"uname"
وضيف المسار الي انته فيه على
$PATH
نحط امثله احسن, مثلا بكتب كود يعطيني شل, وبحطه في
/tmp
بس كل شي ممكن في اللينكس, الثغره هذي انك ممكن تلعب على مسارات البحث.
لو كتبت الامر
env
او كتبت
echo $PATH
بتشوف المسارات الي يبحث فيها الشل الي انته تستخدمه مثلا "الباش" عن البرامج والملفات.
مثلا اذا كتبت الامر
uname
بتشوفه اشتغل مباشره بدون اضافة مساره الحقيقي.
اكتب الامر
whereis uname
بتشوف مساره , مثلا
/bin
المسار هذا بتشوفه موجود عندك على
echo $PATH
المهم نرجع لثغره واستغلالها, بكل بساطه روح على اي مسار مثلا
/tmp
واكتب اي كود تريد و غير اسمه الى
"uname"
وضيف المسار الي انته فيه على
$PATH
نحط امثله احسن, مثلا بكتب كود يعطيني شل, وبحطه في
/tmp
#include <%stdlib.h%>
int main()
{
char *arg[] = {"/bin/sh",NULL};
execve(arg[0],arg,NULL);
}
وبغير اسمه الى
uname
وبعدين بضيف المسار الي انا فيه على
$PATH
uname
وبعدين بضيف المسار الي انا فيه على
$PATH
هنا انا ضفت نقطه على بدايه المسارات , النقطه في اليونكس معناها المسار الي انته فيه.
مثلا اذا جيت تشغل ملف تنفيذي في نفس المسار الي انته فيه بتكتب
./file
المهم, الحين اذا رحت وشغلت الملف الي فيه الثغره وانته موجود على
/tmp
بتشوف انك حصلت على شل بدل الامر
uname
الخطر يكمن في استخدام
setuid/gid
في الصلاحيات.
حيث ان البرنامج يشتغل بصلاحيات اليوزرز صاحب البرنامج وليس اليوزر الي شغل البرنامج.
من المانيول:
S_ISUID 04000 set user ID on execution
S_ISGID 02000 set group ID on execution
خلونا نشوف مثال كامل على الموضوع:
كتبنا الملف المضروب
عملنا له كومبايل بال
gcc
غيرنا اليوزر له لروت
غيرنا الصلاحيات وضفنا له
setgid
شغلنا البرنامج بشكل طبيعي, واعطانا ناتج الامر
uname
رحنا على مسار
/tmp
وعدلنا على
$PATH
كتبنا ملف
uname.c
الي فيه الكود الي بيعطينا الشل
عملنا له كومبايل
شغلنا الملف المضروب مباشره من التمب وحصلنا على الشل و اليوزر له صلاحيات قروب الرووت
تحياتي..
Dr.Death
No comments:
Post a Comment