Статья   RotaJakiro: Долгоживущий секретный бэкдор с 0 обнаружениями на VirusTotal [ Перевод ]

МЕНЮ


Главная страница
Поиск
Регистрация на сайте
Помощь проекту
Архив новостей

ТЕМЫ


Новости ИИРазработка ИИВнедрение ИИРабота разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика

Авторизация



RSS


RSS новости


Недавно специалисты Qihoo 360 Netlab обнаружили очень интересный бэкдор, который получил название RotaJakiro. Данный бэкдор имел 0 обнаружений на VirusTotal длительное количество времени. Специалисты Qihoo 360 Netlab написали статью об этом бэкдоре в свой блог. Статья довольно интересная, и мне захотелось перевести её.

Приятного чтения.

Оригинальная статья
Образцы этого бэкдора для скачивания и изучения ( пароль: infected )

1619946532407.png
Обзор

25 марта 2021 года система BotMon лаборатории 360 NETLAB обнаружила подозрительный ELF файл (MD5=64f6cfe44ba08b0babdd3904233c4857) с 0 обнаружениями на VirusTotal. Образец взаимодействует с 4 доменами на 443 TCP порту (HTTPS), но трафик не имеет защиты TLS/SSL. Внимательное изучение образца показало, что этот бэкдор, нацелен на системы Linux x64. Это семейство вирусов, которое существует уже как минимум 3 года.

Мы назвали его RotaJakiro, основываясь на том, что семейство использует шифрование с подстановкой ( ROT ) и ведет себя по-разному для учетных записей root и non-root при исполнении.

RotaJakiro уделяет достаточно много внимания сокрытию своих следов, используя несколько алгоритмов шифрования: алгоритм AES для шифрования информации о ресурсах внутри образца, использование комбинации AES, XOR, ROT шифрования и ZLIB сжатия для коммуникации с сервером C2 ( сервер для командования и управления вредоносной программой ).

RotaJakiro поддерживает в общей сложности 12 функций, три из которых связаны с выполнением определенных плагинов. К сожалению, мы не имеем доступа к плагинам, и поэтому не знаем их истинного назначения. Функции бэкдора можно сгруппировать в следующие четыре категории.

  • Отправка информации об устройстве
  • Кража конфиденциальной информации
  • Управление файлами/плагинами (запрос, загрузка, удаление)
    Выполнение определенного плагина


Что-нибудь ещё?

Мы обнаружили следующие 4 вида бэкдора, с имеющимися у нас образцами. Все из которых имеют 0 обнаружений на VirusTotal, а самое раннее время первого обнаружения на VirusTotal приходится на 2018 год.


Имя файлаMD5ОбнаруженийВпервые замечен на VirusTotal
systemd-daemon1d45cd2c1283f927940c099b8fab593b0/612018-05-16 04:22:59
systemd-daemon11ad1e9b74b144d564825d65d7fb37d60/582018-12-25 08:02:05
systemd-daemon5c0f375e92f551e8f2321b141c15c48f0/562020-05-08 05:50:06
gvfsd-helper64f6cfe44ba08b0babdd3904233c48570/612021-01-18 13:13:19
Все эти образцы имеют 4 встроенных C2-сервера. У этих четырёх серверов очень близкое время создания, обновления и конца работы.

ДоменОбнаруженийДата созданияДата обновленияДата конца работы
news.thaprior.net0/832015-12-09 06:24:132020-12-03 07:24:332021-12-09 06:24:13
blog.eduelects.com0/832015-12-10 13:12:522020-12-03 07:24:332021-12-10 13:12:52
cdn.mirror-codes.net0/832015-12-09 06:24:192020-12-03 07:24:322021-12-09 06:24:19
status.sublineover.net0/832015-12-09 06:24:242020-12-03 07:24:322021-12-09 06:24:24
Читатели заметят, что даты создания были получены в декабре 2015 года (6 лет назад).

Реверс-инжиниринг

4 образца RotaJakiro с 2018 по 2021 год, очень близки по своим функциям, и для анализа в этом блоге выбран образец 2021 года, который имеет следующую основную информацию:

Код:

MD5:64f6cfe44ba08b0babdd3904233c4857 ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, stripped Packer:No
На уровне кодирования RotaJakiro использует такие технологии, как динамический AES, двухуровневые зашифрованные протоколы связи для противодействия анализу бинарного и сетевого трафика.

На функциональном уровне RotaJakiro сначала определяет, является ли пользователь root или non-root во время выполнения, с различным набором действия для разных учетных записей. Затем расшифровывает соответствующие важные ресурсы с помощью AES и ROT шифров для последующего закрепления в системе, защиты своих процессов и исполнения их одном экземпляре. И, наконец, устанавливает связь с C2-сервером, ожидая выполнения команд от C2.

Далее будет проанализирована конкретная реализация RotaJakiro с вышеуказанными особенностями.

0x00: "Трюки", используемые бэкдором

Динамическая генерация таблиц констант, необходимых для алгоритма шифрования AES для предотвращения прямой идентификации алгоритма шифрования.

1619876583174.png
Использование техники обфускации строк на стеке для хранения зашифрованной конфиденциальной информации о ресурсах.

1619876783128.png
Сетевое взаимодействие с использованием двухуровневого шифрования.

0x01: Алгоритм шифрования

Все конфиденциальные ресурсы в RotaJakiro зашифрованы. В IDA мы видим, что метод расшифровки dec_proc вызывается 60 раз. Этот метод состоит из AES и ROT.

1619876940319.png
Код расшифровки AES выглядит следующим образом:

1619876974083.png
aes_dec - AES-256. Режим CBC. Ключ и вектор инициализации ( key & iv ) записаны в бэкдоре.

KEY

Код:

14 BA EE 23 8F 72 1A A6 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
IV

Код:

 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Ниже показан код расшифровки ROT:

1619877308175.png
ROT - это циклический сдвиг символов, мы видим, что количество сдвигов определяется значением plain_len & 7 ( длина открытого текста ).

Возьмем в качестве примера следующий текст шифра с сервера C2.

Код:

ff ba a2 3b cd 5b 7b 24 8c 5f e3 4b fc 56 5b 99 ac 91 cf e3 9a 27 d4 c9 6b 39 34 ce 69 ce 18 60
Различные параметры, связанные с расшифровкой, показаны ниже, длина шифротекста составляет 32 байта, а длина открытого текста - 26 байт.

1619877425750.png
Сначала, расшифровывая текст с помощью AES, мы получаем следующий "промежуточный зашифрованный текст".

Затем, из "промежуточного зашифрованного текста" извлекается правильный шифротекст, где правильный шифротекст начинается с 8-го байта, а длина равна длина открытого текста - 8 , то есть 26-8=18 байт.

Код:

98 1B DB D9 8B 59 19 5D 59 1B 59 D8 1D DC 8B D8 DB 5B
Наконец, мы можем вычислить сдвиг. Длина открытого текста равна 26. 26 & 7 = 2. Получили количество сдвигов. Сдвинем вышеуказанный правильный шифротекст на 2 бита, чтобы получить открытый текст с сервера C2.

0x02: Постоянное присутствие в системе

RotaJakiro использует различные методы закрепления в системе для пользователей root/non-root.

Учетная запись root

В зависимости от дистрибутива Linux, создаётся самозапускающийся скрипт по пути: /etc/init/systemd-agent.conf или /lib/systemd/system/sys-temd-agent.service

Bash:

Content of systemd-agent.conf ----------------------------- #system-daemon - configure for system daemon #This service causes system have an associated #kernel object to be started on boot. description "system daemon" start on filesystem or runlevel [2345] exec /bin/systemd/systemd-daemon respawn

Bash:

Content of systemd-agent.service ----------------------------- [Unit] Description=System Daemon Wants=network-online.target After=network-online.target [Service] ExecStart=/usr/lib/systemd/systemd-daemon Restart=always [Install]
Имя файла, используемое для маскировки, является одним из следующих двух:

Bash:

/bin/systemd/systemd-daemon /usr/lib/systemd/systemd-daemon
Учётная запись non-root

Создаётся сценарий автозапуска по пути $HOME/.config/au-tostart/gnomehelper.desktop для среды рабочего стола.

Bash:

[Desktop Entry] Type=Application Exec=$HOME/.gvfsd/.profile/gvfsd-helper
Изменяется файл .bashrc, чтобы создать сценарий автозапуска для среды shell-оболочки.

Bash:

# Добавляется помощник GNOME, предназначенный для работы с абстракцией ввода-вывода GIO # Если эта переменная окружения установлена, gvfsd не будет запускать файловую систему fuse if [ -d ${HOME} ]; then         ${HOME}/.gvfsd/.profile/gvfsd-helper fi

GIO (Gnome Input/Output) - Библиотека, предназначенная для предоставления программистам современного и удобного интерфейса к виртуальной файловой системе.

Список имён файлов, используемых для маскировки, оба из которых существуют одновременно.

Bash:

$HOME/.dbus/sessions/session-dbus $HOME/.gvfsd/.profile/gvfsd-helper
0x03:Защита процессов

RotaJakiro использует защиту своих процесса. И, как и в случае с постоянным присутствием в системе, существуют различные реализации для пользователей root/non-root.

Учетная запись root

При работе под пользователем root, в зависимости от дистрибутива Linux, новый процесс автоматически создается, когда процесс сервиса завершается. Это происходит путём записи Restart=always или respawn в конфигурационный файл сервиса.

1619879545169.png
Фактический результат показан на рисунке ниже, где видно, что новый процесс создается сразу после завершения процесса systemd-daemon.

1619879573875.png
Учётная запись non-root

При запуске под non-root пользователем, RotaJakiro создает два процесса: session-dbus и gvfsd-helper, которые следят за состоянием друг друга. Один процесс восстанавливают другой, когда тот завершается. Это очень характерно для двух-процессной защиты.

Как реализована двух-процессная защита в RotaJakiro?

Во-первых, он создает часть общей памяти между процессами с помощью shmget API. session-dbus и gvfsd-helper общаются друг с другом через эту общую память, сообщая друг другу свои PID (ID процесса).
Затем, эти процессы динамически перебирают живые процессы в каталоге /proc/[PID]. Когда один процесс признан мертвым, другой процесс создается с помощью execvp API, чтобы помочь мертвому процессу "воскреснуть", как показано на следующей диаграмме.

1619889723142.png
Этот способ показан на скриншоте ниже. Вы можете видеть, что после завершения session-dbus и gvfsd-helper с помощью kill -9, сразу же создаются новые процессы.

1619889819278.png
0x04: Единственный экземпляр процесса ( Single instance )

RotaJakiro реализует единственный экземпляр с помощью блокировки файлов, как показано ниже.

1619890072813.png
Используемые при этом файлы блокировки различаются под пользователями root/non-root.

Под пользователем root будет создан один файл блокировки.

Bash:

/usr/lib32/.X11/X0-lock /bin/lib32/.X11/X0-lock
Под non-root, будут созданы оба файла блокировки.

Bash:

$HOME/.X11/X0-lock $HOME/.X11/.X11-lock
Например, под пользователем non-root процессы и файлы блокировки могут быть сопоставлены по /proc/locks, а затем выполняется соответствующая реализация RotaJakiro.

1619890386577.png
0x05: Сетевое взаимодействие

RotaJakiro устанавливает связь с сервером C2 с помощью следующего фрагмента кода, ожидая выполнения последующих команд.

1619937066373.png
Этот процесс можно разделить на 2 этапа Этап 1 ( Этап инициализации )

Расшифровывается список серверов C2, устанавливается соединение с сервером C2, отправляется информация, бэкдор получает и расшифровывает информацию, возвращенную с сервера C2.

Этап 2, ожидание вызовов с сервера C2

Проверяется информация, возвращенная с сервера C2. Если она проходит проверку, выполняются последующие инструкции, отправленные сервером C2.

Этап 1: Инициализация

Список C2 расшифровывается алгоритмом дешифровки, описанным в предыдущем разделе, и следующие четыре расшифрованные сервера C2 теперь находятся в бэкдоре.

Код:

news.thaprior.net blog.eduelects.com cdn.mirror-codes.net status.sublineover.net
RotaJakiro сначала попытается установить соединение с этими серверами, а затем создаст сообщение для начала работы в следующем фрагменте кода.

1619937559111.png
Затем он шифрует информацию об этом сообщении и отправляет ее на сервер C2.

1619937639689.png
В конце, бэкдор получает пакет обратно от сервера C2, расшифровывает его и проверяет его подлинность. Если он проходит проверку, то бэкдор переходит на этап 2.

Этап 2: Конкретные операции

Бэкдор получает и выполняет команды от сервера C2 с помощью следующего фрагмента кода.

1619937777262.png
В данный момент время RotaJakiro поддерживает 12 инструкций, а соответствие между кодом инструкции и функцией показано в следующей таблице.


ID командыФункция
0x138E3E6Exit ( Бэкдор завершает работу)
0x208307ATest ( Проверка )
0x5CCA727Heartbeat ( Проверка работоспособности )
0x17B1CC4Set C2 timeout time ( Установить время тайм-аута сервера C2 )
0x25360EASteal Senstive Info ( "Украсть" конфиденциальную информацию )
0x18320e0Upload Device Info ( Загрузить информацию об устройстве на сервер )
0x2E25992Deliver File/Plugin ( Загрузить файл/плагин на заражённое устройство )
0x2CD9070Query File/Plugin Status ( Запросить статуса файла/плагина )
0x12B3629Delete File/Plugin Or Dir ( Удалить файл/плагин или директорию )
0x1B25503Run Plugin_0x39C93E ( Запустить плагин_0x39C93E )
0x1532E65Run Plugin_0x75A7A2 ( Запустить плагин_0x75A7A2 )
0x25D5082Run Plugin_0x536D01 ( Запустить плагин_0x536D01 )
Функция Run Plugin повторно использует тот же код и реализует вызов функции с помощью следующей логики.

1619938272893.png
В настоящее время мы не перехватываем такие полезные нагрузки, поэтому мы используем форму Plugin_"parameter" для представления различных задач бэкдора.

0x06 Анализ пакетов

Пакет сетевого взаимодействия RotaJakiro состоит из трех частей: заголовок, ключ и полезная нагрузка.

1619938459793.png
Заголовок является обязательным и имеет длину 82 байта, а ключ и полезная нагрузка являются необязательными.
Заголовок и ключ шифруются с помощью XOR и ROT шифра. Полезная нагрузка шифруется с помощью AES и сжимается с помощью ZLIB.

Далее мы покажем из чего состоит этот сетевой трафик ( заголовок, ключ и полезная нагрузка ), а также процесс расшифровки на примере взаимодействия между ботом и сервером C2.

C2-сервер -> боту

1619938637794.png
Первые 0x52 байта - это содержимое заголовка.
Как расшифровать заголовок? Очень просто, сдвинуть на 3 бита влево, а затем использовать XOR с ключом 0x1b. После расшифровки мы можем получить следующее содержимое.

Код:

00000000  16 11 10 b9 03 b1 0c fb 04 20 00 00 00 08 00 e0  |...?.±.?. .....?| 00000010  20 83 01 c2 20 64 20 01 e2 00 00 00 00 c2 0c 00  | ..? d .?....?..| 00000020  00 00 32 42 36 39 33 33 34 46 38 34 31 44 30 44  |..2B69334F841D0D| 00000030  39 46 41 30 36 35 38 45 43 33 45 32 39 46 41 44  |9FA0658EC3E29FAD| 00000040  34 39 c8 53 e6 9c 48 c4 8b 77 24 2e 02 1c 96 d9  |49?S?.H?.w$....?| 00000050  81 28 ------------filed parse------------------ offset 0x09, 4 bytes--->payload length offset 0x0d, 2 bytes--->body length offset ox0f, 4 bytes--->cmdid
В результате разбора полей мы можем узнать, что длина ключа составляет 0x8 байт, длина полезной нагрузки - 0x20 байт, а код инструкций для исполнения - 0x18320e0. Это информация об устройстве.
Чтение 8 байт со смещения 0x52 дает ключ: ea 9a 1a 18 18 44 26 a0. Теперь мы используем тот же метод расшифровки, что и в заголовке. Мы получаем байты 4c cf cb dbdb 39 2a 1e, которые используются как ключ AES для расшифровки полезной нагрузки.

Чтение 32 байт со смещением 0x5a дает нам следующую полезную нагрузку.

Код:

54 c1 c3 69 00 18 31 e4 a2 5b 10 7f 67 ab d1 4b b2 7b 3d 3f b3 bc 66 6a 26 f6 f6 b3 f7 2e 66 6d
Используем расшифрованный ключ для AES-256. Расшифруем приведенные выше данные в режиме CBC и получим следующее содержимое.

Код:

3b c7 f8 9b 73 2b d1 04 78 9c e3 60 60 60 d8 df d9 c1 71 56 f7 6f 00 00 13 80 04 28
Восьмой байт и далее - это сжатые данные ZLIB, распакованные для получения следующего содержимого.

Код:

08 00 00 00 bf 89 88 08 cd 2d fd 50 ------------filed parse------------------ offset 0, 4 bytes--->length
Для чего используется распакованная полезная нагрузка (bf 89 88 08 cd 2d fd 50)? Она используется в качестве нового ключа AES для расшифровки некоторой конфиденциальной информации о ресурсах.

Например, когда бот собирает информацию об устройстве. Один вид из этой информации - текущий дистрибутив операционной системы, который узнаётся командой cat /etc/*release | uniq.

Bash:

[email protected]:~# cat /etc/*release | uniq PRETTY_NAME="Debian GNU/Linux 9 (stretch)" NAME="Debian GNU/Linux" VERSION_ID="9" VERSION="9 (stretch)" ID=debian HOME_URL="https://www.debian.org/" SUPPORT_URL="https://www.debian.org/support" BUG_REPORT_URL="https://bugs.debian.org/"
Команда cat /etc/*release | uniq получена из следующего зашифрованного текста.

Bash:

"cat /etc/*release | uniq" cmd_ciphertxt --------------------------- 74 00 dd 79 e6 1e aa bb 99 81 7e ca d9 21 6b 81 6b d9 9d 14 45 73 6a 1c 61 cc 28 a3 0f 2b 41 5a 6b 33 8c 37 25 89 47 05 44 7e f0 6b 17 70 d8 ca
Команда расшифровывается с помощью нового ключа AES и параметров, указанных в следующем фрагменте кода.

1619939481564.png
Бот -> серверу С2

Когда бот получает команду "сообщить информацию об устройстве" от сервера C2, он отправляет следующие данные на C2, и мы можем видеть, что часть ключа по-прежнему ea 9a 1a 18 18 44 26 a0.

1619939597191.png
Расшифрованное значение ключа равно 4c cf cb db db 39 2a 1e. После расшифровки и распаковки полезной нагрузки, отправленной ботом на сервер C2, мы получаем данные, которые являются различной информацией устройства, включая информацию, полученную с помощью cat /etc/*release | uniq, упомянутой ранее, что подтверждает правильность нашего анализа.

1619939878295.png
Взаимосвязь с ботнетом Torii

Ботнет Torii был обнаружен компанией Avast 20 сентября 2018 года, и мы заметили, что между ними есть некоторые сходства, например:

1: Сходство строк

После расшифровки RotaJakiro и Torii мы обнаружили, что они используют много одинаковых команд.

Код:

1?semanage fcontext -a -t bin_t '%s' && restorecon '%s' 2?which semanage 3?cat /etc/*release 4?cat /etc/issue 5?systemctl enable 6?initctl start ...
2: Сходство сетевого трафика

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

1619940132875.png
3: Функциональное сходство

С точки зрения реверс-инжиниринга, RotaJakiro и Torii имеют схожие стили: использование алгоритмов шифрования для сокрытия секретной информации, использование довольно старого стиля обеспечения постоянное присутствия в системе, структурированный сетевой трафик и т.д.

Мы не знаем точного ответа, но похоже, что RotaJakiro и Torii имеют какие-то связи.

Это только верхушка айсберга

На этом мы завершаем анализ RotaJakiro, но настоящая работа еще далека от завершения, и многие вопросы остаются без ответа: "Как распространялся RotaJakiro, и какова была его цель?" , "Есть ли у RotaJakiro конкретная цель?", Мы будем рады узнать, есть ли у сообщества соответствующие версии.

MD-5 хэши образцов

Код:

1d45cd2c1283f927940c099b8fab593b 11ad1e9b74b144d564825d65d7fb37d6 5c0f375e92f551e8f2321b141c15c48f 64f6cfe44ba08b0babdd3904233c4857
Серверы С-2

Код:

news.thaprior.net:443 blog.eduelects.com:443 cdn.mirror-codes.net:443 status.sublineover.net:443
IP-адрес

Код:

176.107.176.16 Ukraine|Kiev|Unknown 42331|PE_Freehost
Спасибо за внимание :)


Источник: codeby.net

Комментарии: