Специалисты по информационной безопасности обнаружили новый образец вредоносного программного обеспечения, получивший название CrystalX. Этот троян удаленного доступа (RAT) отличается сложной архитектурой и многоуровневой системой защиты. Его анализ показал, что злоумышленники применяют трехуровневый загрузчик, шифрование трафика и более сорока команд для управления зараженными системами. Угроза представляет серьезную опасность как для корпоративного, так и для частного сектора.
Описание
Исследователи обратили внимание на файл NursultanCracked.exe размером около трех мегабайт. Он не имеет действительной цифровой подписи. Уже при беглом изучении бросается в глаза необычное соотношение секций: почти весь объем занимает ресурсная секция .rsrc. Это характерный признак того, что внутри упакован дополнительный код. Дальнейший анализ подтвердил: в ресурсе номер 970 хранится зашифрованная полезная нагрузка, которую загрузчик последовательно преобразует тремя разными методами.
Сначала применяется позиционно-зависимая операция XOR, затем алгоритм ChaCha20, и наконец - сырое сжатие DEFLATE. Полученный буфер оказывается полноценным исполняемым файлом формата PE. Загрузчик самостоятельно отображает его в памяти, подготавливая к запуску. Этот файл весит уже почти семь мегабайт и написан на языке Go, что позволяет скрыть оригинальную структуру кода благодаря особенностям компилятора.
Строки в Go-компоненте также защищены: все операционные строки хранятся в зашифрованном виде и расшифровываются только во время выполнения через AES в режиме GCM (аутентифицированное шифрование с дополнительными данными). Ключ длиной 32 байта статически встроен в бинарный файл. В аналитическом отчете перечислено 265 расшифрованных строк, которые раскрывают полную функциональность вредоносной программы. Среди них - адреса командных серверов, токен аутентификации, идентификатор сборки, а также пути к браузерным данным, мессенджерам и игровым платформам для кражи учетных записей.
CrystalX использует для связи протокол WebSocket (двунаправленный канал поверх одного TCP-соединения) поверх TLS (протокол защиты транспортного уровня). Командный центр расположен по адресу crystalxrat[.]net, порт 443. При соединении передается заголовок с токеном X-Builder-Token: zenc0rn. После установки канала обмен данными идет в формате JSON. Сервер может отправлять команды на удаленное управление рабочим столом, веб-камерой, отображение сообщений пользователю, а также более сорока прямых инструкций, включая выполнение shell-команд, кражу данных из файловой системы и различные системные трюки.
Особое внимание уделено механизмам закрепления в системе. После запуска копия трояна сохраняется в папку локальных данных пользователя под именем SecurityHealthSystray.exe. При этом создается задача планировщика, ярлык автозагрузки, WMI-фильтр и потребитель событий. Имя мьютекса и все артефакты привязаны к идентификатору сборки YBFZUW1U32T. Для сокрытия активности добавляются исключения для Защитника Windows, отключаются журналы событий служб и настраиваются правила брандмауэра.
Перед установкой связи троян проверяет окружение на наличие признаков виртуальной машины, средств анализа и инструментов перехвата трафика. Если обнаружены такие процессы, как Wireshark, x64dbg или Burp Suite, а также MAC-адреса популярных гипервизоров, вредоносная программа запускает PowerShell-сценарий для отключения антивируса, Sysmon и очистки всех журналов событий. Это делает обнаружение в автоматических песочницах крайне затруднительным. Для дополнительной маскировки троян обращается к внешним сервисам api.ipify.org и ip-api.com, чтобы определить реальный IP-адрес и местоположение жертвы.
Разработчики CrystalX продолжают совершенствовать свое творение. Текущий вариант демонстрирует высокий уровень технической подготовки и нацелен на кражу конфиденциальных данных из браузеров и мессенджеров. Организациям рекомендуется усилить контроль за запуском неподписанных исполняемых файлов, внедрить политики ограничения программного обеспечения и использовать решения класса EDR (системы обнаружения и реагирования на конечных точках), способные выявлять многослойные упаковщики и аномалии в сетевом трафике. Обычным пользователям стоит проявлять осторожность при открытии вложений из неизвестных источников и своевременно обновлять антивирусные базы.
Индикаторы компрометации
Domain Port Combinations
- crystalxrat.net:443
WebSockets Secure
- wss://crystalxrat.net/api/ws
SHA256
- 2497e0aa88af681872194966bfc2bd67013ea75c96f4b5717abe4a4f43e69394
- 34b84db8f10d34f711bb242b21bdf662ee489dcd0e9c23b9cc95240d324bb094
- 8a6f8ef99384152df63a39b6ba9f08f0a1e9cc33b14319e8a1b184beb4a06cf7
- a9340c46243f5d2b00e30ea649bd14fc146ebbb42e43dbe45f5ee0cc9fc9227a
YARA
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | /* CrystalX Go RAT -- Loader + Go Payload YARA Rule Author: derp.ca Date: 2026-05-18 Source: https://github.com/kirkderp/yara CrystalX Go RAT delivered as NursultanCracked.exe. Three-stage loader unpacks Go payload from RCDATA 970 (XOR -> ChaCha20 -> DEFLATE). Go payload uses AES-GCM string obfuscation, TLS websocket C2 at wss://crystalxrat.net/api/ws, build ID YBFZUW1U32T. Hashes: Loader: 34b84db8f10d34f711bb242b21bdf662ee489dcd0e9c23b9cc95240d324bb094 Payload: a9340c46243f5d2b00e30ea649bd14fc146ebbb42e43dbe45f5ee0cc9fc9227a */ rule CrystalX_Go_RAT { meta: id = "a7b3d5e1c8f4b2e6a9d0c3f7a1b4e8d2c5f9a0b3e7d1c4f8a2b5e9d0c6f3a7" version = "1.0" date = "2026-05-18" status = "RELEASED" sharing = "TLP:CLEAR" source = "https://github.com/kirkderp/yara" author = "derp.ca" yarahub_uuid = "9b56434e-3bd2-4dfa-80bf-4d7f59c552f9" description = "CrystalX Go RAT: unpacked Go payload with build ID YBFZUW1U32T, AES-GCM key, and Go WebSocket C2 infrastructure" category = "MALWARE" malware = "CRYSTALX" malware_type = "RAT" mitre_att = "T1055.012" reference = "https://github.com/kirkderp/yara" triage_score = 10 triage_description = "CrystalX Go RAT with websocket C2, AES-GCM obfuscation, and browser credential theft" yarahub_license = "CC0 1.0" yarahub_rule_matching_tlp = "TLP:WHITE" yarahub_rule_sharing_tlp = "TLP:WHITE" yarahub_reference_md5 = "1fc32ba003f385deca86e5ccf8d6ae43" strings: // CrystalX build ID $build_id = "YBFZUW1U32T" ascii // AES-GCM string decryption key $aes_key = "Hk4fOCLbqKFbbAxwyAcFKUKXK4iqVaMD" ascii // CrystalX-specific persistence/config strings $persist_task = "NvContainerTask_YBFZUW1U32" ascii $mutex_name = "WinSecMutex_YBFZUW1U32" ascii $wc_elv = "WC_ELV" ascii // Go runtime markers (identifies Go-compiled PE) $go_runtime = "Go buildinf:" ascii condition: uint16(0) == 0x5A4D and ( // Unpacked Go payload: build ID + AES key + Go runtime ($build_id and $aes_key and $go_runtime) or // Unpacked Go payload: build ID + persistence + Go runtime ($build_id and $persist_task and $go_runtime) or // Unpacked Go payload: build ID + mutex + WC_ELV ($build_id and $mutex_name and $wc_elv) ) } |