Първоначално публикувано в Malwarebytes Labs Blog на 24 май 2018 г.

Зловреден софтуер Emotet Banking Trojan съществува от доста време. Като такива, изследователите на Infosec са направили няколко опита да разработят инструменти за де-замъгляване и дори декриптиране на AES-криптирания код, принадлежащ на този зловреден софтуер.

Проблемът с тези инструменти е, че те са насочени към активни версии на зловреден софтуер. Те срещат проблеми, когато авторите на зловреден софтуер променят кода. Промяната може да бъде всичко - от леки вариации в структурата на кода до драстични промени, като преминаване от VBA проект към PowerShell скриптове. Обикновено дори незначителна вариация на кода разваля инструментите.

Основната цел на тази статия е да помогне на читателите да разберат подробно структурата и потока на Emotet, така че вариациите на кода да не представляват предизвикателства за анализаторите, които се опитват да го декодират в бъдеще. Също така ще се потопим дълбоко в някои важни части от самия код, за да разберем изпълнението в подробен, стъпка по стъпка процес.

В първата част на този анализ от две части разглеждаме кода на VBA, където ще научите как да разпознавате и отхвърляте „мъртъв“ код, хвърлен, за да усложните процеса на анализ. Ние също така разглеждаме техники, които могат да се използват за извличане на обфусцираните команди и как се изпълнява кодът.

Преглед на Emotet

За целите на нашия анализ разглеждаме „тази извадка“:

Файл: ПЛАЩАНЕ 225EWF.doc

MD5: e8e468710c0a4f0906305c435a761902

SHA-256: 707fedfeadbfa4248cfc6711b5a0b98e1684cd37a6e0544e9b7bde4b86096963

Текущата версия на програмата за изтегляне Emotet използва PowerShell за изпълнение на крайни команди. Векторът на заразата е традиционна имейл фишинг кампания. Фишът ще съдържа връзка, върху която жертвата трябва да щракне, което от своя страна ще започне изтеглянето на зловредния софтуер. Зловреден софтуер обикновено е документ на Word, който подканва жертвата да активира макроси. След като макросите са активирани, VBA се изпълнява във фонов режим, а полезният товар се изтегля и изпълнява на компютъра на жертвата.

VBA код

Нека да разгледаме набързо как можем да получим достъп до VBA кода от заразения документ на Microsoft Word. За да активирате изгледа за програмисти в Word, отидете на Файл и изберете „Опции“. В Опции щракнете върху „Персонализиране на лентата“. Активирайте опцията „Разработчик“ и натиснете OK.

Това вече трябва да ви доведе до елемент „Разработчик“ в горната лента на менюто. След като щракнете върху „Разработчик“, ще видите опцията „Visual Basic“.

Кликнете върху Visual Basic и ще ви бъде представен целият проект в отделен прозорец. Сега можем да започнем да анализираме кода.

Като алтернатива можем да използваме автоматизиран начин за извличане на този скрипт на Powershell, като стартираме документа във виртуална машина и проверим параметрите, с които Powershell е внедрен, т.е. с помощта на ProcessExplorer. Освен това пясъчници като Hybrid Analysis го извличат автоматично.

Изпълнение на код

След като съдържанието е активирано (макроси)», изпълнението започва.

Кодът VBA идва като част от злонамерения документ на MS Office. Веднага след като макросите са активирани, кодът се изпълнява във фонов режим.

Като опит за объркване на кода, разработчиците са включили много текст, който не се използва. Само част от целия код е използваем и е доста добре скрит.

По-бърз начин да стигнете направо до кода е да започнете от макро кода, който се извиква за изпълнение на първоначалните команди. В случая на пробата, анализирана тук, това е Sub AutoOpen(). Започваме, като следваме тази подпроцедура.

Сега ще изхвърлим целия безполезен код, който е включен в подзадача, за да усложним анализа.

Можем да видим в края на подпроцедурата методът Application.run се извиква:

За да изпълним метода, показан по-горе, можем да видим, че методът извиква под и функция.

Първо, разглеждаме подndUzTzJ.

Този под отново има някакъв безполезен текст, който е там само за да добави сложност за целите на анализа. Ще се съсредоточим само върху използваем код.

Ето как трябва да изглежда подчинението, след като изхвърлим безполезния код:

На vbHide ще бъде присвоена стойност 0, което означава, че прозорецът е скрит и фокусът се предава на скрития прозорец.

DsPBkKtzcIwF — генерира командата.

ndUzTzJ — извиква WScript.Shell, за да изпълни командата.

Нека да разгледаме част от функцията DsPBkKtzcIwF():

В кодовия фрагмент по-горе можем да видим няколко забележителни неща:

Променливите се използват за съхраняване на присвоени стойности. След това стойностите ще бъдат предадени на друга функция, yy222222222222222y(), за обработка. Веднъж обработени, стойностите се присвояват отново на различни променливи и тези променливи ще се използват за конструиране на криптирания код, който ще бъде предаден на системата за дешифриране с помощта на PowerShell.

Дълбоко гмуркане

Нека да се потопим дълбоко тук и да анализираме внимателно кода:

JMArl = „zahajUZomiAjVADEAMAA4ADMdpokrTZ“

На променливата JMArl е присвоена стойността на „zahajUZomiAjVADEAMAA4ADMdpokrTZ“

szFqp = sRWNiPRldXLv = 21790 + 2115454 * PhcMjZjwl — CLng(8712932) / (zunFnTXk — Sqr(1328634 * Oct(7463260) — 1977628–4976151) * (294265 / XiFEWH))

vLkhkiRclJ = GcDcX = 3122978 + 1398811 * JTkURPW — CLng(9593915) / (krXPEiFIa — Sqr(1266549 * Oct(1775652) — 8314095–5625841) * (8872696 / mNsSkdPD))

Този код не може да се използва - ще го изхвърлим.

sEVQo = IjKrpJC + yy222222222222222y(JMArl, 14, 11)

Това е мястото, където се развива по-голямата част от действието. На променливата sEVQo се присвоява стойността на изхода на „IjKrpJC + yy22222222222222y(JMArl, 14, 11)“

„IjKrpJC“ не служи за никаква цел, ще го изхвърлим.

yy222222222222222y() е функцията, която се извиква. Нека да разгледаме самата функция:

Сега, нека да се отървем от целия код за боклук от функцията и след това да го погледнем още веднъж:

Функцията извиква функцията Mid, която обработва данните за по-нататъшна употреба.

Средна функция

hPoMiTjfoDT е ТЕКСТЪТ; twOYMDvfbGk е START_POSITION; VSTcawBYGW е NUMBER_OF_CHARACTERS

Сега, след като разбираме как е структуриран кодовият поток, нека да разгледаме как се изпълнява програмата.

Ето променливата sEVQo, преди да й бъде присвоена някаква стойност:

sEVQo сега извиква yy222222222222222y(). Можем да видим, че стойността „14“ е предадена на функционалната променлива „twOYMDvfbGk“:

sEVQo = IjKrpJC + yy222222222222222y(JMArl, 14, 11)

Продължавайки напред, можем да видим, че стойността „11“ е предадена на функционалната променлива „VSTcawBYGW“:

sEVQo = IjKrpJC + yy222222222222222y(JMArl, 14, 11)

Накрая, текстовият низ ще бъде предаден на променливата mbPRLWAjZ, която първоначално е ПРАЗНА:

Сега тези данни ще бъдат обработени с помощта на функцията Mid, както е описано по-горе.

Нека да разгледаме как се развива това:

mbPRLWAjZ= zahajUZomiAjVADEAMAA4ADMdpokrTZ

twOYMDvfbGk= 14

VSTcawBYGW= 11

Mid(hPoMiTjfoDT, twOYMDvfbGk, VSTcawBYGW):

Среден (“zahajUZomiAjVADEAMAA4ADMdpokrTZ”, 14, 11)

Трябва да се преведе на:

ADEAMAA4AD\

Сега нека отново да разгледаме изпълняваната функция:

И ще бъде предадено обратно на извикващата променлива:

И сега стойността за променливата sEVQo е присвоена на ADEAMAA4AD. Това беше поглед към една от многото променливи, използвани в тази функция.

За да видим как всичко се влива в крайния резултат за тази стойност, можем да погледнем окончателното присвояване на променливата:

Стойността, присвоена на DsPBkKtzcIwF след изпълнението на горния ред код, е командата, която ще бъде изпълнена от sub ndUzTzJ:

Вече можем да отпечатаме изхода на екрана (с помощта на MsgBox), за да имаме бърз преглед, или в незабавния прозорец (с помощта на Debug.Print) за пълен резултат.

Ето частта от командата отгоре, която извиква PowerShell:

Което трябва да се преведе (вижте маркирания текст) на:

Това беше поглед към това как да извадите крайната команда с криптираните данни от VBA кода. Във втора част от тази поредица ще дешифрираме тези данни, за да извлечем от тях URL адресите на полезен товар от втория етап.