Отчеты о целевых атаках (APT)

APT-группа GOFFEE продолжает атаковать организации в России

APT-группа GOFFEE впервые попала в поле нашего зрения в начале 2022 года. С тех пор, согласно нашим наблюдениям, она атаковала исключительно организации в Российской Федерации, используя целевые фишинговые письма с вредоносными вложениями. С мая 2022 года по лето 2023 года группа GOFFEE применяла модифицированный зловред Owowa (вредоносный IIS-модуль) в своих атаках. С 2024 года злоумышленники начали распространять модифицированные вредоносные версии explorer.exe с помощью целевого фишинга.

Во второй половине 2024 года APT-группа GOFFEE продолжала атаковать организации в России, используя PowerTaskel — непубличный агент для Mythic на PowerShell, а также новый имплант, который мы назвали PowerModul. Целями атак стали СМИ, телекоммуникационные и строительные компании, а также государственный и энергетический сектора.

Краткое содержание отчета:

  • группа GOFFEE обновила схемы распространения;
  • она задействовала ранее не описанный имплант, который мы назвали PowerModul;
  • злоумышленники из GOFFEE все чаще отказываются от использования PowerTaskel в пользу бинарного агента для Mythic при горизонтальном перемещении по сети.

Для получения более подробной информации обращайтесь по адресу intelreports@kaspersky.com

Техническая информация

Первичное заражение

На данный момент злоумышленники используют несколько схем заражения одновременно. В роли отправной точки обычно выступает фишинговое письмо с вредоносным вложением, но далее схемы немного расходятся. Мы рассмотрим только две схемы, актуальные на момент проведения исследования.

Первая схема заражения использует RAR-архив с исполняемым файлом, замаскированным под документ. В некоторых случаях имя файла включает двойное расширение, например .pdf.exe или .doc.exe. Когда пользователь пытается открыть такой исполняемый файл, он загружает с командного сервера и открывает документ-приманку, параллельно совершая вредоносные действия.

Образец документа-приманки

Образец документа-приманки

Исполняемый файл представляет собой системный файл Windows (explorer.exe или xpsrchvw.exe), в код которого добавлен вредоносный шелл-код. Шелл-код похож на тот, что мы видели в предыдущих атаках, однако он также содержит обфусцированный агент для Mythic, который сразу начинает взаимодействовать с командным сервером.

Схема работы вредоносного ПО, версия 1

Схема работы вредоносного ПО, версия 1

Во втором сценарии архив RAR содержит документ Microsoft Office с макросом, который выполняет роль дроппера.

Схема работы вредоносного ПО, версия 2

Схема работы вредоносного ПО, версия 2

Вредоносный документ с макросом

Вредоносный документ с макросом

При открытии документа его текст отображается в неразборчивом виде, и появляется предупреждающее сообщение с текстом: «Документ был создан в более ранней версии Microsoft Office Word. Для корректного отображения средствами Microsoft Office Word необходимо нажать «Включить содержимое». Нажатие на кнопку «Включить содержимое» активирует макрос, который скрывает предупреждающее изображение и восстанавливает текст с помощью стандартной операции замены символов. Кроме того, макрос создает два файла в текущей папке пользователя: HTA-файл и файл PowerShell, а затем записывает путь к HTA-файлу в значение LOAD раздела реестра HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows.

Хотя сам макрос ничего не запускает и не создает новых процессов, программы, указанные в значении LOAD упомянутого раздела реестра, запускаются автоматически для текущего авторизованного пользователя.

Содержимое UserCache.ini.hta

Содержимое UserCache.ini.hta

Вредоносный HTA-файл запускает скрипт PowerShell (имплант PowerModul), но не напрямую. Вместо этого он сначала вызывает cmd.exe с перенаправлением вывода, чтобы записать на диск файл JavaScript с именем UserCacheHelper.lnk.js, а затем запускает этот JS-файл. И уже затем JavaScript запускает PowerModul:

Стоит отметить, что файлы UserCache.ini.hta и UserCacheHelper.lnk.js содержат строки с полными путями к файлам, включая имя локального пользователя, а не переменные окружения. В результате исполняемые команды и размеры файлов будут различаться в зависимости от имени текущего пользователя.

Содержимое UserCacheHelper.lnk.js

Содержимое UserCacheHelper.lnk.js

Файл UserCacheHelper.lnk.js запускает PowerShell-скрипт под названием UserCache.ini, созданный первоначальным макросом. Этот файл содержит имплант PowerModul в закодированном виде.

Имплант PowerModul

MD5 60A53D2C653991F086C4E6663D652CF2
SHA1 636814C31B78DD291049029A655238D7ADAFF041
SHA256 BE1D0FAF1C253FAACBA1059971B01D1D646256D7B2E557DA55ED059542AFDBCD
File type PowerShell
File size 6.66 KB
File name UserCache.ini

PowerModul — это скрипт PowerShell, который может получать с командного сервера дополнительные PowerShell-скрипты и выполнять их. Первые случаи применения этого импланта были зафиксированы в начале 2024 года. Изначально он отвечал за загрузку и запуск импланта PowerTaskel и считался относительно простым промежуточным компонентом для запуска этого импланта. Однако использование уникального протокола, особых типов полезной нагрузки и командного сервера, отличного от сервера PowerTaskel, позволило выделить его в отдельное семейство.

Содержимое UserCache.ini

Содержимое UserCache.ini

В описанной схеме код PowerModul встроен в файл UserCache.ini в виде строки, закодированной по алгоритму Base64. Начало и конец расшифрованного скрипта показаны на рисунках ниже, а средняя часть содержит копию HTA-файла, а также код, который отвечает за его сохранение на диск, запись пути к нему в реестр и скрытие путем установки соответствующего атрибута. По сути, этот код частично повторяет функциональность VBA-макроса, найденного в документе Word, за исключением скрытия файла, которого в VBA-макросе нет.

Начало скрипта PowerModul

Начало скрипта PowerModul

Конец скрипта PowerModul

Конец скрипта PowerModul

При обращении к командному серверу PowerModul добавляет к его URL-адресу строку идентификатора зараженной системы, которая включает имя компьютера, имя пользователя и серийный номер диска, разделенные символами подчеркивания:

Ответ от командного сервера приходит в формате XML и содержит скрипты, закодированные по алгоритму Base64:

В PowerModul есть дополнительная, ранее не описанная функция под названием OfflineWorker(). Она декодирует заданную строку и выполняет ее содержимое. На приведенных выше скриншотах декодируемая строка пуста, поэтому никакие действия не выполняются. Однако мы наблюдали случаи, когда строка содержала данные. Ниже приведен пример функции OfflineWorker(), содержащей код инструмента для кражи данных FlashFileGrabber:

В число полезных нагрузок, используемых имплантом PowerModul, входят инструменты PowerTaskel, FlashFileGrabber и USB Worm.

Инструмент FlashFileGrabber

Как следует из названия, FlashFileGrabber предназначен для кражи файлов со съемных носителей, таких как флеш-накопители. Мы выявили две разновидности этого инструмента: FlashFileGrabber и FlashFileGrabberOffline.

Основная процедура FlashFileGrabberOffline

Основная процедура FlashFileGrabberOffline

FlashFileGrabberOffline ищет на съемных носителях файлы с определенными расширениями и, обнаружив их, копирует на локальный диск. Для этого в папке TEMP создается ряд подпапок по шаблону %TEMP%\CacheStore\connect\<VolumeSerialNumber>\. Имена папок CacheStore и connect прописаны непосредственно в скрипте. Примеры таких путей приведены ниже:

Чтобы зловред не копировал одни и те же файлы несколько раз, по указанному в шаблоне пути создается файл с именем ftree.db, в котором хранятся метаданные о скопированных файлах, включая полный путь к исходному файлу, его размер и даты последнего доступа и изменения, а в папке %AppData% создается файл internal_profiles.db с MD5-хешами вышеупомянутых метаданных:

Список расширений файлов, интересующих злоумышленников, выглядит следующим образом:

.7z .kml .rar
.conf .log .rtf
.csv .lrf .scr
.doc .mdb .thm
.docx .ods .txt
.dwg .odt .xlm
.heic .ovpn .xls
.hgt .pdf .xlsm
.html .png .xlsx
.jpeg .pptx .xml
.jpg .ps1 .zip

FlashFileGrabber в основном дублирует функциональность FlashFileGrabberOffline, но с одним отличием: он может отправлять файлы на командный сервер.

Процедуры FlashFileGrabber

Процедуры FlashFileGrabber

Червь USB Worm

USB Worm способен заражать съемные носители копией PowerModul. Для этого червь дает файлам на съемном носителе случайные имена, сохраняя их оригинальное расширение, и скрывает их. После этого файл UserCache.ini, содержащий имплант PowerModul, копируется в папку со скрытым таким образом файлом.

Основная процедура USB Worm

Основная процедура USB Worm

Кроме того, червь создает скрытые VBS- и BAT-файлы для запуска PowerModul и открытия документа-приманки.

Функции CreateVBSFile() и CreateBatFile()

Функции CreateVBSFile() и CreateBatFile()

Пример содержимого вредоносного VBS-файла

Пример содержимого вредоносного BAT-файла

Также создается ярлык с исходным именем документа-приманки, при запуске которого выполняется VBS-файл.

Функция CreateShortcutForFile()

Функция CreateShortcutForFile()

Чтобы замаскировать ярлык, червь присваивает ему подходящий значок из библиотеки shell32.dll в зависимости от расширения исходного файла. Червь заменяет ярлыками не более пяти документов, выбирая самые последние файлы и сортируя их по атрибуту LastAccessTime.

Схема заражения системы через съемный носитель

Схема заражения системы через съемный носитель

Имплант PowerTaskel

PowerTaskel — это непубличный агент для Mythic, написанный на PowerShell. Мы наблюдали его в кампаниях с первоначальным заражением через электронные письма с начала 2023 года. У этого импланта две основные функции: отправка информации о зараженной среде на командный сервер в виде контрольного сообщения (checkin) и выполнение произвольных скриптов и команд PowerShell, получаемых с командного сервера в виде задач в ответ на запросы get_tasking. Полезная нагрузка запроса представляет собой объекты PowerShell, сериализованные в XML, закодированные с помощью XOR с однобайтовым ключом, своим для каждого образца, а затем перекодированные по алгоритму Base64.

Судя по названиям и порядку параметров конфигурации, можно предположить, что PowerTaskel является производным от Medusa, агента с открытым исходным кодом для Mythic, изначально написанного на Python.

Сравнение кода конфигурации агентов Medusa и PowerTaskel

Сравнение кода конфигурации агентов Medusa и PowerTaskel

Сравнение кода функции checkin агентов Medusa и PowerTaskel

Сравнение кода функции checkin агентов Medusa и PowerTaskel

PowerTaskel — полнофункциональный агент, способный выполнять команды и скрипты PowerShell, что позволяет ему, например, загружать и выгружать файлы, а также запускать процессы. Однако его возможностей зачастую недостаточно в силу особенностей работы PowerShell, поэтому группа решила перейти на собственный бинарный агент для Mythic. Для этого PowerTaskel загружает бинарный агент с командного сервера, внедряет его в память своего процесса и запускает в отдельном потоке. В этом сценарии бинарный агент представлен в виде самоконфигурирующегося шелл-кода для платформ x86 и x64. Метод внедрения и загрузки шелл-кода Mythic-агента более подробно описан в разделе «Горизонтальное перемещение по сети».

Как минимум в одном случае PowerTaskel получил в качестве задачи скрипт с компонентом FolderFileGrabber. FolderFileGrabber во многом повторяет функциональность FlashFileGrabber, но с одним ключевым отличием: он может загружать файлы с удаленных систем по жестко заданному сетевому пути через протокол SMB. Для доступа к удаленным системным ресурсам используется командлет PowerShell New-SmbMapping, что позволяет успешно извлекать нужные файлы.

Горизонтальное перемещение по сети

После заражения системы, если учетная запись пользователя обладает достаточными правами, PowerTaskel выполняет несколько действий для повышения привилегий до системного уровня. Для этого PowerTaskel использует утилиту PsExec из пакета Sysinternals. PsExec сохраняется в текущем каталоге, где находится PowerTaskel, после чего запускает mshta.exe с системными привилегиями, передавая в качестве аргумента URL-адрес.

На изображениях ниже показаны две задачи, которые PowerTaskel выполняет под управлением командного сервера. Первая задача проверяет наличие файла ntuser.exe в папке %ProgramData% и, если его нет, загружает его с командного сервера. Вторая задача запускает mshta.exe через программу ntuser.exe, которая на самом деле является переименованной версией утилиты PsExec.

Получение ntuser.exe

Получение ntuser.exe

Исполняемый файл ntuser.exe запускает файл mshta.exe

Исполняемый файл ntuser.exe запускает файл mshta.exe

Ниже приведен пример схемы выполнения различных скриптов и команд, запускаемых в процессе повышения привилегий и при совершении последующих действий. Исполняемый файл 1cv9.exe — это переименованная утилита PsExec, а аргумент -s указывает, что запускаемый процесс должен работать под системной учетной записью. Запущенная программа mshta.exe принимает в качестве аргумента URL-адрес, который указывает на HTA-файл, содержащий обфусцированный вредоносный код на JavaScript. Файл HTA кэшируется и сохраняется в папке InetCache. Этот JS-код создает на диске два файла, desktop.js и user.txt, с помощью консольной команды echo с перенаправлением вывода в файл, а затем выполняет desktop.js через cscript.exe. В свою очередь, файл desktop.js запускает интерпретатор со скриптом в командной строке, который затем читает содержимое файла user.txt и выполняет его. Судя по содержимому, передаваемому команде echo, user.txt — это еще один PowerShell-скрипт, задача которого — получить полезную нагрузку с жестко заданного адреса и выполнить ее. В данном случае полезной нагрузкой является агент PowerTaskel, который в этом случае запускается с повышенными привилегиями.

Пример схемы выполнения вредоносного кода в зараженной системе

Пример схемы выполнения вредоносного кода в зараженной системе

После запуска PowerTaskel взаимодействует со своим командным сервером и выполняет стандартные команды для сбора информации о системе и среде. В частности, запуск csc.exe (Visual C# Command Line Compiler) указывает на то, что PowerTaskel получал задание на загрузку шелл-кода, для чего он использовал вспомогательную DLL-библиотеку. Основная функция этой DLL — копирование шелл-кода в выделенную память. В нашем случае шелл-код представляет собой самоконфигурирующийся код бинарного Mythic-агента.

Последняя строка приведенной выше схемы (hxxp://192.168.1[.]2:5985/wsman) указывает на обращение к службе WinRM (Microsoft Windows Remote Management), расположенной на удаленном хосте в локальной сети, через загруженный Mythic-агент. Для доступа к службе WinRM используется специальное значение заголовка User-Agent — Ruby WinRM Client.

HTTP-заголовок для обращения к WinRM

HTTP-заголовок для обращения к WinRM

Службу WinRM группа GOFFEE активно использует для горизонтального перемещения по сети. Обычно для этого злоумышленники запускают утилиту mshta.exe на удаленном хосте, передавая ей URL-адрес в качестве аргумента. Следующие примеры иллюстрируют цепочки выполнения, которые наблюдались на удаленных хостах:

В последнее время мы заметили, что злоумышленники из GOFFEE все чаще отказываются от использования PowerTaskel для распространения в сети в пользу бинарного агента для Mythic.

HTA-файл с агентом для Mythic

MD5 615BD8D70D234F16FC791DCE2FC5BCF0
SHA1 EF14D5B97E093AABE82C4A1720789A7CF1045F6D
SHA256 AFC7302D0BD55CFC603FDAF58F5483B0CC00D354274F379C75CFA17F6BA6F97D
File type Polyglot (HTML Application)
File size 165.32 KB
File name duplicate.hta

Для запуска бинарного Mythic-агента по-прежнему используется утилита mshta.exe, которой в качестве аргумента передается URL-адрес. Однако содержимое полезной нагрузки, получаемой с этого URL-адреса, отличается от традиционного формата HTA. Она имеет относительно большой размер — около 180 КБ — и является файлом-полиглотом (polyglot), то есть может быть корректно прочитана как файл разных форматов. Шелл-код, содержащий Mythic-агент, находится в начале файла и занимает около 80% его размера. За ним идут два скрипта PowerShell, закодированных с помощью алгоритма Base64, которые разделены обычным переносом строки, и, наконец, сам файл HTA.

Полезная нагрузка в виде файла-полиглота

Полезная нагрузка в виде файла-полиглота

Когда утилита mshta.exe загружает описанную полезную нагрузку, она интерпретирует ее как HTA-файл и передает управление обфусцированному коду на JavaScript, встроенному в раздел HTA файла-полиглота. Сначала скрипт определяет, какой аргумент использовался при запуске утилиты mshta.exe: URL-адрес или путь к локальному файлу. Если в качестве аргумента был указан URL-адрес, скрипт ищет оригинальный файл HTA в папке InetCache, куда система кэшировала его во время загрузки. Для этого скрипт перебирает все файлы в папке с кэшем и проверяет их содержимое на наличие определенной магической строки.

Деобфусцированный JavaScript из раздела HTA полезной нагрузки

Деобфусцированный JavaScript из раздела HTA полезной нагрузки

Если на диске найден файл HTA, скрипт с помощью команды echo сохраняет два файла — settings.js и settings.ps1, а затем запускает settings.js с дополнительными аргументами командной строки. Затем скрипт устанавливает таймер на 10 секунд, по истечении которых сохраненные файлы будут удалены.

Деобфусцированный файл settings.js

Деобфусцированный файл settings.js

Запускаемый скрипт settings.js принимает три аргумента командной строки: путь к powershell.exe, путь к файлу HTA и строку Shell.Application. Полученные аргументы используются для формирования скрипта PowerShell, содержимое которого затем выполняется с помощью powershell.exe.

Скрипт, передаваемый интерпретатору PowerShell, объявляет две переменные: $INbqDKHp, которая хранит путь к файлу HTA, и счетчик $KWfWXqek. Затем скрипт считывает содержимое файла settings.ps1 и выполняет его трижды, передавая в качестве аргументов путь к файлу HTA и значение счетчика, которое каждый раз увеличивается на 1.

Деобфусцированный файл settings.ps1

Деобфусцированный файл settings.ps1

Во время каждого выполнения скрипт settings.ps1 считывает содержимое файла HTA, разбивает его на строки и идентифицирует скрипты в кодировке Base64. Чтобы обнаружить эти скрипты, сначала он ищет последовательность символов "<HTA:APPLICATION" , указывающую на строку с тегом приложения HTA. Три строки, предшествующие этому тегу, содержат скрипты в кодировке Base64. В зависимости от значения счетчика $KWfWXqek скрипт выполняет соответствующий скрипт в кодировке Base64.

Первые два скрипта описывают вспомогательные функции, в том числе отвечают за компиляцию дополнительной DLL-библиотеки, необходимой для выполнения шелл-кода. Третий скрипт отвечает за выделение памяти, загрузку шелл-кода из HTA-файла (путь к которому извлекается из ранее определенной переменной $INbqDKHp) и передачу управления загруженному шелл-коду, который является самоконфигурирующимся кодом Mythic-агента.

Жертвы

По данным нашей телеметрии, выявленные цели описанных вредоносных действий находятся в России, а активность наблюдалась с июля по декабрь 2024 года. Атакам подверглись различные отрасли, включая СМИ, телекоммуникационные и строительные компании, а также государственный и энергетический сектора.

Атрибуция

В этой кампании злоумышленники пользовались агентом PowerTaskel, который мы ранее связывали с группой GOFFEE. Кроме того, в цепочке заражения использовались файлы HTA и различные скрипты.

Вредоносный исполняемый файл, прикрепленный к целевому фишинговому письму, представляет собой модифицированную версию explorer.exe, схожую с той, что использовалась в атаках группы GOFFEE в начале 2024 года, и содержит шелл-код, который сильно напоминает тот, что ранее использовался GOFFEE.

Учитывая схожесть целей атак, мы с высокой степенью уверенности приписываем эту кампанию группе GOFFEE.

Выводы

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

Группа впервые использовала документы Word с вредоносными VBA-скриптами для начального заражения. Кроме того, GOFFEE задействовала новый загрузчик PowerShell-скриптов — PowerModul, который отвечал за загрузку зловредов PowerTaskel, FlashFileGrabber и USB Worm. Также злоумышленники начали использовать бинарный Mythic-агент и, вероятно, разработали собственные реализации этого агента на PowerShell и C.

Хотя GOFFEE продолжает улучшать свои инструменты и внедрять новые, эти изменения не столь значительны, чтобы кампанию можно было принять за действия другой группы.

APT-группа GOFFEE продолжает атаковать организации в России

Ваш e-mail не будет опубликован. Обязательные поля помечены *

 

Отчеты
Подпишитесь на еженедельную рассылку

Самая актуальная аналитика – в вашем почтовом ящике