[Перевод] В дикой природе появился Kobalos

4470eaf04df36d6a0819e2a108bbda27.png

Эксперты компании 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 Гб оперативной памяти и почти петабайтное дисковое хранилище. Мы также нашли и другие известные организации-жертвы, например, поставщика средств безопасности для конечных точек (это не мы!).

7429f91562e19f04464500b1bb6394a1.png

Иллюстрация 1. Отрасли и регионы, к которым относятся скомпрометированные организации.

В некоторых организациях было заражено сразу несколько серверов. Мы оповестили всех найденных нами жертв и совместно работали над удалением вредоносного ПО. Благодарим всех, кто откликнулся и поделился информацией, которая помогала нам в этом исследовании.

Начальный вектор компрометации


Нам известно не из первых рук, как были скомпрометированы системы, чтобы злоумышленники получили административный доступ для установки Kobalos. Мы можем лишь предполагать на основе собранных улик.

На скомпрометированных машинах, чьи сисадмины приняли участие в расследовании, мы обнаружили, что программа для кражи учётных данных SSH была представлена в виде троянизированного OpenSSH-клиента. Файл /usr/bin/ssh был заменён модифицированным исполняемым файлом, который записывал имя пользователя, пароль, название целевого хоста и сохранял их в зашифрованный файл. Поэтому мы считаем, что кража учётных данных была одним из способов распространения Kobalos. Также это может объяснить, почему были скомпрометированы многие академические сети: если какой-нибудь SSH-клиент использовался студентами или исследователями из нескольких университетов, то могли быть украдены учётные данные для всех этих сторонних систем.

Другой возможной точкой входа может быть использование известной уязвимости: на некоторых скомпрометированных машинах исполнялись старые, не поддерживаемые или не пропатченные ОС и приложения, поэтому вариант с использованием известного эксплойта наиболее вероятен. Но также не стоит исключать и вероятность применения неизвестной на данный момент уязвимости.

Атака на сети для высокопроизводительных вычислений


ESET поделилась информацией с организациями, играющими важную роль в разрешении инцидентов в исследовательских и академических системах, например, с CERN Computer Security Team. Они подтвердили, что с конца 2019 до середины 2020 года HPC-сообщество подверглось волне трех различных атак, о некоторых из которых было публично объявлено.

Спустя много месяцев расследования все еще неясно, были ли эти три волны связаны друг с другом, или это просто неожиданное совпадение. Операторы вредоносного ПО применяли разные тактики, методики и уровни сложности. С другой стороны, странно, что в разных атаках совпадали некоторые IP-адреса.

  1. В первой волне использовался Kobalos, который описан в этом исследовании.
  2. Вторая волна была сосредоточена на майнинге криптовалют с помощью совсем другого набора инструментов.
  3. Третья волна была самой масштабной, однако её полезную нагрузку пока не удалось определить.

Косвенные признаки компрометации в результате второй и третьей волн были описаны Командой реагирования на инциденты компьютерной безопасности в европейской сетевой инфраструктуре (European Grid Infrastructure Computer Security Incident Response Team) в виде инцидентов #EGI20200421 и #EGI2020512.

Неясно, почему среди жертв этих атак преобладают представители HPC-сообщества. Конечно, HPC-центры представляют интерес, но обычно в них сложнее проникнуть, в отличие от прочих серверов научно-исследовательских сетей. С помощью распределённого процесса реагирования на инциденты, основанного на опыте сообщества, CERN и другие вовлечённые команды отметили ряд устаревших архитектур и неоптимальных методик обеспечения безопасности, которые сыграли ключевую роль в распространении атак. Кроме того, большинство жертв из HPC-сообщества оказались плохо подготовлены к проведению расследований, особенно с точки зрения мониторинга активности в системах.

Обзор Kobalos


Kobalos обладает многочисленными возможностями для доступа к скомпрометированным системам и сокрытия следов их использования.

Доступ к скомпрометированным системам


Во-первых, в Kobalos есть общие команды для чтения и записи в файловую систему, а также для запуска терминала и выполнения произвольных команд. К сожалению, в программе нет конкретной полезной нагрузки, которая подсказала бы намерения авторов. Скорее всего, операторы запускают через терминал командную оболочку и выполняют команды, которые им нужны.

Доступность


Во-вторых, в Kobalos есть ряд возможностей, позволяющих устанавливать сетевое соединение между операторами и исполняемым вредоносом. ПО обеспечивает свою доступность извне несколькими способами:
  1. Открывает TCP-порт и ждет входящее соединение (такой режим иногда называют пассивным бэкдором).
  2. Подключается к другому экземпляру Kobalos, который сконфигурирован как C&C-сервер.
  3. Ждёт подключения к уже работающему легитимному сервису, исходящие с конкретного TCP-порта.

Последний способ требует подмены работающего сервиса другим, который содержит код Kobalos. Во всех случаях, когда мы отмечали использование этого способа, злоумышленникам приходилось изменять исполняющийся OpenSSH-сервер. Файл sshd полностью заменялся, так что программа продолжала работать и при перезапусках сервиса или системы.

Аутентификация и сетевое шифрование


В-третьих, для запуска бэкдора нужно аутентифицировать его клиенты, которые должны обладать закрытым RSA-512 ключом и паролем. После их проверки Kobalos генерирует и шифрует два 16-байтных ключа с открытым ключом по алгоритму RSA-512 и отправляет их злоумышленникам. Эти два ключа используются для RC4-шифрования последующего входящего и исходящего трафика.

Смена порта


В-четвёртых, во время аутентификации оператор может продолжить взаимодействие по другому TCP-соединению. По запросу Kobalos может начать прослушивать нужный порт и перевести на него всё последующее взаимодействие. Проходящие по этому каналу данные шифруются с помощью RC4-ключей, которые были созданы при аутентификации.

Проксирование на другие скомпрометированные машины


В-пятых, Kobalos можно использовать как прокси для соединения с другими скомпрометированными им серверами. Это не обычный TCP-прокси: он требует инкапсуляции данных в специальные пакеты, а также поддерживает упомянутую выше смену порта: для этого отправляется команда, которая «переключает» соединение.

Прокси можно соединять в цепочки, то есть операторы могут использовать несколько скомпрометированных с помощью Kobalos машин для соединения с целевыми серверами.

Совокупность возможностей


9ae2fab437d189aadb98551efd76c1ec.png

Иллюстрация 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 рекурсивно вызывает свою функцию для выполнения необходимых подзадач.
8da19517baf85aff7e920e7aafe019ab.png

Иллюстрация 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.

Расшифрованные строковые значения:

  1. %s %s
  2. /dev/ptmx
  3. ptem
  4. ldterm
  5. ttcompat
  6. /dev/tty
  7. %s
  8. %d
  9. /
  10. \
  11. %d.%d
  12. win3.11
  13. win95
  14. winNT
  15. win?
  16. \\.\pipe\2
  17. %s %s.%s
  18. /dev/ptc

В проанализированных нами образцах Kobalos используются только выделенные жирным значения (1 и 6—9). Другие не упоминаются, хотя они могут использоваться в каких-нибудь других версиях. В частности:
  • Строки 10 и 12—16 выглядят характерными для Windows.
  • Строка 18 — это путь к драйверу псевдотерминального устройства в AIX.
  • Строки 3–5 используются системными вызовами псевдотерминала в Solaris.

Мы не можем исключить вариант с попыткой дезинформирования исследователей о существовании версий под другие ОС. Учитывая, что мы подтвердили поддержку трёх ОС, неудивительно, если их окажется больше. С другой стороны, версиям Windows 3.11 и Windows 95 уже более 25 лет. Есть ли версии Kobalos под эти устаревшие системы?

Противодействие расследованию


После прохождения аутентификации к процессу бэкдора применяются некоторые методики, препятствующие расследованию:
  • Значение RLIMIT_CORE обнуляется для предотвращения создания дампа ядра в случае падения процесса.
  • Большинство сигналов игнорируется, чтобы труднее было прервать процесс.

fd43114da3bf1e9e5fb684686d4bea74.png

Иллюстрация 5. Kobalos избегает создания дампов ядра при падении и игнорирует большинство сигналов.

Важно отметить, что настройка RLIMIT_CORE не помешает сделать дамп процесса вручную, например, с помощью gcore из gdb. Это ограничение используется ядром для определения максимального размера дампа памяти при падении процесса.

Временные метки


Анализ файловой системы скомпрометированных серверов показал, что после установки временные метки заменённых файлов (таких, как ssh для добавления модуля кражи учётных данных или sshd для развёртывания Kobalos) подделываются для отведения подозрений.

Конфигурация


У Kobalos статичная конфигурация, которая включает или отключает функции ПО. В таблице 1 перечислены поля, которые мы считаем частью конфигурации. А на иллюстрации 6 приведён реальный пример.

Таблица 1. Структура статичной конфигурации Kobalos:


195931c5e4400bb3b0b584a9710b65ee.jpg

Иллюстрация 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 является гибкость в установлении соединения между операторами и скомпрометированными хостами. Это можно сделать тремя способами:
  1. Прослушивая указанный TCP-порт (пассивный режим).
  2. Подключившись к C&C-серверу (активный режим) и ожидая подключения оператора через этот сервер.
  3. Подменив имеющийся сервис, который прослушивает TCP-порты, и ожидая соединения с конкретного исходного TCP-порта.

С помощью статичной конфигурации Kobalos можно активировать сразу несколько способов, однако в каждом проанализированном нами образце был активирован только один.

Последний метод требует модифицирования исполняемого демона. Троянизированная версия вызывает код Kobalos при каждом приёме нового TCP-подключения, как показано на иллюстрации 7. Бэкдор может принять его, если подключение исходит с конкретного TCP-порта. Если номер порта совпадает, то функция ничего не возвращает, а подпроцесс завершается при закрытии подключения. Если же порт не соответствует прописанному, то программа ничего не делает и передаёт работу коду легитимного сервиса, который продолжает исправно работать.

887d6b06c97d205c5d24400b9105714e.jpg

Иллюстрация 7. Вызов функции kobalos из троянизированной OpenSSH-функции main после принятия нового TCP-подключения.

Этот способ встречался нам чаще всего, и им злоупотреблял только OpenSSH-сервер. Однако данные могут быть ошибочны, потому что именно этот способ мы могли обнаруживать при сканировании интернета.

Как показано на иллюстрации 8, Kobalos ожидает подключения от TCP-порта 55201.

5ccb7ad6a080a762e5271deb0a2b9bf1.png

Иллюстрация 8. Сравнение исходного порта с 55201.

В Kobalos реализован дополнительный метод фильтрации входящих TCP-подключений, сравнивающий исходный порт со списком из 16 портов:

e3a20eed110c5d244bd95c4c8d32a281.png

Иллюстрация 9. Сравнение исходного порта со списком из 16 портов.

Список 16 портов:


Однако ни в одном из найденных образцов этот фильтр не использовался. Возможно, его применяли в предыдущей версии бэкдора.

Аутентификация


После установления связи выполняется аутентификация. Для дальнейшей работы нужен закрытый RSA-ключ и 32-байтный пароль. Клиент Kobalos отправляет на заражённый сервер начальный 320-байтный пакет, структура которого описана в таблице 2.

Таблица 2. Структура пакета аутентификации (зашифрованного с помощью закрытого RSA-ключа):


Первые 64 байта пакета расшифровываются с помощью модуля открытого ключа RSA-512, указанного в конфигурации, и экспоненты 0x10001 (см. иллюстрацию 11). Затем, как показано на иллюстрации 10, к 32-байтному паролю применяется MD5-хеширование, а результат сравнивается с информацией из статичной конфигурации.
773678cb1ddfbec8beebb2bb322c3997.jpg

Иллюстрация 10. После получения 320 байтов выполняется аутентификация.
7f5da6f3bfbedd4ddff4681c04cc645b.jpg

Иллюстрация 11. Загрузка открытого ключа RSA-512.

С помощью открытого RSA-ключа Kobalos зашифровывает и задаёт RC4-ключи, которые используются при дальнейшем взаимодействии: один для входящего трафика, другой для исходящего. Зашифрованные ключи Kobalos отправляет в своём ответе.

Таблица 3. Структура ответа Kobalos (зашифрованного с помощью открытого RSA-ключа):


Активный канал


После прохождения аутентификации активный канал может использовать иной порт. Вы могли заметить, что при клиентской аутентификации нужно предоставить в зашифрованном сообщении «порт для привязки».
  • Если его значение отличается от 0xFFFF, то Kobalos начнёт прослушивать заданный TCP-порт.
  • Если значение нулевое, то бэкдор начнёт слушать случайный порт выше 1024.

Как упоминалось выше, в аутентификационном ответе вместе с парой RC4-ключей передаётся номер свежеоткрытого порта. По желанию может быть создано дополнительное TCP-соединение: если в качестве порта привязки передаётся значение 0xFFFF, то используется текущее соединение.

Последующий обмен данными через эти TCP-соединения инкапсулируется в пакеты, формат которых описан в таблице 4.

Таблица 4. Структура пакетов Kobalos:


Kobalos первым отправляет пакет подключённому оператору. В пакете содержится основная информация о машине, например, название хоста и версия ядра. На иллюстрации 12 показаны уровни инкапсуляции в пакете.
8e598534630bc9acd8f11bcfe1903842.png

Иллюстрация 12. Информация, отправляемая оператору со скомпрометированного хоста.

На иллюстрации 13 показаны процессы установления связи между Kobalos и его клиентом.

67d49c0527665dd1b433672c64af8119.png

Иллюстрация 13. Диаграмма последовательности действий сетевых протоколов Kobalos.

Управление бэкдором


После аутентификации оператор может давать бэкдору разные команды. Мы разделили их на категории:
  1. Подключение к другим серверам, заражённым Kobalos, и работа в качестве прокси.
  2. Чтение и запись любых файлов в файловую систему.
  3. Запуск и обращение к псевдотерминалу на скомпрометированном хосте.
  4. Запуск и управление C&C-серверами Kobalos с обращением к подключённым ботам.

Команды инкапсулируются в активном канале. Они начинаются с идентифицирующего байта, за которым идут параметры, которые парсятся этой командой. Описанные в этой работе команды обрабатываются Kobalos, то есть оператор шлёт их скомпрометированной системе с помощью специального клиента. Kobalos отвечает в таком же формате, с первым байтом-идентификатором, и ответы обрабатываются тем же клиентом. Например, после аутентификации может быть дана команда «отправь информацию о хосте» (0x04).

Использование в качестве прокси


Операторы могут использовать установленный на скомпрометированной машине Kobalos для подключения к другим экземплярам бэкдора в других системах. В режиме прокси используется описанный выше особый размер пакетов для аутентификации и инкапсуляции, то есть это не обычный TCP-прокси.

При подключении к сторонней машине оператор может выбрать исходный TCP-порт. Это позволяет подключаться к экземплярам Kobalos, которые ждут соединения с конкретного порта. Также поддерживается переподключение активного канала через альтернативный порт. Для этого даётся специальная команда.

Одной из задач в данном случае является обеспечение определённого уровня анонимности операторов. Конечный узел видит только IP-адрес другой скомпрометированной машины, а не IP-адрес оператора. Чтобы ещё сильнее скрыть адрес оператора, можно создавать цепочки скомпрометированных прокси-машин. На иллюстрации 14 показан такой сценарий.

ba4bb162476a830148351146da7c5172.png

Иллюстрация 14. Kobalos используется в качестве прокси.

Команды управления прокси описаны в таблице 5.

Таблица 5. Команды для использования Kobalos в качестве прокси:


Доступ к файловой системе


После аутентификации оператор может читать или записывать в систему любые файлы. В сетевом протоколе Kobalos инкапсулированная полезная нагрузка определяется с помощью 16-битного целого числа. Это означает, что оператор может отправлять только 64-килобайтные пакеты. Например, если он хочет записать в файл 200 Кб, то придётся выполнить четыре успешные команды записи. У команды чтения ограничение ещё жёстче: единовременно прочитать и отправить можно только 1000 байтов.

В таблице 6 описаны команды для работы с файловой системой.

Таблица 6. Команды для чтения и записи файлов:


Создание псевдотерминала


Эта функциональность позволяет аутентифицированному оператору создавать в новом псевдотерминале оболочку и исполнять произвольные команды. Для этого используются команды из таблицы 7.

Таблица 7. Команды для создания и управления псевдотерминалами:


Данные из терминала отправляются операторам, а после данных идёт замыкающий идентификатор команды 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.
e4537fddfb254275cc1dba4482392ad3.png

Иллюстрация 15. Оператор Kobalos обращается к ботам, сообщившим о себе C&C-серверу.

В таблице 8 описаны команды для управления возможностями C&C-сервера.

Таблица 8. Команды управления функциями C&C-сервера:


Команды 0x230x2D обрабатываются подпроцессом C&C-сервера. Как показано на иллюстрации 16, после отправки в активный канал данные перенаправляются через TCP в петлевой интерфейс (loopback interface) порта управления (на единицу больше номера порта, используемого ботами) C&C-сервера.
5b98b1a06c3313217ee730627adb94c3.png

Иллюстрация 16. Относящиеся к управлению C&C-сервером пакеты перенаправляются через TCP в подпроцесс.

Другие команды


Переменные окружения


Для процесса бэкдора есть команда назначения переменных окружения. Она берёт строку в качестве параметра и просто передаёт в putenv, который ожидает данные в формате «VAR=value».

Таблица 9. Другие команды, которые понимает Kobalos:


Пустые операции


Реализованы ещё две команды, но они ничего не делают. У нас есть этому два объяснения:
  • Авторы удалили функциональность команд, поскольку те использовались в предыдущих версиях и больше не нужны.
  • Команды предназначены для конкретных платформ и не применяются в проанализированных нами версиях Kobalos под Linux и FreeBSD.

ac740dd4db210b92e47722b42a3860b7.jpg

Иллюстрация 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.

3287e162c4303a54623a104d6ada8157.png

Иллюстрация 18. Шифрование и запись в файл украденных учётных данных SSH.

В версии под FreeBSD применяется тот же формат и шифр. Однако реализованы они чуть иначе, например, в программе путь к файлу шифруется с помощью однобайтного XOR.

Развивающее семейство программ


После того, как мы уведомили одну из организаций-жертв, они обнаружили, судя по всему, более свежую версию крадущего учётные данные трояна. Она содержит зашифрованную конфигурацию и позволяет передавать через UDP украденную информацию на удалённый хост, указанный в конфигурации. Такой возможностью обладают также Ebury и прочие программы, крадущие учётные данные SSH, такие как Bonadan, Kessel и Chandrila. Возможно, UDP выбран, чтобы обходить файрволы и не осуществлять TCP-подключение к потенциально недоверенным хостам. Троян использует только один способ передачи — через файл или сеть, потому что название целевого хоста и путь к файлу сохраняются в одной и той же переменной.

На иллюстрации 19 показан декомпилированный код, отвечающий за отправку данных через UDP. А на иллюстрации 20 приведена конфигурация из найденного образца. Он был настроен на запись украденной информации в /var/run/sshd/sshd.pid.