Оглавление
- Обзор инцидента
- Puma
- Младший брат Puma: Pumatsune – новая версия Kitsune
- Как бороться с руткитами?
- Заключение
- IOCs
- Сетевые индикаторы
- Yara
- Приложение 1. Расширенная информация по файловым IOCs
- Приложение 2. Пример конфигурации Bulldog Backdoor
В ноябре 2024 года к экспертам Solar 4RAYS обратилась ИТ-компания - их службе безопасности нужна была была помощь в расследовании инцидента. Поводом для расследования послужили обращения к известным С2, относящимся к группировке Shedding Zmiy. В результате анализа Linux-систем нам удалось обнаружить как известное вредоносное ПО, характерное для группировки, так и новые образцы руткита Puma, про который недавно писали специалисты Elastic Security Labs. При проведении расследования мы были удивлены количеству и разнообразию вредоносных образцов – ИТ-компания как будто использовалась как полигон для тестирования:
- 10 руткитов Puma различных версий;
- 15 образцов Bulldog Backdoor (GoRed), о котором мы писали ранее;
- Megatsune (Kitsune руткит, в котором переменная среды называлась MEGATSUNE, а не KITSUNE) с ранее известными C2.
Обнаруженный в инциденте арсенал Shedding Zmiy
Злоумышленники находились в инфраструктуре более полутора лет и собирались оставаться там надолго. На некоторых системах обнаружены факты обновления руткита Puma. Специалисты Elastic Security Labs никак не атрибутировали обнаруженный руткит. Мы уверены, что это новый инструмент Shedding Zmiy, так как он использовался совместно с другими характерными инструментами этой группировки.
Краткое содержание отчета:
- В ходе расследования атаки на крупную IT-компанию мы обнаружили недавние образцы руткита Puma, саму атаку удалось атрибутировать к уже известной нам группировке Shedding Zmiy;
- Puma – это комплексный Linux-руткит уровня ядра на вооружении Shedding Zmiy. В его состав входят: загрузчик, сам руткит и userspace-руткит Pumatsune (обновленная версия ранее известного руткита Kitsune);
- Puma получает команды через хук команды rmdir и может скрывать процессы, файлы и сетевые соединения, повышать привилегии, воровать аутентификационные данные и криптографические ключи.
- Руткит использует уникальный бесфайловый механизм запуска компонента Pumatsune, основная задача которого – взаимодействие с C2, выполнение команд и эксфильтрация чувствительных данных;
- Помимо руткитов Megatsune, Puma и Pumatsune, группировка также развернула на исследованных системах свой привычный набор инструментов: gsocket и Bulldog Backdoor;
- Руткит Puma закреплялся путем замены легитимного файла cron на загрузчик, мимикрирующий под оригинал;
- В ходе расширенного исследования, нам удалось найти и проанализировать другие версии руткитов Puma и Pumatsune вплоть до образцов февраля 2024;
- Мы приводим детальные рекомендации по детекту и нейтрализации руткитов Puma, Pumatsune и Megatsune.
Обзор инцидента
Поскольку мы не участвовали в полноценном расследовании инцидента, цепочку атаки восстановить удалось частично. Наиболее ранние следы заражения были обнаружены в августе 2023 года в системе, где было установлено ПО Bitrix, доступное из интернета. Началом массового заражения систем мы считаем ноябрь 2023 года, так как по доступным журналам удалось установить наличие SSH-входов привилегированных учетных записей в окрестности размещения вредоносного ПО. Тогда в системах атакующие создали сервис acpi, а кроме того, в нескольких системах мы обнаружили следы существования файла /usr/bin/acpi. Ранее мы неоднократно видели размещение gsocket (инструмента удалённого доступа из арсенала Shedding Zmiy) с таким наименованием. На момент исследования в файловой системе существовала только символическая ссылка на автозапуск сервиса.
В июле 2024 года атакующие на системе жертвы разместили сервис, мимикрирующий под легитимный поток ядра kworker (ответственный за создание рабочих очередей, которые в основном используются как обработчики аппаратных прерываний) и файл /usr/bin/kworker. Как и в случае с сервисом acpi, на момент исследования в файловой системе находилась только символическая ссылка на автозапуск. Одновременно с созданием сервиса kworker атакующие модифицировали стандартные системные утилиты ps, ss, netstat и htop, предназначенные для сокрытия следов работы gsocket. Эта характерная комбинация техник Shedding Zmiy известна нам с июня 2024 года.
В нескольких системах находился руткит Megatsune по пути /usr/lib/libselinux.so, закрепленный посредством LD_PRELOAD. Для одной из систем нам удалось определить, что впервые руткит разместили в ноябре 2023 года в период активности, связанной с размещением gsocket и сервиса acpi.
Также в системах мы обнаружили импланты Bulldog Backdoor, о которых подробно рассказывали в статье "Shedding Zmiy: углубленный технический анализ инструментария" и наши коллеги из Positive Technologies в своем исследовании. Наиболее ранние следы использования Bulldog Backdoor в инфраструктуре – апрель 2024 года. В середине ноября 2024 злоумышленники на многих хостах начали размещать Bulldog Backdoor v0.6.9. Все образцы были идентичны друг другу и отличались только зашифрованным конфигом. Пример расшифрованного конфига Bulldog Backdoor приведен в Приложении 2. Причем конфиги отличались только параметрами JWT-токенов (значения exp, iat и jti), все остальные параметры (C2-серверы и другие) были одинаковыми. В марте и апреле 2024 года Shedding Zmiy начали устанавливать на атакованные системы руткиты Puma, а в октябре и ноябре стали обновлять их на более свежие версии. Основные действия Shedding Zmiy в скомпрометированных системах показаны на таймлайне ниже:
Во время анализа систем мы заметили процессы /proc/PID/exe, запущенные из анонимных файлов /memfd:tgt, которые создаются с помощью функции memfd_create и располагаются только в оперативной памяти. Такие процессы имели легитимные параметры запуска в зависимости от типа операционной системы:
- /usr/sbin/cron -f (Debian-системы);
- /usr/sbin/crond -n (RHEL-системы).
Это связано с тем, что Shedding Zmiy закрепляли руткит Puma путем замены легитимного исполняемого файла cron на загрузчик руткита Puma. После этого операционная система в процессе своей загрузки запускала подмененный cron с нужными параметрами. Загрузчик руткита Puma запускал два дочерних процесса из памяти:
- легитимный cron из анонимного файла /memfd:tgt, который успешно выполнял все запланированные задачи хоста, из-за чего обычный пользователь не замечал подмены;
- weapon-модуль руткита Puma (отображаемое имя /usr/bin/sshd -t) из анонимного файла /memfd:wpn, который загружал LKM-руткит (LKM – Linux Kernel Module) Puma в ядро и завершал свою работу, пропадая из дерева процессов.
Руткит Puma с помощью функции kthread_create_on_node создает watchdog-процесс в пространстве ядра с жестко закодированным именем kthread. Этот процесс следит, чтобы в пространстве пользователя всегда был запущен процесс руткита Pumatsune. Если процесс отсутствует, то руткит Puma запускает его с помощью функции call_usermodehelper (создание процессов в пространстве пользователя из пространства ядра). При этом процесс kthread выглядит в списке процессов вполне легитимно – его родителем является процесс kthreadd. В ps aux эта цепочка выглядит так: [kthreadd] (PID 2) -> [kthread]. Такая схема запуска позволяла максимально скрытно запускать руткиты и обеспечивала закрепление.
На рисунке ниже представлен фрагмент вывода команды ps -efl. Процесс [kthread] является дочерним процессом [kthreadd], процесс PID 28534 /usr/bin/cron -f – дочерний для /sbin/init. Процесс руткита Pumatsune скрыт руткитом Puma, процесс cron -f является легитимным и выглядит так же, как обычный cron, за исключением дескрипторов с memfd; процесс [kthread] с временем старта, как у cron -f – это один из индикаторов того, что руткит запущен.


В исследуемых системах мы обнаружили нестандартную директорию /usr/share/zov_f/, в которой располагались:
- файл /usr/share/zov_f/zov_latest – руткит Pumatsune в виде исполняемого файла, который загружается с C2. Больше информации в описании команды 0x1004 руткита Pumatsune.
- пустой файл /usr/share/zov_f/zov_logs.txt для хранения паролей и ключей в открытом виде в base64, которые собирает руткит Puma. Подробности приведены в разделе "Младший брат Puma" .
Наиболее ранние следы использования Puma в инфраструктуре мы относим к марту 2024 года. Всего же в исследованной части инфраструктуры мы обнаружили 10 руткитов Puma различных версий (подробнее в разделе "Версии Puma" ). На нескольких хостах было видно, что Shedding Zmiy обновили свой вредоносный загрузчик cron, и он в течение нескольких месяцев лежал на файловой системе, но в памяти при этом все еще работала старая версия cron. Это может говорить о стремлении злоумышленников к максимальной скрытности, так как для использования новой версии они спокойно ждали штатной перезагрузки системы в течение длительного времени.
По инфраструктуре злоумышленники горизонтально перемещались, используя ssh и учетные данные, получаемые из руткитов Megatsune и Pumatsune. Учитывая, что в сети жертвы Shedding Zmiy находились давно, мы считаем, что цель была им интересна как источник данных.
Далее детально разберем механизм работы руткита Puma.
Puma
Puma – это ядерный руткит для Linux, написанный на языке C. Он загружается в ядро системы как модуль (LKM). В ядре Puma перехватывает некоторые функции и системные вызовы, а также он способен запускать другие встроенные в него нагрузки. В обнаруженных образцах нагрузкой был руткит Pumatsune. После перехвата всего необходимого, Puma скрывает себя из списка загруженных в ядро модулей, а затем, в зависимости от команд, может скрывать сетевую активность, файлы, директории и процессы. Также руткит умеет красть пароли и различные криптографические ключи.
Загрузка модуля
Загрузка Puma в ядро начинается с ELF-файла cron. Он принимает два аргумента командной строки для извлечения файлов weapon и target, но только при наличии переменной окружения "HUINDER". При отсутствии аргументов исполняется основной код, открывающий анонимно файлы /memfd:wpn и /memfd:tgt для последующего запуска.
Назначение хуков
Попав в ядро, Puma начинает выполнять задачи любого уважающего себя руткита, а именно: перехватывать различные функции и системные вызовы. В данном вредоносе используются две техники перехвата: ftrace и syscall hook.
Ftrace – фреймворк для трассировки ядра Linux. Здесь он используется так, как и описано в документации (не считая вредоносных целей деятельности). Техника syscall hook подразумевает редактирование таблицы системных вызовов в целях замены стандартных обработчиков на вредоносные. Обе техники давно известны и применяются практически во всех руткитах.
С помощью ftrace перехватываются функции для сетевого взаимодействия и для работы системы SELinux (система принудительного контроля доступа). Изменение поведения этих функций позволяет руткиту скрывать свою сетевую активность, обходить систему контроля SELinux и запреты на входящие/исходящие подключения, которые устанавливает netfilter.
Итого: 14 перехваченных функций и 19 перехваченных системных вызовов.
Функция или системный вызов |
Вредоносное назначение |
---|---|
sk_diag_fill inet_sk_diag_fill tcp4_seq_show nf_hook_slow selinux_socket_bind selinux_socket_connect |
Используются для различных манипуляций с трафиком и подключениями в целях сокрытия. |
avc_has_perm file_map_prot_check selinux_inode_setattr selinux_file_open selinux_file_permission selinux_inode_permission |
Используются, чтобы обезоружить систему SELinux, позволяя успешно выполнять указанные функции независимо от привилегий. |
_do_fork execve execveat |
Используются для отслеживания программ, которые были запущены из “VIP” процессов* |
stat lstat fstat newfstatat getdents getdents64 kill getsid getgid |
Используются для сокрытия файлов, директорий и процессов. Помимо того, что скрываются директории и файлы с префиксом zov_, Puma скрывает сокеты в директории /dev/tcp, скрытые pid в папке /proc, а также информацию о самом модуле, которую содержат файлы и директории: /sys/module/audit, /sys/module/audit/initstate, /sys/module/audit/holders, /sys/module/audit/refcnt. |
swapoff close |
Используются для правильной обработки файлов для подмены. |
openat open read write |
Используются для подмены файлов и кражи данных. |
rmdir |
Используется как инструмент управления модулем. |
mmap |
Используется для копирования руткита Pumatsune в пространство пользователя. |
* Под “VIP” здесь подразумевается руткит Pumatsune, а также процессы, которые были скрыты в результате выполнения команды zarya.1.[pid].
Помимо функциональности, которая уже была описана в статье Elastic (повышение привилегий, передача команд через rmdir), вредонос имеет возможность красть пароли, которые вводит пользователь, приватные ключи и подменять различные файлы “на лету”. Также стоит отметить, что Puma при запуске скрывает себя из списка загруженных в ядро модулей посредством редактирования структуры THIS_MODULE (структура на github). Puma заменяет указатели в двусвязном списке модулей, предварительно сохраняя их, тем самым исчезая из него.
После этого модуль ядра Puma не будет отображаться в выводе команды lsmod.
Как приручить Puma
С модулем Puma можно общаться из пространства пользователя посредством системного вызова rmdir. Для этого в качестве имени файла нужно передать команду формата zarya[символ][команда][символ][аргумент]. Ниже приведен их список, а в скобках указан наш вариант расшифровки букв команд:
Команда |
Описание |
---|---|
zarya.c.0 (config) |
Получить конфигурацию. |
zarya.d.0 (dump) |
Получить украденные пароли и ключи. |
zarya.k.[pid] (kitsune) |
Установить pid руткита в пространстве пользователя. |
zarya.t.0 (test) |
Проверка работы модуля. |
zarya.v.0 (version) |
Текущая версия модуля. |
zarya.u.0 (unhide) |
Вернуть Puma в список загруженных модулей. |
zarya.0.0 |
Повышение привилегий. |
zarya.1.[pid] |
Скрыть pid. |
zarya.5.[ip] |
Скрыть подключение к ip адресу. |
zarya.7.[port] |
Скрыть подключение к порту. |
zarya.8.[port] |
Раскрыть подключение к порту. |
zarya.9.0 |
Получить информацию о подключениях и процессах, работающих с Puma. |
Пояснения к некоторым командам:
- zarya.k.[pid] - предназначена для задания pid-руткита в глобальной переменной внутри модуля. Puma работает в паре с Pumatsune в пространстве пользователя. Эта команда предназначена именно для того, чтобы модуль в пространстве ядра знал, кто его “союзник”. Помимо того, что процесс руткита Pumatsune будет скрыт в системе, он получает возможность выгружать из Puma украденную информацию с помощью команды zarya.d.0. Кроме того, модуль в ядре будет оповещать руткит в пользовательском пространстве о появлении новых украденных данных посредством отправки сигнала SIGUSR1.
- zarya.9.0 - эта команда предоставляет следующую информацию: pid руткита Pumatsune, версию Puma и информацию о каждом подключении в формате [pid][ip][local port]. На рисунке ниже напротив pid 3246 указан ip адрес CnC сервера с доменным именем rhel.opsecurity1[.]art, к которому подключился руткит.

- zarya.u.0 - команда возвращает в исходное состояние структуру THIS_MODULE, что позволяет модулю нормально отображаться в списке загруженных модулей.
Подмена файлов
В экземплярах руткитов Puma мы обнаружили ssh-ключ, который хранился в виде небольшой структуры.

Поля file_fd и proc_pid заполняют перехваченные вызовы open и openat. Когда процесс с именем target_proc_name пытается открыть файл, имя которого содержит подстроку tagret_file_name, вызываются оригинальные обработчики open/openat для того, чтобы получить файловый дескриптор оригинального файла. Затем, когда этот же процесс пытается прочитать файл с помощью системного вызова read, вредоносный обработчик вместе с содержимым оригинального файла дописывает в буфер содержимое поля data.
Продемонстрировать работу данной схемы поможет утилита cat, переименованная в ssh.


Таким образом, вредонос даёт возможность злоумышленникам подключаться с помощью ssh к системе жертвы при том, что оригинальный файл на диске никак не изменяется.
Кража паролей и ключей
Кража данных происходит с помощью перехваченных вызовов read и write. За это отвечает функция steal, которая вызывается в обработчиках этих системных вызовов. Она собирает различные пароли и криптографические ключи. Стоит отметить, что функция не крадет данные следующих процессов: journalctl, systemd, snapd.
Триггером для кражи данных является наличие подстроки в буфере вызовов read/write.
Для кражи паролей:
s password:
password for
New password:
Current password
Enter password:
Enter same passphrase again:
Enter passphrase again:
Enter passphrase (empty for no passphrase):
Для кражи криптографический ключей:
----BEGIN RSA PRIVATE KEY-----
----BEGIN EC PRIVATE KEY-----
----BEGIN OPENSSH PRIVATE KEY-----
----BEGIN DSA PRIVATE KEY-----
После того, как в копилке Puma появляются новые данные, он отправляет руткиту в пользовательском пространстве сигнал SIGUSR1. Все украденные данные модуль хранит в памяти, пока Pumatsune их не заберёт.
Схема запуска Pumatsune
Внутри Puma лежит ещё один исполняемый файл - это so-библиотека, которая на деле является руткитом Pumatsune.

kit_name – это имя под которым можно открыть руткит Pumatsune, а kit_proc – имя “избранного” процесса, которому позволено это сделать. Стоит отметить, что Puma поддерживает работу с несколькими руткитами.
После того, как Puma перехватывает все нужные функции и системные вызовы, запускается поток ядра с жёстко закодированным именем kthread, который с помощью call_usermodehelper выполняет две команды в user-space: truncate -s 0 /usr/share/zov_f/zov_latest 1>/dev/null, которая очищает файл zov_latest, и cat /dev/null 1>/dev/null, которая по сути ничего не делает. Но обе эти команды запускаются с переменной окружения LD_PRELOAD=/lib64/libs.so:
unsigned long long kthread_func(){
char ** env = {"SHELL=sh",
"HOME=/",
"LD_PRELOAD=/lib64/libs.so",
"PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin",
};
// ...
cat_argv[0] = "/bin/sh";
cat_argv[1] = "-c";
cat_argv[2] = "cat /dev/null 1>/dev/null";
cat_argv[3] = 0LL;
truncate_argv[0] = "/bin/sh";
truncate_argv[1] = "-c";
truncate_argv[2] = "truncate -s 0 /usr/share/zov_f/zov_latest 1>/dev/null";
truncate_argv[3] = 0LL;
// ...
call_usermodehelper(truncate_argv[0], truncate_argv, env, 2LL);
call_usermodehelper(cat_argv[0], cat_argv, env, 2LL);
}
Запуск процесса cat с такой переменной окружения запускает следующую цепочку системных вызовов, каждый из которых уже перехвачен модулем Puma:
- Вызов openat("/lib64/libs.so"), который будет перехвачен и вернёт файловый дескриптор 42, а процесс cat будет отмечен как претендент на получение Pumatsune. Основным условием для получения руткита здесь является имя файла /lib64/libs.so и имя вызывающего процесса. При этом номер дескриптора выбран не просто так. Число 42 не раз встречается в коде Puma и Pumatsune и, вероятно, является отсылкой на книгу "Автостопом по Галактике" Дугласа Адамса.
- Вызов fstat, который вернёт: {st_dev=makedev(0x8, 0x5), st_ino=424242, st_mode=S_IFREG|0644, st_nlink=1, st_uid=1000, st_gid=1000, st_blksize=4096, st_blocks=0, st_size=239880, …}. Здесь снова можно заметить “магическое” число 42 в поле st_ino и размер руткита в поле st_size.
- Вызов mmap, который выделит память в процессе cat и скопирует туда руткит.
- Вызов read, который прочитает заголовки руткита, чтобы создать нужные сегменты в памяти для нормальной работы so-библиотеки.
Таким образом, Pumatsune будет доставлен в пространство пользователя и запущен внутри процесса cat. При этом на диске никакого файла /lib64/libs.so не появится, что позволяет злоумышленникам не попадаться на глаза различным системам защиты.
Для лучшего понимания мы сделали таблицу, в которой для сравнения представили три варианта обработки "LD_PRELOAD=/lib64/libs.so" динамическим линковщиком ld.so:

В первых двух столбцах приведены примеры работы без руткита. В первом столбце (legitimate behaviour with non-existent file) если файл, указанный в LD_PRELOAD, не существует, то возникнет соответствующая ошибка. Во втором столбце (legitimate behaviour with existent file) для существующего файла показана цепочка вызовов для его загрузки в память. В третьем столбце (hooked behaviour with hardcoded file) продемонстрирована работа ld.so при активном рутките Puma в ядре. В этом случае все методы цепочки перехвачены и работают так, чтобы загрузить несуществующий на файловой системе файл /lib64/libs.so в память процесса.
После запуска руткит делает несколько вызовов fork. Первый предназначен для проверки и запуска обновлений, а последние два являются техникой double-fork - классический способ демонизации в unix системах. Затем Pumatsune берёт конфиг из секции konfig либо выполняет команду zarya.c.0, чтобы взять настройки из модуля. После всех этих действий руткит подключается к командному серверу и продолжает свою работу. Полная цепочка запуска представлена на схеме ниже.

На схеме kthread назван watchdog не просто так. После запуска Pumatsune поток не завершит свою работу, а начнёт периодически проверять, запущен ли руткит. Если процесс Pumatsune будет отсутствовать, kthread запустит его так же, как делал это в первый раз. Таким образом, руткит Puma постоянно следит, чтобы в пространстве пользователя всегда работал его младший брат – руткит Pumatsune.
Версии Puma
Нам удалось получить несколько версий модуля Puma. Большинство экземпляров друг от друга отличаются незначительно. Тем не менее по строкам в секции modinfo можно сказать, что они компилировались для различных версий ядра Linux:
Версия Puma |
Значение “vermagic” |
---|---|
v2.402.23 |
5.4.17-2011.5.3.el7uek.x86_64 |
v2.404.25 |
5.4.17-2136.317.5.3.el7uek.x86_64 |
v2.404.25 |
5.15.0-94-generic |
v2.404.25 |
5.4.0-126-generic |
v240513 |
5.4.0-164-generic |
v240807 |
5.4.17-2136.317.5.5.el7uek.x86_64 |
v240918 |
5.4.0-126-generic |
v241015 |
4.15.0-213-generic |
v241015 |
5.4.17-2011.4.4.el7uek.x86_64 |
В этом списке есть модуль, который написан для новой версии ядра Linux (5.15.0-94-generic). Начиная с версии 5.7 разработчики убрали возможность импортировать функцию kallsyms_lookup_name(). В Puma эта функция используется для того, чтобы узнать адреса функций для дальнейшей установки хуков и адрес таблицы системных вызовов для ее редактирования. Данное ограничение разработчики руткита обошли с помощью kprobe.
На фоне всех модулей выделяется самая старая версия – v2.402.23. Вероятно, она была одной из самых первых реализаций модуля Puma. Эта версия имеет меньший набор команд (повышение привилегий, сокрытие процессов и сокетов), не занимается кражей различной информации, не несёт в себе конфигурационный файл и имеет другой механизм загрузки Pumatsune в пользовательское пространство.
Сам Pumatsune, который содержится внутри этого модуля, немногим отличается от старых версий. Он имеет примерно ту же функциональность и принцип работы, за исключением того, что в нём были использованы команды, которые предоставляет LKM.
Младший брат Puma: Pumatsune – новая версия Kitsune
Kitsune — это руткит пользовательского пространства, с которым мы впервые встретились в нескольких наших кейсах в начале 2023. В мае 2023 BI.ZONE выпустили статью об этом рутките и назвали его Kitsune. В новой версии основные задачи по сокрытию и краже данных переданы “большому брату” в ядре – модулю Puma, тогда как Kitsune сосредоточен на взаимодействии с CnC сервером и выполнении команд. Список команд коррелирует с тем, что представлен в статье BI.ZONE, что подчеркивает связь новых и старых версий.
Новый Kitsune не является самостоятельным руткитом, он тесно связан с Puma в ядре. Именно поэтому мы назвали его Pumatsune.
Описание хуков
Сам Pumatsune, как и старые версии, является so-библиотекой, но только для галочки, чтобы загрузиться через LD_PRELOAD в целевой процесс. Перехватывает руткит только функцию close, при первом попадании в которую проводит инициализацию и запускается как отдельный процесс.

Далее руткит “здоровается” с модулем Puma командой zarya.k.[pid], парсит конфиг и переходит к взаимодействию с CnC Сервером.
Функция write

Перехватчик данной функции был заменен на перехватчик системного вызова write в модуле Puma. Работает он так же, однако список подстрок обновлен, а имя процесса теперь не имеет значения - кража происходит только при нахождении нужной подстроки. Подробнее о краже данных в разделе “Кража паролей и ключей”.
Вся украденная информация теперь сохраняется в файле /usr/share/zov_f/zov_logs.txt. Также разработчик проверяет поступающие данные на уникальность с помощью вычисления хеша FNV1a.
Функция read

Вместо этой функции был перехвачен системный вызов read, но принципиально алгоритм обработчика не поменялся. Стоит отметить, что имена cat и authorized_keys в общем случае могут быть изменены на любые другие, на усмотрение разработчика руткита.
Вспомогательная функция steal
Здесь были объединены старые функции stealPrivateKey и triggerStealingOfPassphrase. Поведение функции определяет аргумент mode, который может быть равен 0 или 1 соответственно.
Фунĸции fopen, fopen64, open, __open_2, open64
Код перехватчика open:
unsigned long long mal_open(pt_regs *a1)
{
//...
// проверка условий для начала загрузки Pumatsune в user-space
kit_ptr = get_kit_ptr(42LL, current_pid);
result = 42LL;
if ( !kit_ptr )
{
// проверка условий для сокрытия файла
if (isHidden(filename, 0))
{
result = E_BAD_ARGUMENT;
if ( current_pid <= 0 )
return result;
// проверка наличия pid вызывающего процесса в списке скрытых pid.
iter = &hidden_pids_start;
while (current_pid != *iter)
{
iter += 3;
if (iter == &hidden_pids_end)
return E_BAD_ARGUMENT;
}
}
// вызов оригинального open
result = orig_open(a1);
if ( result > 0 )
{
// проверка условий для изменения содержимого файла.
// таким файлом, например, может быть authorized_keys
check_target_file(result, current_pid, file_name, process_name);
return result;
}
}
return result;
}
Вместо этих функций были перехвачены системные вызовы open и openat. Но, в отличие от старой версии, они не дают открывать скрытые файлы и являются началом цепочки подмены содержимого файлов.
Как описывалось выше, в этих системных вызовах выполняется функция get_kit_ptr, в которой проверяются условия для начала загрузки Pumatsune в пространство пользователя.
Фунĸции readdir, readdir64
Заменой этим функциям стали перехваченные getdents и getdents64. Файлы и директории, которые они скрывают, описаны в разделе “Назначение хуков”.
Фунĸции bind, initRat, accept и doBackdoor
Функциональность этих трёх функций была объединена в одну, которая вызывается в обработчике close. Сравнение взаимодействия с CnC сервером будет описано ниже.
Фунĸции pcap_loop и dropPacketsThatAreUsedByMe
Вместо этих функций были перехвачены sk_diag_fill, inet_sk_diag_fill, tcp4_seq_show, которые скрывают подключения и трафик, которые связаны с ip адресами CnC. Для предотвращения различных проблем при подключении были перехвачены функции nf_hook_slow, selinux_socket_bind, selinux_socket_connect, которые снимают ограничения на входящие/исходящие подключения к командным серверам.
Конфиг
Конфиг хранится в формате BSON, как и в старых версиях. Кроме того, разработчиками была добавлена возможность хранить конфигурацию в разных местах: секция konfig внутри Pumatsune, секция puma-config внутри LKM модуля, а в версии Pumatsune v240513 была возможность взять конфигурацию из файла /usr/share/zov_f/zov_config, но в других версиях такой функции нет.
Структура конфигурационного файла для версии v240513:
{
"ping_interval_s": 300,
"session_timeout_s": 4,
"c2_timeout_s": 43200,
"tag": "generic", // тег жертвы
"s_a0": "rhel.opsecurity1.art",
"s_p0": "8443",
"s_c0": "tls",
"s_a1": "sec.opsecurity1.art",
"s_p1": "8443",
"s_c1": "tls",
"s_a2": "89.23.113.204",
"s_p2": "8443",
"s_c2": "tls"
"gw_p": "<gw_p_value>" // данный ключ в конфиге не был использован, но он задаёт порт, на котором Pumatsune будет слушать в режиме прокси
}
Конфиг имеет такую же структуру и названия ключей, как и конфиги старых версий руткитов Kitsune / Megatsune. В Puma просто добавили несколько новых параметров, например, tag и gw_p.
Взаимодействие с C2
Взаимодействие с CnC сервером так же, как и в старых версиях, происходит в формате BSON по протоколу TLS. Старые команды принципиально не изменены, но были реализованы те, у которых отсутствовал обработчик. Также была добавлена одна новая команда.
Ниже приведен список команд и их описание. Для удобства названия команд взяты из статьи BI.ZONE. Исключение - команда 0x1007 (bindSocks). Ей название мы дали сами, так как она новая, а в обнаруженных нами образцах названия команд отсутствовали.
Код |
Описание |
---|---|
0x1000 (gatherSystemInformation) |
Отправляет на сервер информацию о системе жертвы. |
0x1001 (ping) |
Отправляет на сервер информацию о Pumatsune. |
0x1002 (getLogs) |
Отправляет файл zov_logs.txt на сервер. |
0x1003 (exec) |
Выполняет sh команду с сервера. |
0x1004 (update) <- реализована |
Принимает обновление Pumatsune с сервера. |
0x1005 (reverseShell) <- реализована |
Дает reverse shell серверу. |
0x1006 (updateConfig) |
Обновляет конфигурацию Pumatsune. |
0x1007 (bindSocks) <- новая команда |
Запускает SOCKS прокси с локального порта на сервер. |
Команда 0x1004 (update)
В разделе “Обзор инцидента” мы написали о том, что в системе присутствовал исполняемый файл /usr/share/zov_f/zov_latest. Он оправдывает свое название и является обновлением руткита Pumatsune, которое пришло с командного сервера в аргументе команды update. Этот файл не является библиотекой, но по функциональности принципиально от so-версии ничем не отличается. Наличие новой версии на диске проверяется руткитом в начале работы. Если размер файла zov_latest соответствует контрольному значению (> 10239 байт), то запускается именно новая версия Pumatsune с диска, а старая завершает свою работу.
Команда 0x1005 (reverseShell)
Функциональность reverse shell была реализована с помощью псевдо терминалов Linux. Для PT Slave создаётся процесс /bin/bash -l с env переменными histfile=/dev/null и term=xterm, а PT Master подключается к сокету, который связан с CnC. Далее между терминалами происходит обмен данными.
Команда 0x1007 (bindSocks)
Данная команда ранее отсутствовала в Kitsune. В ее аргументе передается номер порта, который Pumatsune начинает слушать. В дальнейшем при подключении к этому порту можно взаимодействовать с командным сервером.
Возможно, данная функциональность была добавлена в целях связи CnC сервера и других вредоносов в сети жертвы. В этом есть несколько преимуществ:
- Pumatsune с помощью Puma обходит различные запреты на подключения со стороны хоста.
- Puma на хосте скрывает трафик, который связан с командными серверами.
Такая функциональность может позволить другому вредоносу, который имеет возможность взаимодействовать только с хостами в локальной сети, связаться с командным сервером при помощи Pumatsune. В таком случае руткит выступает в роли шлюза.
Таким образом, можно сделать вывод, что Pumatsune в связке с Puma многое перенял от своего предка. Функциональность была расширена новыми командами и возможностями, а сам руткит был адаптирован для работы с ядерным модулем. Руткит Pumatsune, отправляя команды руткиту Puma, скрывает свои подключения и связанные с ним процессы, а также крадет различные аутентификационные данные.
Как бороться с руткитами?
В данном разделе кратко приведем основные приемы борьбы с упомянутыми в статье руткитами: Puma, Pumatsune, Kitsune / Megatsune.
Puma и Pumatsune
Руткит Puma закрепляется через подмененный легитимный файл cron:
- /usr/sbin/cron (Debian-системы);
- /usr/sbin/crond (RHEL-системы).
Для поиска руткита в системе можно воспользоваться нашим Yara-правилом.
Самый простой способ выгрузить руткит из памяти – заменить вредоносный cron-загрузчик легитимной версией cron и перезагрузить хост. У Pumatsune нет никаких собственных методов закрепления, и он полностью зависит от Puma, поэтому после замены cron Pumatsune больше не будет запускаться.
Для получения легитимного cron-файла для вашей системы можно воспользоваться примерной инструкцией ниже.
Для Debian:
1) определить название пакета, из которого был установлен пакет cron
dpkg -S /usr/sbin/cron
вывод команды:
cron: /usr/sbin/cron
cron – имя deb-пакета.
2) скачать deb-пакет
apt-get download cron
Команда загрузит deb-файл, например, cron_3.0pl1-136ubuntu1_amd64.deb (название пакета может меняться в зависимости от версии ОС).
3) Распаковать пакет
pkg-deb -x cron_*.deb cron_orig
где cron_orig – название каталога, куда будут распакованы файлы deb-пакета.
4) Остановить службу cron
sudo systemctl stop cron
5) Заменить вредоносный cron оригинальным
sudo install -m 755 -o root -g root cron_orig/usr/sbin/cron /usr/sbin/cron
6) Перезагрузить систему
sudo reboot
Для RHEL:
1) определить название пакета, из которого был установлен пакет cron
rpm -qf /usr/sbin/crond
вывод команды:
cronie-1.4.11-25.el7_9.x86_64
название пакета может меняться в зависимости от версии ОС.
2) скачать rpm-пакет
yumdownloader cronie
Если yumdownloader не установлен, установите его:
sudo yum install -y yum-utils
3) Распаковать пакет
rpm2cpio cronie-*.rpm | cpio -idmv ./usr/sbin/crond
4) Остановить службу cron
sudo systemctl stop cron
5) Заменить вредоносный cron оригинальным
sudo install -m 755 -o root -g root ./usr/sbin/crond /usr/sbin/crond
6) Перезагрузить систему
sudo reboot
Kitsune и Megatsune
Для обнаружения этих руткитов советуем просканировать систему нашим Yara-правилом.
Эти руткиты скрывают себя на файловой системе, поэтому перед сканированием необходимо стать хозяином руткитов. Это можно сделать путем экспорта переменных MEGATSUNE и KITSUNE:
export KITSUNE=1
export MEGATSUNE=1
После этого можно начать сканирование системы яра правилом. Обычно руткиты Kitsune и Megatsune прописывают себя в файл /etc/ld.so.preload, где как раз и будет путь до вредоносной so-библиотеки руткита. Обычно это /usr/lib64/libselinux.so. Также руткиты создают следующие файлы:
- /etc/config_hhide – конфигурация руткита;
- /etc/id_hhide – идентификатор жертвы;
- /etc/logs_hhide – журнал украденных учетных данных и ключей.
Для деактивации руткита необходимо:
- Стать хозяином руткитов, выполнив команды по экспорту переменных среды выше.
- Удалить путь до вредоносной so-библиотеки из файла /etc/ld.so.preload (обычно там один путь как раз до so-файла руткита).
- Удалить вредоносную so-библиотеку и другие файлы руткита.
- Перезагрузить систему.
Заключение
В результате расследования нам удалось выявить неожиданно большое количество уникальных образцов руткита Puma и его компонентов, Bulldog Backdoor и других инструментов. Это позволило нам не только проследить эволюцию руткита, но и понять, что с предельно высокой долей вероятности его использует группировка Shedding Zmiy.
Мы определили, что для закрепления Puma используется загрузчик, которым заменяют легитимный файл cron. Он в ходе выполнения запускает легитимный cron в памяти для максимальной скрытности. Техника подмены легитимных файлов – одна из любимых у группировки Shedding Zmiy. Так, помимо cron, мы видели в этом инциденте и в прошлых подмену легитимных утилит ps, htop, netstat и ss для сокрытия процессов и сетевой активности gsocket.
Вторая излюбленная техника – подмена отображаемого имени процесса (argv0). Выполняется это чаще всего с помощью exec -a <fake_process_name>. В качестве фальшивых имен используются имена легитимных демонов (например, systemd, journald и другие) или потоки уровня ядра (имена в квадратных скобках, например, [kworker]).
Shedding Zmiy действуют по-разному в зависимости от данных о жертве, полученных в ходе первичной разведки (Reconnaissance). В исследованном инциденте атакующие пребывали в инфраструктуре более полутора лет и занимались кибершпионажем. Однако в случаях, когда атакованная цель не представляет интереса для группировки, они могут изменить вектор атаки в сторону шифрования или даже уничтожения инфраструктуры жертвы. Широкая функциональность описанных в статье руткитов позволяет осуществлять это путем скрытной установки дополнительных полезных нагрузок.
Таким образом, Shedding Zmiy продолжает оставаться серьезной угрозой для российских компаний различного уровня, активно поддерживает и развивает уже существующие инструменты (Bulldog Backdoor, userland руткит Megatsune), а также продолжает пополнять свой арсенал новым вредоносным ПО — руткитом уровня ядра Puma в связке с userland руткитом Pumatsune.
IOCs
File hashes
md5
50466c4f8b923bddf101bfba753a7ca2
43cc7821de620f75ce1000780d0b2294
beeabdefdca013738561d736a355de1c
7c59a35b815050421319746de2e3970b
833647d080f00e841efa705255466e28
158afa2ed5ba7de6946562419ddca4a9
756aba7aa96990b39683cfe3a188ca82
7650ae541cbac33b34a9786b0481d628
c7e1846aa38769b093f89716dc681beb
fdf4add35f92a1367ec82f4048740d61
d081323cf5aaf6d5efae1185efb55f2a
9a179de6c53417e8f82b479455cf6c28
f38704d1350a890fb6141678f9e7fb20
cccfcca0ab1fed438447ada7c92e734d
cf493672d8e9443ac43cffd16707b08b
2c33b3f6ad3fc93405c2aa305023773f
b3174394434523a1d7a877434706e301
a8a7932df2ded22bcf87b848ed2f09b9
7f6961556e33ffdc8cbb3497101b58f0
9e438793420d1ff37c095d2524c6d8f3
895bcf3c5160c5a016addcc049f0877a
2c34dd84ce5c720bc8ee15f77ca474ea
fb8aadf3799e9f54a427e5360afc0155
80330ee9c540ed0d001f1419be251638
6d1e90107c996328ebb15293f0014903
2a1a49719f748daaf20bb3b4fd909b43
0eb642e34012b3ec00ff36ed9bafb959
75ed5575bf7d93beaff8788b69da7fb1
052cd6faa775317030d0300087995bc3
872476eb903f76065028ea7ba65e25ef
c61a3cad0beabde867347bf6ee9ab6f3
237e42a872bb35406ad37b8a6d63906f
63a54282ea7beb5948665f8ce501d03b
23f14ac8474b16ac033477653d88e42f
983a7d60e3303831623a0d4385fe5125
ceef277d9a5ee3fe5957b3e9a8e95e3b
e380b9e5ffc4b688d5f39503aa92dbae
336de312c267db96534dfa949bf365f5
de4fb0d9198c834428a7b766cf90a96c
ae90522065f5b7d5e82adc4280043e37
ba16a44bde866871f667eb58945c9c3b
04a79d1b46953a94a4705e66f633c115
9dfd2a066223c4ed5c1e484619f495c0
bd2f78ed6c43af6d3fef9bcae92443ef
767e591f06018323fb3d7332f31e54ff
07128b9ad7c3b9124ae33618fda01d6d
4bb908dcc60d8e6c494b95daeb985e46
eabec19c2f7e6b6057cd8759f8d9bf65
179cc887b8f36d09c0ea342e089839cd
418b0aa71db25e47446f1d5f73320bd0
759083836561b5d405b4937a5b5360f4
02cb8d5c25eef9f24f1137c367175ee4
27b8e293c88d007d45bd1c9cdad0cc44
f69f43380efc4ccb5ce7e1a7e9cd16fc
89bb5b4436fbc6695e0586450363a753
13f6788e38d8854e3f8ef8a586c5dccb
895bcf3c5160c5a016addcc049f0877a
2c34dd84ce5c720bc8ee15f77ca474ea
fb8aadf3799e9f54a427e5360afc0155
80330ee9c540ed0d001f1419be251638
6d1e90107c996328ebb15293f0014903
sha1
e495a0795b2221cb94ae67969ad4cfc0aa8a441b
4d455bd037685acc652f626bbe4c38e44ea3aab2
0495eed74cf6c6be1684c3bc5b5671762c4305ca
188fcd6f3f8ebb363b14c195f3665f6359bd55fb
113c5f44318c230e9b913eb46592bdb4d3976b12
2ddd44ca9be95c7c0fb362a1b3d2905b6fe143b5
b2b485f5f2c52c1eeec9e4464670887ce6219b9c
3b37fcd90caf6f77adf63cb43707821f138b5862
45c0a1e338a3d3f380ebcca4c696d10e3e2897c3
321d785116a2de162d482fd54070022c429cec8b
96773eb0da2f1cb6acad724384d7bea4f6bcc4f4
0b1ced4fbbbb4397b3585d2ca6e0c58b26b905ce
3b03e71d6e218b9ac533e4a769f3b0a1671420fa
1165cb4066f488c67508a4d7b33b565e7c4a451a
cecd2d1a94e61afd1bb2662763716408f2509d94
f3eed8d4a478c9e30a25a8708e391fc5776f98ef
5fc3344e4f8fbe944d4028038a34bc2cd8a9e212
98441981e297928c4f9652511aef324ffa8f36b3
cc007d94bbef29e935b45397401d2326ba012964
1e47a07950e8b82b18d022fec3143f57f480b4f2
0bcb0681e9dc3ed2b10cb04345dc0af6b089b2b4
59a4a83b22fd7a0428576a29c6d8c4bd68a498dc
b00cfe01fec37dfdec84b8ea0ec240defed4cebd
7dd3b34a8c9fcdabce08ecf3b7128bf088760c29
60493f4f147d063d6509d0605b76ff7ed44aee4f
cfaf6554aea68cc107edb7fee927a946aec1d8e7
f33dd30ae8c44ed149ab9d01d602bb755472962f
7ea6dad563b887813b823703709b319fdd22e357
72d36348991c837aa608a7f1c01260cd9845897b
ac337a0f3a7a34a86844a3bc1d2ec5a246f20ecc
a8c8c0b06d957112974d99dc1afe26207a19d4d7
6f8a453273d3a514d4592750d0e2318a960b637c
69cb1a5f457bc92db4deee100d28160b35b174e0
ee2bc685f250d7ca604e789a70490d669d6e7a76
2a56b537a1d86860d2940f6509aef30f4bed0570
85133b3f0ed8c1879bc92ce4ea8de98fd6df0e3f
5cc5b7dee574df0e5f96e21c8c20369a9533f80b
42e8a02ee3fbdc41da81680f367621baec4e5b79
1f5b3bc8b4f8ee232ea53fdc5f1e5f476a196d9b
36807462e70c0c450506eea7c36bfde14f37f5f4
e2cd2303b75e4d921d170c21aabee83625b4f544
4768230b1eb77231e299a006f801a33b0c2e0c6a
cfec5d9eeffe72c5545594fe0aa8cc4ab2e9e008
c2f586a9d2d7ecc8dd57514a1a3605be08b9fb64
d8017f65f8cd3c5fba7d1e179f0d87cc883b4905
614249d4af3489fd3a5d322ca8a7440266633f05
48377d5bd98f3fe41820cfc9114af22da7fc271a
8cee0ab27878f6aad7401041634b3ba2703d393c
8cca8a970afb65e36c1da134f98ac4acd3a126ca
4e609d6bae367e3cd0bcd798e4cb83b3b8bc2577
a0157028039122991cc4c84a2e57616f57d83a31
5d3489caf91e329e0741b4d4f0888156b3feccf7
f1521b8f9c66cf86843194c02354ce429159e775
d84e959417f848d4962da27e336511bdbf110b75
211e5efd98e9ae676ad106e5af467134b88718a8
bb78cad91395b208ff1ee78bd1df643a5a55eaf6
0bcb0681e9dc3ed2b10cb04345dc0af6b089b2b4
59a4a83b22fd7a0428576a29c6d8c4bd68a498dc
b00cfe01fec37dfdec84b8ea0ec240defed4cebd
7dd3b34a8c9fcdabce08ecf3b7128bf088760c29
60493f4f147d063d6509d0605b76ff7ed44aee4f
sha256
4c8666ecd657df0a1be250a4706c8eabcc7a2ac7356e721a8ab91b8aa17042dd
83ba1f96668b81f117c329ae780637a56c172ba6cd057e0e1c9d462eb8ef44c2
280a14384bede3d7795028caba466055d76610f398785da10871a092da348717
facb3afcf5019040f586e0c08a6d32bdc96c93237bf594ba36e90f9385114063
0e7e5fba460da9ad628816bd64529a4f68d8ce63ea4fd9ce12456546573490ed
38a189981b9bf1348d8f02bc132d82c2fd629bc56d054be7b239b1cf7a3b3c6f
293e1c2fef7992bb07abec6645619ec3ce2ea74cd81e37076409a295b6e32734
add5ae18db5d3db54791516cc684fc78e05776edcbfa468c847245abb7e83fc3
d68a18b028f5f7e2e1f87473c7e2aba0d12cb990236b30eb108bc2a7194a88bc
792e9a44a865232f11dbfd87a32e276662d041451848196896bc6bd4298d5b5f
bb63425eb43edf7c14563a7fe4c32307a572c0258d8ac013e6fee1ec21d348da
13ab61d1456097e874a939ff3360efce6c360d7c5b9e607b8f5c5852ed126b87
68c3e3af3dec81275f07641f76f2aabe48340d35906014ac711c76710f85c081
8535374d460fcd4ba7175f445bb78f09c0db01490f7b904e94807e38a1c4b1af
99e177803bbf97a0e3da861f468f8604d8ac8c466de3d2abaffe3aed95f869e5
a658c6acd649f8633bbcab93f3215548a490487b3613d49fc6c4939ffd567362
5e5142e683809d0abc0eaee270dd5da93f28fbc57205b62d8de09e3a64cfb160
0aed89abb0a34db7ac0a1b9b6eb3f1bfd4d2193a6017246d3b6324529a2bf5ab
dd6c8861f706342e3ef7f1e8344c24b958e01a6e5b615d74dd9f16ca27e0d996
c0d3c30ad03e408fc09976637a4b497bda98b8f6ad815df46d61ad825e003c3d
6705c354ac07ee23bd5de20b00450d2b0efd6fd18cff75b00417ac45905e3929
5c67c677b4d9aaca810545060766f2be1242cd559fe81a0381e856aaf113b66a
0518a2f4aaf2d5f82514ced478381a4dd3353be7dc96c3ec9c62eb283a3bea09
3034ff1b7ffcf2eaf1edb666b6aed69dbd51f46dc28d9abb7ff5c2768ccd1823
2c00ff2a7fd1ea6055aef8ae86c406dfa6f76f948c123920d18b93bbe0a32b8e
b9ccfc0b531064d4ec336b5f80512ccd852e4e666dc75bdf5059d0f454fba2ba
596a85122ee9c4d361a45fd0ba67639e2b0d260b2d208bb4264326d09914f1d0
389febbf2712ff9d88c1cab15ce6971f8ad724f59ce4b9788c8695872d7bba11
0266bc719241f4e475987d0e5feef31f88df74c3a879bb704f19fa918c02999c
85975ea32b8047af55fb24372e2937a9958dd38c508bfcbbcb51b9f2e4a2dbf4
e5b7f38da062485d7e5c5adf8b40429ca919fd27bc5679f863ffef09a9aa7156
d7e2149e79914f6018d1aaebf346f52d150875b66e56ba1bf767d849885f5403
4ef2fa24d4fab54468305eda5e5228bdaa141aff2e5956f9fd41096953c9d2ca
7b3a5f8b5f7b2650aa532e9b6769fcdb322b3d81957843df8a6bd220fd2edf30
71603a5e29697fbb46bc546b2ea54a4edbbfc00426868bb5cde960c2a038b08c
792b30e260eb54f092e4e405e2077b097b3576eb258edcb64f320e8f57ad6cd7
d1a7d7b952976dd2642b0c4746a12b2937fb55b9d84bcf52502a18f9c8a93635
c2262c0e7117c2e50509071be2231a6f487024b1e0615f8035345125cd5e2a13
3f55c8c78be4966df390bb74d7296f449348cc607727facaf8abaad18a641cca
cbce6ca1e4d974255b0ffb153cdc4c8716d84b11b26ddd34d127096b2870f3ef
622750ec03effb24d914c4cf865ff8ace914aa42d849f9fd3fa4415ea62b97fb
8b1bcb03b54998d9995e7492b07571963c393ae2c17ec5ff4a4ad94a89a66914
4e7e530551123af4c27862f84412528087b32edb581ce59b8f9e7efbcaa0309f
8535374d460fcd4ba7175f445bb78f09c0db01490f7b904e94807e38a1c4b1af
99e177803bbf97a0e3da861f468f8604d8ac8c466de3d2abaffe3aed95f869e5
a658c6acd649f8633bbcab93f3215548a490487b3613d49fc6c4939ffd567362
5e5142e683809d0abc0eaee270dd5da93f28fbc57205b62d8de09e3a64cfb160
0aed89abb0a34db7ac0a1b9b6eb3f1bfd4d2193a6017246d3b6324529a2bf5ab
Сетевые индикаторы
Pumatsune C2
cddcvesfhfp1.wris[.]monster
deefveskiip2.wris[.]monster
rhel.opsecurity1[.]art
sec.opsecurity1[.]art
89.23.113[.]204
Megatsune C2
pkg.dpkg-source[.]info
amd64.rpm-bin[.]link
89.23.113[.]59
176.124.192[.]230
2024-10-01:
qxpngendvvp1.wris[.]monster
cnhgenfhfp2.wris[.]monster
ccdertsfrp1.wris[.]monster
qdprtsorp2.wris[.]monster
2024-11-09:
cckitsfrp1.n3x1lo[.]pro
qdkitsorp2.n3x1lo[.]pro
C2 кастомного gsocket
edfrg2r1aa.dylibm[.]homes
edfrg2r2bb.dylibm[.]homes
juiyhg2p1cc.dylibm[.]homes
168.100.9[.]214
Bulldog Backdoor v0.6.9 C2
m0g1ck[.]beauty
176.124.192[.]152
leo.jython27[.]xyz
ocelot.jython27[.]xyz
tiger.jython27[.]xyz
sm4l1pp[.]online
tramways[.]xyz
45.87.246[.]5
Yara
rule nix_puma_rootkit {
meta:
description = "Detects Puma loader, wpn and rootkit"
author = "4RAYS"
strings:
$ = "PUMA %s"
$ = "HUINDER" fullword
$ = "--extract-target" fullword
$ = "--extract-weapon" fullword
$ = "/usr/share/zov_f"
$ = ".puma-config"
$ = "LD_PRELOAD=/lib64/libs.so"
$ = "kit_so_len" fullword
condition:
uint32(0) == 0x464c457f and filesize < 2MB and 4 of them
}
rule nix_kitsune_rootkit {
meta:
description = "Detects Kitsune & Megatsune rootkit"
author = "4RAYS"
strings:
// /etc/config__hhide
$ = {00D19B8A9DD19D9190989799A1A19696979A9B00}
// /etc/id__hhide
$ = {00D19B8A9DD1979AA1A19696979A9B00}
// /etc/logs__hhide
$ = {00D19B8A9DD19291998DA1A19696979A9B00}
condition:
uint32(0) == 0x464c457f and filesize < 300Kb and all of them
}
Приложение 1. Расширенная информация по файловым IOCs
Путь |
Хэш-сумма MD5 |
Хэш-сумма SHA1 |
Хэш-сумма SHA256 |
Комментарий |
---|---|---|---|---|
/lib64/libselinux.so |
50466c4f8b923bddf101bfba753a7ca2 |
e495a0795b2221cb94ae67969ad4cfc0aa8a441b |
4c8666ecd657df0a1be250a4706c8eabcc7a2ac7356e721a8ab91b8aa17042dd |
Руткит Kitsune |
/etc/config__hhide |
43cc7821de620f75ce1000780d0b2294 |
4d455bd037685acc652f626bbe4c38e44ea3aab2 |
83ba1f96668b81f117c329ae780637a56c172ba6cd057e0e1c9d462eb8ef44c2 |
Конфигурационный файл руткита libselinux.so |
/usr/share/zov_f/zov_latest |
beeabdefdca013738561d736a355de1c |
0495eed74cf6c6be1684c3bc5b5671762c4305ca |
280a14384bede3d7795028caba466055d76610f398785da10871a092da348717 |
Pumatsune v241020 |
/usr/bin/acpi |
- |
- |
- |
gsocket |
acpi.service |
- |
- |
- |
Сервис для запуска gsocket |
/usr/bin/kworker |
- |
- |
- |
gsocket |
kworker.service |
- |
- |
- |
Сервис для запуска gsocket |
/usr/bin/htop |
7c59a35b815050421319746de2e3970b |
188fcd6f3f8ebb363b14c195f3665f6359bd55fb |
facb3afcf5019040f586e0c08a6d32bdc96c93237bf594ba36e90f9385114063 |
Модифицированная утилита htop для скрытия процессов kworker и [kworker] |
/usr/bin/netstat |
833647d080f00e841efa705255466e28 |
113c5f44318c230e9b913eb46592bdb4d3976b12 |
0e7e5fba460da9ad628816bd64529a4f68d8ce63ea4fd9ce12456546573490ed |
Модифицированная утилита netstat |
/usr/bin/ps |
158afa2ed5ba7de6946562419ddca4a9 |
2ddd44ca9be95c7c0fb362a1b3d2905b6fe143b5 |
38a189981b9bf1348d8f02bc132d82c2fd629bc56d054be7b239b1cf7a3b3c6f |
Модифицированная утилита ps для скрытия процессов kworker и [kworker] |
/usr/bin/ss |
756aba7aa96990b39683cfe3a188ca82 |
b2b485f5f2c52c1eeec9e4464670887ce6219b9c |
293e1c2fef7992bb07abec6645619ec3ce2ea74cd81e37076409a295b6e32734 |
Модифицированная утилита ss |
/usr/bin/hbtda |
7650ae541cbac33b34a9786b0481d628 |
3b37fcd90caf6f77adf63cb43707821f138b5862 |
add5ae18db5d3db54791516cc684fc78e05776edcbfa468c847245abb7e83fc3 |
Bulldog Backdoor v0.6.9 |
/usr/bin/mzqte |
c7e1846aa38769b093f89716dc681beb |
45c0a1e338a3d3f380ebcca4c696d10e3e2897c3 |
d68a18b028f5f7e2e1f87473c7e2aba0d12cb990236b30eb108bc2a7194a88bc |
Bulldog Backdoor v0.6.9 |
/usr/bin/gjsgc |
fdf4add35f92a1367ec82f4048740d61 |
321d785116a2de162d482fd54070022c429cec8b |
792e9a44a865232f11dbfd87a32e276662d041451848196896bc6bd4298d5b5f |
Bulldog Backdoor v0.6.9 |
/usr/bin/g5stc |
d081323cf5aaf6d5efae1185efb55f2a |
96773eb0da2f1cb6acad724384d7bea4f6bcc4f4 |
bb63425eb43edf7c14563a7fe4c32307a572c0258d8ac013e6fee1ec21d348da |
Bulldog Backdoor v0.6.9 |
/usr/bin/ge4ds |
9a179de6c53417e8f82b479455cf6c28 |
0b1ced4fbbbb4397b3585d2ca6e0c58b26b905ce |
13ab61d1456097e874a939ff3360efce6c360d7c5b9e607b8f5c5852ed126b87 |
Bulldog Backdoor v0.6.9 |
/usr/bin/gyytm |
f38704d1350a890fb6141678f9e7fb20 |
3b03e71d6e218b9ac533e4a769f3b0a1671420fa |
- |
Bulldog Backdoor v0.6.9 |
/usr/bin/gzstk |
cccfcca0ab1fed438447ada7c92e734d |
1165cb4066f488c67508a4d7b33b565e7c4a451a |
- |
Bulldog Backdoor v0.6.9 |
/usr/bin/ge3da |
cf493672d8e9443ac43cffd16707b08b |
cecd2d1a94e61afd1bb2662763716408f2509d94 |
68c3e3af3dec81275f07641f76f2aabe48340d35906014ac711c76710f85c081 |
Bulldog Backdoor v0.6.9 |
/usr/bin/g42tk |
2c33b3f6ad3fc93405c2aa305023773f |
f3eed8d4a478c9e30a25a8708e391fc5776f98ef |
- |
Bulldog Backdoor v0.6.9 |
/usr/bin/mq4tq |
b3174394434523a1d7a877434706e301 |
5fc3344e4f8fbe944d4028038a34bc2cd8a9e212 |
- |
Bulldog Backdoor v0.6.9 |
/usr/bin/ge3dg |
a8a7932df2ded22bcf87b848ed2f09b9 |
98441981e297928c4f9652511aef324ffa8f36b3 |
- |
Bulldog Backdoor v0.6.9 |
/usr/bin/mzqwi |
7f6961556e33ffdc8cbb3497101b58f0 |
cc007d94bbef29e935b45397401d2326ba012964 |
- |
Bulldog Backdoor v0.6.9 |
/usr/bin/hfstg |
9e438793420d1ff37c095d2524c6d8f3 |
1e47a07950e8b82b18d022fec3143f57f480b4f2 |
- |
Bulldog Backdoor v0.6.9 |
/usr/sbin/cron |
2a1a49719f748daaf20bb3b4fd909b43 |
cfaf6554aea68cc107edb7fee927a946aec1d8e7 |
dd6c8861f706342e3ef7f1e8344c24b958e01a6e5b615d74dd9f16ca27e0d996 |
Загрузчик руткита puma |
memfd:wpn |
0eb642e34012b3ec00ff36ed9bafb959 |
f33dd30ae8c44ed149ab9d01d602bb755472962f |
c0d3c30ad03e408fc09976637a4b497bda98b8f6ad815df46d61ad825e003c3d |
weapon-модуль загрузчика puma |
- |
75ed5575bf7d93beaff8788b69da7fb1 |
7ea6dad563b887813b823703709b319fdd22e357 |
6705c354ac07ee23bd5de20b00450d2b0efd6fd18cff75b00417ac45905e3929 |
руткит Puma 5.4.0-126-generic v240918 |
- |
052cd6faa775317030d0300087995bc3 |
72d36348991c837aa608a7f1c01260cd9845897b |
5c67c677b4d9aaca810545060766f2be1242cd559fe81a0381e856aaf113b66a |
руткит Pumatsune v240918 |
memfd:wpn |
872476eb903f76065028ea7ba65e25ef |
ac337a0f3a7a34a86844a3bc1d2ec5a246f20ecc |
0518a2f4aaf2d5f82514ced478381a4dd3353be7dc96c3ec9c62eb283a3bea09 |
weapon-модуль загрузчика puma |
- |
c61a3cad0beabde867347bf6ee9ab6f3 |
a8c8c0b06d957112974d99dc1afe26207a19d4d7 |
3034ff1b7ffcf2eaf1edb666b6aed69dbd51f46dc28d9abb7ff5c2768ccd1823 |
руткит Puma 5.4.0-126-generic v2.404.25 |
- |
237e42a872bb35406ad37b8a6d63906f |
6f8a453273d3a514d4592750d0e2318a960b637c |
2c00ff2a7fd1ea6055aef8ae86c406dfa6f76f948c123920d18b93bbe0a32b8e |
руткит Pumatsune v2.404.25 |
memfd:wpn |
63a54282ea7beb5948665f8ce501d03b |
69cb1a5f457bc92db4deee100d28160b35b174e0 |
b9ccfc0b531064d4ec336b5f80512ccd852e4e666dc75bdf5059d0f454fba2ba |
weapon-модуль загрузчика puma |
- |
23f14ac8474b16ac033477653d88e42f |
ee2bc685f250d7ca604e789a70490d669d6e7a76 |
596a85122ee9c4d361a45fd0ba67639e2b0d260b2d208bb4264326d09914f1d0 |
руткит Puma 5.4.17-2136.317.5.3.el7uek.x86_64 v2.404.25 |
- |
237e42a872bb35406ad37b8a6d63906f |
6f8a453273d3a514d4592750d0e2318a960b637c |
2c00ff2a7fd1ea6055aef8ae86c406dfa6f76f948c123920d18b93bbe0a32b8e |
руткит Pumatsune v2.404.25 |
memfd:wpn |
983a7d60e3303831623a0d4385fe5125 |
2a56b537a1d86860d2940f6509aef30f4bed0570 |
389febbf2712ff9d88c1cab15ce6971f8ad724f59ce4b9788c8695872d7bba11 |
weapon-модуль загрузчика puma |
- |
ceef277d9a5ee3fe5957b3e9a8e95e3b |
85133b3f0ed8c1879bc92ce4ea8de98fd6df0e3f |
0266bc719241f4e475987d0e5feef31f88df74c3a879bb704f19fa918c02999c |
руткит Puma 5.4.17-2136.317.5.3.el7uek.x86_64 v2.402.23 |
- |
e380b9e5ffc4b688d5f39503aa92dbae |
5cc5b7dee574df0e5f96e21c8c20369a9533f80b |
85975ea32b8047af55fb24372e2937a9958dd38c508bfcbbcb51b9f2e4a2dbf4 |
руткит Pumatsune v2.402.23 |
memfd:wpn |
336de312c267db96534dfa949bf365f5 |
42e8a02ee3fbdc41da81680f367621baec4e5b79 |
e5b7f38da062485d7e5c5adf8b40429ca919fd27bc5679f863ffef09a9aa7156 |
weapon-модуль загрузчика puma |
- |
de4fb0d9198c834428a7b766cf90a96c |
1f5b3bc8b4f8ee232ea53fdc5f1e5f476a196d9b |
d7e2149e79914f6018d1aaebf346f52d150875b66e56ba1bf767d849885f5403 |
руткит Puma 5.4.17-2136.317.5.5.el7uek.x86_64 v240807 |
- |
ae90522065f5b7d5e82adc4280043e37 |
36807462e70c0c450506eea7c36bfde14f37f5f4 |
4ef2fa24d4fab54468305eda5e5228bdaa141aff2e5956f9fd41096953c9d2ca |
руткит Pumatsune v240807 |
memfd:wpn |
ba16a44bde866871f667eb58945c9c3b |
e2cd2303b75e4d921d170c21aabee83625b4f544 |
7b3a5f8b5f7b2650aa532e9b6769fcdb322b3d81957843df8a6bd220fd2edf30 |
weapon-модуль загрузчика puma |
- |
04a79d1b46953a94a4705e66f633c115 |
4768230b1eb77231e299a006f801a33b0c2e0c6a |
71603a5e29697fbb46bc546b2ea54a4edbbfc00426868bb5cde960c2a038b08c |
руткит Puma 5.4.17-2011.4.4.el7uek.x86_64 v241015 |
- |
9dfd2a066223c4ed5c1e484619f495c0 |
cfec5d9eeffe72c5545594fe0aa8cc4ab2e9e008 |
792b30e260eb54f092e4e405e2077b097b3576eb258edcb64f320e8f57ad6cd7 |
руткит Pumatsune v241015 |
memfd:wpn |
bd2f78ed6c43af6d3fef9bcae92443ef |
c2f586a9d2d7ecc8dd57514a1a3605be08b9fb64 |
d1a7d7b952976dd2642b0c4746a12b2937fb55b9d84bcf52502a18f9c8a93635 |
weapon-модуль загрузчика puma |
- |
767e591f06018323fb3d7332f31e54ff |
d8017f65f8cd3c5fba7d1e179f0d87cc883b4905 |
c2262c0e7117c2e50509071be2231a6f487024b1e0615f8035345125cd5e2a13 |
руткит Puma 5.4.0-176-generic v240513 |
- |
07128b9ad7c3b9124ae33618fda01d6d |
614249d4af3489fd3a5d322ca8a7440266633f05 |
3f55c8c78be4966df390bb74d7296f449348cc607727facaf8abaad18a641cca |
руткит Pumatsune v240513 |
memfd:wpn |
4bb908dcc60d8e6c494b95daeb985e46 |
48377d5bd98f3fe41820cfc9114af22da7fc271a |
cbce6ca1e4d974255b0ffb153cdc4c8716d84b11b26ddd34d127096b2870f3ef |
weapon-модуль загрузчика puma |
- |
eabec19c2f7e6b6057cd8759f8d9bf65 |
8cee0ab27878f6aad7401041634b3ba2703d393c |
622750ec03effb24d914c4cf865ff8ace914aa42d849f9fd3fa4415ea62b97fb |
руткит Puma 3.10.0-1160.6.1.el7.x86_64 v240918 |
- |
052cd6faa775317030d0300087995bc3 |
72d36348991c837aa608a7f1c01260cd9845897b |
5c67c677b4d9aaca810545060766f2be1242cd559fe81a0381e856aaf113b66a |
руткит Pumatsune v240918 |
memfd:wpn |
179cc887b8f36d09c0ea342e089839cd |
8cca8a970afb65e36c1da134f98ac4acd3a126ca |
8b1bcb03b54998d9995e7492b07571963c393ae2c17ec5ff4a4ad94a89a66914 |
weapon-модуль загрузчика puma |
- |
418b0aa71db25e47446f1d5f73320bd0 |
4e609d6bae367e3cd0bcd798e4cb83b3b8bc2577 |
4e7e530551123af4c27862f84412528087b32edb581ce59b8f9e7efbcaa0309f |
руткит Puma 4.15.0-213-generic v241015 |
- |
9dfd2a066223c4ed5c1e484619f495c0 |
cfec5d9eeffe72c5545594fe0aa8cc4ab2e9e008 |
792b30e260eb54f092e4e405e2077b097b3576eb258edcb64f320e8f57ad6cd7 |
руткит Pumatsune v241015 |
/usr/sbin/cron |
759083836561b5d405b4937a5b5360f4 |
a0157028039122991cc4c84a2e57616f57d83a31 |
- |
Загрузчик руткита puma |
/usr/sbin/cron |
02cb8d5c25eef9f24f1137c367175ee4 |
5d3489caf91e329e0741b4d4f0888156b3feccf7 |
- |
Загрузчик руткита puma |
/usr/sbin/crond |
27b8e293c88d007d45bd1c9cdad0cc44 |
f1521b8f9c66cf86843194c02354ce429159e775 |
- |
Загрузчик руткита puma |
/usr/sbin/crond |
f69f43380efc4ccb5ce7e1a7e9cd16fc |
d84e959417f848d4962da27e336511bdbf110b75 |
- |
Загрузчик руткита puma |
/usr/sbin/crond |
89bb5b4436fbc6695e0586450363a753 |
211e5efd98e9ae676ad106e5af467134b88718a8 |
- |
Загрузчик руткита puma |
/usr/sbin/crond |
13f6788e38d8854e3f8ef8a586c5dccb |
bb78cad91395b208ff1ee78bd1df643a5a55eaf6 |
- |
Загрузчик руткита puma |
/etc/systemd/system/system.daemon.service |
895bcf3c5160c5a016addcc049f0877a |
0bcb0681e9dc3ed2b10cb04345dc0af6b089b2b4 |
8535374d460fcd4ba7175f445bb78f09c0db01490f7b904e94807e38a1c4b1af |
Сервис /usr/bin/g5stc |
/etc/system/system/system.cron.service |
2c34dd84ce5c720bc8ee15f77ca474ea |
59a4a83b22fd7a0428576a29c6d8c4bd68a498dc |
99e177803bbf97a0e3da861f468f8604d8ac8c466de3d2abaffe3aed95f869e5 |
Сервис /usr/bin/gjsgc |
/etc/systemd/system/system.systemd.service |
fb8aadf3799e9f54a427e5360afc0155 |
b00cfe01fec37dfdec84b8ea0ec240defed4cebd |
a658c6acd649f8633bbcab93f3215548a490487b3613d49fc6c4939ffd567362 |
Сервис /usr/bin/mzqte |
/etc/systemd/system.udevd.service |
80330ee9c540ed0d001f1419be251638 |
7dd3b34a8c9fcdabce08ecf3b7128bf088760c29 |
5e5142e683809d0abc0eaee270dd5da93f28fbc57205b62d8de09e3a64cfb160 |
Сервис /usr/bin/ge4ds |
/etc/systemd/system/system.journald.service |
6d1e90107c996328ebb15293f0014903 |
60493f4f147d063d6509d0605b76ff7ed44aee4f |
0aed89abb0a34db7ac0a1b9b6eb3f1bfd4d2193a6017246d3b6324529a2bf5ab |
Сервис /usr/bin/hbtda |
Приложение 2. Пример конфигурации Bulldog Backdoor
{
"Kind": "beacon",
"Logging": "none",
"Token": "",
"UserID": "",
"ClientID": "",
"ClientKey": "",
"Version": "v0.6.9",
"Tags": [],
"Args": [],
"Secret": "",
"TargetID": "",
"BackendAddress": "hxxps://lockn1t3[.]xyz",
"ProxyAddress": null,
"ServerIP": "176.124.192[.]152",
"Domain": "m0g1ck[.]beauty",
"Transport": {
"revsh": {
"Domain": "leo.jython27[.]xyz",
"BackupIP": "",
"Port": 0,
"Proto": "wss://"
},
"rpc": {
"Domain": "ocelot.jython27[.]xyz",
"BackupIP": "",
"Port": 0,
"Proto": "wss://"
},
"proxy": {
"Domain": "tiger.jython27[.]xyz",
"BackupIP": "",
"Port": 0,
"Proto": "wss://"
},
"reserve_domain": "sm4l1pp[.]online",
"reserve_ip": "",
"teleport": [
{
"ws": {
"Domain": "tramways[.]xyz",
"BackupIP": "45.87.246[.]5",
"Port": 0,
"Proto": "wss://"
},
"quic": {
"Domain": "tramways[.]xyz",
"BackupIP": "45.87.246[.]5",
"Port": 8083,
"Proto": ""
},
"icmp": {
"Domain": "tramways[.]xyz",
"BackupIP": "45.87.246[.]5",
"Port": 0,
"Proto": ""
},
"dns": {
"Domain": "tramways[.]xyz",
"BackupIP": "45.87.246[.]5",
"Port": 53,
"Proto": ""
}
}
]
}
}
Параметры декодированного токена:
"Token": {
"header": {
"alg": "HS256",
"typ": "JWT"
},
"payload": {
"exp": <unix_timestamp_redacted>,
"iat": <unix_timestamp_redacted>,
"iss": "holder",
"jti": "<UUID version 4 variant DCE 1.1, ISO/IEC 11578:1996>",
"sub": "<UUID version 4 variant DCE 1.1, ISO/IEC 11578:1996>"
}
}