کارشناسان کسپرسکی در اواخر دسامبر ۲۰۲۳، برخی برنامههای کرک شدهای را کشف کردند که در وبسایتهای جعلی حضور فعال داشتند و به یک پروکسی تروجان آلوده شده بودند. عوامل مخرب، برنامههای از پیش کرک شده را به عنوان فایلهای PKG همراه با یک پروکسی تروجان تعبیه شده و یک اسکریپت پس از نصب که شروع کننده فرآیند نفوذ بود، مجددا بسته بندی کرده بودند. ما اخیراً متوجه خانواده بدافزار macOS جدید و ناشناختهای شدیم که روی نرمافزارهای کرک شده کار میکردند. این تهدید بسیار قویتر از نصب سرور پروکسی غیرمجاز میباشد و منجر به نصب یک بکدور macOS میشود.
مرحله ۱. Activator.app
کارشناسان نمونههایی را یافتند که میتوانند با موفقیت بر روی macOS Ventura 13.6 و نسخههای جدیدتر اجرا شوند، که نشان میدهد اپراتورها فقط کاربران نسخههای سیستم عامل جدیدتر را در پردازندههای اینتل و دستگاههای سیلیکونی اپل مورد هدف قرار میدهند. دیسک ایمیجهای تحت نفوذ شامل برنامهای به نام “Activator” و همچنین برنامهای است که کاربر به دنبال نصب آن میباشد.
کاربر پس از باز کردن/نصب ایمیج، با پنجرهای حاوی دستورالعمل نصب مواجه میگردد. این دستورالعمل به کاربر میگوید که برنامه را درApplications/ / کپی و سپس Activator را اجرا کند. دومی نسبتاً ساده به نظر میرسد: فقط یک دکمه PATCH که هنگام کلیک کردن، یک اعلان رمز عبور را نمایش میدهد.
نگاهی دقیقتر منجر به کشف حقیقت گردید؛ برنامه موجود در فولدرResources (منابع) به نوعی حاوی یک نصبکننده Python 3.9.6 و یک فایل Mach-O اضافی با نام ابزار بود. فایل اصلی Fat Mach-O، که به طور واضح GUI نامیده میشود، در اصل دکمه PATCH را پیادهسازی میکند که با کلیک بر روی آن دو رویداد راهاندازی میشود:
- کپی شدن نصب کننده پایتون در دایرکتوری فایل /tmp/.
- ابزار قابل اجرا در پوشه Resources با سطح دسترسی admin اجرا میشود. برای فعال کردن این مورد، Activator از تابع منسوخ شده AuthorizationExecuteWithPrivileges استفاده کرده که پنجرهای را با اعلان رمز عبور admin باز میکند.
ابزار پس از اجرا، سیستم را برای یک کپی نصب شده از Python 3 بررسی میکند و اگر موردی را پیدا نکرد، چیزی را که قبلاً در /tmp/ کپی کرده بود، نصب میکند و پس از آن، برنامه دانلود شده را “وصله” خواهد کرد. ابزار در واقع ۱۶ بایت اول فایل اجرایی اصلاح شده را با یک دنباله کدگذاری شده در Activator مقایسه و در صورت تطابق آنها را حذف میکند:
اپلیکیشن به طرز جالبی شروع به کار کرده و به نظر می رسید که کرک شده باشد. ترفند این بود که عوامل مخرب نسخههای از پیش کرک شده برنامه را گرفته و چند بایت به ابتدای فایل اجرایی اضافه می کنند و آنها را غیرفعال می کردند تا کاربر ملزم به راه اندازی Activator شود.
مرحله ۲. یک دانلودر
یک “وصله” کامل، پیلود اصلی را با نمونهای به دنبال یافتن اسکریپت رمزگذاریشده به c2 خود آغاز میکند. این برنامه URL سرور فرمان و کنترل (C2) را با ردیف کردن کلمات از دو لیست هاردکد شده و اضافه کردن یک دنباله تصادفی از پنج حرف به عنوان نام دامنه سطح سوم به دست آورده است. یک “پچ” کامل، لود اصلی را با نمونهای به دنبال یافتن اسکریپت رمزگذاری شده به c2 خود آغاز کرد.
نمونه، درخواستی را توسط این URL، به سرور DNS به عنوان تلاشی برای دریافت رکورد TXT برای دامنه ارسال میکند. این، یک روش نسبتاً جالب و غیرمتداول برای تماس با یک سرور فرمان و کنترل و پنهان کردن فعالیت در داخل ترافیک میباشد و دانلود پیلود را تضمین میکند، چرا که پیام پاسخ از سرور DNS میآمد. رکوردهای TXT میتوانند حاوی جزئیات دامنههای متفرقهای باشند که ممکن است برنامه به آنها نیاز داشته باشد. از این رو، درخواستی مانند آنها کاملاً عادی به نظر میآید.
کارشناسان کسپرسکی هر ترکیب ممکنی از کلمات کدگذاریشده را امتحان کردند، که برای هر نمونهای که مطالعه شد یکسان بود، تا فقط یک نام دامنه کاربردی مشاهده گردید و آن همimohub[.]net بود. نام دامنه دقیق سطح سوم تا زمانی که بخشی از درخواست باشد، نامرتبط است. پاسخ سرور DNS شامل سه رکورد TXT میباشد که برنامه بعداً آنها را پردازش میکند تا یک پیام کامل را جمع آوری نماید.
نام دامنه دقیق سطح سوم تا زمانی که بخشی از درخواست بود بیربط بود. پاسخ سرور DNS شامل سه رکورد TXT میشد که برنامه بعداً آنها را پردازش کرد تا یک پیام کامل را جمعآوری کند. هر رکوردريال یک قطعه متن رمزگذاری شده با Base64 میباشد که بایت اول آن حاوی یک شماره دنباله (توالی) است که در طول اسمبلی حذف شده است. این متن رمز در حالت CBC با AES رمزگذاریشده است. پیام رمزگشایی شده حاوی اسکریپت پایتون میباشد.
ابزار پیش از اجرای اسکریپت، مراحل زیر را طی میکند:
محاسبه هش اسکریپت و اطمینان از اینکه قبلاً راه اندازی نشده باشد. برای این کار، متغیرهای محیطی را برای کلید lastExecutedScriptHash جستجو کرده در صورت مشاهده، هش را با دادههای ذخیره شده در زیر کلید مقایسه میکند. اگر هش ها مطابقت داشته باشند، اسکریپت را راه اندازی نخواهد شد. اگر هشها متفاوت باشند، آنگاه ابزار، اسکریپت را اجرا کرده و هش را در متغیر جایگزین خواهد کرد. اگر متغیرهای محیطی حاوی کلید نباشند، ابزار یکی را ایجاد کرده و هش اسکریپت فعلی را در آن ذخیره میکند.
جایگزینی ” _g_ ” در پیوند داخل اسکریپت با یک دنباله تصادفی از ۶۴ کاراکتر که مشابه یک هش است. نوشتن یک اسکریپت در var/root/Library/Caches/<uuid>.py / که هر ده ثانیه تمام فرآیندهای NotificationCenter را خاتمه میدهد.
نوشتن دو عاملی که اسکریپتها را در reboot به طور خودکار راه اندازی میکنند در /Library/LaunchAgents/launched.<uuid> .
همانطور که از اسکریپت رمزگشایی شده پیداست، هر ۳۰ ثانیه یک بار به apple-health[.]org مراجعه کرده و سعی میکند اسکریپت را دانلود و اجرا کند. ۱۴,۴۰۰ ثانیه به اسکریپت زمان داده شده است تا اجرا شود و پس از آن، فرآیند خاتمه یافته و نسخه جدیدی از اسکریپت دانلود میگردد.
مرحله ۳. یک بکدور
در ابتدا به نظر میرسید که اسکریپت دانلود شده یک پایتون قدیمی باشد، زیرا سرور فرمان و کنترل apple-health[.]org به درخواستها پاسخ نمیداد. با این حال، محققان پس از مدتی، موفق شدند یک پیلود را در قالب یک اسکریپت پایتون دیگر به دست آورند. این موفقیت سرانجام اهداف اپراتورهای بدافزار را آشکار کرد. عملکرد اصلی اسکریپت، اجرای دستورات دلخواه بود که آنها را از سرور دریافت میکرد. با قضاوت بر اساس کد پردازش فرمان، این کدها اغلب به شکل اسکریپتهای پایتون کدگذاریشده با Base64 ظاهر میشوند.
اسکریپت علاوه بر اجرای دستورات، اطلاعات زیر را جمع آوری و به سرور ارسال میکند:
- نسخه سیستم عامل
- لیستی از دایرکتوریهای درون Users//
- فیلد خالی ” av” احتمالاً با اطلاعاتی در مورد وجود برنامه های ضد بدافزار[1] در نسخه های بعدی پر می شود.
- لیست برنامههای نصب شده
- نوع CPU
- آدرس IP خارجی
- فیلد خالی ” ver ” که احتمالاً برای ارسال اطلاعات در مورد نسخه پیلود استفاده میشود.
سرور در زمان بررسی محققان، به طور مشخص هیچ فرمانی را باز نگرداند و بعداً نیز به طور کلی از پاسخ دادن منصرف شد. از این رو، محققان اسکریپت مرحله سوم پایتون را مجددا دانلود کردند و متوجه شدند که نسخه جدید حاوی یک سری تغییرات است. توسعه دهندگان به طور خاص، ” metadata ” (متادیتا) ذخیره شده در ابتدای برنامه و حاوی آدرس IP سرور C2 و نام دامنه، و GUID برنامه و نسخه را تغییر داده بودند. این موارد ظاهراً به محض تغییر آدرس IP سرور، که تقریباً هر ۱۰ تا ۲۰ دقیقه یکبار اتفاق میافتد، بهطور خودکار در داخل اسکریپت بهروزرسانی میشوند. همچنین بهروزرسانیهایی برای کد عملکردی وجود داشت که باید توسط انسان ساخته میشد (تصاویر زیر را مشاهده کنید).
این نشان می دهد که کمپین بدافزار هنوز در حال انجام است. دستوراتی که ما سعی داشتیم از سرور دریافت کنیم ممکن است هنوز نوشته نشده باشند.
رباینده رمز ارز کهنه کار
اسکریپت علاوه بر ویژگی های ذکر شده، حاوی دو تابع قابل توجه دیگر نیز بود: check_exodus_and_hash() و check_btccore_and_hash().
هر دو دارای دامنه apple-analyser[.]com بودند که به عنوان میزبان برای پیلودهای بیشتر خدمت می کرد. این دو تابع، دارای یک هدف مشابه میباشند. بررسی اینکه آیا دستگاه دارای یک برنامه کیف پول کریپتو مربوطه است یا خیر، و اگر چنین است، آن را با یک برنامه دانلود شده از apple-analyser[.]com جایگزین میکند.
علاوه بر برنامه، سرور همچنین یک نسخه تمیز از فریمورک Electron را برای راهاندازی نسخه جدید Exodus و تنها برای اجرای دستور Shell زیر هنگام آغاز Exodus.app مورد نیاز است.
do shell script “~/electron/Electron.app/Contents/MacOS/Electron ~/exodus”
quit
آیا اپراتورهای بدافزار واقعا آنقدر مهربان بودند که به قربانیان خود در به روز رسانی کیف پول به عنوان غرامت کمک کنند؟ افسوس که چنین امیدی ساده لوحانه بود و آلودگی هر دو کیف پول اثبات شده است. عوامل مخرب، Exodus را با جاسازی برنامه خود در ابتدای برنامه، آلوده کرده بودند، فایل main/index.js که اولین فایلی بود که هنگام راه اندازی برنامه آغاز گردید.
کد موجود در اسکرین شات به ما می گوید که برنامه با نام 334b4425988b47a5b67c92518f9815c6 مقداری داده را به کانال ارسال کرده است که متعاقباً به 22[.]imohub[.]workers[.]dev ارسال شده است. تنها کاری که محققان میبایست انجام میدادند، این بود که قطعه دقیقی از کدی را که دادهها را ارسال میکرد، پیدا کننند و این … drumroll… wallet/index.js بود. از آنجایی که کد هیچ اینتر یا تورفتگی نداشت، ما به آن فرمت مناسب دادیم و بررسی کردیم که ببینیم آنجا چه اتفاقی می افتد.
عوامل مخرب، یک فراخوانی را به کنترل کننده باز کردن قفل کیف پول اضافه کرده بودند که به سادگی یک عبارت اولیه وارد شده را از طریق کانال به C2 ارسال میکرد و هیچ گونه ویژگی جدید دیگری مشاهده نگردید.
Bitcoin-Qt یک فایل جاوا اسکریپت نبود، بلکه یک Mach-O تمام عیار بود. محققان کسپرسمی همانطور که کد C2 را از Exodus جستجو میکردند، متوجه شدند که Bitcoin-Qt شیوه مشابهی دارد: این برنامه رمز باز کردن قفل کیف پول همراه با کیف، نام آن و موجودی را به سرقت برده است.
بنابراین، این برنامه حتی در غیاب دستورات دریافتی از C2، همچنان میتوانست با سرقت کیف پولهای کریپتو، آسیب قابل توجهی به کاربر وارد کند.
سخن پایانی
برنامههای کرک شده فوق یکی از سادهترین راههای دسترسی عوامل مخرب به رایانههای کاربران میباشند و آنها به منظور افزایش سطح دسترسی خود، میبایست تنها رمز عبور را بیابند که معمولاً در هنگام نصب نرم افزار هیچ شکی را برای کاربران ایجاد نمیکند. با این حال، برخی از مواردی که نویسندگان کمپین بدافزار به آن دست یافته بودند، مانند قرار دادن اسکریپت پایتون در یک رکورد TXT دامنه روی سرور DNS، به طور جدی مبتکرانه بودند. این اسکریپت بعداً به عوامل راهاندازی اضافه شد تا بارگیری پیلود مرحله بعدی را در یک حلقه بینهایت دانلود و اجرا کند، که اپراتورهای بدافزار را قادر میسازد تا بهروزرسانیها را به دستگاه آلوده ارائه نمایند. پیلود نهایی، یک بکدور میباشد که میتواند هر اسکریپتی را با سطح دسترسی admin اجرا کند و برنامههای Exodus و بیتکوین را جایگزین برنامههای کیف پول کریپتو نصب شده بر روی دستگاه با نسخههای آلوده نماید و عبارات بازیابی مخفی را در لحظه باز شدن کیف پول برُباید.
IoC
MD5
آدرسهای سرور فرمان و کنترل
imohub[.]net
22[.]imohub[.]workers[.]dev
apple-analyser[.]com
apple-health[.]org