В октябре 2023 года наша команда по расследованию инцидентов PT CSIRT обнаружила компрометацию одной энергетической компании с использованием трояна Decoy Dog. Этот вредонос активно используется в атаках на российские компании и правительственные организации по меньшей мере с сентября 2022 года. Однако образец, обнаруженный нами на хосте жертвы, представлял собой новую модификацию троянского ПО, которую злоумышленники доработали, усложнив его обнаружение и анализ.
Анализ инструментов, тактик и техник не позволил связать данную активность ни c одной из ранее известных APT-групп. Новая группа, названная нами Hellhounds, прикладывает значительные усилия для сокрытия своей активности на хостах и в сети. В интересы группы входят компании и государственные организации исключительно на территории Российской Федерации. Злоумышленники могут преследовать разные цели, но достоверно известно об одном случае полного уничтожения инфраструктуры.
Первый этап — загрузчик Decoy Dog Loader
Расследуя инцидент, мы обнаружили исполняемый файл /usr/bin/dcrond размером 9 КБ. Файл был защищен модифицированной версией упаковщика UPX с измененной сигнатурой 37 13 03 00 вместо UPX!. На момент расследования только один антивирусный движок детектировал пакер, а некоторые образцы и вовсе не детектировались ни одним из движков. Для обнаружения модифицированного UPX можно использовать публичное YARA-правило из исследования JPCERT/CC.Рисунок 1. Вердикты антивирусных движков
В отличие от обычного UPX эта модификация распаковывает не исполняемый файл, а шеллкод, полностью написанный на языке ассемблера и использующий только системные вызовы Linux. После модифицированного UPX-заголовка расположена зашифрованная конфигурация, которая хранит в себе путь до зашифрованного файла с основной нагрузкой, а после конфигурации находится сжатый шеллкод:
Рисунок 2. Фрагмент Decoy Dog Loader
Загрузчик работает в системе и маскируется под легитимный сервис cron. Также мы обнаружили образцы, маскирующиеся под легитимный сервис irqbalance и под легитимную библиотеку lib7.so.
Код:
[Unit]
Description=Daemon to execute scheduled commands
Documentation=man:dcrond(8)
[Service]
Type=forking
ExecStart=/usr/bin/dcrond
Restart=always
Код:
[Unit]
Description=Deferred execution scheduler
Documentation=man:atd(8)
[Service]
Type=forking
ExecStart=/usr/bin/atd
Restart=always
[Install]
WantedBy=multi-user.target
Код:
[Unit]
Description= systemd-redhead is a service that collects disk usage patterns at boot time. systemd-readahead-stop.service is a service that replays this access data collected at the subsequent boot.
[Service]
Type=forking
ExecStart=/usr/bin/container
Restart=always
[Install]
WantedBy=multi-user.target
Убедившись, что он не находится под отладкой, загрузчик пытается по порядку прочитать идентификаторы скомпрометированного хоста из следующих файлов и считает MD5-хеш от первого существующего в файловой системе файла:
- /etc/machine-id;
- /var/lib/dbus/machine-id;
- /var/db/dbus/machine-id;
- /usr/local/etc/machine-id;
- /sys/class/dmi/id/product_uuid;
- /sys/class/dmi/id/board_serial;
- /etc/hostid;
- /proc/self/cgroup.
На этом этапе исследования стало понятно, что образец ориентирован на работу на конкретном хосте и что у злоумышленников был предварительный доступ к данному хосту для получения идентификатора и добавления его в конфигурацию.
Второй этап — основная нагрузка в виде Decoy Dog
Основная нагрузка исследуемого образца расположена в файловой системе по пути /usr/share/misc/pcie.cache. Расшифрованная нагрузка является модифицированной версией Pupy RAT, которую исследователи называют Decoy Dog.Pupy RAT — это кросс-платформенный многофункциональный бэкдор и инструмент постэксплуатации с открытым исходным кодом, написанный в основном на Python. Pupy поддерживает Windows и Linux, а также ограниченно Android и macOS. Он использует принцип выполнения «все в памяти» и оставляет минимум следов в системе. Pupy RAT может держать связь с управляющим сервером, используя несколько транспортов, мигрировать в процессы с помощью техники reflective injection и удаленно загружать Python-пакеты (.py, .pyc) и скомпилированные расширения Python C (.pyd, .so) из памяти.
В то время как Pupy RAT не разрабатывается уже два года, Decoy Dog находится в активной разработке. Основные отличия от Pupy RAT:
- Клиент обновлен с устаревшего Python 2.7 до Python 3.8. Соответственно, весь код был переписан под Python 3.8. Вероятно, поэтому количество модулей сократилось, остались лишь те, что реально используются;
- Добавлен ряд новых функций, связанных с внедрением кода в виртуальную машину Java;
- Были добавлены новые транспорты:
- BOSH (Bidirectional-streams Over Synchronous HTTP со связкой ECPV и RC4) заменил транспорт HTTP;
- lc4 (связка ECPV и RC4 для локального клиента/сервера с использованием TCP);
- lws4 (связка ECPV и RC4 для локального клиента/сервера с использованием протокола WebSockets);
- ws4 (то же, что и оригинальный ws, только вместо связки RSA и AES используется связка ECPV и RC4);
- dfws4 (то же, что и оригинальный dfws, только вместо связки RSA и AES используется связка ECPV и RC4);
- Добавлена возможность загружать динамический конфигурационный файл и сохранять его в зашифрованном виде на диске;
- Добавлен новый канал соединения (launcher) под названием special (локальное соединение с помощью IP-адреса и порта или файлового сокета);
- Повышена отказоустойчивость при помощи резервных управляющих серверов с указанием конкретных доменов и с использованием DGA.
Рисунок 3. Фрагмент конфигурации Decoy Dog RAT
Также троянская программа получает динамическую (актуальную) конфигурацию из файла /var/lib/misc/mpci.bin, который зашифрован криптографическим алгоритмом AES в режиме счетчика (CTR) с 128-битным ключом (который, в свою очередь, зашифрован на эллиптической кривой brainpoolP384r1), и содержит новые управляющие серверы:
- m-srv.daily-share.ns3[.]name;
- f-share.duckdns[.]org.
Также в конфигурации исследуемого образца содержится один скриплет, который запускается при каждом запуске бэкдора. Данный скриплет называется telemetry и служит для отправки телеметрии (информации о зараженной системе) в социальную сеть mindly.social (на основе открытого движка Mastodon) через API сервиса. Содержимое телеметрии представлено в расширенной версии исследования на сайте Positive Technologies.Передаваемые данные шифруются таким же образом, как и файл динамической конфигурации, с использованием того же открытого ключа. Поэтому даже при перехвате переданных данных, не зная закрытого ключа, расшифровать их не получится.
Отправка данных осуществляется с помощью API-ключа, который хранится в коде в открытом виде. Но злоумышленники ограничили область доступа API-ключа только записью данных. Таким образом, даже при получении API-ключа, прочитать какие-либо данные невозможно.
Рисунок 4. Фрагмент кода Decoy Dog RAT
Однако нам все же удалось установить, что телеметрия с зараженных хостов отправляется в аккаунт с юзернеймом @lahat, имя которого и дало название исследованию.
Рисунок 5. Страница пользователя @lahat в mindly.social
Помимо основного канала управления, исследуемый образец также выступал в качестве сервера, используя дополнительный локальный канал, который читает данные из файлового сокета /var/run/ctl.socket.
В Decoy Dog предусмотрен механизм генерации DGA-имен при потере связи по основному каналу управления.
Если в конфигурации включена опция bootstrap-domains, то для генерации используется один из основных доменов. В противном случае генерируется поддомен для одного из указанных в конфигурации доменов верхнего уровня или домен для одной из указанных зон (по умолчанию используется домен верхнего уровня dynamic-dns.net). В конфигурации исследуемого образца выбраны домены duckdns.org и dynamic-dns.net.
Резервный домен генерируется как первая половина шестнадцатеричного представления MD5-хеша от строки с текущей датой в формате <год><месяц><день> и открытого ключа, используемого при шифровании коммуникации с управляющим сервером.
Затем от получившегося домена (или одного из основных доменов, если включена опция bootstrap-domains) считается MD5-хеш, а затем от первой половины шестнадцатеричного представления берется по два символа и дописывается слева к домену. Таким образом получается набор из девяти доменов, к которым пытается подключиться ВПО. Например, для домена m-srv.daily-share.ns3[.]name получается восемь дополнительных доменов:
- 6cm-srv.daily-share.ns3[.]name
- 78m-srv.daily-share.ns3[.]name
- 7fm-srv.daily-share.ns3[.]name
- b1m-srv.daily-share.ns3[.]name
- 98m-srv.daily-share.ns3[.]name
- d5m-srv.daily-share.ns3[.]name
- 2fm-srv.daily-share.ns3[.]name
- 08m-srv.daily-share.ns3[.]name
Детальная схема работы Decoy Dog:
Рисунок 6. Схема работы Decoy Dog
Жертвами стали два десятка организаций
По нашим данным, по меньшей мере 20 организаций в Российской Федерации были скомпрометированы с использованием Decoy Dog.Рисунок 7. Распределение жертв по отраслям
Сейчас группа активно атакует организации в России, и мы продолжаем наше исследование. Пока что мы не знаем конечных целей атакующих, но в одном из инцидентов злоумышленники, используя Decoy Dog, вывели из строя ряд сервисов в телеком-операторе на территории России. Об этом рассказали исследователи из компании Solar 4RAYS на SOC-Форуме в докладе «Щелчок Таноса для оператора связи».
Причины успешных атак — слабая защищенность Linux-систем
После выхода материалов о Decoy Dog первой версии разработчики этого вредоноса приложили немало усилий, чтобы затруднить его обнаружение и анализ не только в трафике, но и в файловой системе.Одной из причин большого количества жертв стала недостаточная защищенность Linux-систем. В проектах по расследованию инцидентов мы весьма редко встречаем дополнительные системы мониторинга (auditd) и средства антивирусной защиты на хостах под управлением Linux.