Атаки новой группировки TaxOff: цели и инструменты

913734ae482ee7428a4f2cc7dfd52b87.jpg

C начала осени 2024 года мы в отделе исследования киберугроз активно наблюдаем за одной любопытной группировкой. Она атаковала государственные структуры в России, а ее основными целями были шпионаж и закрепление в системе для развития последующих атак. Связей с уже известными группировками мы установить не смогли, поэтому решили назвать ее TaxOff из-за использования писем на правовые и финансовые темы в качестве приманок. В своих атаках злоумышленники использовали написанный минимум на C++17 бэкдор, который мы назвали Trinper из-за артефакта, используемого при связи с C2.

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

Начальный вектор

Фишинг — типичный старт для заражения вредоносом. Мы обнаружили несколько фишинговых писем: в одном была ссылка на «Яндекс Диск» с вредоносным содержимым, связанным с »1С», в другом — фальшивый установщик специализированного ПО для заполнения справок о доходах и расходах для госслужащих. Ежегодно это ПО обновляется и становится целью для злоумышленников, распространяющих ВПО под видом обновлений.

«Материалы.img»

Одно из писем содержало ссылку на «Яндекс Диск», в котором хранился файл Материалы.img с таким содержимым:

  • DCIM.lnk — ярлык, который запускает исполнение бэкдора Trinper;

  • drive.google.com — бэкдор Trinper;

  • Encrypteddata — склейка зашифрованных архивов с обрезанными заголовками формата RAR;

  • «История поисков.html» — фишинговая форма, вид которой продемонстрирован на рисунке ниже.

Фишинговая форма

Фишинговая форма

«Справки БК»

В другом письме мы нашли специальное программное обеспечение «Справки БК» для заполнения справок о доходах и расходах госслужащих. Этот вектор уже использовался одной из групп для распространения бэкдора Konni в виде переименованного файла WEXTRACT.EXE.MUI, который отвечает за извлечение сжатых CAB-файлов. В нашем случае в них содержатся два других исполняемых файла: bk.exe — Справки БК и DotNet35.exe — бэкдор Trinper.

Информация о файле bk.exe

Информация о файле bk.exe

Аналогично CAB-файлу в разделе ресурсов RCData есть атрибуты последовательности запуска файлов, хранящихся в нем. В одном атрибуте под названием RUNPROGRAM были инструкции по выполнению первой команды или любой другой определенной программы, он также запускает bk.exe.

Содержимое атрибута RUNPROGRAM

Содержимое атрибута RUNPROGRAM

Другой атрибут — POSTRUNPROGRAM — также содержит инструкцию для запуска исполняемого файла, но уже после выполнения RUNPROGRAM. Таким образом, после выполнения bk.exe будет выполнен DotNet35.exe.

Содержимое атрибута POSTRUNPROGRAM

Содержимое атрибута POSTRUNPROGRAM

Бэкдор Trinper

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

В начале бэкдор десериализирует конфигурацию и получает оттуда имя, которое должно быть у него. Если название отличается, то выполнение прекращается. А если название бэкдора совпадает с тем которое у него в конфиге, бэкдор продолжает инициализацию и вызывает функцию для получения информации о компьютере жертвы, собирая ее в структуру VictimInfo такого вида:

220523f2409b3f421749cda107d79ce6.png

Поля структуры VictimInfo имеют следующие назначения:

Member

Purpose

magic

Магическое число 0xB0B1B201

VictimData

Member

Purpose

guid

Сгенерированный GUID

pbSecret

Сессионный ключ для AES-128-CBC

UserNameW

Имя пользователя

hostname

Имя узла

disks

Имена дисков

h_addrs

Список адресов узла

KeyboardLayout

Используемый системой язык

dwOemId

Информация об архитектуре

val_64

Константное значение 64

dwMajorVersion

Мажорная версия системы

dwMinorVersion

Минорная версия системы

Authority

Уровень целостности

FileNameW

Путь к файлу

AdaptersAddresses

Адреса сетевых адаптеров

После заполнения структуры VictimInfo бэкдор создает и запускает в разных потоках на исполнение эти экземпляры классов:

  • CommHTTP — класс для потока, в котором будет реализована коммуникация с C2;

  • BgJobFileCapture — класс для потока, в котором будет мониторинг файловой системы;

  • BgJobKeylogger — класс для потока, в котором будут перехвачены нажатия клавиш.

Экземпляр класса CommHTTP в своем потоке парсит десериализованную конфигурацию, которую будет использовать для коммуникации с C2, также генерирует сессионный ключ для AES-128-CBC (при этом вектор инициализации равен нулю), импортирует публичный RSA-ключ и входит в цикл общения с C2, в котором реализовано:

Цикл работы экземпляра класса CommHTTP

Цикл работы экземпляра класса CommHTTP

Экземпляр класса BgJobFileCapture в своем потоке мониторит файловую систему, в цикле перебирает все подключенные диски и рекурсивно ищет хранящиеся на дисках файлы с расширениями .doc, .xls, .ppt, .rtf, .pdf. Он также хранит результат работы в карте с ключом (имя файла) и значением (структура, содержащая информацию о файле, в том числе его содержимое).

Получение информации о файловой системе

Получение информации о файловой системе

Экземпляр класса BgJobKeylogger в своем потоке перехватывает нажатия клавиш и хранит их в двусторонней очереди, а данные из буфера обмена находятся в неупорядоченной карте.

Установка перехвата клавиш

Установка перехвата клавиш

Конфигурация хранится в зашифрованном виде в секции .data. Дешифрование осуществляется однобайтовым ключом для обычной операции Xor.

Дешифрование конфигурации

Дешифрование конфигурации

Протокол общения с C2

Все общение с C2 осуществляется экземпляром класса CommHTTP с помощью вызовов сетевых функций библиотеки WININET.DLL. Информация о компьютере жертвы и сессионном ключе шифруется публичным ключом RSA, кодируется с помощью Base64 и отправляется C2 в заголовке Config.Commands.CommandsHeaders с приветственной строкой Config.Commands.HelloMessage в данных запроса. Команды, полученные от C2 в ответе, заключены между маркерами Config.Commands.CommandsResponse.TagOpen и Config.Commands.CommandsResponse.TagClose и закодированы с помощью Base64. Результат работы задач шифруется сессионным ключом AES-128-CBC, кодируется с помощью Base64 и заключается между маркерами Config.TaskResults.TaskResultsData.TagOpen и Config.TaskResults.TaskResultsData.TagClose в данных запроса к C2.

POST-запрос для получения команд

POST-запрос для получения команд

Ниже демонстрируется запрос бэкдора к C2 для получения команд. В качестве приветствия в данных используется строка mid=76&mod=TRINP (отсюда мы и получили название для бэкдора). Также можно заметить, что заголовок User-Agent некорректно отображает содержимое, полученное из Config.UserAgent. Это связано с ошибкой передачи значения заголовка в функцию InternetOpenW, так как InternetOpenW пытается конвертировать строку для User-Agent из широкой кодировки в кодировку ascii, но из-за неправильно переданного указателя на значения из конфигурации происходит неправильная конвертация, и на выходе формируется неотображаемая строка.

Пакет запроса получения команд

Пакет запроса получения команд

Заключение

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

Таким образом, сочетание использования актуальных тем и сложного многопоточного бэкдора делает атаки группировки TaxOff особенно опасными и трудными для обнаружения и предотвращения.

293504861bc62c35e5e295106ae531ce.jpgВладислав Лунин

Старший специалист группы исследования сложных угроз экспертного центра безопасности Positive Technologies

© Habrahabr.ru