یه مقداری درگیر کار و .... بودم واقعا وقت نکرده بودم ادامه این پستو به اتمام برسونم و خب الان اومدم که این process هم کیل کنیم😂
خب آقا این کدی که ما داشتیم یه linux kernel module هستش که کارش privilage escalation هست و کاری که میکنیم با استفاده از syscall مربوط به kill() هستش که با استفاده از kprobe اون رو hook میکنیم تا وقتی یه مقدار خاص یا همون MAGIC_SIG 64
خودمون که اینجا 64 هستش دیده بشه.هدفمون چیه؟ این دوستمون بیاد GID,UID رو به 0 تغییر بده یا همون root بکنه مارو .
خب یه نگاهی به منطق کدمون بکنیم الان: وقتی kill(PID, 64) استفاده میشه سیسکال __x64_sys_kill()
صدا زده میشه و kprobe وارد کار میشه و میبینه که اصلا سیگنالی که دادیم چند هستش اگه 64 بود PID تسک رو پیدا میکنه و UID و GID رو برابر 0 میکنه capabilities ما رو هم full میکنه و task که ما داشتیم کلا عوض میشه و سطح دسترسی پراسس ما تبدیل به روت میشه .
مکانیزم اصلی hook کردن رو با استفاده از kprobe.h در بخش زیر آوردیم :
module_init()
module_exit()
MODULE_LICENSE()
در بخش اول این بکدور ما خودش رو وارد کرنل میکنه بعد از انجام load module با استفاده از register_kprobe() که باعث میشه کرنل روی تابع مربوط به kill یه probe داشته باش.
توی اول بخش کد اگه نگاه کنین ما یه مجیک سیگنال تعریف کردیم که مقدار اون رو 64 گزاشتیم یعنی چی؟
هر موقع که اون سیسکال kill سیگنال 64 رو دریافت کرد این kprobe ما بیاد تو کار و اون PID که بهش دادیم رو بیاد و hook کنه .
کرنل اول میره سراغ process و اینجا با استفاده از task_struct انجام میشه که یعنی اینکه اول از شماره PID به خود پراسس میرسه و بعد به credential ها یا دسترسی هایی که داره میرسه . یه اشاره ریز به credential بکنیم یعنی اطلاعاتی که درباره هویت و مجور یه پراسس داریم : UID , EUID , GID , EGID , capabilities و ...
توی اینجا اگه UID , GID که داریم برابر 1000 باشه توی این بخش بکدور میاد یه کردنشیال جدید میسازه و اینا رو برابر 0 قرار میده .
بعد از ساختن یه کردنشیال جدید میاد و اون رو وارد پراسس میکنه اینجاست که پریویلیج اسکلیشن رخ میده و بکدور ما کار خودشو میکنه .
فیلم عملیشو حتما توی یکی دو روز آینده میزارم
دمتون گرم 💥
Join channel⚡