محققای چک پوینت در یه رخداد امنیتی مرتبط با سازمان های اسرائیلی، یه باج افزار جدید بنام Moneybird رو شناسایی کردن و براساس TTP حمله ، اونو به گروه هکری Agrius ، نسبت دادن.
گروه هکری Agrius که از سال 2021 فعالیتش رو شروع کرده، یه گروه هکری همسو با منافع دولت ایران هستش، که اغلب کشورهای خاورمیانه رو هدف قرار میده. از جمله حملاتی هم که انجام داده، حملات باج افزاری و wiper به سازمانهای اسرائیلی بوده.
باج افزار جدیدی که علیه سازمان های اسرائیلی استفاده کردن، Moneybird هستش . این فعالیتها با حملاتی که قبلا روی سازمانهای اسرائیلی انجام دادن، از جمله دانشگاه Shirbit و Bar Ilan مرتبط هستش. این گروه از نامهای مختلف برای فعالیتهاش استفاده میکنه، مثلا در مورد دانشگاه Shirbit از نام BlackShadow استفاده کرده بود.
عملیات باج افزاری Agrius ، به یه باج افزار سفارشی بنام Apostle ، که در اصل یه wiper بود ، بر میگرده. استفاده از یه باج افزار که در زبان C++ توسعه داده شده، نشون دهنده پیشرفت مداوم گروه در توسعه ابزارهای هک هستش.
بررسی فعالیت:
فعالیتهای Agrius که منجر به استقرار باج افزار Moneybird شد، با گزارشات قبلی از این گروه، مرتبط هستش. شکل زیر نمای کلی از فعالیت های این گروه رو برای استقرار باج افزار نشون میده.
این گروه از طریق آسیب پذیری های وب سرورها، یه وب شل بنام ASPXSpy رو مستقر میکنن و این نقطه ورود به تارگت هستش. اکسپلویت و فعالیتهای post-exploit از طریق VPNهای عمومی انجام میشه که در اسرائیل معروفترینشون ، ProtonVPN هستش.
وب شلهای ASPXSpy بصورت منحصر به فرد و در فایلهای متنی Certificate پنهون شدن. این روش، با گزارشات قبلی که در خصوص فعالیتهای این گروه منتشر شده، همپوشانی داره. برای استفاده از وب شل، بازیگر تهدید ، محتوای فایل دیکد میکنه و در یه فایل ASPX می ریزه. شکل زیر نشون دهنده وب شل رمزشده در یه فایل جعلی Certificate هستش.
بعد از استقرار وب شل، بازیگر تهدید با استفاده از ابزارهای عمومی اقداماتی مانند ریکان، حرکات جانبی ، بدست آوردن اعتبارنامه ها و استخراج داده رو انجام میده. این ابزارها عبارتند از :
- SoftPerfect Network Scanner : برای اسکن شبکه داخلی
- Plink : برای ایجاد RDP از سرور بازیگر تهدید
- ProcDump : برای دامپ گرفتن LSASS و استخراج اعتبارنامه ها
- FileZilla: برای استخراج داده های فشرده شده
نکته جالبی که وجود داره اینه که ، بشتر فعالیت بازیگر تهدید، از طریق ارتباط با RDP هستش. مثلا برای دانلود برخی از پیلودها، بازیگر تهدید، از طریق مرورگر سرویس های اشتراک فایل قانونی ufile[.]io و easyupload[.]io رو باز کرده و پیلود رو دانلود کرده.
یکی از فایلهایی که دانلود کرده، به فایل فشرده بوده که داخلش، باج افزار Moneybird بوده.
تحلیل فنی باج افزار Moneybird :
باج افزار Moneybird با زبان سی پلاس نوشته شده و شامل یه مسیر PDB بصورت زیر بوده :
1 |
C:\Users\user\Desktop\moneybird\x64\Release\moneybird.pdb |
نامی که در این مسیر بوده، با نامی که در متن باج افزار در نمونه ای که پیدا کردن ، یکی هستش.
این باج افزار، بعد از رمز کردن فایلها، اونارو به فرمت md تبدیل میکنه :
اغلب باج افزارها، از یسری پارامتر کامندلاینی استفاده میکنن، تا اپراتور بتونه برای محیطهای مختلف، باج افزار شخصی سازی کنه. اما باج افزار این گروه چنین ویژگی رو نداشته و از یه پیکربندی که در داخل خود ابزار بوده، استفاده کرده. این باعث میشه که در کمپین های انبوه با محیط های مختلف، امکان استفاده از قابلیت های باج افزار کمتر بشه. شکل زیر پیکربندی این باج افزار نشون میده.
در این پیکربندی برخی عناصر، برای اجرای باج افزار مورد استفاده قرار میگیرن. اولین DWORD نادیده گرفته میشه. دومین DWORD ، یه عدد صحیح هستش که نشون دهنده زمانی هستش که باج افزار قبل از اجرا باید منتظر بمونه. این مقدار به میلی ثانیه هستش.
DWORD بعدی که بعنوان یه فلگ در نظر گرفته شده، برای اینه که مشخص میکنه ،باج افزار لیست فرمتهای فایلی که داخلش قرار گرفته رو هدف قرار بده یا همه فایلها رو. مقدار 1 برای لیست و مقدار 2 برای همه در نظر گرفته شده. اگه گزینه لیست انتخاب بشه ، باج افزار 194 فرمت فایل که فرمتهای رایج برای فایلهای داکیومنت، دیتابیس ، گواهی ها و … هست رو رمز میکنه. اگه همه موارد باشه، به غیر از exe ، dll ، msi ، sys و lnk همه رو رمز میکنه.
DWORD بعدی مشخص کننده اینه که حداکثر چه تعدادی از thread ها برای رمزنگاری فایلها مورد استفاده قرار بگیرن.
DWORD بعدی مشخص کننده تعداد thread هایی هستش که، برای کارهای قبل از رمز کردن اختصاص داده میشه. این تضمین میکنه که فایلهای هدف، مرتبط با SYSTEM نباشن تا رمزشون نکنه.
این روش در مقایسه با سایر باج افزارها، کارایی کمی رو داره. باج افزارهای دیگه از GetSystemInfo یا بطور مستقیم از PEB→dwNumberOfProcessors برای تعیین تعداد CPU های سیستم هدف و مشخص کردن تعداد thraedها برای فعالیتهاشون استفاده میکنن.
DWORD بعدی مشخص کننده اندازه یه رشته ASCII که در ادامه میاد هستش. این رشته حاوی مقدار Base64 شده کلید عمومی هستش. از این کلید برای رمزنگاری کلیدهای رمزنگاری متقارن که برای هر فایل تولید میشه، استفاده میکنن.
بعد از کلیدهای عمومی ، یه مقدار صحیح میاد که نشون دهنده تعداد یسری رشته هستش که در ادامه میاد. این رشته ها برای مشخص کردن مسیر های خاص برای رمزنگاری هستن. این کار هم غیرعادی بوده، چون باج افزارها ، سعی میکنن تا جایی که میتونن داده ها رو رمز کنن. در نمونه مورد نظر فقط یک مسیر، F:\User Shares هستش که نشون دهنده اینه که فقط این مسیر رمز میشه.
بقیه فضای پیکربندی ( تا 1024 بایت همراه با عناصر قبلی) برای مقاصد بعدی رزرو شدن. در صورتیکه این بخش ها حاوی داده ای نباشن، با کاراکتر A پر میشن.
اگه مسیری به باج افزار داده نشه،مانند باج افزارهای معمول، با استفاده از GetLogicalDrives ، لیست درایوها رو بدست میاره و بعدش اونارو پردازش میکنه.
ساختار پیکربندی باج افزار بصورت دیکامپایل شده در C :
1 2 3 4 5 6 7 8 9 10 11 12 |
struct mb_config { DWORD start_sleep_delay; DWORD ignore_extension_flag; DWORD num_of_ciphering_threads; DWORD num_of_check_threads; DWORD sizeof_b64_public_key; char b64_public_key[124]; DWORD num_off_paths; char first_path[15]; char room_for_paths[860]; }; |
منطق رمزنگاری این باج افزار، به یسری کتابخونه از جمله libgcrypt بستگی داره که میشه از رشته های داخل نمونه استخراج کرد :
1 2 3 4 5 6 7 8 9 10 11 12 |
... C:\Users\user\Desktop\moneybird\Shiftlibgcrypt\cipher\mac.c C:\Users\user\Desktop\moneybird\Shiftlibgcrypt\mpi\mpi-pow.c C:\Users\user\Desktop\moneybird\Shiftlibgcrypt\src\fips.c C:\Users\user\Desktop\moneybird\Shiftlibgcrypt\cipher\primegen.c C:\Users\user\Desktop\moneybird\Shiftlibgcrypt\mpi\mpicoder.c C:\Users\user\Desktop\moneybird\Shiftlibgcrypt\cipher\dsa.c C:\Users\user\Desktop\moneybird\Shiftlibgcrypt\random\random-drbg.c C:\Users\user\Desktop\moneybird\Shiftlibgcrypt\cipher\elgamal.c C:\Users\user\Desktop\moneybird\Shiftlibgcrypt\cipher\blake2.c C:\Users\user\Desktop\moneybird\Shiftlibgcrypt\cipher\keccak.c ... |
با توجه به نام فولدرهای موجود در این رشته ها، احتمالا کتابخونه از این مخزن گیتهاب کامپایل شده. این مخزن حاوی یه نسخه غیررسمی از libgcrypt هستش که با هدف استفاده راحتتر در پروژه های Visual Studio توسعه داده شده. این بدافزار همچین از libpgp-error که بعنوان یه وابستگی برای libgcrypt هستش هم، استفاده میکنه.
باج افزار همچنین از کتابخونه cryptopp هم استفاده میکنه. این مورد میشه ،در رشته هایی که در خود نمونه هست و یه رشته تستی که در خود کتابخونه قرار گرفته ، استخراج کرد :
باج افزار از AES-256 و GCM mode برای رمز کردن فایلها استفاده میکنه :
همونطور که مشاهده میکنید، IV با مقدار 012345678901255 داخل نمونه قرار گرفته و با توجه به پارامترهای تابع gcry_cipher_open میشه فهمید که از AES-256 و GCM mode استفاده کرده.
کدی که مسئول ایجاد کلید هستش :
این کد برای هر فایل اجرا میشه و بنابراین برای هر فایل یه کلید رمزگذاری منحصر به فرد اختصاص داده میشه. برای تولید یه کلید، باج افزار یه GUID که در شکل زیر با رنگ قرمز مشخص شده رو با استفاده از تابع CoCreateGuid بدست میاره، بعدش با یه مقداره تصادفی که در شکل زیر به رنگ سبز مشخص شده و با تابع rand بدست میاره، ترکیب میکنه. seed برای تابع rand هم براساس زمان سیستم هستش. بعدش 8 بایت از محتوای فایلی که قرار رمز بشه رو ، که در شکل زیر با رنگ آبی مشخص شده، رو بدست میاره و به ترکیب بالا اضافه میکنه و در نهایت مسیر کامل فایل که در شکل زیر به رنگ بنفش هستش به این ترکیب اضافه میکنه تا کلید بدست بیاد. از مسیر فقط 4 بایتش ،مورد استفاده قرار میگیره، چون اندازه کلید 32 بایتی هستش.
کلید (32 بایتی) = GUID (16 بایت) + مقدار تصادفی rand (4 بایت) + محتوای فایل (8 بایت) + مسیر فایل (4 بایت )
ساختار کلید در C :
1 2 3 4 5 6 7 |
struct aes_key { char guid[16]; int rand_val; char file_content[8]; char file_path_start[4]; }; |
استفاده از تکنیک GUID از طریق تابع CoCreateGuid ، فرایند بدست آوردن کلید رو سختتر میکنه. چون از طریق فراخوانی RPC با استفاده از تابع UuidCreate ایجاد میشه که برای تصادفی بودن از تابع ProcessPrng در bcryptPrimitives.dll استفاده میکنه ، این تابع برای ایجاد بایتهای تصادفی با استفاده از رمزنگاری ایمن شده.
باج افزار یه ساختار دیگه ای رو با اضافه کردن اندازه مسیر ، بصورت زیر ایجاد میکنه :
1 2 3 4 5 6 7 8 |
struct meta_info { char guid[16]; int rand_val; char file_content[8]; char file_path[file_path_length]; int file_path_length; }; |
این ساختار با استفاده از یه سیستم رمزنگاری ترکیبی ، یعنی Elliptic Curve Integrated Encryption Scheme (CryptoPP ECIES) و کلید عمومی که قبلا در بخش پیکربندی نمونه مشاهده کردیم، رمز میشه و بعد از اینکه یه فایلی رمز شد، ساختار رمز شده meta_info به انتهای اون فایل اضافه میشه. ساختار نهایی بصورت زیر هستش :
1 2 3 4 5 6 |
struct encrypted_file { char enc_file_content[file_content_length]; char enc_meta_info[enc_meta_info_length]; int enc_meta_info_length; }; |
جمع بندی:
محققای چک پوینت اعلام کردن با بررسی رخدادهای مرتبط با باج افزار Moneybird میشه نتیجه گرفت که گروه Agrius در تلاش برای استفاده از باج افزار هستش. اگرچه این گروه قبلا با Wiper یا باج افزار Apostle شناخته میشده و از نامهای مختلف استفاده میکرده، اما استفاده اونا از یه باج افزار جدید، نشون دهنده ، افزایش قابلیت ها و سختتر کردن فرایند شناساییشون شده.
با همه این تلاشها، رفتار اونا در حملات مشابه هستش و مانند اغلب باج افزارها ، میشه با رعایت نکات ایمنی در شبکه، از خیلی از فعالیتهای اونا در ابتدای حمله ،جلوگیری کرد.
خود باج افزار پیچیدگی خاصی نداره، اما نشون دهنده اینه که برای اهداف خاصی طراحی شده. برخی از ویژگی های باج افزار امکان اجرای اون در کمپین های انبوده رو نمیده. این مسئله هدفمند بودن، در مسیرهای خاصی که در تحلیل بررسی شده، هم هستش.
رولهای YARA برای باج افزار Moneybird :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
rule ransomware_moneybird { meta: author = "Marc Salinas @ Check Point Research" description = "Detects a ransomware sample named Moneybird based on its pdb string." malware_family = "MoneyBird" date = "11/05/2023" sample = "aa19839b1b6a846a847c5f4f2a2e8e634caeebeeff7af59865aecca1d7d9f43c" strings: $ran1 = "WE ARE MONEYBIRD!" $ran2 = "All of your data encrypted!" $ran3 = "ok.ru/profile" $ext1 = "Shiftlibgcrypt" $ext2 = "come to the aide of their" $ext3 = "stopmarker" wide $code1 = {44 89 4C 24 20 4C 89 44 24 18 48 89 54 24 10 89 4C 24 08 56 57 48 83 EC 78 48 8B 05 68 FE 1A 00 48 33 C4 48 89 44 24 60 48 8D 44 24 50 48 8D 0D DC 68 15 00 48 8B F8 48 8B F1 B9 10 00 00 00 F3 A4 45 33 C9 41 B8 09 00 00 00 BA 09 00 00 00 48 8D 4C 24 48 ?? ?? ?? ?? ?? 41 B8 20 00 00 00 48 8B 94 24 A0 00 00 00 48 8B 4C 24 48 ?? ?? ?? ?? ?? 48 8D 44 24 50 48 89 44 24 40 48 C7 44 24 30 FF FF FF FF} $code2 = {48 FF 44 24 30 48 8B 44 24 40 48 8B 4C 24 30 80 3C 08 00} $code3 = {48 8B 44 24 30 4C 8B C0 48 8D 54 24 50 48 8B 4C 24 48 ?? ?? ?? ?? ?? 8B 84 24 90 00 00 00 48 C7 44 24 20 00 00 00 00 45 33 C9 44 8B C0 48 8B 94 24 98 00 00 00 48 8B 4C 24 48 ?? ?? ?? ?? ?? 89 44 24 38 48 8B 4C 24 48 ?? ?? ?? ?? ?? 48 8B 4C 24 60 48 33 CC ?? ?? ?? ?? ?? 48 83 C4 78 5F 5E C3} condition: uint16(0) == 0x5A4D and (2 of ($ran*) or all of ($code*) or all of ($ext*)) |