Один из самых рас­простра­нен­ных век­торов атак на орга­низа­ции и прос­тых поль­зовате­лей — соци­аль­ная инже­нерия. Зло­деи при­сыла­ют жер­тве элек­трон­ное пись­мо с вло­жени­ем, очень час­то — документ Microsoft Office с опас­ным содер­жимым. В этой статье мы раз­берем­ся, как ана­лизи­ровать такие докумен­ты и как искать в их нед­рах вре­донос­ный код.

Сог­ласно мат­рице MITRE ATT&CK, ата­ка, в которой зло­умыш­ленни­ки исполь­зуют докумен­ты Microsoft Office, называ­ется Spearphising Attachment. Что­бы рас­ска­зать о методах ана­лиза при­меня­емых в таких ата­ках фай­лов, я вос­поль­зуюсь дву­мя задани­ями с ресур­са CyberDefenders. Пер­вое из них — Obfuscated — поз­волит нам иссле­довать вре­донос­ный документ в фор­мате DOC. С помощью вто­рого, под наз­вани­ем Emprisa Maldoc, мы раз­берем, как зло­умыш­ленни­ки исполь­зуют документ RTF для выпол­нения шелл‑кода.

Су­щес­тву­ют сле­дующие методы выпол­нения вре­донос­ного кода в докумен­тах Microsoft Office.

  1. Вы­пол­нение кода, встро­енно­го в мак­рос VBA.
  2. Вы­пол­нение JavaScript в докумен­тах Microsoft Office.
  3. Вы­пол­нение полез­ной наг­рузки с исполь­зовани­ем уяз­вимос­тей в при­ложе­ниях Microsoft Office.

Для нашей работы мы будем исполь­зовать сле­дующий набор ути­лит:

  • oleid — для ана­лиза OLE-фай­лов;
  • olevba — для извле­чения и ана­лиза исходно­го кода мак­росов VBA из докумен­тов MS Office (OLE и OpenXML);
  • oledump — для ана­лиза потоков дан­ных OLE-фай­ла;
  • rtfdump — для ана­лиза фай­лов фор­мата RTF;
  • rtfobj — для извле­чения встро­енных объ­ектов из фай­лов RTF;
  • scdbg — для ана­лиза шелл‑кода, ути­лита пос­тро­ена на осно­ве биб­лиоте­ки для эму­ляции libemu.

info

Ис­сле­дова­ние мы будем про­водить в лабора­тории для ана­лиза вре­доно­сов, под­робно опи­сан­ной в статье «Код под над­зором. Соз­даем вир­туаль­ную лабора­торию для ана­лиза мал­вари».

Все необ­ходимые для ана­лиза вре­донос­ных докумен­тов ути­литы находят­ся в катало­ге FLARE\Office вир­туаль­ной машины под управле­нием Windows 10. А опи­сание обще­го под­хода к это­му самому ана­лизу мож­но най­ти в памят­ке Лен­ни Зель­цера.

Итак, прис­тупим к изу­чению фай­лов с сай­та CyberDefenders. Я не буду при­водить отве­ты на воп­росы из заданий — пов­торив все опи­сан­ные ниже экспе­римен­ты, ты смо­жешь най­ти их сам.

 

Obfuscated

Заг­рузим с сай­та ар­хив с задани­ем. Пер­вым делом пос­чита­ем хеш MD5 содер­жащего­ся в архи­ве фай­ла (в резуль­тате получит­ся зна­чение 49b367ac261a722a7c2bbbc328c32545) и про­верим его на VirusTotal.

Те­перь получим информа­цию о струк­туре вре­донос­ного докумен­та. Для это­го вос­поль­зуем­ся ути­литой oleid.

oleid 49b367ac261a722a7c2bbbc328c32545
Информация об объекте исследования
Ин­форма­ция об объ­екте иссле­дова­ния

Тул­за опре­дели­ла, что это документ Microsoft Office Word и в нем есть VBA-мак­рос. Его нам пред­сто­ит вытащить наружу. Для начала вос­поль­зуем­ся ути­литой oledump и пос­мотрим, в каком потоке OLE содер­жится VBA-мак­рос.

oledump 49b367ac261a722a7c2bbbc328c32545
Потоки исследуемого документа
По­токи иссле­дуемо­го докумен­та

Мак­рос спря­тал­ся в вось­мом потоке дан­ных. Выг­рузим его при помощи инс­тру­мен­та olevba с клю­чом -a.

olevba -a 49b367ac261a722a7c2bbbc328c32545
Результат работы утилиты olevba
Ре­зуль­тат работы ути­литы olevba

В потоке Macros/VBA/Module1 сос­редото­чена основная фун­кци­ональ­ность вре­донос­ного скрип­та. Из вывода ути­литы вид­но, какие фун­кции он исполь­зует. Давай извле­чем этот скрипт и нач­нем иссле­довать код.

olevba -c 49b367ac261a722a7c2bbbc328c32545
Участок обфусцированного кода вредоносного VBA-макроса
Учас­ток обфусци­рован­ного кода вре­донос­ного VBA-мак­роса

Фун­кция AutoOpen() запус­кает выпол­нение скрип­та, ког­да документ откры­вают. Что­бы усложнить нам работу, зло­умыш­ленни­ки обфусци­рова­ли код VBA-мак­роса: име­на перемен­ных пред­став­лены в фор­мате Base64. Мы будем вруч­ную деоб­фусци­ровать код и раз­берем его фун­кци­ональ­ность.

info

Для деоб­фуска­ции VBA-мак­роса мож­но вос­поль­зовать­ся ути­литой ViperMonkey, которая эму­лиру­ет выпол­нение сце­нария, но сегод­ня про­ведем руч­ной ана­лиз.

Нач­нем с фун­кции AutoOpen().

Участок кода функции AutoOpen
Учас­ток кода фун­кции AutoOpen

На кар­тинке ты видишь выделен­ный фраг­мент кода, содер­жащий нес­коль­ко очень инте­рес­ных фун­кций. Фун­кция FileLen(ActiveDocument.FullName) получа­ет раз­мер докумен­та Word и записы­вает его в перемен­ную N18Eoi6OG6T2rNoVl41W. Фун­кция Open(ActiveDocument.FullName) откры­вает документ в бинар­ном фор­мате, затем записы­вает его содер­жимое в перемен­ную E2kvpmR17SI и пре­обра­зует счи­тан­ные стро­ки в кодиров­ку Unicode.

Во вто­ром выделен­ном бло­ке с исполь­зовани­ем объ­екта vbscript.regexp выпол­няет­ся поиск такой стро­ки в откры­том фай­ле:

MxOH8pcrlepD3SRfF5ffVTy86Xe41L2qLnqTd5d5R7Iq87mWGES55fswgG84hIRdX74 dlb1SiFOkR1Hh

В перемен­ной Y5t4Ul7o385qK4YDhr хра­нит­ся ука­затель на пер­вый сим­вол най­ден­ной стро­ки в исходном докумен­те.

Продолжение участка кода функции AutoOpen
Про­дол­жение учас­тка кода фун­кции AutoOpen

Об­фусци­рован­ный вре­донос­ный код рас­положен пос­ле обна­ружен­ной нами стро­ки, его раз­мер сос­тавля­ет 16 827 байт.

Начало полезной нагрузки
На­чало полез­ной наг­рузки

Из фай­ла счи­тыва­ется информа­ция начиная с бай­та 0x503c, далее декоди­рует­ся по алго­рит­му, который мы раз­берем ниже, и сох­раня­ется в файл %appdata%\Microsoft\Windows\maintools.js. Затем с помощью WScript.Shell выпол­няет­ся JS-скрипт maintools.js с парамет­ром EzZETcSXyKAdF_e5I2i1.

Да­вай раз­берем алго­ритм декоди­рова­ния и напишем неболь­шую прог­рамму на Python для получе­ния исходно­го JS-скрип­та.

Функция декодирования полезной нагрузки
Фун­кция декоди­рова­ния полез­ной наг­рузки

Для удобс­тва чте­ния кода я пере­име­новал перемен­ные. Алго­ритм декоди­рова­ния очень прост. С каж­дым бай­том выпол­няет­ся опе­рация XOR (исклю­чающее «или») с клю­чом, который хра­нит­ся в перемен­ной KEY. Пос­ле каж­дого пре­обра­зова­ния бай­та изме­няет­ся и сам ключ.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Подписаться
Уведомить о
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии