در سال 2019 محققان امنیتی در Unit 24، ظهور بدافزار مورد استفادهی گروه [جرایم سایبری] Rocke که تجیهزات ابری را برای استخراج رمزارز Monero مورد حمله قرار میداد، ثبت و تایید کردند. از آن زمان با اقدامات موسسات امنیتی جهت ایجاد اختلال در عملکرد این بدافزار، Rocke بدافزار مورد بحث را بهروزرسانی نمود.
در ادامه به بررسی نسخهی تغییر یافتهی این بدافزار (طبق گزارش محققان امنیتی در Unit 24) که در حال حاضر شامل قابلیتهای جدید و بهبود یافتهی rootkit و worm است، میپردازیم. نام این بدافزار طبق نامی که مهاجم برای اسکریپت نصب بدافزار انتخاب کرده بود، Pro-Ocean نامگذاری شده است.
بررسی بدافزار
بدافزار Pro-Ocean از آسیبپذیریهای شناختهشده برای تهدید برنامههای کاربردی ابری استفاده میکند. طبق تحلیلهای صورت گرفته توسط محققان امنیتی، شواهد نشان میدهد که بدافزار Pro-Ocean آسیبپذیریهای موجود در Apache ActiveMQ (CVE-2016-3088) ،Oracle WebLogic (CVE-2017-10271) و موارد آسیبپذیر Redis را هدف قرار میدهد. در صورتیکه بدافزار در ابرهای Tencent یا Alibaba اجرا شود، دقیقاً از کد بدافزار قبلی برای حذف برنامههای نظارتی و مانیتورینگ و جلوگیری از تشخیص، استفاده میکند؛ همچنین تلاش میکند سایر بدافزارها و ماینرها از جمله Luoxk، BillGates، XMRig و Hashfish را قبل از نصب حذف کند. پس از نصب، بدافزار هر فرآیندی که مصرف CPU بالایی دارد، از بین میبرد تا امکان استفادهی صددرصدی از پردازنده و استخراج رمزارز Monero را فراهم کند.
اگرچه بدافزار Pro-Ocean در راستای پنهان کردن ماندن سعی دارد خود را بیخطر معرفی کند، اما از ماینری به نام XMRig استفاده میکند که در عملیات و حملات cryptojacking شهرت نسبتاً بالایی دارد. این ماینر با استفاده از لایههای متعدد مبهمسازی روی کد مخرب سعی در پنهان ماندن دارد:
- کد باینری با استفاده از UPX[1] بستهبندی شده است. این بدان معنی است که بدافزار اصلی درون باینری فشرده شده است و حین اجرای باینری استخراج و اجرا میشود.
- ابزارهای پیشرفتهی تحلیل ایستا توانایی گشودن باینریهای UPX و پویش محتوای آنها را دارند. اما در این مورد magic string[2]های UPX از باینری حذف شدهاند و بنابراین ابزارهای تحلیل ایستا قادر نخواهند بود باینری را به عنوان UPX شناسایی کرده و پویش کنند.
- ماژولها درون باینری گشوده نشده، به صورت gzip فشرده شدهاند.
- باینری XMRig درون یکی از ماژولهای gzip شده قرار دارد و همچنین توسط UPX بستهبندی شده است و در عین حال magic stringهای UPX را ندارد.
در شکل 1 لایههای مبهمسازی مذکور نشان داده شده است.
بدافزار Pro-Ocean، برنامههای کاربردی ابری متعددی از جمله Apache ActiveMQ، Oracle Weblogic و Redis را با تاکید بر عرضهکنندگان ابری در چین از جمله Alibaba و Tencent هدف قرار میدهد. بدافزار به زبان Go توسعه داده شده و به یک معماری x64 کامپایل میشود؛ همچنین حاوی چهار ماژول است که حین اجرا، پنهان شدن، استخراج، آلودهسازی و نظارت مورد استفاده قرار میگیرند. هر ماژول شامل تعدادی فایل است که به زبانهای گوناگونی (C، پایتون و Bash) نوشته شدهاند و یک اسکریپت Bash که ماژول را اجرا میکند.
ماژولها
چهار ماژول بدافزار Pro-Ocean درون باینری به صورت gzip فشرده شدهاند و یکی پس از دیگری استخراج شده و به وسیلهی چهار تابع مختلف که در شکل زیر نشان داده شده است، اجرا میشوند.
در ادامه به طور دقیقتر به بررسی معماری بدافزار میپردازیم:
ماژول پنهانسازی (قابلیتهای Rootkit):
ماژول پنهانسازی وظیفهی مخفی کردن فعالیتهای مخرب بدافزار را بر عهده دارد. این ماژول از یک ویژگی اصلی و native لینوکس یعنی LD_PRELOAD استفاده میکند. LD_PRELOAD باینری را وادار میکند تا کتابخانههای معینی را قبل از سایر کتابخانهها بارگذاری کند و از این طریق امکان بازنویسی هر تابعی از هر کتابخانهای توسط کتابخانههای از پیش بارگذاری شده، فراهم خواهد شد. یکی از راههای استفاده از LD_PRELOAD، افزودن کتابخانه مذکور به مسیر /etc/ld.so.preload است.
بدین ترتیب، به محض اجرا، باینری این کتابخانه را بارگذاری کرده و به جای استفاده از توابع موجود در کتابخانههای پیشفرض از توابع این کتابخانه استفاده میکند. این ویژگی عموماً توسط سایر بدافزارها مورد سواستفاده قرار میگیرد.
حین اجرا، ماژول پنهانسازی یک فایل C را به باینری کامپایل کرده و به مسیر /etc/ld.so.preload اضافه میکند. این کتابخانه حاوی تعداد زیادی تابع است که معمولا توسط کتابخانهی libc شامل توابع open، opendir، readdir، stat، access و بسیاری دیگر ظاهر میشود. این توابع، از توابع واقعی موجود در کتابخانهی libc برای تغییر دادههای برگشتی و پنهان کردن هر گونه اطلاعاتی که موجب کشف بدافزار Pro-Ocean شود، استفاده میکنند (به عنوان مثال فرآیندها یا فایلهای مخرب). در برخی موارد، هنگام دسترسی به یک فایل خاص مانند /proc/stat دادهی جعلی برمیگرداند.
مشابه نسخهی قبلی بدافزار، در سورس کد از کتابخانهی Libprocesshider[3] برای پنهانسازی فرآیندها استفاده شده است. توسعهدهنده این کد برای دستیابی به برخی قابلیتهای rootkit، قطعات کد متعددی از اینترنت جمعآوری کرده و به کد اصلی اضافه کرده است.
به عنوان مثال تابع open از کتابخانهی libc را بررسی میکنیم. این تابع یک فایل را گشوده و شرحدهنده آن فایل را برمیگرداند، اما هنگامی که کتابخانهی مخرب بارگذاری میشود، اتفاق دیگری رخ میدهد (شکل 4).
پیش از فراخوانی تابع open، تابع مخرب، تعیین میکند که آیا نیاز است فایل مورد نظر به منظور مبهمسازی فعالیتهای مخرب بدافزار پنهان شود یا خیر. اگر تصمیم تابع مخرب بر این باشد که فایل باید پنهان شود، خطای «No such file or directory» برمیگرداند بدین معنا که فایل مورد نظر وجود ندارد.
علاوه بر این، در ماژول مورد بحث، بدافزار Pro-Ocean سعی دارد با کپی کردن خود در موقعیتهای مختلف، ساخت یک سرویس مخرب جدید که بدافزار را در صورت اجرا نشدن اجرا میکند و افزودن cron job[4]های متعدد که همین فعالیت را به صورت دورهای انجام میدهد، حضور خود را استمرار بخشیده و تثبیت کند.
ماژول استخراج (mining):
ماژول استخراج دلیل اصلی به وجود آمدن بدافزار Pro-Ocean است و هدف آن استخراج رمزارز Monero به کیف پول مهاجم است. بدافزار عمل استخراج را با بهکارگیری یک ماینر XMRig نسخهی 5.11.1 و یک پیکربندی JSON انجام میدهد. این یک عملیات معمول برای بدافزارهای cryptojacking است.
ماژول آلودهسازی (قابلیت کرمگونه):
برخلاف رفتاری که گروه Rocke در نسخه ی قبلی بدافزار از خود نشان دادند، در این نسخه بدافزار Pro-Ocean از قربانیان به طور دستی بهرهبرداری نمیکند؛ درعوض این نسخه از بدافزار از یک اسکریپت پایتون که قابلیتهای کرمگونه (worm) ارائه میدهد، استفاده میکند. این اسکریپت آدرس IP عمومی ماشین را با دسترسی به یک سرویس آنلاین (به آدرس ident.me) بدست آورده و سعی میکند همهی ماشینهای موجود در همان subnet 16 بیتی را آلوده کند. این عملیات را به امید یافتن یک نرمافزار وصلهنشده که بتوان از آن بهرهبرداری کرد، با اجرای کورکورانهی اکسپلویتهای عمومی یکی پس از دیگری انجام میدهد. قطعه کد مربوط به دریافت لیست آدرس IPها و پویش آنها برای یافتن آسیبپذیری به منظور آلوده کردن آنها در شکل 5 نشان داده شده است.
به محض یافتن نرمافزار وصلهنشده و بهرهبرداری از آن، اسکریپت پایتون، یک payload ارسال میکند. این payload یک اسکریپت نصب را از یک سرور HTTP مخرب دانلود کرده و پس از انجام یک سری آمادهسازی، بدافزار Pro-Ocean را نصب میکند.
فهرست نرمافزارهای آسیبپذیری که Pro-Ocean از آنها بهرهبرداری میکند شامل موارد زیر است:
- Apache ActiveMQ – CVE-2016-3088
- Oracle WebLogic – CVE-2017-10271
- Redis – نسخهها و موارد آسیبپذیر
از آنجایی که حین آلودهسازی، بدافزار از یک سرور راه دور بر روی ماشین قربانی دانلود میشود، نرمافزارهای آسیبپذیری که بدافزار از آنها بهرهبرداری میکند، محدود به فهرست فوق نخواهد بود (بدافزار تمامی برنامههای کاربردی ابری را هدف قرار میدهد). بنابراین میتواند تغییر کرده و بهرهبرداریها و بهروزرسانیهای دیگری به آن اضافه شود. فرآیند کلی آلودهسازی در شکل زیر مشاهده میشود.
اسکریپت نصب:
اسکریپت نصب نقش تعیینکنندهای ایفا میکند. پیش از نصب بدافزار با انجام کارهای مختلف، زمینه را برای بدافزار Pro-Ocean فراهم میکند. این اسکریپت به زبان Bash نوشته شده و مبهمسازی شده است. با مشاهدهی اسکریپت، میتوان نتیجه گرفت که هدف بدافزارAlibaba Cloud و Tencent Cloud میباشد که به ترتیب زیر عمل میکند:
- تلاش برای حذف سایر بدافزارها و ماینرها از جمله Luoxk، BillGates، XMRig، Hashfish و بسیاری دیگر. این عمل را با اجرای دستور «grep» و جستجوی سایر فرآیندها و اتصالات شبکه و سپس پایان دادن به همهی آنها انجام میدهد.
- پاک کردن تمامی وظایف cron به منظور حصول اطمینان از اینکه دیگر بدافزارها قادر به بازیابی نباشند.
- غیرفعال نمودن فایروال iptables به منظور دسترسی کامل بدافزار به اینترنت
- در مواردی که بدافزار در ابرهای Tencent یا Alibaba اجرا شود، دقیقاً از کد بدافزار نسخهی قبل برای لغو نصب برنامههای مانیتورینگ و نظارتی و جلوگیری از کشف شدن استفاده میکند (شکل 7).
- جستجو برای یافتن کلیدهای SSH و سعی در آلوده کردن ماشینهای بیشتر با استفاده از آنها
پس از آمادهسازی زمینه، اسکریپت نصب، معماری پردازندهی ماشین را تعیین میکند و تلاش میکند با استفاده از ابزارهای گوناگون از جمله curl، wget، python2، python3 و PHP باینری مطابق با معماری پردازنده را دانلود کند. کد مبهمسازی شدهای که بدافزار را دانلود میکند در شکل زیر نشان داده شده است.
ماژول نظارتکننده (watchdog – نگهبان):
این ماژول به زبان Bash نوشته شده است و دو اسکریپت Bash را با اهداف متفاوت اجرا میکند:
- program__kill30: این اسکریپت برای همیشه اجرا میشود و فرآیندهایی که بیش از 30 درصد پردازنده را استفاده میکنند (بجز فرآیندهای مربوط به بدافزار) جستجو میکند. پس از یافتن این فرآیندها آنها را kill میکند (از بین میبرد). هدف بدافزار استفادهی 100 درصدی از CPU و استخراج رمزارز Monero به طور موثر است. پس هر فرآیندی که به شدت از پردازنده استفاده کند از بین میبرد.
- Program__daemonload: این فرآیند برای همیشه اجرا میشود و بررسی میکند که آیا بدافزار در حال اجرا است یا خیر. اگر در حال اجرا نباشد، آن را اجرا میکند.
مرجع
https://unit42.paloaltonetworks.com/pro-ocean-rocke-groups-new-cryptojacking-malware/
[1] یک ابزار متن باز و آزاد برای بستهبندی فایلهای اجرایی است که از فرمتهای مختلف در سیستم عاملهای مختلف پشتیبانی مینماید.
[2] مقادیر رشتهای که مستقیماً در کد مشخص شده، بر رفتار برنامه تاثیر میگذارند و میتوانند سر منشا تولید باگ و آسیبپذیری در کد باشند.
[3] https://github.com/gianlucaborello/libprocesshider
[4] قابلیتی است در سیستم عاملهای بر مبنای یونیکس که وظیفهی اجرای برنامه در زمان بندیهای خاص را بر عهده دارد. Cron job این قابلیت را برای کاربران ایجاد میکند تا بتوانند کارها (دستورها و شل اسکریپت) را به صورت زمانبندی شده و در دورههای مشخص اجرا کنند.