سپهر هاشمی
سپهر هاشمی
خواندن ۶ دقیقه·۶ سال پیش

تحلیل یک نوع جدید از بدافزار Emotet


نوسنده مقاله : Xiaopeng Zhang (ترجمه به زبان اول شخص خواهد بود)

تاریخ انتشار در منبع : 29 بهمن 97

محل پژوهش و انتشار : نشریه مقالات پژوهشی تحلیل تهدیدات - مجموعه آزمایشگاه های FortiGuard

خبر وجود اعضای خانواده ی بدافزار Emotet چیز جدیدی نیست در واقع مربوط به چندین سال قبل است. ظاهرا قبلاً در سال 2017 این تیم پژوهشی یک فایل جاوااسکریپت مربوط به این بدافزار را رصد کرده که پس از تحلیل در دو بخش منتشر شده است. برای مشاهده گزارشات قبلی کلیک کنید : بخش یک و بخش دو

اخیرا آزمایشگاه FortiGuard یک نوع تازه از Emotet را کشف کرده است. این دفعه، در یک سند نرم افزار واژه پرداز Microsoft Word جاساز شده است. من هم یک تحلیل سریع روی آن انجام دادم و در این مقاله قصد دارم برای شما بیان کنم که چگونه بر روی دستگاه قربانی عمل خواهد کرد)

نمونه فایل Word همراه با Macro

شکل 01 - فایل Word همراه با هشدار امنیتی باز شده است
شکل 01 - فایل Word همراه با هشدار امنیتی باز شده است

اسم اصلی سند آلوده شده PAY09735746167553.doc می باشد که حاوی کد مخرب VBA در یک ماکرو می باشد. ( VBA مخفف Visual Basic for Applications هست). شکل 01 محتوای درون یک فایل Word را نشان می دهد.

به محض اینکه کاربر بر روی Enable Editing کلیک کند، کد VBA مخرب به طور خودکار با استفاده از تابع "autoopen" اجرا می شود، همانطور که در شکل 1 نشان داده شده است. بعد از مدتی، مقدار بسیار فراوانی از کد را در PowerShell تولید میکند و سپس آن را اجرا می کند. همانطور که در شکل 2 نشان داده شده است، این کد تولید شده توسط PowerShell، فایل واقعی Emotet را از چندین لینک (URL) مختلف که به طور پویا تولید می شوند را دانلود می کند.

شکل 02 - کد پاورشل بدافزار Emotet را دانلود و اجرا می کند
شکل 02 - کد پاورشل بدافزار Emotet را دانلود و اجرا می کند

بدافزار Emotet در آدرس %LocalAppData% جای می گیرد

فایل دانلود شده، نرم افزار مخرب Emotet است. نامی که از آن استفاده می کند یک رشته ی تصادفی است و در پوشه ی %temp% قرار دارد. هنگامی که اجرا می شود، مسیرِ فایلِ پراسسِ فعلی را مقایسه می کند و همان آدرس %LocalAppData%\culturesource\culturesource.exe نباشد، فایل exe اصلی را از پوشه ی %temp% به پوشه فوق منتقل می کند (حتی اگر پوشه ای وجود نداشته باشد، پوشه را ایجاد می کند) و آن را به اسم culturesource.exe تغییر نام می دهد. کلمه "culturesource" یک رشته ثابت است که از حافظه آن رمزگشایی شده است.

در زیر کد قطعه کد ASM مربوطه درج شده است. این برنامه API SHFileOperationW را برای اجرای فایل فراخوانی می کند که در یک تابع فراخوانی Timer فراخوانی می شود که بعداً درباره آن صحبت خواهم کرد.

کد :

[.....]
002FFB9A loc_2FFB9A: ; CODE XREF: sub_311D78+1Fj
002FFB9A call ds:memset
002FFBA0 call sub_2F1250 ;;;CreateDirectoryW
002FFBA5 push 1Eh
002FFBA7 lea eax, [ebp-20h]
002FFBAA push edi
002FFBAB push eax
002FFBAC call ds:memset
002FFBB2 add esp, 18h
002FFBB5 mov dword ptr [ebp-1Ch], 1 ;; FO_MOVE
002FFBBC lea eax, [ebp-20h] ; SHFILEOPSTRUCTA structure
002FFBBF mov dword ptr [ebp-18h], offset unk_3083F8 ; ; current file path in %temp% folder.
002FFBC6 mov esi, 0E14h
002FFBCB mov dword ptr [ebp-14h], offset
word_307EE0 ; %LocalAppData%\culturesource\culturesource.exe.
002FFBD2 mov [ebp-10h], si
002FFBD6 push eax
002FFBD7 call ds:SHFileOperationW
002FFBDD test eax, eax
002FFBDF jnz short loc_2FFBEA
002FFBE1 cmp [ebp-0Eh], edi
002FFBE4 jz loc_2FFCA0
[.....]

در نهایت، API CreateProcessW را برای اجرای فایل culturesource.exe فراخوانی می کند و پس از آن از پراسس فعلی خارج می شود.

تکنیک ضد-تحلیل

سپس، این بدافزار، پراسس (بهتر است بگوییم فرآیند) دوم culturesource.exe را آغاز می کند که در آن، توابع مهم Emotet نگهداری و اجرا می شوند. هنگامی که culturesource.exe دوم به طور معمول اجرا می شود، پراسس اولیه از کار می افتد. پس از آن Emotet به صورت پویا کد و اطلاعات را در تعدادی از بلوک های حافظه منتشر می کند که پس از آن، کار Emotet را پیگیری می کند.

اکثر توابع به چند قسمت تقسیم می شوند. من یکی را انتخاب میکنم تا به شما نشان دهم که چگونه از این ترفند استفاده میکند. شکل 3 نشان می دهد که تابع نرمال و معمولی به هفت بخش تقسیم شده است که همه آنها با استفاده از دستورالعمل "jmp" به یکدیگر متصل می شوند تا مشکل تجزیه و تحلیل کد را افزایش دهند.

شکل 03 - یک تابع به هفت بخش تقسیم می شود
شکل 03 - یک تابع به هفت بخش تقسیم می شود

تمام رشته ها رمزگذاری می شوند و سپس قبل از استفاده در زمان اجرا رمزگشایی می شوند.

تمام API های وارد ( Import ) شده نیز رمزگذاری شده اند و همگی در ابتدای اجرا نیز رمزگشایی می شوند. شکل 4 یک قطعه کد را نشان می دهد که یک رشته ی "user32.dll" را از "unk_3031F0" رمزگشایی می کند. سپس API LoadLibraryW را برای بارگیری "user32.dll" فراخوانی می کند و بعد از آن، از اطلاعاتِ API رمزگشایی شده برای پیدا کردن API های صادر شده در ماژول "user32.dll" استفاده می کند.

شکل 04 - رشته رمزنگاری شده و API بارگذاری شده از user32.dll
شکل 04 - رشته رمزنگاری شده و API بارگذاری شده از user32.dll

تابع Timer

Emotet همچنین از یک رویداد تایمر ویندوز برای اجرای کدِ خود استفاده می کند. در تجزیه و تحلیل قبلی من ، از تابع "WindowProc" برای ضبط یک پیام تایمر به منظور انجام فعالیت های مخرب استفاده نمود اما در این نسخه کمی متفاوت است. در اینجا، مستقیماً از تابع Timer Callback استفاده می کند.

هنگامی که API SetTimer را فراخوانی می کند، فاصله زمانی ( Interval Time ) را روی 1000 تنظیم میکند. این به این معنی است که تابع callback در هر 1000 میلی ثانیه یک بار فراخوانی می شود. در زیر، شبه کد این تابع فراخوانی آورده شده است:


void __stdcall Timer_fun(int a1, int a2, int a3, int a4)

{

unsigned int v4; // esi@6

int v5; // eax@6

unsigned int v6; // esi@15

int v7; // eax@15

int v8; // esi@16

int v9; // eax@16

if ( qword_307C94 <= (unsigned __int64)(unsigned int)GetTickCount() )

{

switch ( HIDWORD(qword_307C94) )

{

مورد شماره 1 :

HIDWORD(qword_307C94) = 0;

if ( !sub_2F6BA0() || !sub_2F7170() || check_if_process_is_in_correct_path() )

goto LABEL_7;

v4 = GetTickCount() % 0xBB8u;

v5 = GetTickCount();

HIDWORD(qword_307C94) = 2;

LODWORD(qword_307C94) = v4 + v5 + 3000;

break;

مورد شماره 2 :

HIDWORD(qword_307C94) = 0;

if ( sub_2F8300()

&& sub_2F8430()

&& sub_2F8B20()

&& sub_2F95B0()

&& sub_2FA320()

&& sub_2FB750()

&& sub_2F68D0() )

{

dword_307CC4 = (int)&unk_3080E8;

dword_307CC8 = (int)&unk_303430;

dword_307CCC = 106;

v6 = GetTickCount() % 0xBB8u;

v7 = GetTickCount();

HIDWORD(qword_307C94) = 3;

LODWORD(qword_307C94) = v6 + v7 + 3000;

}

else

{

LABEL_7:

HIDWORD(qword_307C94) = 4;

}

break;

مورد شماره 3 :

HIDWORD(qword_307C94) = 0;

v8 = GetTickCount();

v9 = sub_2FCB20();

HIDWORD(qword_307C94) = 3;

LODWORD(qword_307C94) = v9 + v8;

break;

مورد شماره 4 :

SetEvent(dword_304C0C);

break;

default:

return;

}

}

}

در مورد شماره 0 (ظاهرا منظور نویسنده کد های قبل از مورد شماره 1 می باشد )، یکی از اهداف آن انتقال فرایند به موقعیت مورد نظر با نام فایل است که قبلا ذکر کردم. همچنین مشخصات نام کامپیوتر، سیستم فایل و پارتیشن ها را با نام Callback API GetComputerNameW و GetVolumeInformationW جمع آوری می کند. در ادامه این دو مجموعه ی داده را در کنار هم قرار می دهد و آنها را در یک متغیر گلوبال (و رایج) ذخیره می کند، که در سرور C & C ( یعنی دستور و کنترل - همان سرور مرکزیِ فرماندهی) به عنوان شناسه برای این قربانی ذخیره و استفاده می شود. این شناسه بعداً در بسته هایی که با سرور فرماندهی در ارتباط هستند مورد استفاده قرار می گیرد. بدافزار Emotet سپس میزان CRC32 ی فایل EXE خود را محاسبه می کند و آن را در یک متغیر گلوبال دیگر ذخیره می کند که در هنگام ارسال اولین بسته به سرور فرماندهی مورد استفاده قرار می گیرد. من در مورد آن در بخش بعدی صحبت خواهم کرد. ( توضیح ، crc32 یک تابع تشخیص خطا است که از الگوریتم CRC32 برای تشخیص تغییرات بین اطلاعات مبدا و هدف - source and target data - استفاده می کند - مانند تغییر در سایز یا محتوای بسته یا فایل ارسالی)

شکل 05 - تصویری از سرویس culturesource در ویندوز قربانی
شکل 05 - تصویری از سرویس culturesource در ویندوز قربانی

از مورد شماره 1 برای راه اندازی تعدادی از ماژول های DLL و رمزگشایی توابع API صادر شده منجمله "urlmon.dll"، "userenv.dll"، "wininet.dll" و غیره که Emotet از آنها بهره می برد، استفاده می شود.

مورد شماره 2 شاخه اصلی است. داده ها را از سیستم قربانی جمع آوری می کند و این داده ها را به سرور فرماندهی ( که بصورت عمومی با عنوان C&C server برای روتکیت ها و بدافزار ها شناخته می شود) ارسال می کند و همچنین دستورات آن سرور را نیز اجرا می کند.

ارتباط با سرور فرماندهی C&C

این بدافزار چندین تابع API را برای جمع آوری اطلاعات فرا می خواند. به عنوان مثال، "RtlGetVersion" را برای به دست آوردن اطلاعات نسخه ویندوز، و "GetNativeSystemInfo" را برای جمع آوری اطلاعات سیستم و پردازنده فراخوانی می کند. همچنین مقدار DWORD درون افست 0x1D4 که در PEB قرار دارد و به عنوان SessionID تعریف می شود را برمیدارد. (برداشتن از فعل pick می آید و به معنای حذف کردن نیست. به معنای استفاده کردن است) - (وازه PEB در مبحث دیباگ ویندوز خلاصه ی عبارت Process Enviroment Block یعنی بلوک محیط پراسس می باشد)

بدافزار Emotet همچنین با فراخوانی APIs CreateToolhelp32Snapshot، Process32FirstW و Process32NextW به جمع آوری نام پراسس های در حال اجرا ادامه می دهد. گام بعدی این است که همه داده های جمع آوری شده را در یک ساختار قرار داده و سپس کل مجموعه ی داده ها را رمزگذاری کند. شکل 6 نشان می دهد که داده ها در یک ساختار کپی شده اند. مقادیر درون مستطیل قرمز پرچم هایی (Flag) هستند تا نشان دهند که اطلاعات زیر چه اطلاعاتی هستند. رشته ی پشت "12" ، نام کامپیوتر است. اطلاعات پشت "18" اطلاعات سیستم قربانی است و بایت بعد از "20" همان SessionID مربوط به PEB است. مقدار DWORD در کنار '2D' مقدار CRC32 در Emotet می باشد، رشته زیر '32' لیستِ اسم پراسس ها است که جمع آوری شده است و مقدار با خط زیر آبی طول داده های زیر است که از نوعی از کدگذاری utf-8 استفاده می کند.

سرور C&C قابلیت این را دارد که بفهمد آیا روی سیستم قربانی ابزارهای تجزیه و تحلیل همانند Wireshark ، دیباگر هایی مانند ollydbg و windbg و ... وجود دارند یا خیر. اگر وجود داشته باشند سرور به داده های دریافت شده از سیستم قربانی پاسخ نخواهد داد تا از احتمال افشای بدافزار بکاهد.

شکل 06 - داده ها را در یک ساختار قرار می دهد (منظور این است که ساختاری انحصاری ایجاد میکند و داده ها را آنجا جمع می کند)
شکل 06 - داده ها را در یک ساختار قرار می دهد (منظور این است که ساختاری انحصاری ایجاد میکند و داده ها را آنجا جمع می کند)

بدافزار، مجموعه اطلاعات را پس از رمزگذاری با استفاده از Base64 کدگذاری (encode) می کند. علاوه بر این، پس از کد Base64 را به عنوان مقدار کوکیِ یک هدر HTTP مخفی می کند. شما می توانید کد Base64 را در شکل 7 مشاهده کنید.

شکل 07 - ارسال دیتای جمع آوری شده به سرور فرماندهی C&C
شکل 07 - ارسال دیتای جمع آوری شده به سرور فرماندهی C&C

در شکل 7 همچنین می توانید سرور C & C به بعضی از داده ها پاسخ داده است. هنگامی که دستگاه برای اولین بار از سرور C & C اطلاعات دریافت می کند، یک ورودی خودکار به نام "cultruesource" تحتِ زیر-کلیدِ "HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Run" در رجیستری سیستم ایجاد می کند. در حال حاضر دو راه برای شروع Emotet، یعنی سرویس سیستم و اجرای خودکار ( Auto Run ) در رجیستری سیستم وجود دارد. در شکل 8 و 9 شما می توانید اطلاعات بیشتری در مورد اضافه کردن ورودیِ اجرایِ خودکار ( Autorun ) به رجیستری مشاهده کنید.

شکل 08 - اضافه کردن ورودیِ اجرایِ خودکار ( Autorun ) به رجیستری
شکل 08 - اضافه کردن ورودیِ اجرایِ خودکار ( Autorun ) به رجیستری
شکل 09 - تصویری از ورودیِ اجرایِ خودکار به نام
شکل 09 - تصویری از ورودیِ اجرایِ خودکار به نام

با رمزنگاری داده های دریافت شده، من می توانم فایل PE را دریافت کنم، مطابق آنچه که در شکل 10 مشاهده می کنید. از این تحلیل من، متوجه شدم که فایل PE رمز گشایی شده یک بدافزار Emotet دیگر است که این فقط برای ارتقاء خود بدافزار از آن استفاده می شود.

شکل 10 - داده های رمزگشایی شده ای که از سرور فرماندهی C&C دریافت شده اند.
شکل 10 - داده های رمزگشایی شده ای که از سرور فرماندهی C&C دریافت شده اند.

تا به اینجا، این تحلیل من برای این نوع جدید (از بدافزار) است. من همچنان برای نظارت بر این کمپین Emotet در خصوص توابع و تغییرات اضافی ادامه خواهم دا

همانند نسخه قبلی بدافزار، لیست IP سرورهای فرماندهی C&C در حافظه ی آن Hardcode شده و در یک متغیر گلوبال ذخیره می شود. هر جفت آی پی و پورت از 8 بایت حافظه استفاده می کند و در مجموع 62 سرور فرماندهی C&C وجود دارد. لیست آی پی و پورت Hardcode شده ی این نسخه از بدافزار تشریح شده است:

01> 71.91.161.118 : 21
02> 70.164.196.211 : 995
03> 175.101.79.120 : 80
04> 187.233.136.39 : 143
05> 5.107.250.192 : 995
06> 50.224.156.190 : 8080
07> 5.107.161.71 : 993
08> 186.179.243.7 : 995
09> 71.240.202.13 : 443
10> 190.215.53.85 : 80
11> 133.242.164.31 : 7080
12> 115.71.233.127 : 443
13> 69.136.227.134 : 22
14> 216.49.114.172 : 443
15> 153.121.36.202 : 7080
16> 181.119.30.27 : 995
17> 70.164.196.211 : 20
18> 98.157.215.153 : 80
19> 62.75.187.192 : 8080
20> 189.234.165.149 : 8080
21> 154.72.75.82 : 20
22> 45.123.3.54 : 443
23> 217.13.106.160 : 7080
24> 75.99.13.124 : 7080
25> 198.74.58.47 : 443
26> 69.195.223.154 : 7080
27> 172.114.175.156 : 8080
28> 73.124.73.90 : 20
29> 74.80.16.10 : 80
30> 24.11.67.222 : 443
31> 181.143.53.227 : 21
32> 173.76.44.152 : 20
33> 208.78.100.202 : 8080
34> 47.44.164.107 : 993
35> 45.63.17.206 : 8080
36> 50.31.0.160 : 8080
37> 62.75.191.231 : 8080
38> 98.142.208.27 : 443
39> 78.187.172.138 : 7080
40> 67.205.149.117 : 443
41> 98.186.90.192 : 443
42> 5.230.147.179 : 8080
43> 50.240.162.242 : 995
44> 94.76.200.114 : 8080
45> 178.62.37.188 : 443
46> 83.222.124.62 : 8080
47> 70.184.83.93 : 20
48> 173.255.196.209 : 8080
49> 208.107.230.235 : 20
50> 186.179.80.102 : 443
51> 72.95.118.97 : 21
52> 162.250.19.59 : 80
53> 134.129.126.86 : 443
54> 69.198.17.7 : 8080
55> 8.17.46.42 : 53
56> 70.90.183.249 : 7080
57> 47.149.54.132 : 8080
58> 200.116.160.31 : 80
59> 175.143.84.108 : 50000
60> 178.254.31.162 : 8080
61> 175.110.104.150 : 20
62> 211.115.111.19 : 443

راهکار :

این سند مخرب نرم افزار Word به عنوان "VBA / Agent.AFD! tr.dldr" شناخته شده است و فایل اصلی Emotet توسط سرویس آنتی ویروس FortiGuard به عنوان "W32 / Emotet.GBUH! tr" شناخته شده است.

ما همچنین یک امضا IPS به نام "Emotet.Botnet" برای تشخیص ترافیک بین سرور فرماندهی C&C و قربانی ایجاد کرده ایم.

لینک های دانلود Emotet نیز توسط سرویس FortiGuard WebFilter به عنوان "وب سایت های مخرب" دسته بندی شده اند.

لینک ها :

"hxxp://muathangnhom.com/6DOpkmOL9_yfO"
"hxxp://gmcvietnam.vn/abMbIaTzHSDkAq"
"hxxp://hugoclub.sk/yCq4xkYzeqAJK_v"
"hxxp://foreprojects.webedge.com.ng/Lc3UYXyQixr_Dp"
"hxxp://evonline.liceoriosdechile.com/NpDgofVhpankbq_I8AaJbzQj"

مشخصات SHA256 نمونه :

فایل WORD به نام PAY09735746167553.doc :
1194bab2c4a8e63e59ef01220ebe8e4d3511b12a16da30e713c2fbee6c2cb520
فایل EXE اصلی دانلود شده که همان بدافزار EMOTET می باشد:
7C5CDC5B738F5D7B40140F2CC0A73DB61845B45CBC2A297BEE2D950657CAB658

منبع : https://www.fortinet.com/blog/threat-research/analysis-of-a-fresh-variant-of-the-emotet-malware.html

بدافزارماکروadvanced malwareتحلیل بدافزارامنیت سایبری
بلاکچین و رمزارز: پژوهشگر | مترجم | نویسنده
شاید از این پست‌ها خوشتان بیاید