• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

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

🖐 Приветствую всех читателей Codeby.net 🖐

Недавно специалисты обнаружили очень интересный бэкдор, который получил название 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

(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:
root@debian:~# 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


Спасибо за внимание :)
 
Последнее редактирование:
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!