روابط عمومی شرکت ایدکو (توزیعکنندهی محصولات کسپرسکی در ایران)؛ ماه ژوئن با یک کارزار ایمیلی گسترده مواجه شدیم که خود را به جای وکلای یک شرکت بزرگ معرفی میکرد. در این ایمیلها به دروغ ادعا میشد که نام دامنه دریافتکننده حقوق فرستنده را نقض کرده است. درون این پیامها اسکریپت مخرب Efimer قرار داشت که با هدف سرقت رمزارز طراحی شده بود. این اسکریپت همچنین قابلیتهای بیشتری دارد که به مهاجمان کمک میکند با آلودهسازی سایتهای وردپرسی و میزبانی فایلهای مخرب در آنها، بدافزار را بیشتر گسترش دهند.
در این مقاله قرار است به موارد زیر بپردازیم.
- روشهای انتشار:وبسایتهای وردپرسی آلوده، تورنتهای مخرب و ایمیل.
- ارتباط با مهاجمان:از طریق شبکهی Tor با سرور فرمان و کنترل خود ارتباط برقرار میکند.
- قابلیتهای افزوده:اجرای اسکریپتهای اضافی که امکان حمله جستجوی فراگیربه رمزهای عبور سایتهای وردپرسی و جمعآوری آدرسهای ایمیل برای کارزارهای مخرب بعدی را فراهم میکند.
- تشخیص در محصولات کسپرسکی
HEUR:Trojan-Dropper.Script.Efimer
HEUR:Trojan-Banker.Script.Efimer
HEUR:Trojan.Script.Efimer
HEUR:Trojan-Spy.Script.Efimer.gen
جزئیات فنی
پیشزمینه
در ماه ژوئن، ما یک کارزار ایمیلی گسترده را شناسایی کردیم که پیامهای یکسانی را همراه با یک فایل فشرده آلوده ارسال میکرد. این فایل حاوی بدافزار Efimer Stealer طراحیشده با هدف سرقت رمزارز بود. نام Efimer از کلمهای گرفته شده که در ابتدای اسکریپت رمزگشاییشده این بدافزار، در بخش کامنت ظاهر میشود. شواهد نشان میدهد نسخههای اولیه این تروجان احتمالاً از حوالی اکتبر ۲۰۲۴ ظاهر شدهاند و در ابتدا از طریق وبسایتهای وردپرسی آلوده منتشر میشدند. هرچند مهاجمان همچنان از این روش استفاده میکنند، اما از ژوئن دامنه فعالیت خود را گسترش داده و ارسال ایمیلهای مخرب را نیز به کار گرفتند.
توزیع از طریق ایمیل
ایمیلهایی که قربانیان دریافت میکردند، ظاهراً از سوی وکلای یک شرکت بزرگ ارسال شده بود. در این پیامها ادعا میشد که دامنه دریافتکننده شامل واژهها یا عباراتی است که حقوق علائم تجاری ثبتشده آن شرکت را نقض کردهاند. همچنین تهدید به اقدام قانونی مطرح میشد، اما در ادامه پیشنهاد میدادند در صورت تغییر نام دامنه، شکایت را پس بگیرند. حتی در ایمیلها تمایل خود را برای خرید دامنه نیز اعلام میکردند. نکته قابل توجه این بود که هیچگاه نام دامنه مشخصی در متن ایمیل ذکر نمیشد؛ در عوض، در پیوست، «جزئیات» مربوط به نقض ادعایی و مبلغ پیشنهادی برای خرید ذکر شده بود.
در تلاش فیشینگیِ اخیر، قربانیان ایمیلی دریافت کردند که حاوی فایل فشردهای با نام “Demand_984175” MD5: e337c507a4866169a7394d718bc19df9 بود. درون این فایل، یک آرشیو تو در تو و رمزگذاریشده همراه با یک فایل خالی به نام “PASSWORD – 47692” قرار داشت. نکته جالب توجه، روش پنهانسازی هوشمندانه مهاجمان در نام فایل رمز بود: به جای استفاده از حرف استاندارد بزرگ S، از کاراکتر یونیکد U+1D5E6 استفاده کرده بودند. این تغییر ظریف احتمالاً با هدف جلوگیری از استخراج خودکار رمز عبور توسط ابزارهای امنیتی انجام شده است. اگر کاربر آرشیو رمزگذاریشده را باز کند، با فایلی مخرب به نام “Requirement.wsf” مواجه میشود. اجرای این فایل باعث آلودگی سیستم به تروجان Efimer شده و در نهایت کاربر با نمایش یک پیام خطا روبهرو خواهد شد.
زنجیره آلودگی
این همان روندی است که معمولاً در زنجیره آلودگی رخ میدهد. زمانی که اسکریپت Requirement.wsf برای نخستین بار اجرا میشود، ابتدا سطح دسترسی کاربر را بررسی میکند. برای این کار تلاش میکند فایلی موقت با نام C:\Windows\System32\wsf_admin_test.tmp ایجاد کرده و در آن داده بنویسد. اگر این عملیات موفقیتآمیز باشد، فایل حذف میشود. ادامه فرآیند بستگی به سطح دسترسی کاربر دارد:
۱. اجرای اسکریپت با دسترسی ادمین (کاربر دارای امتیاز بالا):
- مسیر C:\Users\Public\controller به استثناهای Windows Defender اضافه میشود. این پوشه برای ذخیره فایلهای مختلف مورد استفاده قرار میگیرد.
- مسیر کامل اسکریپت WSF در حال اجرا و همچنین پردازههای سیستمی C:\Windows\System32\exeو C:\Windows\System32\cmd.exeنیز به استثناها افزوده میشوند.
- سپس دو فایل در مسیر یادشده ذخیره میشوند:
controller.js (حاوی تروجان Efimer)
controller.xml
- در نهایت یک تسک زمانبندیشده در ویندوز ایجاد میشود که از پیکربندی موجود در controller.xml استفاده میکند.
۲. اجرای اسکریپت با دسترسی محدود (کاربر عادی):
- تنها فایل controller.js در همان مسیر ذخیره میشود.
- پارامتری برای اجرای خودکار کنترلر به کلید رجیستری زیر اضافه میگردد:
o HKCU\Software\Microsoft\Windows\CurrentVersion\Run\controller
- در پایان، کنترلر از طریق ابزار WScript اجرا میشود.
- پس از آن، اسکریپت با استفاده از متدهای WScriptیک پنجره خطا نمایش داده و سپس بسته میشود. هدف از این کار، فریب کاربر است؛ به این شکل که او تصور میکند قرار بوده یک نرمافزار یا سند باز شود، در حالیکه در عمل هیچ چیز مفیدی اتفاق نمیافتد.
تروجان Efimer
اسکریپت controller.js در حقیقت نوعی تروجان از خانواده ClipBanker است. وظیفه اصلی آن جایگزینکردن آدرسهای کیف پول رمزارزی است که کاربر در کلیپبورد خود کپی میکند، با آدرسهای متعلق به مهاجم. علاوه بر این، این تروجان توانایی اجرای کدهای خارجی دریافتی مستقیماً از سرور فرمان و کنترل (C2) را نیز دارد. این تروجان در مرحله نخست با استفاده از WMIبررسی میکند که آیاتسک منیجردر حال اجراست یا خیر.
اگر«تسک منیجر»فعال باشد، اسکریپت بلافاصله متوقف میشود تا از شناسایی جلوگیری کند. اما اگر فعال نباشد، اسکریپت نصب یک کلاینت پراکسی Torروی سیستم قربانی را آغاز میکند. این کلاینت برای برقراری ارتباط با سرور فرمان و کنترل (C2) به کار میرود. اسکریپت چندین URL سختکدشده دارد تا در صورت مسدود شدن یکی از آنها، همچنان امکان دریافت نرمافزار Tor از منابع دیگر وجود داشته باشد. در نمونهای که ما بررسی کردیم، این آدرسها وجود داشت:
- https://inpama[.]com/wp-content/plugins/XZorder/ntdlg.dat
- https://www.eskisehirdenakliyat[.]com/wp-content/plugins/XZorder/ntdlg.dat
- https://ivarchasv[.]com/wp-content/plugins/XZorder/ntdlg.dat
- https://echat365[.]com/wp-content/plugins/XZorder/ntdlg.dat
- https://navrangjewels[.]com/wp-content/plugins/XZorder/ntdlg.dat
فایلی که از این مسیرها دانلود میشود در حقیقت سرویس پراکسی Tor است. تروجان آن را در مسیر C:\Users\Public\controller\ntdlg.exeذخیره میکند. اگر دانلود با شکست مواجه شود، اسکریپت خاتمه مییابد. در صورت موفقیت، اسکریپت فایل را با کمک WScript اجرا کرده و سپس به مدت ۱۰ثانیه غیرفعال میماند. این وقفه احتمالاً برای برقراری ارتباط سرویس Tor با شبکه Onion و راهاندازی آن در نظر گرفته شده است. در ادامه، اسکریپت تلاش میکند یک GUID از مسیر C:\Users\Public\controller\GUID بخواند. اگر فایل وجود نداشته باشد، تابع createGUIDیک شناسه جدید ایجاد کرده و آن را در مسیر مشخصشده ذخیره میکند. فرمت GUID همیشه به شکل vs1a-<۴کاراکتر هگزادسیمال تصادفی>است.
در ادامه، اسکریپت تلاش میکند فایلی با نام SEED از مسیر C:\Users\Public\controller\SEED بارگذاری کند. این فایل شامل عبارتهای بازیابیمربوط به کیف پولهای رمزارزی است که اسکریپت آنها را جمعآوری کرده است. جزئیات روش یافتن و ذخیره این عبارتها در بخشهای بعدی توضیح داده خواهد شد. اگر فایل SEED موجود باشد، اسکریپت ابتدا آن را به سرور ارسال کرده و سپس حذف میکند. این مکانیزم برای حالتی در نظر گرفته شده است که اسکریپت در اجرای قبلی بهطور غیرمنتظره متوقف شده باشد و نتوانسته باشد دادههای جمعآوریشده را ارسال کند. با این روش، بدافزار پیش از ارسال، دادهها را به فایل ذخیره میکند تا در صورت بروز خطا، اطلاعات از بین نرود. در این مرحله، کنترلر فرآیند راهاندازی اولیه خود را تکمیل کرده و وارد چرخه اصلی عملیات میشود.
چرخه اصلی
در هر چرخه کاری، کنترلر هر ۵۰۰میلیثانیه بررسی میکند که آیا«Task Manager» در حال اجراست یا خیر. مانند مراحل قبل، اگر فعال باشد، پردازه خاتمه مییابد. در غیر این صورت، اسکریپت شروع به پینگکردن سرور C2 از طریق شبکه Torمیکند. برای این کار، یک درخواست شامل GUID (شناسه یکتا) به سرور ارسال میشود. پاسخ سرور یک فرمان خواهد بود. بهمنظور جلوگیری از ایجاد ظن ناشی از ارسال درخواستهای بیش از حد و در عین حال حفظ ارتباط دائمی، اسکریپت از یک تایمر داخلی با متغیر p_timer استفاده میکند.
همانطور که مستحضر هستید، هر ۵۰۰میلیثانیه (نیم ثانیه)، بلافاصله پس از بررسی وضعیت «Task Manager»، متغیر p_timer یک واحد کاهش مییابد. وقتی این متغیر به صفر برسد (که در اجرای اولیه نیز صفر است)، تایمر با استفاده از فرمول زیر بازنشانی میشود: مقدار متغیر PING_INT که برابر ۱۸۰۰ است، در ۲ ضرب شده و نتیجه در p_timer ذخیره میشود. این کار باعث میشود ۱۸۰۰ثانیه یا ۳۰دقیقه تا بروزرسانی بعدی باقی بماند. پس از بروزرسانی تایمر، تابع PingToOnion فراخوانی میشود که در ادامه آن را بررسی میکنیم. بسیاری از بدافزارهای مشابه به طور مداوم شبکه را پر میکنند و سرور C2 خود را با درخواستهای مکرر بمباران میکنند. این رفتار سریعاً آنها را شناساییپذیر میکند. استفاده از تایمر به اسکریپت امکان میدهد بدون جلب توجه، ارتباط خود با سرور را حفظ کند. ارسال درخواستها تنها یک بار در هر نیم ساعت، شناسایی آنها در جریان کلی ترافیک را بسیار دشوارتر میکند.
تابع PingToOnion همراه با CheckOnionCMD عمل میکند. در این تابع، اسکریپت با استفاده از ابزار curl یک درخواست POST به سرور C2 ارسال میکند و این درخواست از طریق پراکسی Tor در localhost:9050 هدایت میشود.
http://cgky6bn6ux5wvlybtmm3z255igt52ljml2ngnc5qp3cnw5jlglamisad[.]onion/route.php
|
پس از ارسال درخواست به سرور، تابع CheckOnionCMD فوراً وارد عمل میشود. وظیفه آن بررسی پاسخ سرور در فایلی به نام cfile است که در مسیر %TEMP%قرار دارد. اگر پاسخ شامل دستور GUID باشد، بدافزار هیچ کاری انجام نمیدهد. این احتمالاً یک پاسخ PONG از سرور است که نشان میدهد اتصال با سرور C2 برقرار و سالم است. اما اگر خط اول پاسخ شامل دستور EVAL شود، به این معنی است که تمامی خطوط بعدی حاوی کدهای JavaScript هستند و این کدها توسط تابع eval اجرا میشوند. بدافزار فارغ از پاسخ سرور، سپس به دادههای کلیپبورد قربانی حمله میکند. هدف اصلی آن شناسایی عبارتهای بازیابی و جایگزینی آدرسهای کیف پول رمزارزی که کاربر کپی میکند با آدرسهای کیف پول مهاجم است.
جمعآوری و ارسال عبارتهای بازیابی
ابتدا کلیپبورد برای رشتههایی که شبیه عبارتهای بازیابیهستند، اسکن میشود. اگر چنین عباراتی یافت شود، در فایلی به نام SEED (مشابه فایلی که تروجان هنگام راهاندازی میخواند) ذخیره میشوند. سپس این فایل با استفاده از تابع PingToOnion و پارامتر action=SEEDبه سرور ارسال میشود و پس از ارسال، فایل SEED حذف میشود. در ادامه، اسکریپت ۵احتمالاً برای ثبت استفاده از عباراتبازیابی اسکرینشات گرفتهو آنها را نیز به سرور ارسال میکند.
روش گرفتن اسکرینشات
اسکرینشاتها با کمک فرمان PowerShell زیر ثبت میشوند:
powershell.exe -NoProfile -WindowStyle Hidden -Command "$scale = 1.25; Add-Type -AssemblyName System.Drawing; Add-Type -AssemblyName System.Windows.Forms; $sw = [System.Windows.Forms.SystemInformation]::VirtualScreen.Width; $sh = [System.Windows.Forms.SystemInformation]::VirtualScreen.Height; $w = [int]($sw * $scale); $h = [int]($sh * $scale); $bmp = New-Object Drawing.Bitmap $w, $h; $g = [Drawing.Graphics]::FromImage($bmp); $g.ScaleTransform($scale, $scale); $g.CopyFromScreen(0, 0, 0, 0, $bmp.Size); $bmp.Save(\'' + path.replace(/\\/g, '\\\\') + '\', [Drawing.Imaging.ImageFormat]::Png); ' + '$g.Dispose(); $bmp.Dispose();"
ارسال فایلها به سرور
تابع FileToOnion مسئول ارسال فایلها به سرور است. این تابع دو آرگومان میگیرد: خود فایل (مثلاً اسکرینشات) و مسیری که فایل باید در سرور بارگذاری شود.پس از ارسال فایل، اسکریپت برای ۵۰ ثانیه غیرفعال میماند و سپس فرآیند جایگزینی آدرسهای کیف پول رمزارزی را آغاز میکند. اگر محتوای کلیپبورد فقط شامل اعداد، حروف بزرگ و کوچک انگلیسی باشد و حداقل یک حرف و یک عدد داشته باشد، اسکریپت بررسیهای اضافی انجام میدهد تا تشخیص دهد آیا این محتوا آدرس کیف پول بیتکوین، اتریوم یا مونرو است یا خیر.
منطق جایگزینی آدرسها
بیتکوین:
- آدرسهای کوتاه بیتکوین (شروع با 1یا 3و طول ۳۲ تا ۳۶ کاراکتر) با آدرسی جایگزین میشوند که دو کاراکتر اول آن با آدرس اصلی مطابقت داشته باشد.
- آدرسهای بلند بیتکوین که با bc1qیا bc1pشروع میشوند و طول آنها ۴۰ تا ۶۴ کاراکتر است، با آدرسی جایگزین میشوند که آخرین کاراکتر آن با آدرس اصلی مطابقت داشته باشد.
اتریوم:
- آدرسهایی که با 0xشروع میشوند و طول آنها ۴۰ تا ۴۴ کاراکتر است، با یکی از آدرسهای اتریوم سختکد شده در بدافزار جایگزین میشوند. هدف این است که سه کاراکتر اول آدرس جایگزین با آدرس اصلی مطابقت داشته باشد.
مونرو:
- آدرسهایی که با 4یا 8شروع میشوند و طول آنها ۹۵ کاراکتر است، با یک آدرس از پیش تعریفشده جایگزین میشوند. مشابه دیگر کیف پولها، اسکریپت بررسی میکند که کاراکترهای اصلی و جایگزین با هم مطابقت داشته باشند. در مورد مونرو، تنها کاراکتر اول باید مطابقت داشته باشد؛ بنابراین فقط آدرسهای مونرویی که با 4شروع میشوند جایگزین میشوند.
اجرای جایگزینی کلیپبورد
این فرآیند معمولاً با کمک فرمان زیر اجرا میشود:
cmd.exe/cecho|set/p=+new_clipboard_data+|clip
پس از هر جایگزینی آدرس کیف پول، اسکریپت اطلاعات مربوط به آدرس اصلی و آدرس جایگزین را به سرور ارسال میکند.
توزیع از طریق سایتهای وردپرسی آلوده
همانطور که پیشتر ذکر شد، علاوه بر ایمیل، تروجان از طریق سایتهای وردپرسی آلوده نیز منتشر میشود. مهاجمان به دنبال وبسایتهای با امنیت پایین میگردند، رمز عبور آنها را بهصورت جستجوی فراگیرحدس میزنند و سپس پیامهایی منتشر میکنند که کاربران را به دانلود فیلمهای تازه منتشرشده دعوت میکند. این پستها شامل لینک یک آرشیو رمزدار میشوند که فایل تورنت درون آن قرار دارد. فایل تورنت یک پوشه را روی دستگاه دانلود میکند که شامل موارد زیر است:
o یک فایل بهظاهر فیلم با فرمت XMPEG
o یک فایل متنی “readme !!!.txt”
o یک فایل اجرایی که خود را به عنوان پلیر رسانهای نمایش میدهد
برای مشاهده فیلم در فرمت XMPEG، کاربر تصور میکند باید xmpeg_player.exeرا اجرا کند. اما این فایل اجرایی در واقع نسخه دیگری از نصبکننده تروجان Efimerاست. مشابه نسخه WSF، این نصبکننده فایل اصلی تروجان را در مسیر C:\Users\Public\Controllerاستخراج میکند، اما با نام ntdlg.js. همچنین نصبکننده، کلاینت پراکسی Torرا با نام ntdlg.exeاستخراج میکند و با استفاده از PowerShell:
- اسکریپت را به برنامههای راهاندازی خودکار اضافه میکند
- پوشه Controllerرا از اسکن Windows Defender مستثنی میکند
فرمان PowerShell برای افزودن استثنا:
cmd.exe /c powershell -Command Add-MpPreference -ExclusionPath 'C:\Users\Public\Controller\'
تروجان استخراجشده تقریباً مشابه نسخهای است که از طریق ایمیل منتشر میشود. با این تفاوت که این نسخه علاوه بر کیف پولهای بیتکوین، اتریوم و مونرو، کیف پولهای Tron و Solanaرا نیز جعل میکند و GUID آن با “vt05”آغاز میشود.
اسکریپتهای اضافی
در برخی سیستمهای آلوده، چند اسکریپت دیگر نیز کشف شد که با همان دامنه .onionکه قبلاً ذکر شد، ارتباط برقرار میکردند. معتقدیم مهاجمان این اسکریپتها را از طریق دستور evalبرای اجرای payload از سرور C2 نصب کردهاند.
نفوذ به سایتهای وردپرسی
در میان این اسکریپتهای اضافی، فایلی به نام btdlg.js (MD5: 0f5404aa252f28c61b08390d52b7a054) یافت شد. این اسکریپت برای brute-force رمزهای عبور سایتهای وردپرسی طراحی شده است. پس از اجرا، اسکریپت یک شناسه یکتا کاربر تولید میکند، مانند fb01-<۴کاراکتر هگزادسیمال تصادفی>و آن را در مسیر C:\Users\Public\Controller\ذخیره میکند. سپس اسکریپت چندین فرآیند را برای اجرای حملاتجستجوی فراگیربه صفحات وب آغاز میکند. کدی که مسئول این حملات است، در همان اسکریپت و پیش از حلقه اصلی قرار دارد. برای فعالسازی این عملکرد، اسکریپت باید با پارامتر “B”اجرا شود. در حلقه اصلی، اسکریپت با فراخوانی تابع _runBruteProcو پارامتر “B”، خود را راهاندازی میکند.
پس از پایان هر حمله جستجوی فراگیر، اسکریپت به حلقه اصلی بازمیگردد و تا رسیدن به حداکثر ۲۰ فرآیند (سختکد شده) به ایجاد فرآیندهای جدید ادامه میدهد.
بنابراین، اسکریپت دو حالت اجرایی دارد:
- حالت جستجوی فراگیر
- حالت اصلی که مسئول راهاندازی اولیه است
اگر اسکریپت بدون هیچ پارامتری اجرا شود، بلافاصله وارد حلقه اصلی میشود. از آنجا، یک نمونه جدید از خودش را با پارامتر “B” اجرا میکند تا حملهجستجوی فراگیرآغاز شود.
مکانیزم حمله جستجوی فراگیر
فرآیندجستجوی فراگیراز طریق تابع GetWikiWords شروع میشود: اسکریپت ابتدا یک فهرست از کلمات ویکیپدیا دریافت میکند. این فهرست برای شناسایی وبسایتهای جدید هدف برای حملهجستجوی فراگیراستفاده میشود. اگر اسکریپت نتواند فهرست کلمات را دریافت کند، ۳۰دقیقه صبر کرده و سپس دوباره تلاش میکند. سپس اسکریپت وارد حلقه اصلی عملیات خود میشود. هر ۳۰دقیقه، یک درخواست به سرور C2 ارسال میکند. این کار با استفاده از روش PingToOnion انجام میشود که مشابه روشهای با همین نام در دیگر اسکریپتها است. در این درخواست، دستور BUIDارسال میشود که شامل شناسه یکتا کاربر و آمار حملاتجستجوی فراگیر است؛ از جمله تعداد کل دامنههای هدف، تعداد حملات موفق و ناموفق.
پس از آن، اسکریپت با استفاده از تابع GetRandWordsیک فهرست از کلمات تصادفی ویکیپدیا تولید میکند. سپس با استفاده از این کلمات تصادفی به عنوان پارامتر جستجو، تابع getSeDomains دامنههایی را در گوگل و بینگ جستجو میکند تا برای حملاتجستجوی فراگیرهدفگذاری شوند.
مدیریت اطلاعات دامنهها
تابع ObjIDیک هش هشت رقمی هگزادسیمال ایجاد میکند که بهعنوان شناسه یکتا برای یک شیء ویژه (obj_id) عمل میکند. در این مورد، شیء ویژه شامل فایل حاوی اطلاعات حملاتجستجوی فراگیراست، از جمله:
- فهرست کاربران برای حدس رمز عبور
- پرچم موفقیت/شکست تلاشهای جستجوی فراگیر
- سایر دادههای مرتبط با اسکریپت
برای هر دامنه جدید، این دادهها در یک فایل جداگانه ذخیره میشوند. اسکریپت بررسی میکند که آیا این شناسه قبلاً ثبت شده است یا خیر. تمامی شناسههای یکتا در فایلی با نام “UDBXX.dat”ذخیره میشوند. اگر شناسه جدیدی یافت نشود، به فایل اضافه میشود. این مکانیزم باعث صرفهجویی در زمان میشود و از پردازش دوباره دامنههای شناختهشده جلوگیری میکند.
ارسال درخواستها برای دامنههای جدید
برای هر دامنه جدید، اسکریپت با استفاده از تابع WPTryPostیک درخواست ارسال میکند. این یک تابع XML-RPCاست که تلاش میکند با استفاده از نام کاربری و رمز عبور احتمالی، یک پست آزمایشی ایجاد کند. زمانی که درخواست XML-RPCپاسخ داده میشود، چه موفقیتآمیز باشد یا نه، تابع WPGetUsersفعال میشود تا کاربران دامنه را استخراج کند. این تابع دامنه را در مسیر /wp-json/wp/v2/usersبررسی میکند و انتظار دارد فهرستی از کاربران سایت وردپرسی دریافت کند.
این فهرست کاربران، همراه با دامنه و شمارندههای تعداد کاربران و تلاشهای جستجوی فراگیر برای رمز عبور، در فایل شیء ویژهای که پیشتر توضیح داده شد ذخیره میشوند. شناسه این فایل با کمک ObjIDمحاسبه میشود. پس از پردازش یک صفحه، اسکریپت برای ۵ثانیه غیرفعال میماند و سپس به صفحه بعدی میرود. در همین حین، چندین فرآیند بهطور همزمان روی سیستم قربانی در حال انجام عملیات جستجوی فراگیر هستند. همانطور که قبلاً ذکر شد، وقتی اسکریپت با پارامتر “B”اجرا شود، وارد یک حلقه بیپایان جستجوی فراگیر میشود و هر فرآیند بهصورت مستقل اهداف خود را پردازش میکند. در ابتدای هر تکرار، یک تأخیر تصادفی ۱–۲ ثانیهای اعمال میشود تا زمانبندی شروع درخواستها پراکنده شده و شناسایی فعالیت دشوارتر شود.
پس از آن، فرآیند یک شناسه فایل شیء تصادفی برای پردازش از مسیر C:\Users\Public\Controller\objectsبا فراخوانی ObjGetWدریافت میکند.
- تابع ObjGetWیک شیء دامنه تصادفی را انتخاب میکند که در حال حاضر توسط فرآیند دیگری مشغول نباشد.
- فایلهای قفلشده با پسوند LOCK مشخص میشوند.
- پس از انتخاب یک دامنه آزاد برایجستجوی فراگیر ، تابع lockObj فراخوانی میشود و پسوند فایل به LOCK تغییر مییابد تا سایر فرآیندها روی آن کار نکنند.
- اگر همه فایلها قفل باشند یا فایل انتخابشده نتواند قفل شود، اسکریپت به تکرار بعدی حلقه میرود و دوباره تلاش میکند تا فایل قابل پردازش پیدا شود.
پس از بهدست آوردن فایل، اسکریپت دادههای آن شامل دامنه، شمارندههای جستجوی فراگیررمز عبور و فهرست کاربران را استخراج میکند. بر اساس مقادیر شمارنده، اسکریپت بررسی میکند که آیا تمام ترکیبها امتحان شدهاند یا آیا حداکثر تلاشهای ناموفق فراتر رفته است.اگر تمام تلاشها انجام شده باشد، فایل شیء حذف میشود و فرآیند به تکرار بعدی میرود. اگر تلاشهایی باقی مانده باشد، اسکریپت با استفاده از رمزهای عبور سختکد شده تلاش به احراز هویت میکند. هنگام تلاش برای حدس رمز عبور هر کاربر، یک درخواست پست وبسایت با استفاده از تابع WPTryPost ارسال میشود. بسته به نتیجه تلاشجستجوی فراگیر ، تابع ObjUpd فراخوانی میشود تا وضعیت دامنه فعلی و ترکیب نام کاربری-رمز عبور بهروزرسانی شود.
پس از بهروزرسانی وضعیت، فایل شیء قفلگشایی میشود و فرآیند با وقفهای تصادفی قبل از ادامه حلقه به هدف جدید ادامه میدهد. این مکانیزم باعث میشود عملیات چندنخی و مداوم جستجوی فراگیربه طور منظم اجرا شود و همه مراحل در یک فایل ویژه ثبت شوند. این ثبت لاگ باعث میشود در صورت کرش کردن اسکریپت، از ابتدا شروع نکند. رمزهای عبور با موفقیت حدس زده شده نیز با دستور GOOD به سرور C2 ارسال میشوند.
نسخه جایگزین Efimer
همچنین اسکریپتی دیگر با نام assembly.js (MD5: 100620a913f0e0a538b115dbace78589 کشف شد. اگرچه عملکرد آن مشابه controller.js و ntdlg.js است، تفاوتهای مهمی دارد.
- مشابه نسخههای قبلی، این اسکریپت نیز از نوع ClipBanker است.
- این بدافزار ابتدا شناسه یکتا کاربر را میخواند، اما این بار مسیر آن C:\Users\Public\assembly\GUID است. اگر شناسه یافت یا خوانده نشود، یک شناسه جدید تولید میشود.
- فرمت شناسه جدید به شکل M11-XXXX-YYYY است، که در آن XXXX و YYYY دو عدد هگزادسیمال چهار رقمی تصادفی هستند.
- پس از آن، اسکریپت بررسی میکند که آیا در محیط ماشین مجازی اجرا میشود یا خیر.
اگر اسکریپت یک ماشین مجازی (VM)تشخیص دهد، پیشوند “V”را به GUID اضافه میکند؛ در غیر این صورت از پیشوند “R”استفاده میکند. پس از آن، دایرکتوری حاوی GUIDکه به نظر میرسد دایرکتوری اصلی کاری اسکریپت باشدمخفی میشود. سپس فایلی با نام “lptime”در همان مسیر ذخیره میشود. این فایل زمان کنونی منهای ۲۱,۰۰۰ ثانیه را نگهداری میکند. پس از تکمیل این مراحل اولیه، بدافزار وارد حلقه اصلی عملیات خود میشود. اولین کاری که انجام میدهد، بررسی زمان ذخیره شده در فایل “lptime”است. اگر تفاوت بین زمان کنونی و زمان فایل بیش از ۲۱,۶۰۰ثانیه باشد، اسکریپت شروع به آمادهسازی دادهها برای ارسال به سرور میکند.
در ادامه، اسکریپت تلاش میکند دادهها را از فایلی به نام “geip”که انتظار دارد در مسیر C:\Users\Public\assembly\geipباشد، بخواند. این فایل شامل اطلاعات مربوط به کشور و آدرس IP دستگاه آلوده است. اگر فایل موجود نباشد، اسکریپت اطلاعات را از https://ipinfo.io/json دریافت کرده و ذخیره میکند. سپس سرویس Torفعال میشود که در مسیر C:\Users\Public\assembly\upsvc.exeقرار دارد.
پس از آن، اسکریپت با استفاده از تابع GetWalletsList اقدام به شناسایی کیف پولهای رمزارزی کرده و فهرستی از یافتههای خود تهیه میکند. اسکریپت ابتدا دایرکتوری افزونههای مرورگر برای Google Chrome و Braveرا اسکن میکند. همچنین پوشههای مربوط به برخی برنامههای کیف پول رمزارزی را که مسیر آنها در اسکریپت سختکد شده است، بررسی میکند. سپس اسکریپت فایلی با نام “data”را از مسیر C:\Users\Public\assembly میخواند. این فایل معمولاً شامل نتایج جستجوهای قبلی برای عبارتهای بازیابیدر کلیپبورد میشود. در نهایت، اسکریپت دادههای این فایل همراه با کیف پولهای رمزارزی که از پوشههای برنامهها شناسایی کرده، به سرور C2 ارسال میکند:
http://he5vnov645txpcv57el2theky2elesn24ebvgwfoewlpftksxp4fnxad[.]onion/assembly/route.php
پس از ارسال، اسکریپت پاسخ سرور را با کمک تابع CheckOnionCMDبررسی میکند که مشابه توابع موجود در دیگر اسکریپتها است. پاسخ سرور میتواند یکی از دستورات زیر باشد:
- RPLY: مقدار "OK"برمیگرداند. این پاسخ تنها پس از ارسال کیف پولهای رمزارزی دریافت میشود و نشان میدهد که سرور دادهها را با موفقیت دریافت کرده است. اگر سرور "OK"برگرداند، فایل داده قدیمی حذف میشود. اما اگر انتقال موفقیتآمیز نباشد (پاسخی دریافت نشود)، فایل حذف نمیشود. این مکانیزم تضمین میکند که در صورت عدم دسترسی موقت سرور C2، کیف پولهای جمعآوریشده همچنان پس از برقراری ارتباط ارسال شوند.
- EVAL:یک اسکریپت JavaScriptکه در پاسخ سرور آمده، اجرا میکند.
- KILL:تمامی اجزای بدافزار را کاملاً حذف کرده و اجرای آن را متوقف میکند.
سپس اسکریپت کلیپبورد را برای رشتههایی که شبیه عبارتهای بازیابی و آدرسهای کیف پول رمزارزی هستند، اسکن میکند. تمام دادههای یافتشده سپس با رمزگذاری XOR و استفاده از کلید $@#LcWQX3$محافظت شده و در فایلی با نام “data” ذخیره میشوند. پس از این مراحل، کل چرخه دوباره تکرار میشود.
اسکریپت جمعآوری آدرس ایمیل “Liame”
این اسکریپت بهعنوان یک جاسوس دیگر عمل میکند و مشابه دیگر اسکریپتهایی است که پیشتر بررسی شد، اما هدف آن کاملاً متفاوت است. هدف اصلی آن جمعآوری آدرسهای ایمیل از وبسایتهای مشخص و ارسال آنها به سرور C2 است.
- لیست وبسایتهای هدف توسط دستور سرور C2 به اسکریپت داده میشود.
عملکرد اولیه
هنگام راهاندازی، اسکریپت ابتدا بررسی میکند که آیا LUID (شناسه یکتا برای سیستم فعلی) در دایرکتوری کاری اصلی موجود است یا خیر. مسیر آن:
C:\\Users\\Public\\Controller\\LUID
اگر LUID یافت نشود، اسکریپت یکی ایجاد میکند، مشابه روش استفادهشده در دیگر اسکریپتها.
- فرمت این شناسه یکتا به شکل fl01-<۴کاراکتر هگزادسیمال تصادفی> است.
سپس تابع checkUpdate()اجرا میشود. این تابع بررسی میکند که آیا فایلی با مسیر زیر وجود دارد یا خیر:
C:\\Users\\Public\\Controller\\update_l.flag
- اگر این فایل وجود داشته باشد، اسکریپت ۳۰ثانیه صبر میکند، سپس فایل update_l.flag را حذف کرده و عملیات خود را متوقف میکند. بعد از آن، اسکریپت بهصورت دورهای هر ۱۰ دقیقه یک بار درخواستهایی به سرور ارسال میکند تا دستورات جدید دریافت کند. این کار با استفاده از تابع PingToOnionانجام میشود که مشابه توابع همنام در دیگر اسکریپتها است.
- LIAM: شناسه یکتا
- Action: نوع درخواست
- Data: دادههای مرتبط با نوع درخواست
پارامترهای درخواست به سرور
در این بخش از کد، LIAM به عنوان مقدار پارامتر actionاستفاده میشود و پارامتر data شامل تعداد آدرسهای ایمیل جمعآوریشده به همراه آمار عملکرد اسکریپت است. اگر اسکریپت به دلیل یک خطا بهطور غیرمنتظره متوقف شود، میتواند علاوه بر آمار عملکرد، یک لاگ خطا نیز ارسال کند. در این حالت:
- پارامتر action شامل رشته LOGS خواهد بود
- پارامتر data شامل پیام خطا خواهد بود
درخواستها به سرور C2 زیر ارسال میشوند:
http://cgky6bn6ux5wvlybtmm3z255igt52ljml2ngnc5qp3cnw5jlglamisad[.]onion/route.php
سرور پاسخی مشابه ساختار JSON بازمیگرداند که تابع بعدی آن را پردازش میکند. این ساختار مشخص میکند که اسکریپت چه دستورات اجرایی داشته باشد.
عملکردهای اصلی اسکریپت
این اسکریپت دو عملکرد اصلی دارد:
- دریافت فهرست آدرسهای ایمیل از دامنههایی که توسط سرور ارائه میشوند
- دریافت اسکریپت دامنهها و بررسی صفحات وب هر کدام جهت یافتن پیوندها و آدرسهای ایمیل موجود در سایت
جمعآوری پیوندها و ایمیلها
- تابع GetPageLinks محتوای HTML یک صفحه وب را تجزیه کرده و تمام لینکهایی که در همان دامنه قرار دارند را استخراج میکند. سپس این لینکها فیلتر میشوند تا فقط لینکهایی که به فایلهای HTML/PHP یا فایلهای بدون پسوند اشاره دارند، حفظ شوند.
- تابع PageGetLiame آدرسهای ایمیل را از محتوای HTML صفحه استخراج میکند. این تابع میتواند آدرسهای مستقیم و آنهایی که داخل لینک mailto قرار دارند را پردازش کند.
پس از جمعآوری اولیه، اسکریپت تمام لینکهای قبلی جمعآوری شده در دامنههای ارائهشده توسط C2 را مجدداً بررسی میکند تا آدرسهای ایمیل جدیدی پیدا کند. در پایان، اسکریپت فهرست تمام ایمیلهای جمعآوریشده را پاکسازی از تکراریها کرده و برای استفادههای بعدی ذخیره میکند.
ارسال دادههای جمعآوریشده به سرور
در این بخش، اسکریپت از پاسخ سرور C2 انتظار دارد دو پارامتر دریافت کند:
- Pstack:آرایهای از دامنهها که درخواستهای POST بعدی به آنها ارسال خواهد شد
- Buffer:آرایهای از رشتهها که هر کدام شامل دادهها به فرمت address,subject,message هستند
اسکریپت بهصورت تصادفی یک دامنه از pstack انتخاب میکند و سپس یکی از رشتههای موجود دربافررا به آن آپلود میکند. این بخش از اسکریپت احتمالاً بهعنوان ماژول اسپم عمل میکند و برای پر کردن فرمها در وبسایتهای هدف طراحی شده است.
برای هر ارسال موفق داده از طریق POST به یک دامنه مشخص، اسکریپت آمار خود را بهروزرسانی میکند و تعداد ارسالهای موفق برای آن دامنه ثبت میشود.
اگر در این حلقه خطایی رخ دهد، اسکریپت آن را با دستور LOGS به سرور C2 گزارش میکند.
نکات نامگذاری
در سراسر کد، واژه “Liame” مشاهده میشود که در واقع “Email” بهصورت معکوس است. همچنین متغیرها و توابعی با نامهایی مانند Liama، Liam، Liams نیز وجود دارند که احتمالاً از همین واژه گرفته شدهاند. این نوع بازی با کلمات بهاحتمال زیاد تلاشی برای مخفی کردن اهداف مخرب کد است. برای مثال، به جای نام تابع واضح PageGetEmail، تابعی با نام PageGetLiame استفاده شده است.
قربانیان
از اکتبر ۲۰۲۴ تا جولای ۲۰۲۵، محصولات کسپرسکی تروجان Efimer را در بین ۵۰۱۵کاربر کسپرسکی شناسایی کردند. بیشترین فعالیت این بدافزار در برزیل رخ داد، جایی که ۱۴۷۶کاربر تحت تأثیر قرار گرفتند. سایر کشورهایی که بهطور قابل توجهی تحت تأثیر قرار گرفتند شامل هند، اسپانیا، روسیه، ایتالیا و آلمان هستند.
نکات کلیدی
تروجان Efimer چندین تهدید جدی را با هم ترکیب میکند. اگرچه هدف اصلی آن سرقت و جایگزینی کیف پولهای رمزارزی است، اما میتواند با بهرهگیری از اسکریپتهای اضافی، سایتهای وردپرسی را به خطر انداخته و اسپم توزیع کند. این امکان موجب میشود زیرساخت مخرب کاملی ایجاد کرده و به دستگاههای جدید گسترش یابد.
ویژگی جالب دیگر این تروجان، تلاش آن برای انتشار در میان کاربران عادی و محیطهای شرکتی است:
- در حالت کاربران فردی، مهاجمان از فایلهای تورنت بهعنوان طعمه استفاده میکنند که بهصورت ظاهری برای دانلود فیلمهای محبوب ارائه میشوند.
- در حالت سازمانی، ایمیلهایی ارسال میشود که به ادعای استفاده غیرمجاز از کلمات یا عبارات ثبتشده توسط شرکت دیگری اشاره دارد.
نکته مهم: در هر دو سناریو، ابتلا تنها در صورتی امکانپذیر است که کاربر فایل مخرب را خودش دانلود و اجرا کند.
راهکارهای امنیتی
- برای کاربران عادی:
- از دانلود فایلهای تورنت از منابع ناشناس یا مشکوک خودداری کنید
- همواره فرستنده ایمیلها را بررسی کنید
- دیتابیس آنتیویروس خود را بهطور مداوم بهروزرسانی کنید
- برای توسعهدهندگان و مدیران وبسایتها:
- اقدامات امنیتی برای محافظت از منابع و جلوگیری از انتشار بدافزار را پیاده کنید
- نرمافزارها را مرتب بهروزرسانی کنید
- از رمزهای قوی غیرپیشفرض و احراز هویت دو مرحلهای استفاده کنید
- سایتها را بهطور مستمر برای شواهد نفوذ و تهدیدات بررسی کنید
شاخصهای دستکاری
هشهای فایلهای آلوده
39fa36b9bfcf6fd4388eb586e2798d1a — Requirement.wsf
5ba59f9e6431017277db39ed5994d363 — controller.js
442ab067bf78067f5db5d515897db15c — xmpeg_player.exe
16057e720be5f29e5b02061520068101 — xmpeg_player.exe
627dc31da795b9ab4b8de8ee58fbf952 — ntdlg.js
0f5404aa252f28c61b08390d52b7a054 — btdlg.js
eb54c2ff2f62da5d2295ab96eb8d8843 — liame.js
100620a913f0e0a538b115dbace78589 — assembly.js
b405a61195aa82a37dc1cca0b0e7d6c1 — btdlg.js
هشهای فایلهای تمیز گنجاندهشده در حمله
5d132fb6ec6fac12f01687f2c0375353 — ntdlg.exe (Tor)
وبسایتها
hxxps://lovetahq[.]com/sinners-2025-torent-file/
hxxps://lovetahq[.]com/wp-content/uploads/2025/04/movie_39055_xmpg.zip
یوآرالهای سی 2
hxxp://cgky6bn6ux5wvlybtmm3z255igt52ljml2ngnc5qp3cnw5jlglamisad[.]onion
hxxp://he5vnov645txpcv57el2theky2elesn24ebvgwfoewlpftksxp4fnxad[.]onion
کسپرسکی آنلاین (ایدکو)
کسپرسکی اسم یکی از بزرگترین شرکتهای امنیتی و سازنده آنتی ویروس است که برخی از کاربران اشتباهاً این شرکت و محصولات آنتی ویروس آن را با عناوینی نظیر کسپرسکای،کاسپرسکی، کسپراسکای، کسپراسکای، و یا کاسپراسکای نیز میشناسد. همچنین لازم به ذکر است مدیرعامل این شرکت نیز یوجین کسپرسکی نام دارد.