В ходе своего анализа ВПО, я наткнулся на вредонос, который ещё не был никем проанализирован. Его имя – YoungLotus, в Интернете очень мало информации по нему. Именно поэтому я решил изучить его и написать эту статью. Как и в прошлой моей статье, я распакую и опишу основные характеристики вредоноса, его методы закрепления, способ коммуникации с C2 и его основные возможности.

Распаковка

Анализируя различные варианты YoungLotus, я заметил, что он распространяется в виде DLL библиотеки. Чаще всего эта библиотека упаковывается в исполняемый файл, который загружает её в память и переходит к её точке входа.

Я покажу пример распаковки одного из таких экземпляров. В этот раз я использовал IDA в связке в x32dbg. Вся распаковка происходит в главной функции.

Функция распаковки
Функция распаковки

После расшифровки и аллокации памяти, вредонос копирует расшифрованный код в аллоцированную память и ищет точку входа в библиотеку с именем Shellex. Затем вредонос копирует конфигурационную информацию в буфер и переходит к функции входа. IDA не распознала аргумент функции mw_main, но после распаковки сразу видно, что эта принимает конфигурационный байтовый массив.

Для распаковки нам нужно поставить точку останова в момент вызова функции mw_main. Такие переходы часто очень легко распознать, потому что в них используется инструкция jmp или call с регистром в качестве аргумента.

Точка остонова на иструкции call eax
Точка остонова на иструкции call eax

Теперь нам нужно лишь перейти по адресу, который находится в регистре eax, и выгрузить сегмент памяти, в который входит этот адрес. В нашем случае, в eax находился адрес 0x10008538, а в начале сегмента оказался заголовок PE файла:

Распакованный в память вредонос
Распакованный в память вредонос

Теперь можно перейти к рассмотрению самого вредоноса.

Конфигурация и закрепление

Для закрепления ВПО создает новый сервис. Его конфигурационная информация состоит из домена управляющего сервера, ключа Group сервиса, ключа Remark сервиса, имени сервиса, отображаемого имени сервиса, описания сервиса, порта управляющего сервера, флага запуска без закрепления и магических байтов, которые будут отправлены в первом сообщении для C2.

Конфигурация одного из экземпляров вредоноса
Конфигурация одного из экземпляров вредоноса

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

Различные варианты по-разному реализуют механизм закрепеления. Мой основной экземпляр копирует себя по пути C:\Windows\Microsoft.Net\Framework\v3.5\ и создает соответствующий сервис. При этом вредонос меняет своё имя на mscorsvw.exe для того, чтобы его сложнее было опознать.

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

Протокол ВПО

Для взаимодействия с управляющим сервером, ВПО использует собственный протокол. Предварительно, перед отправкой сообщения, оно шифруется простым XOR'ом. Разные реализации вредоноса имеют разные алгоритмы шифрования. Пример одного из экземпляров:

Функция шифрования
Функция шифрования

Формат пакетов протокола довольно прост. Сначала идут три неизменных байта (в моих экземплярах это были байты 0x687820), далее идёт длина сообщения, зарезервированное поле, число 1, номер действия и массив с аргументами для действия. Минимальная длина пакета – 16 байт, но также пакет может состоять из первых 3 байт.

struct packet {
  BYTE signarute[3]; // 0x687820
  DWORD message_length;
  DWORD reserved; 
  DWORD reserved; // Всегда 1
  BYTE action_number;
  BYTE param[];
};

При запуске вредонос подключается к С2-серверу используя параметры, указанные в конфигурации. Первый пакет, который отправляет ВПО, содержит информацию о системе. Повторно получить эту информацию можно, если отправить байты 0x687820 без остальной части пакета. Этот пакет содержит имя хоста, характеристики процессора, текущую дату и другую информацию о системе. Выглядит этот пакет примерно вот так:

Первый пакет от ВПО
Первый пакет от ВПО

После установки TCP-соединения и первого пакета от клиента, управляющий сервер может отправлять команды для управления вредоносом. Для того чтобы полностью изучить возможности, я воссоздал управляющий сервер при помощи Python. Это сервер позволит нам полностью протестировать все функции вредоноса. Вот так выглядят основные функции отправки и получения сообщения:

def listen(conn, addr):
	while True:
		data = conn.recv(8192) # Размер буфера, определенный во вредоносе
		print(decrypt(data))

def send(conn, addr):
	while True:
		try:
			port = str(addr[1])
			message = input(port + ">").encode().decode("unicode_escape")
			if(message == ""): # Пустое сообщение
				continue
			if(message == "hx "): # Запрос на обычный ответ
				conn.send(encrypt(message.encode()))
				continue
			if(message[0] == "#"): # Отправка голых байтов
				conn.send(encrypt(message[1::].encode()))
				continue
			if(message == "dis"): # Разрыв соединения
				conn.close()
				break
			args = message.split(" ")
			action = args[0]
			argument = args[1]
			response = \ # Формирование пакета
                b"hx " \ # Сигнатура
                + (len(argument) + 16).to_bytes(4, "little") \ # Длина сообщения
				+ b"\x11\x11\x11\x11\x01\x00\x00\x00" \ # Зарезервированные значения
                + int(action).to_bytes(1, "little") \ # Номер действия
				+ bytes(argument, encoding="raw_unicode_escape") # Аргумент действия
			conn.send(encrypt(response))
		except:
			print("Error")

А вот так выглядит основной цикл. При новом подключении мы создаём два новых потока, для отправки и получения сообщений.

import threading
import socket

sock = socket.socket()
sock.bind(("0.0.0.0", 3306))
sock.listen(1)

while True:
	try:
		conn, addr = sock.accept()
		print('connected:', addr)
		thread_listen = threading.Thread(target=listen, args=[conn,addr])
		thread_send = threading.Thread(target=send, args=[conn,addr])
		thread_listen.start()
		thread_send.start()
	except KeyboardInterrupt:
		break
	finally:
		print("Error on connection")

Функции decrypt и encrypt различаются в зависимости от экземпляра ВПО. Для моего экземпляра эти функции просто прибавляют или отнимают значение от байта и применяют к нему XOR. При помощи такого простого сервера мы можем выполнять все действия, которые предусмотрена в данном вредоносе.

Возможности YoungLotus

Вредонос обладает всеми основными функциями RAT. Он позволяет контролировать состояние системы, файлы, пользователей, реестр, сервисы, процессы и окна. Как и почти в любом другом RAT, в YoungLotus присутствует большая функция-обработчик со всеми действиями вредоноса, которая вызывается после получения сообщения от управляющего сервера. Далее представлена таблица всех действия вредоноса:

Номер действия

Описание действия

0x0

Выключить компьютер

0x1

Удалить вредоносный сервис и завершить работу

0x8

Скачать и запустить файл по ссылке

0xE

Найти процесс по имени

0xF

Найти окно по имени

0xD

Открыть диалоговое окно

0x10

Открыть прокси

0x11

Закрыть прокси

0x65

Запустить обработчик действий с файлами

0x69

Запустить оболочку (cmd)

0x6A

Запустить обработчик действий с системой

0x6C

Запустить обработчик действий с сервисами

0x6D

Запустить обработчик действий с реестром

Последние пять действий создают ещё одно подключение к управляющему серверу и также имеют свои номера действий (кроме 0x69). Обработчики этих подключений работают так же как и главный обработчик. Замечу, что в более старых вариантах вредоноса (около года назад) не было этих последних пяти действий. Это значит, что над трояном все ещё ведется работа и что разработчики намерены использовать его и дальше. Теперь рассмотрим поподробнее эти обработчики.

Действия с файлами. Перед тем, как выполнять некоторые действия с файлом, его нужно выбрать, используя действие 0x3. После этого можно начинать работу с файлом. Таблица действий с файлами:

Номер действия

Описание действия

0x1

Вывести содержимое папки

0x3

Выбрать файл для последующих действий

0x4

Запись в файл

0x5

Чтение из файла

0x7

Удаление файла

0x8

Удаление папки

0xB

Перемещение файла

0xC

Запуск файла

0x11

Копирование файла

Действия с системой. В этом обработчике собраны различные действия, которые работают с системой. Например, поиск антивирусного ПО или действия с пользователями. Таблица действий с системой:

Номер действия

Описание действия

0x1

Получение информации о процессах

0x2

Получение списка открытых окон

0x3

Получение информации о системе, в том числе об антивирусном ПО

0x4

Получение информации о пользователях

0x8

Получение информации о процессе

0xС

Установка параметров для пользователя

0xE

Создание пользователя

0x10

Удаление пользователя

0x15

Выключить компьютер

Действия с сервисами. Здесь собраны самые основные взаимодействия с сервисами, которые могут понадобиться вредоносу при его работе. Таблица действий с сервисами:

Номер действия

Описание действия

0x1

Список всех сервисов

0x64

Удалить сервис

0x65

Запустить сервис

0x66

Проверка если сервис не остановлен

0x67

Проверка если сервис запущен

0x68

Проверка если сервис приостановлен

0x69

Установка режима запуска – запуск сервиса при загрузке системы

0x6A

Установка режима запуска – ручной запуск сервиса

0x6B

Установка режима запуска – не запускать

Действия с реестром. Здесь тоже ничего необычного. Просто стандартные действия с ключами и значениями реестра. Таблица действий с реестром:

Номер действия

Описание действия

0x1

Получить значение ключа

0x2

Создать ключ

0x3

Удалить ключ

0x4

Установить значение для ключа

0x5

Удалить значение для ключа

Связи с другими вредоносами

В ходе анализа, я заметил, что YoungLotus очень похож на другой известный троян – FatalRAT, который я тоже недавно анализировал. FatalRAT фигурировал в новостях еще несколько лет назад, его впервые обнаружила компания AT&T. Основные фрагменты кода у этих вредоносов совпадают, отличается лишь арсенал действий. У FatalRAT есть функции кейлогера, инфостиллера, обхода ВМ, и другие, но нет всех остальных функций, которые есть у YoungLotus. В целом FatalRAT является улучшенной версией YoungLotus, но с другими возможностями.

Сравнение главных функций YoungLotus и FatalRAT
Сравнение главных функций YoungLotus и FatalRAT

У FatalRAT в качестве сигнатуры в протоколе используются байты 0x535609. Это является его отличительной чертой от YoungLotus. Точка входа в библиотеку у FatalRAT чаще всего называется SVP7, а у YoungLotus – Shellex.

Если судить по дате первого появления в новостях, то YoungLotus появился на пару лет раньше, чем FatalRAT. Оба вредоноса разработаны в Китае. Об этом говорят IP-адреса управляющих серверов, которые находятся в Китае и Южной Корее и исследование AT&T.

В ходе своей работы один из экземпляров YoungLotus, загружает на компьютер жертвы вредонос Blackmoon. Этот троян загружается с домена hook[.]ftp21[.].cc. С поддоменов домена ftp21[.]сс распространяются оба вредоноса – YoungLotus и Blackmoon. Кампания по распространению началась около недели назад. Тогда были замечены первые вредоносные ссылки. Сам этот домен находится в Южной Корее.

Заключение

YoungLotus не очень распространен. Новые экземпляры появляются пару раз в месяц. Я думаю что это связано с тем, что для этого вредоноса ещё не написано ни одного нормального Yara-правила. Поэтому процент определения остаётся довольно низким. Именно для этого я и написал своё правило, чтобы можно было чаще определять данный тип ВПО.

Это моя вторая статья по теме анализа ВПО. С момента написания предыдущей статьи, я изучил много новых инструментов и техник. Я также планирую и дальше исследовать вредоносы и писать статьи с их разборами.

Правило Yara

rule win32_younglotus {
    meta:
        author = "Reedus0"
        description = "Rule for detecting YoungLotus malware"
        reference_1 = "https://malpedia.caad.fkie.fraunhofer.de/details/win.younglotus"
        reference_2 = "https://habr.com/ru/articles/827184/"
        version = "1"
        strings:
            $string_0 = "%s:%d:%s"
            $string_1 = "SYSTEM\\CurrentControlSet\\Services\\"
            $string_2 = "WinSta0\\Default"
            $string_3 = "%4d-%.2d-%.2d %.2d:%.2d"
            $string_4 = "%d*%sMHz"
            $string_5 = "Win7"
            $string_6 = "Shellex"
            $string_7 = "%s%s%s%s%s%s"
            $string_8 = "AVtype_info"
        condition:
            uint16(0) == 0x5A4D and 6 of them and filesize < 300KB
}

MITRE ATT&CK

Тактика

Описание

T1573

Зашифрованный канал

T1569

Системный сервис

T1140

Деобфусцирование файлов или информации

T1136.001

Создание аккаунта

T1082

Обнаружение информации о системе

T1518

Обнаружение ПО

T1112

Модификация реестра

T1608.001

Загрузка вредоноса

T1012

Запрос реестра

T1095

Протокол не прикладного уровня

T1543.003

Создание или модификации системного процесса: Сервис Windows

Комментарии (0)