تحلیل آسیب پذیری در جوملا نسخه ۳٫۴٫۴ تا نسخه ۳٫۶٫۳ – CVE-2016-9838

دسته : آسیب پذیری آموزش ایمن سازی

نویسنده :

:مقدمه

جوملا یکی از معروفترین سیستم‌های مدیریت محتوای بازمتن در سرتاسر جهان ‌است. آسیب‌پذیری از این سیستم مدیریت محتوا منتشر شده است که در نهایت موجب افزایش سطح دسترسی از کاربر مهمان به کاربر سوپر یوزر می گردد، لذا در این گزارش به بررسی آسیب‌پذیری و روش اجرای آسیب‌پذیری پرداخته می‌شود.

به طور کلی با استفاده از آسیب‌پذیری مذکور ثبت نام یوزر (حتی در صورتی که ثبت نام توسط مدیر وب‌سایت غیرفعال شده باشد) انجام می‌گردد، سپس با مشخص شدن نام کاربری و ID مدیر وب‌سایت، نام کاربری و کلمه عبور مدیر وب‌سایت تغییر داده می‌شود تا باسطح دسترسی کامل به این سیستم مدیریت محتوا ورود شود، در نهایت نیز از طریق امکانات مدیرکل وب‌سایت اقدام به آپلود شل می‌شود.

یکی از خصوصیات بارز این آسیب‌پذیری دنباله وسیعی از نسخه‌های قابل نفوذ می‌باشد به طوریکه از نسخه ۳٫۴٫۴ تا نسخه ۳٫۶٫۳ نسبت به این حمله آسیب‌پذیر می‌باشند. همچنین در بیشتر گزارشات منتشر شده در مورد این آسیب‌پذیری تنها به این موضوع اشاره شده است که امکان ثبت نام کاربر ادمین وجود دارد ولی روش به روزرسانی کاربران دیگر تعیین نشده است، که قابل توجه است که با داشتن کاربر ادمین امکان اپلود شل وجود نخواهد داشت. در واقع در این گزارش علاوه بر ساخت نام کاربری ادمین روشی برای ورود به پنل با نام کاربری سوپریوزر ارایه می‌گردد که نوآوری این گزارش می‌باشد.

 

بررسی آسیب‌پذیری:

با توجه به به‌روزرسانی انجام شده توسط جوملا می‌توان دریافت که آسیب‌پذیری در فایل به آدرس components/com_users/controllers/user.php اتفاق می‌افتد. در به روزرسانی یکی از متد‌های کلاس UsersControllerUser با نام register از سیستم مدیریت محتوا حذف شده است، در واقع این متد پارامتر‌های ورودی از کاربر که توسط POST انجام‌شده ارسال شده است را مورد بررسی قرار می‌دهد و بعضی از پارامترهای خاص آن را اعتبارسنجی می‌نماید. یعنی مثلا ورودی‌هایی همچون email,Address,username در فرمت مناسب قرار دارند یا خیر. اما نکته جالب توجه آن است که در صورت تایید مقادیر ورودی، مقادیر اضافی که به سمت سرور ارسال ‌شده است اعتبار‌سنجی نمی‌شوند و در واقع می‌توان پارامترهای دیگری همچون گروه کاربری، id کاربر را به دلخواه تنظیم یا تغییر داد. در شکل ۱ ملاحظه می‌شود که در خط ۳۱۵ اعتبار سنجی انجام شده است ولی در انتها برای ثبت نام یوزر در خط ۳۲۴ داده اولیه که کاربر ارسال نموده به مدل UsersModelRegistration ارسال شده است.
جوملا از یک کلاس دیگر نیز علاوه بر کلاس ذکر‌شده برای ثبت نام کاربران استفاده می‌نماید. این کلاس UsersControllerRegistration نام دارد که دارای متدی با نام Register است. در صورتی که متد اشاره شده مورد بررسی قرار گیرد، شباهت بسیار زیاد این دو متد قابل تشخیص است، اما هرچند این دو متد دارای شباهت زیادی می‌باشند در آنها تفاوت‌هایی وجود دارد که به نفوذگر امکان پیاده‌سازی حمله را می‌دهد. کد منبع متد register از کلاس UsersControllerRegistration را در شکل ۲ مشاهده می‌نمایید. در زیر به تفاوت‌های اساسی در متدهای register دو کلاس UsersControllerUser و UsersControllerRegistration پرداخته می‌شود.

۱- متد Register از کلاس UsersControllerRegistration قبل از هر چیز بررسی می‌کند که آیا ثبت‌نام توسط مدیر وب‌سایت فعال شده‌است یا خیر. این چیزی است که متد register اولیه بررسی نمی‌کند. از طرف دیگر چون هر دو متد به صورت عمومی در اختیار کاربر هستند می‌توان با تغییر متد دوم به متد اول حتی در صورتی که ثبت نام کاربر غیرفعال باشد اقدام به ثبت نام نمود.

۲- متد Register از کلاس UsersControllerRegistration مقدار خروجی از تابع اعتبار‌سنج را برای ثبت نام استفاده می‌نماید این در حالیست که متد register از کلاس UsersControllerUser مقدار ارسال‌شده توسط کاربر را برای ثبت نام به مدل UsersModelRegistration ارسال می‌نماید.

 

شکل ۱ – تابع register حذف شده از کلاس UsersControllerUser

 

شکل ۲– متد Register از کلاس UsersControllerRegistration

 

 

بررسی تابع اعتبارسنج

در این مرحله سوال اساسی مطرح ‌می‌گردد که چگونه این دو تفاوت کوچک موجب این آسیب‌پذیری می‌گردد. برای درک بیشتر بهتر است به بررسی تابع اعتبارسنج validate پرداخته شود. این تابع ورودی کاربر را به تابع فیلتر فرم ارسال می‌نماید که فرایندی همچون تابع فیلتر زبان PHP دارد. با استفاده از این روش داده‌های اضافی که به همراه Post ارسال شده‌اند حذف می گردند و فقط ورودی‌هایی که داخل فرم هستند نگه داشته می‌شوند. با این روش می‌توان مقادیری که به مدل ارسال می‌شود را محدود نمود. بعد از این پردازش بررسی می‌شود که کلیه ورودی‌ها در قالب معتبر خود قرار داشته باشند و سپس آرایه فیلتر‌شده برگشت داده می‌شود. حال نکته قابل توجه اینجاست که در متد register از کلاس UsersControllerUser  خروجی تابع validate به مدل ثبت‌نام کننده ارسال نمی‌شود و مستقیما ورودی کاربر به تابع ارسال‌کننده ارسال می‌گردد که این به این معناست که تمامی پارامتر‌های اضافه نیز از طریق مدل در ثبت‌نام استفاده می‌شوند. در شکل ۳ تابع اعتبار سنج را مشاهده می‌نمایید.

 

شکل ۳  – تابع اعتبارسنج

 

 

بررسی مدل ثبت‌نام

اگر به بررسی مدل ثبت‌نام که در کلاس UsersModelRegistration موجود است پرداخته شود، ملاحظه می‌شود که قبل از ذخیره داده در پایگاه‌داده، داده ارسال‌شده توسط کاربر به متد bind از کلاس JUser ارسال می‌گردد. در شکل ۴ متد ثبت‌نام از مدل اشاره‌شده را مشاهده می‌نمایید.

اساسا متد bind جفت‌های $key => $value از داده‌های ورودی کاربر را به جفت‌های $key => $value قابل شناسایی برای ذخیره تبدیل می‌نماید. این به این معناست که نفوذگر می‌تواند هر خصوصیت از کاربر که در کلاس JUser حاضر است را تغییر و یا اضافه نماید. بنابراین مساله اصلی فقط انتخاب خصوصیت مناسب برای بازنویسی و اضافه کردن است تا سطح دسترسی کاربر اضافه شود که در زیر به بررسی نمونه‌هایی از این خصوصیات پرداخته می‌شود.

  • خصوصیت $groups که شامل یک ID از نوع عددی است که نشان‌دهنده گروه کاربر مانند نویسندگان، مدیران، ادمین‌ها و … است.
  • خصوصیت $id که نشان‌دهنده شماره کاربری است که نفوذگر برای تغییر خصوصیت‌های آن در حال ارسال درخواست است.

آنچه مشخص است بعد از اضافه کردن کاربر ادمین در وب‌سایت امکان اپلود فایل‌های پکیج موجود است که از این روش می‌توان اقدام به آپلود شل نمود.

 

پیاده‌سازی عملیات نفوذ

روش پیاده‌سازی کلی حمله به صورت زیر می‌باشد که در بخش‌های بعدی به توضیح مفصلی از هر یک پرداخته می‌شود.

  1. ابتدا یک کاربر با سطح دسترسی ادمین ثبت نام می‌شود.
  2. با ورود به پنل ادمین و مشاهده لیست کاربران ID کاربر سوپر‌یوزر مشاهده و ذخیره می‌شود.
  3. با استفاده از ID کاربر سوپریوزر که در مرحله قبل تعیین شد، کاربر سوپریوزر با مقادیر جدیدی از نام‌کاربری و کلمه عبور به روزرسانی می‌گردد.
  1. با استفاده از امکان اپلود ماژول‌های مختلف در جوملا اقدام به اپلود شل می‌گردد.

شکل ۴– مدل ثبت‌کننده داده نهایی

 

 

مرحله اول :  اضافه نمودن کاربر

 

بدین منظور ابتدا می‌بایست یک cookie و token معتبر از وب‌سایت هدف جمع‌آوری نمود برای این کار صفحه لاگین وب‌سایت باز می‌شود و در بخش درخواست cookie و در قسمت ورودی لاگین token جمع‌آوری می‌گردد. صفحه لاگین در آدرس زیر قابل مشاهده است:

http://victim.com/joomla/index.php/component/users/?view=login

که cookie و token برای مثال می‌توانند مقادیر زیر باشند:

Cookie:  ۹d4bb4a09f511681369671a08beff228=0lpsp88kot705en1bidon2mlk7; c46330041075274033c86990c1022aea=kvuicgsgqi66pgbfqk0s0bl4u6; ea7fb21076fac4de3bc05366618d1aa6=5bcia7iv66h11ptskt2urbi1j1

 

Token: a12f5bcb5efba0556827cf8d49cae1

 

حال با استفاده از نرم‌افزار burpsuite مقادیر را مطابق با شکل ۵ آماده می‌گردد و به سمت سرور ارسال می‌شود.

 

شکل ۵– ارسال اولین درخواست به سرور

 

 

ممکن است نیاز به فعال‌سازی از طریق ایمیل باشد، سپس با استفاده نام‌کاربری و کلمه عبور مشخص شده به پورتال ادمین ورود می‌شود.

 

مرحله دوم: تعیین ID کاربر سوپریوزر

حال با ورود به پورتال به آدرس زیر رفته و ID کاربر سوپریوزر را مشخص می‌گردد.

http://victim.com/joomla/administrator/index.php?option=com_users&view=users

 

مرحله سوم: به‌روزرسانی کاربر سوپریوزر

 

در این مرحله فایل درخواست در شکل ۵ به صورت شکل ۶ تغییر داده ‌می‌شود تا با استفاده از آن نام کاربری و کلمه عبور کاربر سوپریوزر تغییر داده شود. نکته قابل توجه آن است که کلیه مقادیر تمامی پارامتر‌ها باید با مقدار جدید جایگزین گردند در غیر این صورت داده در پایگاه داده به روزرسانی نمی‌شود.

 

شکل ۶– تغییر نام‌کاربری و کلمه عبور سوپریوزر

 

 

مرحله چهارم: اپلود شل

حال در این مرحله با استفاده از نام‌کاربری و کلمه‌عبور به روز‌شده از کاربر سوپریوزر به پورتال ادمین ورود صورت می‌گیرد و با استفاده از لینک زیر یک ماژول که داخل آن یک فایل شل می‌باشد، آپلود می‌شود.

http://localhost/joomla/administrator/index.php?option=com_installer

 

 

 

 

 نحوه ایمن سازی :

 نسخه ی جوملای خود را به روز رسانی کرده و دسترسی آپلود ماژول را تنها به صورت دستی تنظیم کنید