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

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

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

Содержимое атрибута POSTRUNPROGRAM
Бэкдор Trinper
Подробности про его архитектуру, STL, паттерн проектирования, кастомную сериализацию и буферный кэш можно почитать в расширенном исследовании.
В начале бэкдор десериализирует конфигурацию и получает оттуда имя, которое должно быть у него. Если название отличается, то выполнение прекращается. А если название бэкдора совпадает с тем которое у него в конфиге, бэкдор продолжает инициализацию и вызывает функцию для получения информации о компьютере жертвы, собирая ее в структуру VictimInfo такого вида:

Поля структуры VictimInfo имеют следующие назначения:
Member | Purpose | |
| Магическое число 0xB0B1B201 | |
| Member | Purpose |
| Сгенерированный GUID | |
| Сессионный ключ для AES-128-CBC | |
| Имя пользователя | |
| Имя узла | |
| Имена дисков | |
| Список адресов узла | |
| Используемый системой язык | |
| Информация об архитектуре | |
| Константное значение 64 | |
| Мажорная версия системы | |
| Минорная версия системы | |
| Уровень целостности | |
| Путь к файлу | |
| Адреса сетевых адаптеров |
После заполнения структуры VictimInfo бэкдор создает и запускает в разных потоках на исполнение эти экземпляры классов:
CommHTTP— класс для потока, в котором будет реализована коммуникация с C2;BgJobFileCapture— класс для потока, в котором будет мониторинг файловой системы;BgJobKeylogger— класс для потока, в котором будут перехвачены нажатия клавиш.
Экземпляр класса CommHTTP в своем потоке парсит десериализованную конфигурацию, которую будет использовать для коммуникации с C2, также генерирует сессионный ключ для AES-128-CBC (при этом вектор инициализации равен нулю), импортирует публичный RSA-ключ и входит в цикл общения с C2, в котором реализовано:

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

Пакет запроса получения команд
Заключение
Группировка TaxOff использует актуальные темы в своих фишинговых рассылках, тем самым она привлекает и обманывает пользователей. В своих атаках эти киберпреступники используют сложный многопоточный бэкдор Trinper, который позволяет им устанавливать устойчивый доступ к скомпрометированным системам, эффективно управлять несколькими задачами одновременно и выполнять различные вредоносные действия без значительного влияния на производительность системы.
Таким образом, сочетание использования актуальных тем и сложного многопоточного бэкдора делает атаки группировки TaxOff особенно опасными и трудными для обнаружения и предотвращения.
Владислав ЛунинСтарший специалист группы исследования сложных угроз экспертного центра безопасности Positive Technologies
