Специалисты по кибербезопасности столкнулись с новым случаем целевой атаки на финансовый сектор, в ходе которой использовался набор самодельных вредоносных программ средней сложности. Инцидент демонстрирует, как даже инструменты с относительно низким качеством кода могут представлять серьёзную угрозу, выполняя широкий спектр шпионских функций, от кражи файлов до записи нажатий клавиш. Атака была направлена на финансовую организацию в Южной Азии и включала два основных компонента: бэкдор для удалённого доступа и кейлоггер.
Описание
Эксперты Elastic Security Labs обнаружили эти вредоносные программы в инфраструктуре пострадавшей организации. Видимость в среде жертвы была ограничена данными уровня SIEM (Security Information and Event Management, система управления событиями и информацией о безопасности), что осложнило анализ постэксплуатационной активности. Основной имплант, исполняемый файл "paint.exe", действовал как полнофункциональный бэкдор, получивший название BRUSHWORM. Второй компонент, маскирующийся под библиотеку "libcurl.dll", представлял собой кейлоггер BRUSHLOGGER. В совокупности они обеспечивали злоумышленникам устойчивое присутствие в системе, сбор конфиденциальных данных и возможность распространения.
Анализ BRUSHWORM: модульный бэкдор с функциями червя
BRUSHWORM выполняет роль основного импланта, отвечая за установку, закрепление в системе, связь с командным сервером, загрузку дополнительных модулей, распространение через съёмные носители и целенаправленную кражу файлов. Примечательно, что код не использует сложной обфускации или упаковки, а его общее качество разработчики оценивают как низкое. Например, бэкдор в процессе работы записывает свою расшифрованную конфигурацию на диск в открытом виде, прежде чем зашифровать и сохранить вторую копию, после чего удаляет незашифрованный файл. Подобные ошибки, отсутствие механизма самоуничтожения и использование бесплатных сервисов динамического DNS в тестовых версиях позволяют с умеренной уверенностью предположить, что автор обладает относительно небольшим опытом и, возможно, использовал инструменты генерации кода на основе искусственного интеллекта без тщательной проверки результата.
Перед началом основной деятельности вредоносная программа выполняет ряд проверок окружения для обнаружения анализа. Эти техники достаточно прямолинейны: проверка разрешения экрана, поиск в имени компьютера или пользователя строки "sandbox", а также детектирование гипервизора. При обнаружении виртуальной среды BRUSHWORM не завершает работу, а лишь приостанавливает выполнение на одну секунду. Дополнительной мерой является мониторинг движения курсора мыши в течение пяти минут - отсутствие активности трактуется как признак песочницы и ведёт к остановке.
Для установки бэкдор создаёт несколько скрытых директорий по жёстко заданным путям. Основная папка для установки - "C:\ProgramData\Photoes\Pics\". Опечатка в слове "Photoes" вместо "Photos" является характерной чертой автора и встречается в обоих компонентах, что, вероятно, было попыткой замаскировать папку под каталог с пользовательскими медиафайлами. Другие директории используются для хранения загруженных модулей, конфигурации, похищенных файлов и журнала их хешей для избежания повторной эксфильтрации.
Конфигурация бэкдора хранится в формате JSON с полями, зашифрованными алгоритмом AES-CBC. Ключ шифрования жёстко закодирован в бинарном файле. Любопытно, что расшифрованные параметры, такие как домен для проверки интернета или домен для загрузки, нигде в логике работы не используются. Фактический адрес командного сервера хранится в открытом виде как отдельная строковая переменная. Это указывает на неорганизованный процесс разработки, где функционал мог быть отключён или предназначался для другой версии.
Для обеспечения устойчивости BRUSHWORM создаёт запланированную задачу Windows с именем "MSGraphics" через COM-интерфейс планировщика задач. Задача настроена на запуск при каждом входе пользователя в систему. Основная активность включает связь с командным сервером по адресу "resources.dawnnewsisl[.]com/updtdll" для загрузки модуля в формате DLL, который сохраняется как "Recorder.dll". Загруженный модуль выполняется через вторую запланированную задачу "MSRecorder". В ходе расследования сам модуль получить не удалось, но его название и метод запуска указывают на расширение возможностей, например, запись экрана.
Одной из ключевых функций BRUSHWORM является распространение на съёмные носители и кража данных. После проверки наличия интернет-соединения (через попытку доступа к "www.google.com") бэкдор запускает два потока. Первый копирует себя на все подключённые USB-накопители, используя социально-инженерные названия файлов, рассчитанные на сотрудников финансовой организации: "Salary Slips.exe", "Important.exe", "Presentation.exe" и другие. Второй поток занимается поиском и кражей файлов с целевыми расширениями, включая документы, электронные таблицы, архивы почты и даже исходный код. Похищенные файлы временно размещаются в папке "C:\Users\Public\Systeminfo\".
Особый интерес представляет поведение в режиме отсутствия интернета. В этом случае бэкдор не только заражает съёмные диски, но и копирует на них украденные файлы, а также файлы из профиля пользователя. Этот механизм действует как мост для физической эксфильтрации данных из изолированных или воздушно-разрывных сетей, где обычная передача по сети невозможна.
BRUSHLOGGER: кейлоггер с подменой библиотеки
Второй компонент, BRUSHLOGGER, представляет собой 32-битную DLL, предназначенную для внедрения через технику DLL side-loading (подмены библиотеки). Он маскируется под легитимную библиотеку "libcurl.dll", экспортируя семь стандартных функций "curl_easy_*", которые являются пустыми заглушками. Вся вредоносная логика выполняется из точки входа "DllMain".
После запуска кейлоггер создаёт мьютекс с именем, имитирующим идентификатор обновления Windows, для обеспечения работы в единственном экземпляре. Затем он формирует путь к лог-файлу на основе имени текущего пользователя и его MD5-хеша: "C:\programdata\Photoes\<username>_<MD5(username)>.trn". Для перехвата нажатий клавиш по всей системе устанавливается хуки низкого уровня "WH_KEYBOARD_LL". Для поддержания работы хука организуется стандартный цикл обработки сообщений Windows.
Логика перехвата фиксирует не только виртуальные коды клавиш, но и контекст: при смене активного окна в буфер записывается метка с временной отметкой и заголовком окна. Это значительно повышает ценность собранных данных, позволяя атакующим понять, к каким приложениям относятся введённые последовательности. Собранные данные перед записью на диск подвергаются примитивному XOR-шифрованию с однобайтовым ключом "0x43", что является лишь базовой обфускацией, а не серьёзной криптографической защитой.
Исследователи также обнаружили на VirusTotal более ранние тестовые версии бэкдора, загруженные под именами "V1.exe", "V2.exe" и "V4.exe". Их анализ показал использование бесплатной инфраструктуры динамического DNS и варьирующиеся конфигурации, что подтверждает гипотезу об итеративной разработке и активном совершенствовании инструментария этой группой.
Выводы и последствия
Несмотря на низкую изощрённость и очевидные ошибки в реализации, связка BRUSHWORM и BRUSHLOGGER образует функциональную платформу для сбора информации. Её возможности включают модульное расширение, распространение через съёмные носители, масштабную кражу файлов с обходом воздушных разрывов и устойчивый перехват ввода. Этот инцидент служит напоминанием, что даже инструменты среднего уровня могут нанести значительный ущерб, особенно при атаке на критически важный сектор, такой как финансы. Обнаруженные артефакты указывают на то, что разработка ведётся активно, а значит, можно ожидать появления новых, возможно, более отточенных версий. Организациям, особенно в финансовой сфере, следует обратить внимание на меры контроля съёмных носителей, мониторинг создания запланированных задач с подозрительными именами и анализ процессов, загружающих DLL из нетипичных путей, чтобы противостоять подобным угрозам.
Индикаторы компрометации
URLs
- resources.dawnnewsisl.com/updtdll
SHA256
- 4f1ea5ed6035e7c951e688bd9c2ec47a1e184a81e9ae783d4a0979501a1985cf
- 89891aa3867c1a57512d77e8e248d4a35dd32e99dcda0344a633be402df4a9a7
YARA
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | rule Windows_Trojan_BrushLogger_304ee146 { meta: author = "Elastic Security" os = "Windows" arch = "x86" category_type = "Trojan" family = "BrushLogger" threat_name = "Windows.Trojan.BrushLogger" reference_sample = "4f1ea5ed6035e7c951e688bd9c2ec47a1e184a81e9ae783d4a0979501a1985cf" strings: $a = "%02d-%02d-%d %02d:%02d " fullword $b = { 81 ?? ?? A1 00 00 00 74 09 81 ?? ?? A0 00 00 00 75 09 6A 00 6A 10 E8 } condition: all of them } |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | rule Windows_Trojan_BrushWorm_7c2098ef { meta: author = "Elastic Security" os = "Windows" arch = "x86" category_type = "Trojan" family = "BrushWorm" threat_name = "Windows.Trojan.BrushWorm" reference_sample = "89891aa3867c1a57512d77e8e248d4a35dd32e99dcda0344a633be402df4a9a7" strings: $a = "internetCheckDomain" wide fullword $b = { B8 00 00 00 40 33 C9 0F A2 48 8D ?? ?? ?? 89 07 89 5F 04 89 4F 08 89 57 0C 45 33 C0 } condition: all of them } |