همونطور که مطلع هستید ، اخیرا فورتی نت چهل آسیب پذیری در محصولات مختلفش رو اصلاح کرده. یکی از این موارد ، یه آسیب پذیری بحرانی با شناسه CVE-2022-39952 در FortiNAC بود.
FortiNAC برای کنترل دسترسی در شبکه بکار گرفته میشه و امکان مشاهده، کنترل و پاسخ خودکار برای تمام دستگاه های متصل به شبکه رو فراهم میکنه.
بطور کلی آسیب پذیری به یه مهاجم احراز هویت نشده ، امکان نوشتن فایل دلخواه و در نتیجه اجرای کد با امتیاز ROOT رو میده.
محققین horizon3 یه گزارش در خصوص علت آسیب پذیری بهمراه PoC و IoCهای این آسیب پذیری منتشر کردن که در این پست به بررسی این گزارش پرداختیم.
استخراج سیستم فایل:
در ابتدا نیاز هستش که ما محیط آنالیز و بررسی رو آماده سازی کنیم. FortiNAC بصورت ماشین مجازی قابل دسترس هستش ولی امکان دانلود رو نمیده و فایلشم تو اینترنت من نتونستم گیر بیارم. تو بخش ساپورت فورتی نت نیاز هستش که لایسنس محصول وارد کنیم تا امکان دانلود رو بده و مثله سایر محصولات ، صرفا با لاگین کردن نمیشه دانلودش کرد.
محققا از روش Patch diff استفاده کردن. یعنی نسخه اصلاح شده و آسیب پذیر رو با هم مقایسه کردن تا ببینن، در چه فایلها و ساختارهایی تغییرات ایجاد شده و از این طریق به علت آسیب پذیری برسن.
برای این منظور هر دو نسخه رو دانلود کردن و فایل سیستمشون رو استخراج کردن.
محصولات تحت تاثیر :
FortiNAC version 9.4.0
FortiNAC version 9.2.0 through 9.2.5
FortiNAC version 9.1.0 through 9.1.7
FortiNAC 8.8 all versions
FortiNAC 8.7 all versions
FortiNAC 8.6 all versions
FortiNAC 8.5 all versions
FortiNAC 8.3 all versions
نسخه اصلاح شده :
FortiNAC version 9.4.1 or above
FortiNAC version 9.2.6 or above
FortiNAC version 9.1.8 or above
FortiNAC version 7.2.0 or above
نسخه اصلاح شده ای که محققا روش کار کردن ، fortinac-9.4.1.0726.vmdk هستش.
در ابتدا نیاز هستش که ما اطلاعاتی رو در خصوص سیستم فایل و پارتیشن و … این ماشین مجازی بدست بیاریم. چرا این کار میکنیم؟ یه ماشین مجازی ممکنه چندین پارتیشن و … داشته باشه و ما میخواییم با بدست آوردن این اطلاعات صرفا اون فایل سیستم و پارتیشن مورد نظر رو بررسی کنیم.
برای این منظور محققا از یه بسته ابزار بنام libguestfs استفاده کردن . خود این ابزار شامل یسری ابزار مختلف هستش که امکان کار روی ایمیج دیسک ماشین مجازی رو فراهم میکنه. کارهایی هم که میتونید با این ابزار انجام بدید مواردی مانند مشاهده و ویرایش فایلهای داخل دیسک، مشاهده آماری از وضعیت فضای دیسک، کلون کردن ماشین مجازی ، ایجاد ماشین مجازی ، فرمت دیسک ، تغییر اندازه دیسک ، مانت و … هستش.
برای اینکه بتونیم اطلاعاتی از سیستم فایل ماشین مجازی بدست بیاریم ، از دستور زیر استفاده میکنیم:
1 |
sudo virt-filesystems --filesystems -a fortinac-9.4.1.0726.vmdk |
در ادامه میخواییم مسیر root رو مانت کنیم. برای این منظور در بسته ابزاری libguestfs ، از ابزار guestmount استفاده میکنیم. در دستور زیر ، با پارامتر m مسیر سیستم فایل دلخواهمون که از دستور بالا بدست آوردیم ، میدیم و با پارامتر ro هم که محلی که میخواییم مانت بشه رو میدیم:
1 |
sudo guestmount -a fortinac-9.4.1.0726.vmdk -m /dev/centos/root --ro /tmp/fnac941 |
بررسی آسیب پذیری :
بعد از استخراج filesystem هر دو نسخه اصلاح شده و آسیب پذیر ، محققا متوجه شدن که فایل زیر ، در نسخه اصلاح شده حذف شده.
1 |
/bsc/campusMgr/ui/ROOT/configWizard/keyUpload.jsp |
نکته: شکل بالا مرتبط با برنامه MELD هستش که یه ابزار برای مقایسه فایل و دایرکتوری و … هستش.
محتوای این فایل رو بررسی کردن و متوجه شدن که این فایل ، یه درخواست بدون احزارهویت ، که فایلی رو با پارامتر key ارسال میکنه رو، تجزیه و تحلیل میکنه و اگه فایل پیدا کنه، اونو در مسیر زیر مینویسه :
1 |
/bsc/campusMgr/config.applianceKey |
بعد از اینکه فایل با موفقیت نوشته شد، یه تابع بنام Runtime().Exec فراخوانی شده که یه اسکریپت BASH در مسیر زیر رو اجرا میکنه :
1 |
/bsc/campusMgr/bin/configApplianceXml |
این اسکریپت اولش میره به مسیر / ، بعدش یه ورژنی رو چک میکنه که مهم نیست و در آخر فایلی رو که قبلا نوشته شده بود رو از حالت فشرده خارج میکنه. بنابراین ما هر فایلی رو بخواییم میتونیم در مسیر / بنویسیم.
اکسپلویت :
نکته ای که وجود داره اینه که این نوشتن به درد ما نمیخوره. ما میخواییم یه فایلی رو بنویسیم و اجراش کنیم. برای حل این مشکل ما با دو مسئله روبرو هستیم:
- مسئله اول: به چه روشی فایل رو اجرا کنیم؟
- مسئله دوم: با چیزی که الان داریم ، چطوری مسئله یک رو پیاده کنیم؟
حل مسئله اول: به چه روشی فایل رو اجرا کنیم:
در لینوکس برای اینکه بتونیم یه کاری رو بصورت اتوماتیک انجام بدیم، میتونیم از cron job استفاده کنیم. بصورت کلی cron job کارش اینه که یه تسکی رو براساس زمان براش تعریف میکنیم و اون برامون اجرا میکنه. این تسک میتونه یه زمان مشخصی داشته باشه ، مثلا 1/1/1 ساعت 1:1 دقیقه فلان کار بکن. یا بصورت دوره ای باشه مثلا هر هفته ، جمعه ها ، ساعت 20:30 ، لینوکس رو بروزرسانی کن.
وقتی ما تسکی رو زمانبندی میکنیم ، این تسک میره و در مسیر زیر قرار میگیره :
1 |
/etc/cron.d |
در حقیت cron job در بکگراند اجرا میشه و مسیر بالا رو چک میکنه و اگه موردی براساس زمان باشه ، اونو اجرا میکنه. پس مسئله اول ما حل شد. ما میتونیم پیلودمون رو در این مسیر قرار بدیم و بگیم که مثلا بعد یک دقیقه اجرا فلان کار رو برای ما انجام بده.
حل مسئله دوم : با چیزی که الان داریم ، چطوری مسئله اول رو پیاده کنیم:
اما مشکلی که هست اینه که ما چطوری پیلودمون رو در این مسیر قرار بدیم. راه حل این مشکل هم استفاده از آسیب پذیری ZIP SLIP هستش. حالا این آسیب پذیری چیه؟
فرض کنید شما در دسکتاپ هستید و یه فایلی فشرده بنام onhexgroup.zip رو دارید که توش یه فولدر بنام seyyid و یسری فایل هستش. اگه این فایل فشرده رو از حالت فشرده خارج کنید، یه فولدر بنام seyyid ساخته میشه و فایلهاتون رو توش میریزه. حالا فرض کنید که در دسکتاپ یه فولدر بنام seyyid دارید و عمل قبلی رو دوباره انجام میدید. این بار فولدر ساخته نمیشه و فایلهاتون داخل فولدر موجود قرار میگیره.
یا یه مثال بهتر ، فرض کنید ما مشکل پرمیشن نداریم، یه فایل فشرده بنام evil.zip رو در درایو Cمون داریم. این فایل فشرده، توش یه فولدر بنام windows هستش ، تو این فولدر هم یه فولدر دیگه بنام system32 هستش و داخل اون یه فایل بنام malware.exe هستش. الان ما فایل evil.zip رو از حالت فشرده خارج کنیم ، malware.exe میره تو فولدر system32 قرار میگیره.
خب با این توضیحات ، ما میتونیم یه فایل فشرده ارسال کنیم. این فایل فشرده در مسیر / استخراج میشه. ولی ما میخواییم در مسیر /etc/cron.d/payload قرار بگیره. پس اگه یه فایل فشرده بسازیم مثلا malware.zip ، داخلش یه فولدر etc و داخل اون یه فولدر corn.d بسازیم و پیلودمون که یه تسک corn job هستش ، مثلا reverse shell ، توش قرار بدیم ، سیستم فایل payload ما رو در مسیر corn job قرار میده و اجراش میکنه. برای اینکار محققا یه PoC منتشر کردن که reverse shell میده.
IOCهای تشخیص اینکه هک شدیم:
در ادامه گزارش یسری IoC هم منتشر کرده ، تا اگه هک شدید بتونید تشخیص بدیدشون.
دستگاههای FortiNAC امکان مشاهده رابط گرافیکی رو تا زمانیکه لایسنس بهش اضافه نکنید، نمیدن ، بنابراین لاگها از این بخش قابل مشاهده نبود. با این حال اگه این آسیب پذیری اکسپلویت بشه ، لاگهاش در مسیر زیر قرار میگیره :
1 |
/bsc/logs/output.master |
اگه مهاجم این فایل رو پاک نکنه با بررسی Running configApplianceXml میتونید بررسی کنید که هک شدید یا نه :
در نهایت آسیب پذیری های نوشتن فایل ، بسته به مهاجم ، امکان حملات مختلفی رو میدن. مثلا در این مثال محققا از corn job استفاده کردن. اما ممکنه مهاجم یه باینری یا کلید SSH رو بازنویسی کنه و حملات دیگه رو انجام بده. برای همین بررسی این موارد هم میتونه کمکتون بکنه.