В начале 2026 года японский интернет-провайдер IIJ (Internet Initiative Japan) выявил неизвестное вредоносное ПО, загруженное на публичные репозитории с территории Японии. Малварь распространялась в составе ZIP-архивов и представляла собой многофункциональный удалённый троян (RAT). Исследователи назвали его SLOTAGENT - от строк, найденных внутри кода.
Описание
Обнаруженный образец оказался далеко не примитивным. Вредонос использует сложную цепочку загрузки, имитируя легитимные компоненты операционной системы Windows. В архиве содержались три файла: исполняемый файл WindowsOobeAppHost.AOT.exe, библиотека WindowsOobeAppHost.AOT.dll и файл конфигурации db.config. При запуске основного EXE вызывалась экспортная функция из DLL, которая начинала процедуру динамического разрешения API. Для этого применялось хэширование на основе XOR и циклического сдвига ROR11.
Затем из db.config извлекались зашифрованные данные. Ключом для расшифровки служила строка "easdbadshyfab", а алгоритмом - RC4. После расшифровки полученный буфер передавался на выполнение через системный вызов NtCreateThreadEx. Таким образом формировался шелл-код, внутри которого уже находился сам SLOTAGENT в виде DLL. Шелл-код применял XOR-декодирование с 16-байтовым ключом, после чего вредоносная библиотека загружалась рефлективно - без обращения к стандартному загрузчику Windows.
Такая техника затрудняет обнаружение традиционными средствами, поскольку код не прописывается в таблице импорта и не создаёт записей о загрузке модуля. Это типичный приём, используемый в продвинутых угрозах, чтобы обойти сигнатурные детекторы.
После активации SLOTAGENT устанавливал TCP-соединение с командным сервером (C2). В исследованном образце адрес был жёстко прописан: 43.156.59[.]110:699. Коммуникация велась по собственному протоколу, который внешне напоминает HTTP-запрос. Сначала отправлялась длина данных, затем путь вроде "/api/v1/stream/data", после разделителя "|" шло тело запроса в формате JSON в открытом виде. На этом этапе C2 узнавал имя компьютера, имя пользователя, локальный IP, MAC-адрес, версию ОС, идентфикатор процесса, флаг административных привилегий и другие параметры.
Затем вредонос переходил в режим ожидания команд. Исследователи из IIJ насчитали более 20 реализованных команд. Среди них - создание скриншотов в формате BMP, загрузка и выгрузка файлов, выполнение произвольных команд через удалённую оболочку, сбор информации о системе и процессах, навигация по файловой системе, изменение интервала связи с C2, принудительное завершение процессов, чтение и запись файлов, удаление объектов. Особое место занимает возможность выполнять BOF-нагрузки (Beacon Object File). Этот формат используется в таких постэксплуатационных фреймворках, как Cobalt Strike, и позволяет запускать произвольный код в памяти без создания новых файлов.
Дополнительно реализованы функции антифорензики. Одна из них - подмена временных меток в атрибутах файлов ($SI). Этот приём, известный как timestomping, призван скрыть следы активности от системных администраторов и инструментов анализа. Также присутствует захват дампа памяти процесса - вероятно, для кражи учётных данных или ключей шифрования.
Особого внимания заслуживает механизм защиты от обратной разработки. Исследователи IIJ в своём отчёте детально описали, что все строки внутри кода, включая названия команд, зашифрованы симметричным алгоритмом, близким к TEA (Tiny Encryption Algorithm). Расшифровка происходит только во время выполнения, что делает статический анализ практически бесполезным без специальных скриптов. Кроме того, для вызова Windows API используется хэширование на основе DJB2 - это стандартный способ скрыть обращения к функциям от статических анализаторов.
Команда IIJ опубликовала IDAPython-скрипт для автоматической расшифровки строк в дизассемблере IDA. Этот инструмент может помочь специалистам по реагированию на инциденты быстрее восстанавливать функциональность вредоноса.
Последствия использования подобного RAT могут быть серьёзными. Злоумышленник получает полный удалённый контроль над заражённой машиной: доступ к файлам, возможность кражи паролей из памяти, выполнение произвольных команд, а также загрузку дополнительных нагрузок. При этом приёмы скрытия активности (зашифрованные строки, динамическое разрешение API, рефлективная загрузка) дают вредоносу высокие шансы остаться незамеченным для стандартных антивирусов и EDR-систем.
Хотя обнаружение произошло в Японии, угроза не ограничивается этим регионом. Публичные репозитории используются для распространения вредоносных файлов по всему миру. Любая организация, чьи сотрудники могут загрузить инфицированный архив, оказывается в зоне риска.
Само наличие SLOTAGENT подтверждает тенденцию к усложнению инструментария злоумышленников. Вредонос сочетает в себе возможности как классических RAT, так и современных постэксплуатационных фреймворков. Использование BOF-нагрузок, в частности, указывает на то, что авторы хорошо знакомы с арсеналом пентестеров и адаптируют его для своих целей.
Исследователи IIJ поделились не только технической документацией, но и правилами YARA для детектирования SLOTAGENT по сигнатурам на диске и в памяти. Это может помочь службам безопасности оперативно выявлять заражение и блокировать попытки распространения.
Важно, чтобы администраторы и аналитики уделяли внимание не только хорошо известным семействам вредоносного ПО, но и недавно обнаруженным образцам. Регулярное обновление правил обнаружения, мониторинг необычных сетевых подключений и теней на жёстких дисках (например, файлов с расширением .AOT.dll) способны снизить риск компрометации. При этом отсутствие единого стандарта для всех RAT означает, что каждый новый образец требует отдельного анализа и адаптации защитных мер.
Индикаторы компрометации
IPv4
- 43.156.59.110
SHA256
- 97e0714ee7279feb558aa38ab9d4c279731d3000c501aff7ad5c2967c3cb987f
- a9c46b67ff938930b16b377df9ddf86f3a56ef9876267387f30299a069c98472
- c1681d3aae736585c1dd656fe3ad66dafd3712ad4125e09fc97a4f1e5f367548
- e62bbb6d100cac48018170a991f34dddfcbd0ca2b8f020800f97c85ef690e41b
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 | rule SLOTAGENT_Loader { meta: description = "SLOTAGENT loader" author = "Internet Initiative Japan Inc." hash = "c1681d3aae736585c1dd656fe3ad66dafd3712ad4125e09fc97a4f1e5f367548" strings: $xorKey = { C6 84 24 ?? 01 00 00 65 C6 84 24 ?? 01 00 00 61 C6 84 24 ?? 01 00 00 73 C6 84 24 ?? 01 00 00 64 C6 84 24 ?? 01 00 00 62 C6 84 24 ?? 01 00 00 61 C6 84 24 ?? 01 00 00 64 C6 84 24 ?? 01 00 00 73 C6 84 24 ?? 01 00 00 68 C6 84 24 ?? 01 00 00 79 C6 84 24 ?? 01 00 00 66 C6 84 24 ?? 01 00 00 61 C6 84 24 ?? 01 00 00 62 C6 84 24 ?? 01 00 00 00 } $xorLoop = { B9 00 01 00 00 F3 AA } condition: all of ($xor*) } |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | rule SLOTAGENT_RAT { meta: description = "SLOTAGENT paths and internal strings (in plaintext)" author = "Internet Initiative Japan Inc." hash = "a9c46b67ff938930b16b377df9ddf86f3a56ef9876267387f30299a069c98472" strings: $path0 = "/api/v1/users/profile" $path1 = "/api/v1/session/refresh" $path2 = "/api/v1/analytics/event" $path3 = "/api/v1/stream/data" $str0 = "{\"error\":\"Failed to get drives\"}" $str1 = "{\"name\":\"%c:\",\"type\":\"dir\",\"size\":0,\"modified\":0,\"accessed\":0,\"changed\":0,\"drive_type\":\"%s\"}" condition: all of ($path*) or all of ($str*) } |