برای افرادی که علاقمند به توسعه ی اکسپلویت در باینری هستن، معمولا دو سوال مطرحه:
- آیا در سال 2024، توسعه اکسپلویت در باینری، ارزش وقت گذاشتن رو داره یا نه؟
- اگه ارزشش داره، چطوری شروع کنیم، آیا یک رودمپ یا مسیر یادگیری (رایگان) برای توسعه اکسپلویت در باینری وجود داره یا نه؟
در این پست میخواییم به این دو سوال مهم و کلیدی از دید DayZeroSec جواب بدیم.
DayZeroSec یک بلاگ و پادکست در خصوص امنیت سایبری هستش که از دو محقق امنیتی در زمینه کشف آسیب پذیری و توسعه اکسپلویت، بنام Specter و ZI تشکیل شده. اغلب موضوعاتی هم که پوشش میدن در خصوص اکسپلویت کردن باینری یا Binary Exploitation هستش. نوشته پیشرو هم توسط ZI نوشته شده.
چکیده مطالب این پست رو میتونید در شکل زیر مشاهده کنید:
توسعه ی اکسپلویت چیه؟
توسعه ی اکسپلویت (Exploit development یا ExploitDev)، بویژه اکسپلویت کردن در باینری (Binary Exploitation) ، شامل تبدیل یک باگ خرابی حافظه (Memory Corruption) در نرمافزار، به چیزی مفید مانند اجرای کد دلخواه (RCE) هستش.
برخلاف اکسپلویتهای سطح بالاتر مانند SQL injection، توسعه اکسپلویت در باینری، نیازمند یک فرآیند توسعه پیچیدهتر هستش که شبیه به برنامه نویسی مجدد نرمافزار برای اهداف مدنظرتون هستش. با این حال، با پیچیدهتر شدن اکسپلویتهای سطح بالاتر، این اصطلاح بطور گستردهتری استفاده میشه و انتظار میره این روند ادامه پیدا کنه.
آیا توسعه اکسپلویت در حال از بین رفتن؟ آیا هنوز ارزش یادگیری رو داره؟
توسعه اکسپلویت یک مهارت تخصصیِ که حتی در بین هکرها هم خیلی برجسته هستش و اغلب به عنوان نوعی جادوی سیاه دیده میشه. در حالیکه تقاضا برای رسیدگی به مسائل امنیتی سطح بالا بیشتر هستش، باگهای خرابی حافظه بدلیل شدت بالقوه اونا همچنان حیاتی هستن.
نمیشه گفت که یادگیری اون برای شما ارزش داره یا نه، اما میشه گفت که هنوز آیندهای برای این کار وجود داره. برای برخی افکار درباره آینده اکسپلویت، میتونید قسمت 250 ام پادکست DAY[0] با موضوع Future of Exploitation Development رو گوش بدید.
این پادکست رو قبلا در کانالمون معرفی کردیم و براش یه خلاصه مختصر هم نوشیم:
- اقدامات کاهشی که سازندگان معرفی میکنن یا هزینه بر هستش، یا نیاز به زمان داره تا جا بیافته.
- یکی از اقداماتی که سازندگان ازش استفاده میکنن مهاجرت به زبانهای امن مثله Rust هستش. مشکل اینجور روشها اینه که :
- اولا باید کل سیستم بازنویسی بشه، اینکه یه بخشی مثلا کتابخونه ها با Rust نوشته بشه و بقیه نه، سیستم بصورت کامل امن نمیشه. کدهای قدیمی همچنان وجود دارن.
- دوما اینکه همه چیز رو نمیشه با این مدل زبونها پیاده سازی کرد.
- سوما اینکه ارزیابی کدهای Rust هم سختی های خودش داره.
- چهارما برنامه های جدید همچنان با C توسعه داده میشن.
- پنجما اینکه این روشها، آسیب پذیری ها و تکنیک های جدید اکسپلویت کردن رو با خودشون میارن.
- همونطور که آسیب پذیریهایی که الان اکسپلویت میکنیم رو چند سال پیش نمیتونستیم، اکسپلویت کنیم، این اقدامات جدید هم ممکنه در آینده شکسته بشن.
- این اقدامات درسته کار اکسپلویت کردن رو سخت میکنن، اما ارزش کسایی که اکسپلویت میکنن و خود اکسپلویتهارو بالا میبرن و دولتها و شرکتها هم الان این هزینه ها رو میدن. مثلا قبلا شاید یکی در یک سال 10 تا اکسپلویت مینوشت که میشد 10 هزار دلار، الان همون نفر ممکنه یک اکسپلویت توسعه بده که ارزش همون یکی 10 هزار دلار باشه.
- آسیب پذیری های Memory Corruption همچنان وجود دارن اما اکسپلویت کردنشون سخت تر شده.
- ما بعنوان باینری کار فقط نباید بریم دنبال آسیب پذیری هایی مثله سرزیربافر و … ، بلکه بقیه آسیب پذیری ها هم جزء باینری هستن و باید بریم سراغ اونا. این آسیب پذیری ها نیاز به دانش بیشتری دارن.
- در نهایت اینکه هنر اکسپلویت کردن ، نمرده.
من میخوام توسعه ی اکسپلویت در ویندوز رو یاد بگیرم، آیا توسعه ی اکسپلویت در ویندوز مشابه لینوکسه؟
اکسپلویت کردن باگهای خرابی حافظه اساساً در ویندوز، لینوکس، FreeBSD، MacOS یا سایر سیستمعاملها مشابه هم هستش. هر قسمت از نرمافزار داده های منحصر به فرد خودش رو در حافظه داره که باید خراب بشن.
ایده اصلی درک نحوه استفاده از داده های برنامه و چگونگی تغییر اونا به نفع خودمون هستش، صرف نظر از اینکه اون پشت چه سیستم عاملی در حال اجراست.
هنگام کار روی یک هدف خاص، شما جزئیات منحصر به فرد اون نرمافزار رو بررسی خواهید کرد، اما هنگام یادگیری مفاهیم نیازی به نگرانی در این مورد ندارید. البته نویسنده در انتها ماژولی برای توسعه اکسپلویت در ویندوز معرفی کرده.
پیش نیازها:
انگیزه داشته باشید:
انگیزه در یادگیری توسعه اکسپلویت امری کلیدی هستش. بجای اینکه خودتون رو مجبور به گذروندن موضوعاتی کنید که احساس خستگی میکنید، به علایق خودتون عمل کنید. اگه علاقه خودتون رو از دست دادید، موضوع رو عوض کنید و بعداً برگردید. حفظ انگیزه مهمتر از دنبال کردن ترتیب “درست” هستش. در طول این مسیر ناامید خواهید شد، ناامیدی بخش کلیدی توسعه اکسپلویت هستش و شما باید یاد بگیرید که اونرو بپذیرید و به پیش برید.
یادگیری زبان برنامه نویسی C :
یادگیری C به معنای تبدیل شدن به یک برنامهنویس C نیست، بلکه درک مدل حافظه CPU هستش. از اونجایی که باگهای خرابی حافظه در این سطح به حافظه حمله میکنن، C دقیقترین مدل ذهنی رو ارائه میده.
شما باید درک جامعی از حافظه نرمافزار، مناطق مختلف، تخصیص ها و اشاره گرها داشته باشید. پست Evan Miller با عنوان “You Can’t Dig Upwards” مدل ذهنی رو که از نوشتن C بدست میارید و در زبانهایی مانند پایتون بدست نمیارید رو توضیح میده.
کد ماشین/زبان اسمبلی x86-x64 :
بسیاری از منابع توصیه شده بر روی اکسپلویت کردن باینریهای x86-x64 تمرکز دارن که در دسکتاپها و لپتاپها رایج هستن. برخلاف برنامهنویسها، توسعه دهندگان اکسپلویت با کد ماشین “خام” کار میکنن که فاقد اکثر امکانات موجود برای برنامهنویسهاست.
درک اونچه که خود CPU میبینه مهمه. برخی از موضوعات مهم برای درک، شامل موارد زیر هستن:
- رجیسترها و نحوه ی استفاده از اونا
- قراردادهای فراخوانی توابع و سیستم کالها (Syscall)
- تقسیم بندی حافظه (Memory segmentation)
- ترجمه نوعهای سطح بالا به بایتهای خام (raw bytes) (در اسمبلی، همه چیز فقط بایت در حافظه یا رجیستر هستش)
برای یادگیری این موارد میتونید از دوره ی رایگان مهندسی معکوس نرم افزار (Software Reverse Engineering) استفاده کنید که با محوریت درک کدهای اسمبی در حال انتشار هستش.
دانش یک زبان اسکریپت نویسی:
اکسپلویت کردن شامل تعامل با نرمافزارهای دیگه هستش که اغلب با استفاده از یک زبان اسکریپتنویسی انجام میشه. پایتون و کتابخونه PwnTools انتخابهای رایجی هستن، اما هر زبانی دیگه ای رو میتونید برای این کار انتخاب کنید.
دانش اولیه استفاده از لینوکس:
بیشتر منابع مبتنی بر لینوکس هستن، بنابراین باید با ترمینال لینوکس و ابزارهای خط فرمان رایج راحت باشید.
Pwn College – Fundamentals :
بخش Fundamentals ماژولهایی رو ارائه میده که بیشتر این موضوعات رو پوشش میدن و ارزش بررسی قبل از شروع رو دارن.
راه اندازی محیط:
منابعی که اینجا معرفی میشن، سعی شده مواردی باشن که به راحتی در دسترس باشن. مشکل اصلی نسخه ی قبلی رودمپ، این بود که راه اندازی یک محیط کاری سخت بود.
بیشتر منابعی که اینجا معرفی شدن رو میتونید با یک ویرایشگر متن برای یادداشتهای شخصی و یک مرورگر طی کنید. البته برای اجرای برخی از باینری ها باید دسترسی به لینوکس داشته باشید که برای این کار میتونید از یک ماشین مجازی استفاده کنید. البته یک بخش اختیاری هم وجود داره که هدفش بررسی توسعه ی اکسپلویت در معماری های دیگه هستش و بنابراین برای این بخش، نیاز به اجرای باینری در Qemu دارید.
مسیر یادگیری:
Pwn College – قسمت اول :
از زمان انتشار اولین نسخه Pwn College در سال 2020، این مجموعه به یک رودمپ پیشرو برای یادگیری توسعه اکسپلویت تبدیل شده. در این مجموعه ترتیب مطالب رعایت نشده اما هنوز هم یک منبع رایگان شگفتانگیز از دانشگاه ایالتی آریزونا هستش و اگه مشکل یا سوالی داشتید، میتونید از دیسکوردشون استفاده کنید. دورهها با سال تحصیلی بروزرسانی میشن.
Pwn College – CSE 466 – Fall 2023 :
این دوره اصلیِ که مردم هنگام صحبت در مورد Pwn College بدون قید و شرط به اون اشاره میکنن. این دوره روی سرریزهای مبتنی بر پشته (Stack-Based Overflows) تمرکز داره و نقطه شروع خوبی برای مسائل خرابی حافظه هستش.
میتونید از قسمت Foundations/Refreshers Dojo صرف نظر کنید، مگه اینه که نیاز به یادآوری داشته باشید. بقیه ماژولها رو به ترتیب تا پایان Program Exploitation تکمیل کنید.
شما دو چیز مهم از این ماژولها بدست میارید:
- تجربه سرریزهای مبتنی بر پشته در یک محیط نسبتا مدرن همراه با اقدامات کاهشی فعال.
- مهارتهای تفکر خلاق و جانبی بهبود یافته از ماژولهای Shellcoding و Sandboxing. این ماژولها به شما کمک میکنن تا ذهنیت مناسبی برای مقابله با محدودیتهای اکسپلویت کردن در دنیای واقعی رو توسعه بدید، حتی اگه شرایط ساختگی باشن.
ROP Emporium :
Pwn College یک ماژول Return Oriented Programming (ROP)، داره. اگه با ROP Emporium مشکل دارید میتونید از این ماژول استفاده کنید که Labهای اون سرعت یادگیری ملایمتری داره.
ROP Emporium فراتر از ماژول Pwn College میره، همچنین چالشهاش رو در چندین معماری ارائه میده. شما باینریهای x86-x64 رو مطالعه میکنید اما توصیه شده در برخی موارد برای تکمیل مطلب، چالشهای ARM رو هم انجام بدید. این فرآیند به تقویت درک شما از حملات استفاده مجدد از کد (Code-Reuse Attacks) کمک میکنه. در حالیکه معماری اساساً چیزی رو تغییر نمیده، اما محدودیتهایی رو اضافه میکنه که صرفاً از حفظ مراحل جلوگیری میکنه و درک عمیقتری از کاری که انجام میدید رو ایجاد میکنه.
در حوزه ی امنیت سایبری، حملات استفاده مجدد از کد به دسته ای از حملات گفته میشه که هکرها در اون به جای نوشتن اکسپلویت کامل، از قطعات کد موجود در خود برنامه برای اجرای دستورات دلخواهشون استفاده میکنن.
بصورت کلی دو روش وجود داره:
- ROP (Return-Oriented Programming): یکی از رایج ترین تکنیکهای استفاده مجدد از کد هستش. در این روش، هکرها با استفاده از دستورالعمل های موجود در برنامه، یک زنجیره از دستورالعمل ها رو ایجاد میکنن که بهشون گجت میگن و معمولا با دستور RET تموم میشن.
- JOP (Jump-Oriented Programming): مشابه ROP هستش، اما به جای استفاده از دستورالعمل RET، از دستورالعمل JMP استفاده میکنه.
Open Security Training – Vulnerabilities 1001 :
تا اینجای مسیر شما عمدتاً با سرریزهای بافر مبتنی بر پشته آشنا شدید. این سادهترین نقطه شروع هستش چون فرآیند، تغییر زیادی نمیکنه. با این حال، در دنیای واقعی، ما با انواع مختلف باگها سروکار داریم که میتونن حافظه رو فراتر از سرریزهای ساده بافر خراب کنن.
دوره Open Security Training بر درک تئوری پشت این مسائل، نه اکسپلویت کردن، تمرکز داره. این دوره انواع مختلف آسیبپذیریها و کلاسهای خرابی رو پوشش میده. با Stack-Based Linear Overflows شروع میشه و به مسائل مربوط به Heap، Out-Of-Bound Access و مسائل مختلف اعداد صحیح (Integer) میپردازه.
Pwn College – قسمت دوم:
آسیب پذیری Race Condition در CSE 466، برای تمرکز بیشتر روی ROP و داشتن یک جریان روانتر حذف شد. با این حال، Race Condition یک کلاس باگ رایج هستش. بنابراین ارزش این داره که اینجا بیشتر در موردش بدونید، حتی اگه این ماژول، خیلی روی مسائل خرابی حافظه متمرکز نباشه، اما هنوز هم مقدمه خوبی برای مسائل همزمانی (Concurrency) هستش.
CSE 598 – Spring 2024 – Format String Exploits :
حملات رشته فرمت (Format String) سابقه طولانی دارن و معمولا دومین کلاس باگی هستن که افراد در اکسپلویت باینری با اون درگیر میشن. اونا توانایی بسیار قدرتمندی برای خراب کردن حافظه به روشی هدفمند فراهم میکنن. با توجه به پیش زمینه دوره Vulns 1001، شما میتونید به سرعت این حمله رو یاد بگیرید.
CSE 598 – Spring 2024 – File Struct Exploits :
این ماژول اولین قدم به سمت “خرابی حافظه ی مدرن” هستش، جایی که شما شروع به استفاده از خرابی برای تغییر رفتار به روشهای مفیدتر، بجای اکسپلویتهای یکبار مصرف میکنید.
CSE 598 – Spring 2024 – Dynamic Allocator Misuse :
در حالیکه این ماژول بر روی تخصیص دهنده (Allocator) پیش فرض glibc تمرکز داره، اما جایگزینی برای هر نرمافزار نسبتاً پیچیدهای هستش. بسیاری از برنامه ها دارای این نوع ساختارهای داده انتزاعی مانند لیست پیوندی یا درخت دودویی هستن که میتونن اهداف خرابی شما باشن. تخصیص دهنده فقط یک نقطه شروع بسیار مناسب برای یادگیری هدف قرار دادن این ساختارهای داخلی هستش.
CSE 598 – Spring 2024 – Exploitation Primitives :
در این ماژول، ایده هایی ارائه میشه تا بتونید در مورد اکسپلویت کردن به روشهای کم و بیش مدرن فکر کنید.
Weird Machines:
یک Weird Machine اساساً یک مدل محاسباتی ناخواسته هستش که به دلیل یک آسیبپذیری در یک سیستم ایجاد میشه.
برای درک ساده تر مفهوم Weird Machine یک مثال میزنم:
تصور کنید یک ماشین حساب دارید. این ماشین حساب برای انجام عملیات ساده مثل جمع، تفریق، ضرب و تقسیم طراحی شده. اما بدلیل یک ایراد نرمافزاری، وقتی شما اعداد خیلی بزرگ رو وارد میکنید، به جای جواب درست، شروع میکنه به نمایش اعداد تصادفی یا حتی حروف.
ماشین حساب، که در اصل برای انجام عملیات ریاضی طراحی شده بود، به دلیل یک مشکل، به یک ماشین دیگه تبدیل شده که کارهای غیرمنتظرهای انجام میده. این ماشین جدید که به صورت ناخواسته ایجاد شده، همون چیزی هستش که ما بهش “Weird Machine” میگیم.
در اصل این مدل ذهنی “Weird Machine” هستش که دوران مدرن اکسپلویت رو تعریف میکنه.
LiveOverflow چندین ویدیو برای توضیح این مفهوم منتشر کرده که میتونید ازش استفاده کنید:
Thomas Dullien و Halvar Flake دیدگاه آکادمیکتری در مورد Weird Machine در مقاله خودشون در سال 2015 با عنوان Weird Machines, Exploitability, and Provable Unexploitability دارن. ارائه ایشون در RuhrSec در سال 2018 هم یک منبع عالی هستش.
CSE 598 – Spring 2024 – Windows Crash Course:
این ماژول برای کسانی هستش که میخوان توسعه اکسپلویت رو در ویندوز انجام بدن. ماژول خیلی عمیقی نیستش اما نشون میده که اکسپلویت کردن اساساً در سیستم عاملهای مختلف تفاوتی نداره. اگه اصول اولیه اکسپلویت رو درک کنید، تغییر به یک سیستمعامل دیگه چالش بزرگی نیست.
در این مرحله، اگه چند رایتآپ ویندوزی رو متناسب با هدفتون انتخاب و مطالعه کنید، براحتی میتونید خودتون رو بروز کنید.
ادامه یادگیری:
نویسنده اعلام کرده که میتونه این رودمپ رو اینجا تموم کنه، چون اگه به این مرحله برسید، شما اصول اولیه رو کسب کردید و آماده هستید تا چالش های اکسپلویت کردن خودتون رو داشته باشید. اگرچه مفاهیم زیادی هنوز مونده که شما باهاشون مواجه نشدید، اما دانش پایه ای برای درک اونا رو دارید.
در ادامه نویسنده، گزینه هایی رو برای ادامه یادگیری توصیه کرده:
Guyinatuxedo’s Nightmare :
در حالیکه این منبع، به عنوان یک دوره مستقل هستش که میتونید روش کار کنید، اما اونو به عنوان یک «ماجراجویی یادگیری انتخابی خودتون» در نظر بگیرید. موضوعی رو که به اون علاقه دارید رو انتخاب کنید و چالشها رو خودتون انجام بدید.
GLibc Heap Exploitation :
در گذشته، مقالات Malloc Maleficarum و Malloc Des-Maleficarum مقالات آموزنده و چشمگیری بودن. اونا به پتانسیل خرابی کوچک، برای ایجاد تأثیر عظیم به دلیل اثرات جانبیشون، بجای اینکه مستقیماً منجر به خطر بشن، اشاره کردن. این مفهوم که در اون، باگهای کوچک میتونن به چیزی بزرگتر زنجیر بشن، دلیل ارزشمند بودن یادگیری در مورد حملات تخصیص دهنده هیپ (Heap Allocator Attacks) هستش، حتی اگه قصد حمله به خود تخصیص دهنده خاص رو نداشته باشید.
یک منبع پولی برای این مورد، Max Kamper’s HeapLAB series هستش. اگه مورد رایگان بخوایید، ماژولهای Dynamic Allocator Exploitation و Shellphish’s how2heap رو میشه معرفی کرد.
CTF To Real World :
این، عنوان یک سری از بلاگهایی هستش که توسط نویسنده نوشته شده. در حالیکه عنوان ممکنه به حرکت از CTF ها اشاره کنه، تجربه قبلی CTF ضروری نیست. این سری روی حرکت از درک اکسپلویت در موقعیتهای آسیبپذیر عمدی، مانند CTFها، به مقابله با اهداف دنیای واقعی تمرکز داره.
این سری بلاگها، مهارتهایی رو که باید شروع به تمرین و یادگیری اونا کنید، همراه با برخی توصیه ها در مورد نحوه انجام موثر اونارو پوشش میده.
آموزشهای پولی:
نویسنده گفته که سوالات زیادی در این خصوص دریافت کرده، اما با وجود منابع رایگان زیاد، آموزش های پولی رو توصیه نمیکنه.
اما اگه آموزش پولی میخوایید، دوره ی Ret2 Fundamentals of Software Exploitation رو معرفی و اعلام کرده که بهترین دوره ی آموزشی آنلاین هستش. این دوره بصورت ویدیویی نیستش و ممکنه برای همه خوب نباشه. با این حال این دوره، با درگیر کردن شما با کلاسهای آسیبپذیری مدرن، بجای تمرکز بر سرریزهای مبتنی بر پشته و (شاید) حملات Format String مثله سایرین که اغلب در آموزش مبتدیشون انجام میدن، متمایز میشه.