Эксперты компании ESET рассказали о новом вредоносном ПО, целью которого являются кластеры для высокопроизводительных вычислений по всему миру. Оно интересно по нескольким причинам. Несмотря на довольно малый размер кодовой базы (образцы, подвергнутые анализу, имели размер 25 Кб), малварь достаточно сложна для проведения атак на Linux, BSD и Solaris и, потенциально, может подходить для атак на AIX и Microsoft Windows. Еще одной отличительной чертой является способность превращать зараженные серверы в новые C&C по команде оператора. Из-за множества хитростей и малого размера кода исследователи назвали его Kobalos — в честь озорных древнегреческих духов, однажды ограбивших Геракла и обожающих обманывать и пугать людей.
В опубликованном специалистами исследовании рассказывается о предполагаемых начальных векторах компрометации, механизмах аутентификации и распространения, встроенных функциях и приводится технический анализ вредоносного кода. После этого эксперты указывают на признаки компрометации и применяемые методики MITRE ATT&CK.
У нас возникла мысль, что людям, слабо владеющим английским языком, но неравнодушным к актуальным исследованиям в области ИБ, в частности, к разбору вредоносного ПО, будет интересен и полезен перевод анализа такой, на наш взгляд, необычной малвари.
Компания ESET Research проанализировала Kobalos — ранее неизвестное, сложное, многоплатформенное вредоносное ПО, предназначенное для работы под Linux, FreeBSD и Solaris. Учитывая, что жертвами являются, в основном, известные организации, можно не сомневаться, что именно на них это ПО и было нацелено. При развёртывании Kobalos даёт доступ к файловой системе скомпрометированного хоста и удалённому терминалу, позволяя злоумышленникам выполнять произвольные команды.
У Kobalos примечательные сетевые возможности. Он может работать либо в пассивном режиме, либо в качестве бота, активно подключаясь к своим C&C-серверам. Любопытно, что и сами эти серверы скомпрометированы с помощью Kobalos: код для их использования есть во всех образцах этого вредоносного ПО.
Проведя широкое исследование сети, ESET Research смогла выявить и уведомить жертв Kobalos. Неизвестно, когда это ПО было разработано, но его первая известная активность, подтверждённая жертвой, зарегистрирована в конце 2019 года. Группа злоумышленников, управляющая Kobalos, действовала и на протяжении 2020 года. Техники атак на Linux продолжают развиваться, и авторы вредоносных программ прилагают много усилий к совершенствованию своих разработок. Kobalos — одна из таких программ.
Основные выводы
- Kobalos — многоплатформенный бэкдор, работающий под Linux, FreeBSD и Solaris. Найдены признаки того, что это ПО может существовать под AIX и даже Windows.
- К целям Kobalos относятся известные организации, а атакам подверглись высокопроизводительные машины, серверы учебных заведений, поставщик средств безопасности для конечных точек и большой интернет-провайдер. Kobalos развёрнут на серверах в Европе, Северной Америке и Азии.
- Kobalos использует сложный механизм обфускации, затрудняющий его анализ.
- Любые скомпрометированные с помощью Kobalos серверы могут быть превращены в C&C-серверы для других скомпрометированных хостов. Для этого в ПО встроен необходимый код, который может быть в любой момент активирован оператором.
- На большинстве исследованных скомпрометированных хостов также было установлено ПО для кражи учётных данных OpenSSH. Это может объяснить способ распространения Kobalos.
- До сих пор неизвестны намерения авторов Kobalos. Не было найдено никаких подсказок о том, крадут ли они конфиденциальную информацию, преследуют денежную или какую-то иную выгоду. В скомпрометированных системах не обнаружено никакого другого вредоносного ПО, не считая инструмента для кражи учётных данных SSH.
Введение
Если в последние годы вы следили за работой ESET Research, то могли заметить, что мы предпочитаем искать и документировать серверное вредоносное ПО, разработанное под Linux и иные, менее распространённые ОС. Один из первых подобных отчётов посвящён Operation Windigo и описывает несколько семейств ПО, совместно занимающихся перенаправлением интернет-трафика, рассылкой спама и другой вредоносной деятельностью. Основой Operation Windigo является Ebury — OpenSSH-бэкдор, крадущий учётные данные. Ebury может скомпрометировать SSH-клиент и сервер без модификации исполняемых файлов OpenSSH. Вместо этого он изменяет загружаемую ими библиотеку и патчит функции, чтобы суметь запуститься и украсть учётные данные после загрузки бэкдора. Задача непростая, но авторам Ebury удалось её решить.
После Operation Windigo мы обнаружили и описали несколько других вредоносных программ под Linux, таких как Mumblehard, Moose, Shishiga, а также описали десятки бэкдоров для OpenSSH в отчёте The dark side of the ForSSHe.
До текущего момента нам не попадалось вредоносное Linux-ПО, анализировать которое было так же трудно, как Ebury. Но в этот раз ситуация иная: в отличие от Ebury, действия Kobalos не выглядят такими масштабными. Количество скомпрометированных ими машин исчисляется десятками, а в случае с Ebury — десятками тысяч. В этой статье описан полный технический анализ Kobalos, цели злоумышленников, а также индикаторы компрометации, которые могут помочь потенциальным жертвам обнаружить вредоносное ПО и избавиться от него.
Жертвы
После анализа вредоносного ПО ESET провела широкое сканирование интернета в поисках жертв Kobalos. Мы искали специфическое поведение бэкдора, для которого характерно установление TCP-соединения со скомпрометированным хостом с конкретного исходящего порта.
Учитывая сложность этого ПО, нас удивило очень небольшое количество найденных жертв. Однако сами цели выбраны явно не случайно: это высокопроизводительные компьютеры (HPC) и серверы, входящие в научные и исследовательские сети. На одном из таких компьютеров было не меньше 512 Гб оперативной памяти и почти петабайтное дисковое хранилище. Мы также нашли и другие известные организации-жертвы, например, поставщика средств безопасности для конечных точек (это не мы!).
Иллюстрация 1. Отрасли и регионы, к которым относятся скомпрометированные организации.
В некоторых организациях было заражено сразу несколько серверов. Мы оповестили всех найденных нами жертв и совместно работали над удалением вредоносного ПО. Благодарим всех, кто откликнулся и поделился информацией, которая помогала нам в этом исследовании.
Начальный вектор компрометации
Нам известно не из первых рук, как были скомпрометированы системы, чтобы злоумышленники получили административный доступ для установки Kobalos. Мы можем лишь предполагать на основе собранных улик.
На скомпрометированных машинах, чьи сисадмины приняли участие в расследовании, мы обнаружили, что программа для кражи учётных данных SSH была представлена в виде троянизированного OpenSSH-клиента. Файл
/usr/bin/ssh
был заменён модифицированным исполняемым файлом, который записывал имя пользователя, пароль, название целевого хоста и сохранял их в зашифрованный файл. Поэтому мы считаем, что кража учётных данных была одним из способов распространения Kobalos. Также это может объяснить, почему были скомпрометированы многие академические сети: если какой-нибудь SSH-клиент использовался студентами или исследователями из нескольких университетов, то могли быть украдены учётные данные для всех этих сторонних систем.Другой возможной точкой входа может быть использование известной уязвимости: на некоторых скомпрометированных машинах исполнялись старые, не поддерживаемые или не пропатченные ОС и приложения, поэтому вариант с использованием известного эксплойта наиболее вероятен. Но также не стоит исключать и вероятность применения неизвестной на данный момент уязвимости.
Атака на сети для высокопроизводительных вычислений
ESET поделилась информацией с организациями, играющими важную роль в разрешении инцидентов в исследовательских и академических системах, например, с CERN Computer Security Team. Они подтвердили, что с конца 2019 до середины 2020 года HPC-сообщество подверглось волне трех различных атак, о некоторых из которых было публично объявлено.
Спустя много месяцев расследования все еще неясно, были ли эти три волны связаны друг с другом, или это просто неожиданное совпадение. Операторы вредоносного ПО применяли разные тактики, методики и уровни сложности. С другой стороны, странно, что в разных атаках совпадали некоторые IP-адреса.
- В первой волне использовался Kobalos, который описан в этом исследовании.
- Вторая волна была сосредоточена на майнинге криптовалют с помощью совсем другого набора инструментов.
- Третья волна была самой масштабной, однако её полезную нагрузку пока не удалось определить.
Косвенные признаки компрометации в результате второй и третьей волн были описаны Командой реагирования на инциденты компьютерной безопасности в европейской сетевой инфраструктуре (European Grid Infrastructure Computer Security Incident Response Team) в виде инцидентов #EGI20200421 и #EGI2020512.
Неясно, почему среди жертв этих атак преобладают представители HPC-сообщества. Конечно, HPC-центры представляют интерес, но обычно в них сложнее проникнуть, в отличие от прочих серверов научно-исследовательских сетей. С помощью распределённого процесса реагирования на инциденты, основанного на опыте сообщества, CERN и другие вовлечённые команды отметили ряд устаревших архитектур и неоптимальных методик обеспечения безопасности, которые сыграли ключевую роль в распространении атак. Кроме того, большинство жертв из HPC-сообщества оказались плохо подготовлены к проведению расследований, особенно с точки зрения мониторинга активности в системах.
Обзор Kobalos
Kobalos обладает многочисленными возможностями для доступа к скомпрометированным системам и сокрытия следов их использования.
Доступ к скомпрометированным системам
Во-первых, в Kobalos есть общие команды для чтения и записи в файловую систему, а также для запуска терминала и выполнения произвольных команд. К сожалению, в программе нет конкретной полезной нагрузки, которая подсказала бы намерения авторов. Скорее всего, операторы запускают через терминал командную оболочку и выполняют команды, которые им нужны.
Доступность
Во-вторых, в Kobalos есть ряд возможностей, позволяющих устанавливать сетевое соединение между операторами и исполняемым вредоносом. ПО обеспечивает свою доступность извне несколькими способами:
- Открывает TCP-порт и ждет входящее соединение (такой режим иногда называют пассивным бэкдором).
- Подключается к другому экземпляру Kobalos, который сконфигурирован как C&C-сервер.
- Ждёт подключения к уже работающему легитимному сервису, исходящие с конкретного TCP-порта.
Последний способ требует подмены работающего сервиса другим, который содержит код Kobalos. Во всех случаях, когда мы отмечали использование этого способа, злоумышленникам приходилось изменять исполняющийся OpenSSH-сервер. Файл
sshd
полностью заменялся, так что программа продолжала работать и при перезапусках сервиса или системы.Аутентификация и сетевое шифрование
В-третьих, для запуска бэкдора нужно аутентифицировать его клиенты, которые должны обладать закрытым RSA-512 ключом и паролем. После их проверки Kobalos генерирует и шифрует два 16-байтных ключа с открытым ключом по алгоритму RSA-512 и отправляет их злоумышленникам. Эти два ключа используются для RC4-шифрования последующего входящего и исходящего трафика.
Смена порта
В-четвёртых, во время аутентификации оператор может продолжить взаимодействие по другому TCP-соединению. По запросу Kobalos может начать прослушивать нужный порт и перевести на него всё последующее взаимодействие. Проходящие по этому каналу данные шифруются с помощью RC4-ключей, которые были созданы при аутентификации.
Проксирование на другие скомпрометированные машины
В-пятых, Kobalos можно использовать как прокси для соединения с другими скомпрометированными им серверами. Это не обычный TCP-прокси: он требует инкапсуляции данных в специальные пакеты, а также поддерживает упомянутую выше смену порта: для этого отправляется команда, которая «переключает» соединение.
Прокси можно соединять в цепочки, то есть операторы могут использовать несколько скомпрометированных с помощью Kobalos машин для соединения с целевыми серверами.
Совокупность возможностей
Иллюстрация 2. Обзор возможностей Kobalos и возможных сценариев обращения к скомпрометированным серверам.
Первый сценарий — прямое подключение к скомпрометированным серверам для доступа к их ресурсам. На схеме бэкдор работает внутри процесса OpenSSH-сервера и ожидает, что у подключения будет исходный порт. Для взаимодействия с бэкдором оператор должен использовать правильный исходный TCP-порт.
Второй сценарий, возможно, самый сложный, но с ним связаны уникальные особенности Kobalos. Оператор может запускать C&C-сервер с любого сервера, на котором исполняется это ПО. Дополнительный код для этого не нужен, вся функциональность уже встроена. После своего запуска C&C-сервер проверяет список подключённых ботов, и оператор может подключиться к любому из них. На последнем узле нужна аутентификация, применяется сквозное принудительное шифрование с помощью обмена RC4-ключами. Чтобы обеспечить такую схему работы, в экземпляре Kobalos на сервере В должен быть прописан IP-адрес и порт C&C-сервера, работающего на сервере А. Сервер В обменивается трафиком только с сервером A, скрывая IP-адрес оператора.
В третьем сценарии сервер А используется для проксирования подключения к серверу С. Здесь тоже применяются аутентификация и принудительное сквозное шифрование. Оператор может задавать исходный порт при подключении с сервера А к С. Это означает, что сервер А можно использовать для соединения с экземплярами Kobalos, которые ждут подключение от конкретного порта.
Технический анализ Kobalos
В первый раз мы проанализировали троянизированный OpenSSH-сервер. Размер вредоносного кода и данных Kobalos довольно мал: около 25 Кб для образцов под x86-64. Любопытно, что весь код упакован в одну функцию. В легитимном коде OpenSSH есть только один вызов этой функции.
Kobalos — сложное ПО. Очевидно, что его разработчики вложили в его создание много сил. Авторы реализовали многочисленные возможности и внедрили собственную обфускацию.
Обфускация
Исключительное выравнивание (flattening) потока управления
То, что код помещается в одну функцию, не означает линейности потока управления. Kobalos рекурсивно вызывает свою функцию для выполнения необходимых подзадач.
Иллюстрация 3. Граф потока управления Kobalos.
Первый параметр функции — это выполняемое действие. Kobalos умеет выполнять 37 действий. Они перечислены в приложении «Встроенные функции Kobalos», которое помогает анализировать имеющиеся и вероятные будущие версии этого ПО. Также функция служит обработчиком сигнала
SIGCHLD
для плавного завершения дочернего процесса и SIGALRM
для обработки таймаута подключения.Что касается исходного кода Kobalos, то это может быть похоже на компилирование нижеприведённого кода на С. Часть преобразования может быть автоматизирована с помощью встраивания функций компилятором, но присвоение цифровых идентификаторов всем функциям и обработка того же количества аргументов в функциях требует ручной работы или специального инструментария.
До | После |
---|---|
|
|
Иллюстрация 4. С помощью этого кода на С показано, как может выглядеть исходный код Kobalos после выравнивания потока управления.
Зашифрованные строковые значения
В коде и данных Kobalos нет обычных текстовых строковых значений. Здесь используются лишь несколько коротких строк, зашифрованных с помощью RC4. Они расшифровываются сразу после первичного взаимодействия с программой, но до аутентификации. Для всех проанализированных нами образцов используется один ключ —
AE 0E 05 09 0F 3A C2 B5 0B 1B C6 E9 1D 2F E3 CE
.Расшифрованные строковые значения:
- %s %s
- /dev/ptmx
- ptem
- ldterm
- ttcompat
- /dev/tty
- %s
- %d
- /
- \
- %d.%d
- win3.11
- win95
- winNT
- win??
- \\.\pipe\2
- %s %s.%s
- /dev/ptc
В проанализированных нами образцах Kobalos используются только выделенные жирным значения (1 и 6—9). Другие не упоминаются, хотя они могут использоваться в каких-нибудь других версиях. В частности:
- Строки 10 и 12—16 выглядят характерными для Windows.
- Строка 18 — это путь к драйверу псевдотерминального устройства в AIX.
- Строки 3–5 используются системными вызовами псевдотерминала в Solaris.
Мы не можем исключить вариант с попыткой дезинформирования исследователей о существовании версий под другие ОС. Учитывая, что мы подтвердили поддержку трёх ОС, неудивительно, если их окажется больше. С другой стороны, версиям Windows 3.11 и Windows 95 уже более 25 лет. Есть ли версии Kobalos под эти устаревшие системы?
Противодействие расследованию
После прохождения аутентификации к процессу бэкдора применяются некоторые методики, препятствующие расследованию:
- Значение
RLIMIT_CORE
обнуляется для предотвращения создания дампа ядра в случае падения процесса. - Большинство сигналов игнорируется, чтобы труднее было прервать процесс.
Иллюстрация 5. Kobalos избегает создания дампов ядра при падении и игнорирует большинство сигналов.
Важно отметить, что настройка
RLIMIT_CORE
не помешает сделать дамп процесса вручную, например, с помощью gcore
из gdb. Это ограничение используется ядром для определения максимального размера дампа памяти при падении процесса.Временные метки
Анализ файловой системы скомпрометированных серверов показал, что после установки временные метки заменённых файлов (таких, как
ssh
для добавления модуля кражи учётных данных или sshd
для развёртывания Kobalos) подделываются для отведения подозрений.Конфигурация
У Kobalos статичная конфигурация, которая включает или отключает функции ПО. В таблице 1 перечислены поля, которые мы считаем частью конфигурации. А на иллюстрации 6 приведён реальный пример.
Таблица 1. Структура статичной конфигурации Kobalos:
Размер (байты) | Описание |
---|---|
2 | Вероятно, номер версии. Передаётся при успешной аутентификации. Во всех найденных образцах имеет значение 0xB03 (учитывая, что оно передаётся в формате от старшего к младшему, как и все остальные данные Kobalos). |
320 | Модуль открытого RSA-ключа. Зашифрован в особом двоичном формате. |
2 | Прослушиваемый TCP-порт. Если задан ноль, то Kobalos не будет прослушивать порты, а воспользуется другими способами ожидания подключения к бэкдору. |
2 | Минимальный таймаут для входящего подключения или подключения к C&C-серверу, в минутах. Если не задан, то по умолчанию таймаут — один день. |
2 | Диапазон таймаута в минутах. Финальный таймаут представляет собой случайное количество минут в промежутке от минимального (предыдущее значение) до максимального значения плюс диапазон (это значение). |
4 | IP-адрес для подключения к C&C-серверу для обработки команд. При нулевом значении Kobalos пассивно ждёт подключения. |
2 x 16 | TCP-порты, к которым ПО пробует подключиться при соединении с C&C-сервером. |
16 | MD5-хеш пароля, необходимого для аутентификации. |
Иллюстрация 6. Пример конфигурации образца Kobalos, встроенного в sshd.
Часть конфигурации будет другой, если Kobalos исполняется внутри
sshd
или в виде отдельного исполняемого файла. В последнем случае требуется адрес удалённого C&C-сервера (remote_c2_addr
) или порт для прослушивания (listen_port
).Развёртывание и сохранность
Если Kobalos развёрнут для запуска в виде части OpenSSH-сервера, файл
sshd
должен быть перекомпилирован ради добавления вредоносного кода. Мы сравнили троянизированную версию OpenSSH и ту, что должна быть установлена в системе, например, из менеджера пакетов. Похоже, оператор компилирует Kobalos на основе корректного исходного OpenSSH, уже установленного на сервере. Вероятно, компилирование заражённого исполняемого файла выполняется на машине жертвы перед заменой оригинала. Скорее всего, такая схема выбрана ради обеспечения сохранности ПО за счет предотвращения несовпадений версий, из-за которых может возникать несовместимость библиотеки. Нужно отметить, что для замены
sshd
нужны root-привилегии. Однако есть версии Kobalos и в виде отдельных файлов, которые подключаются к C&C-серверу или прослушивают TCP-порт. Для их запуска не нужны привилегии администратора, однако доступ к файловой системе и набор команд будут ограничены уровнем доступа текущего пользователя.Взаимодействие с бэкдором
Подключение к бэкдору
Одной из примечательных особенностей Kobalos является гибкость в установлении соединения между операторами и скомпрометированными хостами. Это можно сделать тремя способами:
- Прослушивая указанный TCP-порт (пассивный режим).
- Подключившись к C&C-серверу (активный режим) и ожидая подключения оператора через этот сервер.
- Подменив имеющийся сервис, который прослушивает TCP-порты, и ожидая соединения с конкретного исходного TCP-порта.
С помощью статичной конфигурации Kobalos можно активировать сразу несколько способов, однако в каждом проанализированном нами образце был активирован только один.
Последний метод требует модифицирования исполняемого демона. Троянизированная версия вызывает код Kobalos при каждом приёме нового TCP-подключения, как показано на иллюстрации 7. Бэкдор может принять его, если подключение исходит с конкретного TCP-порта. Если номер порта совпадает, то функция ничего не возвращает, а подпроцесс завершается при закрытии подключения. Если же порт не соответствует прописанному, то программа ничего не делает и передаёт работу коду легитимного сервиса, который продолжает исправно работать.
Иллюстрация 7. Вызов функции
kobalos
из троянизированной OpenSSH-функции main
после принятия нового TCP-подключения.Этот способ встречался нам чаще всего, и им злоупотреблял только OpenSSH-сервер. Однако данные могут быть ошибочны, потому что именно этот способ мы могли обнаруживать при сканировании интернета.
Как показано на иллюстрации 8, Kobalos ожидает подключения от TCP-порта 55201.
Иллюстрация 8. Сравнение исходного порта с 55201.
В Kobalos реализован дополнительный метод фильтрации входящих TCP-подключений, сравнивающий исходный порт со списком из 16 портов:
Иллюстрация 9. Сравнение исходного порта со списком из 16 портов.
Список 16 портов:
20 | 567 | 2734 | 22392 |
21 | 982 | 5392 | 33921 |
53 | 1821 | 11568 | 44983 |
230 | 1912 | 19678 | 55201 |
Однако ни в одном из найденных образцов этот фильтр не использовался. Возможно, его применяли в предыдущей версии бэкдора.
Аутентификация
После установления связи выполняется аутентификация. Для дальнейшей работы нужен закрытый RSA-ключ и 32-байтный пароль. Клиент Kobalos отправляет на заражённый сервер начальный 320-байтный пакет, структура которого описана в таблице 2.
Таблица 2. Структура пакета аутентификации (зашифрованного с помощью закрытого RSA-ключа):
Размер (в байтах) | Описание | Значение |
---|---|---|
4 | Таинственный параметр | 0x7FFF000A |
2 | Порт для привязки | Если 0x0000 , то Kobalos выбирает случайный порт.Если 0xFFFF , то использует существующее TCP-соединение. |
1 | Идентификатор канала связи | Похоже, всегда задан как 0xFF . |
32 | Пароль | Значение пароля совпадает с MD5-хешем в статичной конфигурации. |
280 | Заполнение |
Первые 64 байта пакета расшифровываются с помощью модуля открытого ключа RSA-512, указанного в конфигурации, и экспоненты
0x10001
(см. иллюстрацию 11). Затем, как показано на иллюстрации 10, к 32-байтному паролю применяется MD5-хеширование, а результат сравнивается с информацией из статичной конфигурации.Иллюстрация 10. После получения 320 байтов выполняется аутентификация.
Иллюстрация 11. Загрузка открытого ключа RSA-512.
С помощью открытого RSA-ключа Kobalos зашифровывает и задаёт RC4-ключи, которые используются при дальнейшем взаимодействии: один для входящего трафика, другой для исходящего. Зашифрованные ключи Kobalos отправляет в своём ответе.
Таблица 3. Структура ответа Kobalos (зашифрованного с помощью открытого RSA-ключа):
Размер (в байтах) | Описание | Значение |
---|---|---|
4 | Таинственный параметр | 0x7FFF000A |
16 | RC4-ключ для входящего трафика | RC4-ключ, который используется для трафика на скомпрометированный хост. |
16 | RC4-ключ для исходящего трафика | RC4-ключ, который используется для трафика со скомпрометированного хоста. |
2 | Привязанный порт | TCP-порт, который используется в качестве активного канала. Значение 0xFFFF означает использование текущего соединения. |
282 | Заполнение |
Активный канал
После прохождения аутентификации активный канал может использовать иной порт. Вы могли заметить, что при клиентской аутентификации нужно предоставить в зашифрованном сообщении «порт для привязки».
- Если его значение отличается от
0xFFFF
, то Kobalos начнёт прослушивать заданный TCP-порт. - Если значение нулевое, то бэкдор начнёт слушать случайный порт выше 1024.
Как упоминалось выше, в аутентификационном ответе вместе с парой RC4-ключей передаётся номер свежеоткрытого порта. По желанию может быть создано дополнительное TCP-соединение: если в качестве порта привязки передаётся значение
0xFFFF
, то используется текущее соединение.Последующий обмен данными через эти TCP-соединения инкапсулируется в пакеты, формат которых описан в таблице 4.
Таблица 4. Структура пакетов Kobalos:
Размер (в байтах) | Значение |
---|---|
1 | Таинственное значение (0x7F ) |
2 | Полезная нагрузка |
1 | Идентификатор канала связи. |
1 | Идентификатор канала связи. |
payload_size | Полезная нагрузка (зашифрована с помощью RC4). |
Kobalos первым отправляет пакет подключённому оператору. В пакете содержится основная информация о машине, например, название хоста и версия ядра. На иллюстрации 12 показаны уровни инкапсуляции в пакете.
Иллюстрация 12. Информация, отправляемая оператору со скомпрометированного хоста.
На иллюстрации 13 показаны процессы установления связи между Kobalos и его клиентом.
Иллюстрация 13. Диаграмма последовательности действий сетевых протоколов Kobalos.
Управление бэкдором
После аутентификации оператор может давать бэкдору разные команды. Мы разделили их на категории:
- Подключение к другим серверам, заражённым Kobalos, и работа в качестве прокси.
- Чтение и запись любых файлов в файловую систему.
- Запуск и обращение к псевдотерминалу на скомпрометированном хосте.
- Запуск и управление C&C-серверами Kobalos с обращением к подключённым ботам.
Команды инкапсулируются в активном канале. Они начинаются с идентифицирующего байта, за которым идут параметры, которые парсятся этой командой. Описанные в этой работе команды обрабатываются Kobalos, то есть оператор шлёт их скомпрометированной системе с помощью специального клиента. Kobalos отвечает в таком же формате, с первым байтом-идентификатором, и ответы обрабатываются тем же клиентом. Например, после аутентификации может быть дана команда «отправь информацию о хосте» (
0x04
).Использование в качестве прокси
Операторы могут использовать установленный на скомпрометированной машине Kobalos для подключения к другим экземплярам бэкдора в других системах. В режиме прокси используется описанный выше особый размер пакетов для аутентификации и инкапсуляции, то есть это не обычный TCP-прокси.
При подключении к сторонней машине оператор может выбрать исходный TCP-порт. Это позволяет подключаться к экземплярам Kobalos, которые ждут соединения с конкретного порта. Также поддерживается переподключение активного канала через альтернативный порт. Для этого даётся специальная команда.
Одной из задач в данном случае является обеспечение определённого уровня анонимности операторов. Конечный узел видит только IP-адрес другой скомпрометированной машины, а не IP-адрес оператора. Чтобы ещё сильнее скрыть адрес оператора, можно создавать цепочки скомпрометированных прокси-машин. На иллюстрации 14 показан такой сценарий.
Иллюстрация 14. Kobalos используется в качестве прокси.
Команды управления прокси описаны в таблице 5.
Таблица 5. Команды для использования Kobalos в качестве прокси:
Команда | Описание | Параметры |
---|---|---|
0x01 | Установление подключения к другому хосту, скомпрометированному Kobalos. | Удалённый адрес. Исходный порт. Конечный порт. Аутентификационное сообщение (320 байтов). |
0x03 | Переподключение с помощью другого конечного порта. Полезно, когда активный канал запрашивается в новом TCP-подключении. | Порт назначения. |
0x05 | Закрытие подключения к другому хосту. |
Доступ к файловой системе
После аутентификации оператор может читать или записывать в систему любые файлы. В сетевом протоколе Kobalos инкапсулированная полезная нагрузка определяется с помощью 16-битного целого числа. Это означает, что оператор может отправлять только 64-килобайтные пакеты. Например, если он хочет записать в файл 200 Кб, то придётся выполнить четыре успешные команды записи. У команды чтения ограничение ещё жёстче: единовременно прочитать и отправить можно только 1000 байтов.
В таблице 6 описаны команды для работы с файловой системой.
Таблица 6. Команды для чтения и записи файлов:
Команда | Описание | Параметры |
---|---|---|
0x18 | Открытие файла для записи; если его нет, то файл создаётся. | Позиция поиска. Путь к файлу. |
0x1A | Запись в файл. | Данные для записи. Они будут перезаписаны с позиции поиска. |
0x1C | Закрытие файла после записи. | |
0x1D | Открытие и чтение файла. | Позиция поиска. Путь к файлу. |
0x20 | Закрытие файла после чтения. |
Создание псевдотерминала
Эта функциональность позволяет аутентифицированному оператору создавать в новом псевдотерминале оболочку и исполнять произвольные команды. Для этого используются команды из таблицы 7.
Таблица 7. Команды для создания и управления псевдотерминалами:
Команда | Описание | Параметры |
---|---|---|
0x12 | Запуск нового псевдотерминала. | Путь к оболочке (например, /bin/sh ). Аргумент. |
0x0D | Указание размера окна псевдотерминала. | Значения структуры winsize , принимаемые TIOCSWINSZ. |
0x14 | Закрытие псевдотерминала. | |
0x16 | Запись в псевдотерминал. | Данные для записи. |
Данные из терминала отправляются операторам, а после данных идёт замыкающий идентификатор команды
0x17
. Она реализована в клиенте, который используют операторы.Использование в качестве C&C-сервера
Одна из самых необычных особенностей Kobalos заключается в том, что код C&C-сервера уже встроен в сам бэкдор. Это позволяет злоумышленникам с помощью одной команды превращать в C&C-серверы (для других ботов) любые заражённые машины. После запуска сервера оператор может задать его IP-адрес и порт в конфигурациях будущих экземпляров Kobalos, которые будут развёрнуты на других хостах. Это позволяет:
- Использовать скомпрометированные ресурсы в качестве C&C-серверов, а не арендовать серверы у обычных провайдеров. Таким образом снижается вероятность недоступности серверов.
- Использовать C&C-сервер в качестве промежуточного узла для машин за файрволами, с которыми нет прямой связи из интернета.
Когда оператор отправляет команду «перехода в режим C&C» (
0x21
), в качестве параметра передаётся номер порта. Kobalos начинает его прослушивать, а боты используют этот порт для подключения к экземпляру C&C-сервера. При этом бэкдор также прослушивает следующий порт с более высоким номером. Например, если для ботов используется TCP-порт 7070, то в C&C-режиме Kobalos также прослушивает 7071. Второй порт используется оператором для контроля C&C-функций, таких как составление списка ботов и установления туннелей к ним. Схема представлена на иллюстрации 15.Иллюстрация 15. Оператор Kobalos обращается к ботам, сообщившим о себе C&C-серверу.
В таблице 8 описаны команды для управления возможностями C&C-сервера.
Таблица 8. Команды управления функциями C&C-сервера:
Команда | Описание | Параметры |
---|---|---|
0x21 | Запуск C&C-сервера. | TCP-порт для C&C-сервера. |
0x23 | Получение количества активных соединений и общее количество с момента запуска C&C. | |
0x25 | Список всех ботов, готовых исполнять команды. | |
0x29 | Отключение C&C-сервера. | |
0x2B | Подключение к боту. | Индекс бота из списка готовых к подключению ботов. Аутентификационное сообщение (320 байтов). |
0x2D | Подключение к боту без аутентификации. | Индекс бота из списка готовых к подключению ботов. |
Команды
0x23
—0x2D
обрабатываются подпроцессом C&C-сервера. Как показано на иллюстрации 16, после отправки в активный канал данные перенаправляются через TCP в петлевой интерфейс (loopback interface) порта управления (на единицу больше номера порта, используемого ботами) C&C-сервера.Иллюстрация 16. Относящиеся к управлению C&C-сервером пакеты перенаправляются через TCP в подпроцесс.
Другие команды
Переменные окружения
Для процесса бэкдора есть команда назначения переменных окружения. Она берёт строку в качестве параметра и просто передаёт в putenv, который ожидает данные в формате «VAR=value».
Таблица 9. Другие команды, которые понимает Kobalos:
Команда | Описание | Параметры |
---|---|---|
0x0E | Задаёт переменную окружения для сессии. | Строка для передачи в putenv . |
Пустые операции
Реализованы ещё две команды, но они ничего не делают. У нас есть этому два объяснения:
- Авторы удалили функциональность команд, поскольку те использовались в предыдущих версиях и больше не нужны.
- Команды предназначены для конкретных платформ и не применяются в проанализированных нами версиях Kobalos под Linux и FreeBSD.
Иллюстрация 17. Команды
0x07
и 0x09
ничего не делают.Второе объяснение выглядит более вероятным, поскольку нам известны строковые значения для Solaris, AIX и Windows (см. главу «Зашифрованные строковые значения»).
Программа для кражи учётных данных OpenSSH
В большинстве систем, скомпрометированных Kobalos, бэкдор развёртывал ещё и программу для кражи учётных данных SSH через троянизированный SSH-клиент. Мы нашли разные варианты этих файлов, в том числе под Linux и FreeBSD. В отличие от Kobalos, возможности этой программы почти не подверглись обфускации. Её главная функция заключается в краже названия хоста, номера порта, а также имени пользователя и пароля для установления SSH-подключения от скомпрометированного хоста. Данные сохраняются в зашифрованный файл. Свежие версии трояна также могут передавать информацию по сети через UDP, но эта функция не была активирована в конфигурации большинства найденных образцов.
Но момент публикации нашего предыдущего исследования OpenSSH-бэкдоров «The dark side of the ForSSHE» мы не знали об этом трояне, поэтому он не упоминается в той работе. Также мы не можем связать его ни с одной из описанных в открытых источниках программ для кражи учётных данных OpenSSH.
Место размещения файла с украденными данными зависит от версии программы. Все образцы создавали в директории
/var/run
файл с расширением .pid. Оно используется во многих файлах в этой директории. Посмотреть примеры названий файлов и путей к ним из разных образцов можно в главе «Признаки компрометации».Все найденные образцы шифруют содержимое файлов с помощью одного простого шифра. Как показано на иллюстрации 18, троян просто добавляет к каждому сохраняемому байту данных 123.
Иллюстрация 18. Шифрование и запись в файл украденных учётных данных SSH.
В версии под FreeBSD применяется тот же формат и шифр. Однако реализованы они чуть иначе, например, в программе путь к файлу шифруется с помощью однобайтного XOR.
Развивающее семейство программ
После того, как мы уведомили одну из организаций-жертв, они обнаружили, судя по всему, более свежую версию крадущего учётные данные трояна. Она содержит зашифрованную конфигурацию и позволяет передавать через UDP украденную информацию на удалённый хост, указанный в конфигурации. Такой возможностью обладают также Ebury и прочие программы, крадущие учётные данные SSH, такие как Bonadan, Kessel и Chandrila. Возможно, UDP выбран, чтобы обходить файрволы и не осуществлять TCP-подключение к потенциально недоверенным хостам. Троян использует только один способ передачи — через файл или сеть, потому что название целевого хоста и путь к файлу сохраняются в одной и той же переменной.
На иллюстрации 19 показан декомпилированный код, отвечающий за отправку данных через UDP. А на иллюстрации 20 приведена конфигурация из найденного образца. Он был настроен на запись украденной информации в
/var/run/sshd/sshd.pid
.Иллюстрация 19. Троян шлёт учётные данные через UDP.
Иллюстрация 20. Пример конфигурации, в которой для записи украденных данных используется файл.
Любопытно, что конфигурация содержит и название хоста жертвы. Вероятно, оно используется операторами для обозначения источника данных. Также это означает, что каждый скомпрометированный сервер получает уникальный экземпляр трояна.
Заключение
Многочисленные хорошо реализованные функции и методики сетевого обхода говорят о том, что авторы Kobalos гораздо квалифицированнее многих создателей вредоносных программ, предназначенных для Linux и иных не-Windows-систем. Выбор целей — довольно известные организации — также подсказывает нам, что операторы Kobalos не стремятся заразить как можно больше систем. Малое количество следов и методики сетевого обхода могут быть причиной того, что бэкдор оставался незамеченным до тех пор, пока мы не сообщили жертвам о результатах своего сетевого сканирования.
Мы не можем ответить на вопрос о намерениях злоумышленников. Возможности бэкдора позволяют использовать его для решения любых задач. На скомпрометированных машинах не было найдено дополнительного ПО за исключением трояна, крадущего учётные данные SSH. Поэтому мы считаем входной точкой именно SSH, а не полезную нагрузку. Согласно информации от сисадминов скомпрометированных HPC-системинформации от сисадминов скомпрометированных HPC-систем, никто не пытался майнить криптовалюты или запускать иные задачи, требующие больших вычислительных мощностей.
Что преследуют злоумышленники?
Мы также не смогли выяснить, как давно используется это ПО. Мы нашли строки, относящиеся к Windows 3.11 и Windows 95, которые вышли больше 25 лет назад. Существует ли версия Kobalos под Windows? Эта программа создана настолько давно? Мы знаем о новых заражениях в 2019-м и 2020-м годах, но не нашли доказательств более раннего использования.
Хотя авторы этого ПО, судя по всему, хорошо разбираются в работе сетевых протоколов и операционных систем своих жертв, у Kobalos есть несколько слабых мест. Во-первых, проблемы с криптографией, вероятно, из-за развития этой отрасли, если Kobalos действительно разработан очень давно. Во-вторых, можно заметить пассивно прослушивающие экземпляры, особенно если им требуется конкретный исходный TCP-порт. Мы успешно воспользовались этой особенностью уи уведомили жертв, чтобы уменьшить количество заражённых хостов и лучше узнать эту свежеобнаруженную угрозу.
Также сообщаем о работе Maciej Kotowicz из MalwareLab pl, который самостоятельно проанализировал Kobalos и с кем которым мы обменивались результатами изысканий. Он рассказал об этой угрозе на конференции Oh My H@ck 2020.
Приложение. Встроенные функции в Kobalos
Значение | Короткое описание | Параметры | Описание |
---|---|---|---|
1003 | INITIALIZE | socket, filter | Запускает Kobalos с помощью заданного процесса, если он удовлетворяет заданному фильтру (целое число из enum). |
1004 | START_LISTENING | Запускает прослушивания или подключения к C&C-серверу в зависимости от конфигурации. | |
1005 | START_C2_SERVER | socket_1, socket_2 | Запускает C&C-сервера. |
1006 | SEND_PACKET | socket_fd, &channel_1, &channel_2, data, data_len |
Отправляет инкапсулированные Kobalos данные в socket_fd. |
1007 | RECV_PACKET | socket_fd, &channel_1, &channel_2, data, data_len |
Принимает инкапсулированный Kobalos пакет от socket_fd. |
1008 | GET_RANDOM_INT | возвращает random_int | Получает случайное 32-битное целое число. PRNG получает начальные данные на основе текущего времени. |
1009 | GET_HOST_INFO | out_buf, returns buf_len | Получает буфер с названием хоста, IP-адресом и исполняемой версией ядра. |
1010 | SET_COMMON_SOCKOPT | socket | Присваивает SO_REUSEADDR и SO_KEEPALIVE значение true, а SO_LINGER — длительность до 15 секунд. |
1011 | RC4_DECRYPT_STRING_INPLACE | str, len | Расшифровывает строковое значение str с помощью RC4-ключа из конфигурации. |
1012 | CLEANUP_THINGS | what_to_close, send_report | Оба параметра целочисленные. Закрывает сокеты и освобождает память. Отправляет отчёт. |
1013 | RC4_INIT | context, key_size, key | Инициализирует алгоритм RC4 с предоставленным ключом. |
1014 | RC4_CRYPT | context, len, data_in, data_out | Выполняет RC4-шифрование или дешифрование. |
1015 | MD5 | input, input_len, output_digest | Вычисляет MD5-хеш. |
1016 to 1037 |
Функции, относящиеся к асимметричному шифрованию. | ||
1038 | RSA_PUBLIC_DECRYPT | ||
1039 | LOAD_PUB_KEY | key_bin_data, public_key | Загружает BLOB с открытым RSA-ключом из key_bin_data в public_key. |
Признаки компрометации
Названия, обнаруженные ESET
- Linux/Kobalos
- Linux/Agent.IV
- Linux/SSHDoor.EV
- Linux/SSHDoor.FB
- Linux/SSHDoor.FC
Образцы
Kobalos
SHA-1 | Целевая ОС | Встраивается в | Доступность |
---|---|---|---|
FBF0A76CED2939D1F7EC5F9EA58C5A294207F7FE |
RHEL | sshd | Ждёт подключения с исходного порта 55201. |
479F470E83F9A5B66363FBA5547FDFCF727949DA |
Debian | Stand-alone | Подключается к 151.80.57[.]191:7070 |
AFFA12CC94578D63A8B178AE19F6601D5C8BB224 |
FreeBSD | sshd | Ждёт подключения с исходного порта 55201. |
325F24E8F5D56DB43D6914D9234C08C888CDAE50 |
Ubuntu | sshd | Ждёт подключения с исходного порта 55201. |
A4050A8171B0FA3AE9031E0F8B7272FACF04A3AA |
Arch Linux | sshd | Ждёт подключения с исходного порта 55201. |
Троян для кражи учётных данных SSH
SHA-1 | Целевая ОС | Записывает в |
---|---|---|
6616DE799B5105EE2EB83BBE25C7F4433420DFF7 |
RHEL | /var/run/nscd/ns.pid |
E094DD02CC954B6104791925E0D1880782B046CF |
RHEL | /var/run/udev/ud.pid |
1DD0EDC5744D63A731DB8C3B42EFBD09D91FED78 |
FreeBSD | /var/run/udevd.pid |
C1F530D3C189B9A74DBE02CFEB29F38BE8CA41BA |
Arch Linux | /var/run/nscd/ns.pid |
659CBDF9288137937BB71146B6F722FFCDA1C5FE |
Ubuntu | /var/run/sshd/sshd.pid |
Ключи
Открытый RSA-ключ
-----BEGIN PUBLIC KEY----- MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAOUgD8sEF1kZ04QxCd60HrB+TxWnLQED
wzb0sZ8vMMD6xnUAJspdYzSVDnRnKYjTOM43qtLNcJOwVj6cuC1uHHMCAwEAAQ==
-----END PUBLIC KEY-----
Статичный RC4-ключ для строковых значений
AE0E05090F3AC2B50B1BC6E91D2FE3CE
Правила YARA
rule kobalos
{
meta:
Описание = “Kobalos malware” author = “Marc-Etienne M.Leveille” date = “2020-11-02”
reference = «http://www.welivesecurity.com» source = «https://github.com/eset/malware-ioc/» license = «BSD 2-Clause»
version = “1”
strings:
$encrypted_strings_sizes = {
05 00 00 00 09 00 00 00 04 00 00 00 06 00 00 00
08 00 00 00 08 00 00 00 02 00 00 00 02 00 00 00
01 00 00 00 01 00 00 00 05 00 00 00 07 00 00 00
05 00 00 00 05 00 00 00 05 00 00 00 0A 00 00 00
}
$password_md5_digest = { 3ADD48192654BD558A4A4CED9C255C4C }
$rsa_512_mod_header = { 10 11 02 00 09 02 00 }
$strings_RC4_key = { AE0E05090F3AC2B50B1BC6E91D2FE3CE }
condition:
any of them
}
rule kobalos_ssh_credential_stealer { meta:
Описание = “Kobalos SSH credential stealer seen in OpenSSH client” author = “Marc-Etienne M.Leveille”
date = “2020-11-02”
reference = «http://www.welivesecurity.com» source = «https://github.com/eset/malware-ioc/» license = «BSD 2-Clause»
version = “1”
strings:
$ = “user: %.128s host: %.128s port %05d user: %.128s password: %.128s”
condition:
any of them
}
Методики MITRE ATT&CK
Таблица составлена с помощью восьмой версии фреймворка ATT&CK.
Тактика | Идентификатор | Название | Описание |
---|---|---|---|
Устойчивость | T1554 | Compromise ClientSoftware Binary | Kobalos может встраивать свою вредоносную полезную нагрузку в OpenSSH-сервер и подменять легитимный файл sshd .Kobalos подменяет в скомпрометированных системах SSH-клиент ради кражи учётных данных. |
T1205 | Traffic Signaling | Kobalos может быть инициирован входящим TCP-подключением к легитимному сервису с конкретного исходящего порта. | |
Defense Evasion | T1070.003 | Clear Command History | На заражённых Kobalos машинах не было найдено никакой истории, связанной с атаками. |
T1070.006 | Timestomp | При подмене файлов операторами Kobalos подделываются временные метки. | |
T1027.002 | Software Packing | Код Kobalos сведён в единую функцию с помощью специального упаковщика и шифрования строковых значений. | |
Command And Control | T1573.001 | Encrypted Channel: Symmetric Cryptography | После аутентификации канал связи шифруется с помощью RC4. |
T1573.002 | Encrypted Channel: Asymmetric Cryptography | Аутентификация и обмен ключами выполняется с помощью RSA-512. | |
T1090.003 | Proxy: Multi-hop Proxy | Kobalos может играть роль прокси для других систем, заражённых Kobalos. |