معرفی و بررسی پیش نیاز های اکسپلویت نویسی

معرفی و بررسی پیش نیاز های اکسپلویت نویسیبار ها شده که اسم اکسپلویت رو در دنیای سایبری شنیده باشیم ولی تا به حال به معنی و ماهیت آن فکر کرده اید ؟ که چی هست، چیکار می کنه و اصلا چگونه خودمون یکی بسازیم ؟خب جواب دادن به این ۳ سوال سخت تر از اونی هست که بشه تو چند خط یا چند مقاله و فیلم و کتاب به اتمام رسوند. درک عملکرد و نحوه نوشتن یک اکسپلویت نیازمند طی کردن یه راه سخت و بدون انتهاست.دقت کنید گفتم بی انتها :)در واقعا اکسپلویت در دنیای سایبری به یه تیکه کد، چند خط دستور و یا یه تیکه دیتا که به منظور بهره برداری از یک آسیب پزیری استفاده می شود ، می گویند. اکسپلویت ها انواع مختلفی دارند ، بعضی از آنها از راه دور و از راه اتصال به یک آیپی و پورت اجرا میشن ، و بعضی از آنها به صورت محلی و رو سیستم باید اجرا بشوند. با این حال اکسپلویت ها باز انواع دیگری دارند و بسته به مکان مورد استفادشون به دسته های دیگه ی تقسیم بندی می شوند ، مثلا اکسپلویت وب یا اکسپلویت باینری.چیزی که ما در این مطلب در موردش صحبت می کنیم در مورد انواع اکسپلویت ها به کار می آیید :)بزارید برای درک نحوه کارکرد اکسپلویت یک مثال در دنیای واقعی براتون بزنم که قشنگ جا بیافتد.چند سال پیش یه باندی بودن که ماشین های هوشمند رو با یه فندک می دزدیدن!چطور ؟ :)خب تحقیق کرده بودن که اون ماشین دو سنسور اکسیژن و حرارت توی اگزوزش داره ، سنسور اکسیژن واسه این بود که سیستم بفهمه ماشین روشنه یا نه(البته سیستم های دیگه ای هم واسه این هست، ولی خب این هم واسه ماشین مهمه!) و سنسور حرارت هم واسه وقتای اضطراری مثل آتش سوزی، حالا این باند رفته بودن دم اگزوز، فندک زده بودن، در مدت زمان خیلی کمی هر دو سنسور رو تحریک کرده بودند و ماشین فکر کرده که الان روشنه و آتیش گرفته و هر چهار درش رو باز کرده 🙂 (خبر اصلی)تو این مثال چند نکته آموزشی هست که می خوام بهتون بگمبه اینکار یه حمله می گن که در اون ماشین میشه قربانی ( victim)، فرد انجام دهنده حمله میشه هکر(attacker/hacker)، ابزاری که از آن برای انجام حمله استفاده شد میشه اکسپولیت(exploit)که در این مثال فندک بود، سیستم تشخصی آتش سوزی یا سنسور ها هم میشه قسمت آسیب پذیر(vulnerability) خب ماهیت همه ی اکسپلویت یه چیز واحد هستش ولی نمیشه با همون فندک بیای و یه پراید بدزدی ، میشه :)؟خب چند نکته مهم در این باره هست که باید یاد بگیریمنباید برای همه سیستم ها یک اکسپلویت واحد را استفاده کرد.هر چی قابلیت و ویژگی بیشتر باشه، احتمال آسیب پذیری بیشتر می شود،اکسپلویت باید به شیوه درست و هوشمندانه ساخته و استفاده بشود که نه سیخ بسوزد نه کباب. مثلا شما فکر کنید مهاجم بجای فندک از یه آتیش بزرگ استفاده می کرد، قطعا یه جای از ماشین رو خراب میکرد، یا مثلا به جای اگسوز روی تایرا فندک می گرفت. قربانی همونه، هکر و اکسپلویت هم همونه ولی خب هکر بلد نیست از اکسپلویت استفاده کنه و هم به قربانی آسیب می زنه هم خودش البته بعضی از اکسپلویت ها هدف اصلیشون ترکوندن قربانیه ما به اونا کاری نداریم😁بریم سر اینکه برای شروع و وارد شدن به این راه بی انتها به چه چیزای نیاز داریم که وسط راه دچار مشکل نشیم.برای نوشتن اکسپلویت باید اول یک آسیب پذیری پیدا کرده باشیم، بعد به خوبی مشکل رو درک کرده باشیم و بعد با دانش برنامه نویسمون اکسپلویتمون رو بسازیم و از اون بهره ببریم.پس با این ترتیب در مورد هر بخش یاد میگیریم، ینی اول یاد میگیریم چجوری بتونیم باتحلیل یک اپلیکیشن یه آسیب پذیری رو کشف و درک کنیم و چجوری با ابزار های موجود و یا دانش برنامه نویسی خودمون یک اکسپلویت برای اون بسازیم.اگه بگم این مهم ترین بخش هست دروغ نمیگم چون همه برنامه های که روی کامپیوتر اجرا میشن توسط سیستم عامل مدیریت میشن و همه کاره در اصل همونه.فرایند های مدیریت حافظه و پروسه و نحوه ارتباط پروسه ها و نخ ها با یکدیگر، محدودیت های حافظه و نحوه واکنش سیستم عامل به هنگام رخ دادن اشتباهات عمدی و یا غیر عمدی در حافظه و تک تک اجزا و بخش ها و پروسه های آن را به خوبی درک کنید، کلا می خوام اینو بگم که سیستم عامل رو کامل درک کنید :)این بخش بخاطر این مهم هست که حافظه(RAM) منبعی محدود هست و وجود آن برای سیستم عامل ضروری است و باید آن را به شیوه ی مدیریت بکند که نه سیخ بسوز نه کباب.در اصل سیستم عامل فرایند های خودش و فرایند های درخواست شده توسط کاربر را پردازش کرده، بخشی از منابع را در اختیارشان می گذارد و ازشون مراقبت می کند و نمی گذارد که با پروسه های دیگر دچار مشکل شود و مزاحم یکدیگر شوند.(بله ناظم خوبی است :))به مرور زمان و طی سال ها که حملات سطح باینری انجام میشد، موازی با آنها حفاظت های برای حافظه و اپلیکیشن ها در نظر گرفته می شد که از حملات جلوگیری بشه و هر بار دور زده می شدند و ما باید از اولیشون تا آخریشون رو یاد بگیریم چون وقتی که می خواهیم به یه چیزی آسیب بزنیم باید بلد بشیم که اون چجوری از خودش دفاع می کنه تا بتونیم نقاط ضعفش رو کشف کنیم و بعدش فیتالیش بکنیم😌️بعد از اون لازمه که برنامه که می خواییم ازش باگ دربیاریم رو کامل بفهمیم، ینی حتی بیشتر از برنامه نویسی که اون رو نوشته !حالا وقت شیرجه زدن تو قسمت عمیق تر هستش یعنی یادگیری مهندسی معکوس ، که برای خود مهندسی معکوس لازمه مفاهیم دیگه ی رو بشناسیم که به مرور معرفی می کنم.قدم اول یادگیری اسمبلی (نزدیک ترین زبان بین کامپیوتر و انسان) هست.شما سیستم عامل رو شناختید پس نوبت آن است که یاد بگیرید با اسمبلی خودتون سخت افزار رو کنترل کنید و هرجور که می خواهید از منابع و سیستم عامل استفاده کنید.ولی اسمبلی به چه کار ما میاید واقعا ؟سوال قشنگیه، راستش دلایل زیادی واسه یادگرفتنش هستمثلا برای اینکه بتونیم یه برنامه رو تحلیل کنیم باید به کدهاش دسترسی داشته باشیم و جالب تر از اون اینه که در ۹۹.۹۹ درصد مواقع ما به کدها دسترسی نداریم و باید با استفاده از یک دیس اسمبلر کدهای باینری(opcode) رو تبدیل به اسمبلی بکنیم.پس اینم یاد گرفتیم که کار یک دیس اسمبلر تبدیل اوپکد ها به زبان اسمبلی هست و هدف از یادگرفتن اسمبلی هم درک عملکرد برنامه است.با اسمبلی می توان جریان داده ها و مسیر اجرای برنامه را با دقت و مرحله به مرحله و با خوانا ترین شکل ممکن دید.ولی مشکل اونجاست که درک خود زبان اسمبلی هم سختی های خودشو داره و فهمیدن و یاد گرفتنش لازمه کمی تلاشه ، ولی لازمه که حتما بدونید. اگه تو کتتان نمی رود که اسمبلی یاد بگیرید پس بهتر است قبل از اینکه ناک اوت شوید، از همین جا خداحافظی بفرمایید، چون ادامه دادن این راه بدون اسمبلی ممکن نیست :)ولی واقعیتش اینه که همیشه هم تحلیل کدهای اسمبلی کار عاقلانه ی نیست ، چون زمان و حوصله زیاد می خواهد.پس اگه هنوز خداحافظی نفرمودید بشینید که می خوام یه خبر خوب بهتون بدم ( ولی هنوزم سر حرفم هستم که اسمبلی رو باید یاد بگیرید)اول بدونیم که کامپایلر چی هست، در واقع کار کامپایلر ترجمه کد های زبان های سطح بالا به زبان ماشین هست.دیکامپایلر همانطور که از اسمشم پیداست کارش برعکس کردن فرایند کامپیل کردنه، به اون صورت که کدهای باینری رو تبدیل به کدهای یک زبان سطح بالا می کند و اکثر دیکامپایلر هابه زبان C تبدیل می کنند، اینجا یکی از دلایل اهمیت یادگیری زبان C رو هم فهمیدیم :)حالا که اینا رو یاد گرفتیم موقع اون میرسه که از دیباگر ها اسم ببریم، دیباگر ها کارشون اینه که به صورت یه رابط بین برنامه و سیستم عامل قرار می گیرن و هر آنچه که در بین آن دو ردوبدل می شود رو نمایش می دهد و ما می توانیم به راحتی در جایی از برنامه توقف ایجاد کنیم و حافظه مورد استفاده اپلیکیشن رو ببینیم به دلخواه تغیر بدیم و…دیباگر ها اصولا یک دیس اسمبلر به صورت پیش فرض دارن و کدهای برنامه رو به صورت اسمبلی به کاربر نشون میدن و تعدادی از دیباگر ها دارای دیکامپایلر هم می باشند.ولی سوکعم یسدنهم خیلی پیچیده تر از این حرفاست و لازمه که تمرین زیاد در این بابت داشته باشید.ولی به نظر شما همین کافیه که بتونیم یه برنامه رو به صورت کامل تحلیل کنیم ؟من که نظرم مثبت نیست، به این دلیل که بیشتر دیباگرا و شاید هم همه اشون توانایی اینو ندارن که ترافیک شبکه رو ردگیری کنن و برای برنامه های که ارتباط شبکه ی دارن باید از ابزار های دیگه استفاده کنیم. دیباگرا حتی نحوه استفاده برنامه از دیوایس های مثل ماوس و کیبورد و هارد دیسک و … رو به خوبی نشون نمیدن و واسه اونم باید از ابزارهای دیگه ای استفاده کنیم که بر حسب نیاز در بخش های بعدی درباره شون یاد می گیریم.راه های زیادی برای کشف آسیب پذیری هست ولی به صورت کلی ۳ راه اصلی white/black/gray box رو داریم.توی این نوع تست ما با دانش کامل و دسترسی به همه کدهای برنامه شروع به تست کردن می کنیم، در واقع ما می دانیم که باید کجا را و چگونه آن را تست کنیم. در این نوع ما نیازه که برنامه نویسی ایمن رو بخوبی بلد باشیم و توانایی درک و خوندن کد رو به خوبی داشته باشیم که راحت تر بتونیم آسیب پذیری هارو تشخیص بدیم.توی این نوع تست ما هیچ گونه آگاهی نسبت به عملکر داخلی سیستم و کد های منبع اون نداریم، در اصل این رویکرد دقیقا شرایط یک مهاجم را شبیه سازی می کند، با این شیوه به دلیل عدم آگاهی نسبت به درون سیستم ، فرایند کشف آسیب پذیری طولانی تر شود. در واقع شما فقط آنچه را که می توانید مشاهده کنید می دانید و شما به عنوان یه کاربر فقط می توانید ورودی و خروجی را که از انتهای دیگر خارج می شود ببینید و نمی توانید ببینید چه بلای بر سری ورودی ها می آید، این نوع معمولا در هنگام دسترسی از راه دور به برنامه های وب و سرویس های وب مشاهده می شود.این نوع تست هم ترکیبی از دو تست دیگر است.فازینگفازینگ یک تکنیک تست نرم افزار هست که در آزمایش های black box استفاده میشود که اغلب خودکار و نیمه خودکار انجام می شود.فازینگ در اصل فرستادن داده های نامعتبر، تصادفی و غیر منتظره به ورودی های اپلیکیشن است و از طریق کنترل کردن برنامه برای خطاها و یا کراش کردن(خرابی) اپلیکیشن و استثناهای که رخ می دهند می توان تا حدودی فرایند کارکرد اپلیکیشن رو تشخیص داد.فازینگ ۶ مرحله مختلف دارد که ما به ترتیب در موردشون یاد میگیریم. در مرحله اول سراغ شناسایی هدف می رویم ، باید یک جمع آوری اطلاعات عمومی در مورد هدف انجام بدهیم و با توجه به چیزای که دستگیرمان شده ابزار وتکنیک های رو برای فازینگ انتخاب کنیم.در مرحله بعدی هدف شناسایی تمام نقاطی هست که از کاربر ورودی می گیرند،وقتی میگویم تمام نقاط، در واقع منظور از هر بخشی هست که از طریق کلاینت مقدار دهی می شود. مثلا توی وب حتی هدر های که واسه سرور فرستاده می شوند رو هم شامل می شود. ( مورد داشتیم که از طریق UserAgent باگ sqli پیدا کردن )تا اینجا دو مرحله مهم رو طی کردیم و بعد از شناسایی کامل هدف موقع شروع عملیات فازینگ و مرحله ای به اسم تولید داده های مبهم هست،اما فرستادن داده های مبهم چه سودی دارد ؟می تواند سوال جالبی باشد:) در اصل داده های مبهم ترکیبی کامل از تمام بایت های قابل چاپ و غیر قابل چاپ هستش که به وسیله آن می توان به خوبی قسمت vlidation ورودی رو شناسایی و تحلیل کنیم ، برای مثل بتونیم تشخیص بدیم که اون بخش فقط حروف قابل چاپ رو قبول می کند یا فقط عدد یا هر دو و ترکیبای دیگه ی که می تواند وجود داشته باشد، جدا از اینا طول حداکثر و حداقل رشته ورودی رو می تونیم تشخیص بدیم..و سوال قشنگ تر این است که چطور امکان پذیر است ؟خب بزارید توی مرحله چهارم داده های مبهم رو به هدف بدیم.توی مرحله پنجم دنبال خطاها و استثنا ها می گردیم، در واقع با فرستادن دیتای های مبهم و طولانی کاری می کنیم که اپلیکیشن دچار خطا بشه و از طریق اون خطاها ما می تونیم نحوه کار کرد اپلیکیشن رو تشخیص بدیممثلا وقتی به برنامه رشته ای به طول ۱۰۲۴ کاراکتر می دهیم و دچار خطا نمی شود، ولی اگر ۱۰۲۵ کاراکتر بدیم یک خطا رخ میدهد این به این معنیه که حداکثر طول رشته ما باید ۱۰۲۴ کاراکتر باشد. توی مرحله ششم و بعد از اینکه کاری کردیم که اپلیکیشن دچار خطا بشه، وقت این است که دقیق تر روی آن کار بکنیم و بررسی بکنیم که آیا می توان استفاده ی مفیدی از آن کرد یا خیر، مثلا آیا دیتای اضافی حذف می شود یا بخش اضافه ش هم روی حافظه متغیر نوشته می شود و بررسی های دیگر که به مرور و در بخش های آینده به همه شون می پردازیم.بخش بعدیش کاملا به دانش برنامه نویسی و میزان درکتون از اپلیکینش و سیستم عامل داره، چون توی این قسمت و بعد از کشف کردن قسمت آسیب پذیر، باید یافته های خومون رو روی هم بزاریم و پیلود خودمون رو بسازیم و به بعدش اپلیکیشن رو اکسپلویت بکنیم.حال فرض کنیم آسیب پذیری رو هم پیدا کردیم، چجوری آن را اکسپلویت کنیم ؟خب اینجاست که باهوش بودن هکر در مواجه شدن با باگ و مسئله های جدید مشخص می شود و بقیه مراحل تا حدودی شانسی است… :)نوشتن اکسپلویت نیازمند درکی کامل از نحوه رخ دادن آسیب پذیری و مکان رخداد آن است که بعد از کشف آسب پذیری باید به صورت کامل و عمیق اپلیکیشن تحلیل شود و بعد شروع به نوشتن کد اکسپلویتمون بکنیمولی همه ی اپلیکیشن ها لازم نیست براشون کد بنویسیم !بعضی وقت ها فقط فرستادن چندین بایت کافیست و بعضی اوقات لازمه که صد ها خط کد بنویسید…خب گفتم کد نویسی و اینجاست که شما زبانی که به آن می خوایید اکسپلویتتون رو بنویسید خودتون انتخاب می کنید; اما به عنوان پیشنهاد من چند زبان پرکاربرد رو بهتون معرفی می کنمزبان c به خاطر انعطاف پذیری بالا و توانایی دستکاری حافظه به صورت دستی گزینه بسیار مناسبی برای اکسپلویت نویسی هست ولی اگر راحت طلبید من پایتون و روبی رو معرفی می کنم، یه ماژول به اسم pwn برای پایتون توسعه داده شده که یکی از بهترین ماژول ها در زمینه آنالیز و اکسپلویت اپلیکیشن ها هست که در بخش های بعدی بر حسب نیاز و به مرور به یادگیری اون می پردازیم، روبی هم که تعریف نمی خواد :)در واقع سوت پایان واسه اولین بازی :)هنوز خیلی چیزا هست یاد بگیرید ، این فقط یه معرفی نامه کوچیک بود،تا یاده اینم بگم این معرفی نامه واسه کسی نیست که تازه وارد هکینگ شده ، در واقع واسه کسی هست که حداقل یک یا دو سال تجربه فعال داشته باشه، برنامه نویس خوبی باشه، پنتستر خوبی باشه و…. خلاصه یه آدم خفن باشه و بعدش بیاد واسه عمیق تر شدن بیاد این سمت :)سعی نکنید از طبقه همکف بپرید طبقه هفت و هشت، چون نه می تونید برسید و اگر که خیلی پرشتون خوب باشه(در حد ۴ یا ۵ طبقه مثلا) بعدش دوباره نمی رسید و می افتید پایین و در بهترین حالت فلج میشد :)پس سعی کنید از پله ها بیایید بالا( ساختمون آسانسور نداره متاسفانه)یه چیز دیگه ام بگم ، اینکه توی متن زیاد از واژه درک کنید استفاده کردم ، احتمالا متوجه شده باشید ، وقتی می گم درک کنید منظور از این نیست که شما برید فلان کتاب رو حفظ کنید و همه شو واسم بخون، میگم درک کن،‌ینی اونو بفهم، فرا تر از فهمیدن حتی :)روزتون خوش 🙂

Author: admin

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *