Атаки новой группировки 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