В ходе своего анализа ВПО, я наткнулся на вредонос, который ещё не был никем проанализирован. Его имя – YoungLotus, в Интернете очень мало информации по нему. Именно поэтому я решил изучить его и написать эту статью. Как и в прошлой моей статье, я распакую и опишу основные характеристики вредоноса, его методы закрепления, способ коммуникации с C2 и его основные возможности.
Распаковка
Анализируя различные варианты YoungLotus, я заметил, что он распространяется в виде DLL библиотеки. Чаще всего эта библиотека упаковывается в исполняемый файл, который загружает её в память и переходит к её точке входа.
Я покажу пример распаковки одного из таких экземпляров. В этот раз я использовал IDA в связке в x32dbg. Вся распаковка происходит в главной функции.
После расшифровки и аллокации памяти, вредонос копирует расшифрованный код в аллоцированную память и ищет точку входа в библиотеку с именем Shellex
. Затем вредонос копирует конфигурационную информацию в буфер и переходит к функции входа. IDA не распознала аргумент функции mw_main
, но после распаковки сразу видно, что эта принимает конфигурационный байтовый массив.
Для распаковки нам нужно поставить точку останова в момент вызова функции mw_main
. Такие переходы часто очень легко распознать, потому что в них используется инструкция jmp
или call
с регистром в качестве аргумента.
Теперь нам нужно лишь перейти по адресу, который находится в регистре 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, но с другими возможностями.
У 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 |