Автор: Иннокентий
Сенновский
Taidoor крайне эффективная вредоносная программа класса RAT
(remote access trojan), предназначенная для использования без
закрепления в системе. Модульная система, реализованная в Taidoor,
отличается от многих других RAT гибкостью: операторы программы
могут отправлять на зараженную систему только те модули, которые
нужны для достижения целей конкретной атаки.
Чтобы затруднить обнаружение, Taidoor использует несколько
разных методов: манипуляции с временными метками, удаление файлов с
модулями, обфускацию строк, поиск антивируса на атакуемой машине и
др.
Мы изучили функциональные возможности и алгоритмы работы
Taidoor, а также ее загрузчиков, и хотим поделиться своими
наблюдениями.
Источник информации о зараженной системе, включая имена
файлов,
отчет агентства кибербезопасности и безопасности инфраструктуры США
(CISA) номер AR20-216A.
Taidoor в арсенале злоумышленника
С точки зрения злоумышленника, Taidoor достойный базовый
инструмент удаленного управления с многочисленными возможностями
для динамического расширения. К тому же у малвари довольно удобный
интерфейс для запуска процессов и взаимодействия с консолью.
Два встроенных модуля позволяют собирать информацию о зараженной
системе. По мере необходимости с сервера управления можно
отправлять дополнительные модули.
В ходе общения с управляющим сервером Taidoor использует
криптоконверт RSA
+ AES
для обеспечения
конфиденциальности. Однако криптография в программе реализована
слабо: при перехвате трафика можно подменить команды от сервера.
Также при использовании указанного алгоритма на сервере может
появиться уязвимость, позволяющая расшифровать отправляемые на
сервер данные, к которым удалось получить доступ.
Загрузчики Taidoor
Загрузчики основного тела Taidoor файлы
rasautoex.dll
и ml.dll
, идентичные по
функциональности. Они отличаются только разрядностью: первый
является 64-битной версией малвари, второй 32-битной. Их свойства
представлены в табл. 1.
Табл. 1. Свойства загрузчиков Taidoor
Ниже мы поделимся результатами исследования 64-битной
версии.
Функциональные
возможности загрузчика
Файл rasautoex.dll
предназначен для загрузки
основного тела Taidoor в память системы. Он может быть запущен
через вызов экспортируемой функции MyStart
или
зарегистрирован как служба об этом свидетельствует экспортируемая
функция ServiceMain
.
Поведение в системе
При запуске загрузчик ищет в той же директории, в которой он
находится, файл svchost.dll
зашифрованное основное
тело Taidoor. Обнаружив необходимый файл, загрузчик выполняет
следующие действия:
- Загружает содержимое файла в память.
- Расшифровывает файл алгоритмом RC4 на ключе
ar1z7d6556sAyAXtUQc2
. В расшифрованном виде
svchost.dll
представляет собой 64-битную библиотеку.
В случае с 32-битным загрузчиком (ml.dll
)
библиотека с телом Taidoor, соответственно, 32-битная.
- Выполняет маппинг библиотеки в памяти.
- Находит и заполняет адреса всех импортируемых функций.
- Находит адрес экспортируемой из библиотеки функции
Start
. Если такая функция найдена, вызывает ее.
Индикатор компрометации (IoC)
Строка: ar1z7d6556sAyAXtUQc2
Основное тело Taidoor
Основное зашифрованное тело Taidoor представлено в виде одного
из файлов svchost.dll
, которые отличаются
разрядностью. Их свойства описаны в табл. 2.
Табл. 2. Свойства файлов основного тела Taidoor
В файле с MD5-хешем, оканчивающимся на 7edd
,
зашифрована 64-битная версия программы. В файле с MD5-хешем,
оканчивающимся на 2664c
, 32-битная. Файлы почти
идентичны, но в них прописаны разные адреса серверов
управления.
Далее речь пойдет об исследовании 64-битной версии.
Общая
характеристика исследуемого образца Taidoor
Изученный образец зашифрованная вредоносная библиотека, которую
запускает отдельная программа, описанная выше.
При запуске с помощью rundll32
Taidoor проверяет
наличие сохраненных вне тела программы зашифрованных настроек в
параметре RValue
ключа реестра
SOFTWARE\Microsoft\Windows NT\CurrentVersion
. При их
отсутствии или другом типе запуска программа использует стандартные
настройки, сохраненные в ее теле.
Далее Taidoor расшифровывает настройки, которые включают в себя
следующие данные:
- адреса сервера управления (домены или IP-адреса и порты);
- адрес прокси-сервера (необязательно);
- настройки ожидания (время переподключения к серверу в различных
ситуациях);
- публичный RSA-ключ сервера.
Если указан прокси, программа пытается подключиться к серверу
управления через него. При подключении Taidoor отправляет один
зашифрованный по алгоритму RSA пакет с идентификатором и ждет от
сервера ответ. Если попытка успешна, программа создает файл
%ALLUSERSPROFILE%\\Application
Data\\Microsoft\\~svc_.TMp
вероятнее всего, это индикатор
успешного заражения, который предотвращает повторную загрузку
Taidoor.
Программа в ходе основного цикла инициализирует два плагина:
один для сбора информации о системе, другой для создания процессов
и работы с командной строкой.
После этого программа запускает в отдельном потоке цикл отстука,
в котором она обращается к управляющему серверу каждые 10 секунд. В
основном же потоке программа начинает цикл получения команд от
сервера. При отправке сообщений на сервер используется
криптоконверт RSA
+ AES
. На каждое
сообщение генерируется отдельный ключ AES
.
Вот какие действия может совершать злоумышленник в зараженной
системе при помощи Taidoor в базовой комплектации (основной модуль
и два встроенных плагина):
- сохранять файлы на диск,
- изменять настройки подключения к серверу управления,
- загружать новые модули,
- подменять временные метки у файлов,
- запускать процессы и получать их результаты,
- взаимодействовать с командной строкой.
У каждого плагина Taidoor есть свой идентификатор, который
указывается в начале каждого сообщения с обеих сторон. Это
позволяет оператору программы адресовать команды конкретному
плагину и различать источники сообщений от программы (основной
модуль и конкретные плагины). По умолчанию используются следующие
идентификаторы:
- 1 основной модуль;
- 2 плагин для старта процессов и работы с командной
строкой;
- 3 плагин для получения дополнительной информации о
системе.
Внешние плагины Taidoor загружает в виде динамических библиотек
по команде с сервера управления. В каждом плагине есть три
экспортируемые функции:
Install
инициализация плагина и возвращение
идентификатора плагина;
Proxy
передача плагину адресованного ему сообщения
от сервера;
Uninstall
деинициализация плагина.
Taidoor применяет всевозможные методы, чтобы затруднить
обнаружение и расследование атаки:
- Вместо оригинального файла может использоваться копия
cmd.exe.
- Временные метки индикатора заражения
%ALLUSERSPROFILE%\\Application
Data\\Microsoft\\~svc_.TMp
заменяются временными метками
системного файла C:\Windows\System32\services.exe
, что
осложняет определение даты заражения.
- Файлы загружаемых плагинов удаляются после запуска.
- До старта процессов плагин проверяет, нет ли на атакуемой
машине антивируса Kaspersky.
Инициализация Taidoor
Перед использованием модуль должен быть расшифрован это делает
специализированный загрузчик, описанный выше. Исполнение самого
образца начинается с вызова экспортируемой функции
Start
.
В начале процесса используется механизм для препятствования
ручной отладке, в ходе которого программа:
- считает, сколько секунд по времени от 0 до 60 должно быть через
10 секунд;
- запускает цикл, ждет по 10 секунд на каждой итерации до тех
пор, пока не получит ожидаемое значение.
При ручной отладке с момента вычисления ожидаемого значения до
вызова функции wait
может пройти больше секунды, в
результате чего цикл может сбиться и исполняться вечно.
После запуска Taidoor препятствует ручной отладке с помощью
примитивной функции.
Далее программа сама импортирует все необходимые функции за
исключением LoadLibrary
и
GetProcAddress
.
Taidoor вызывает еще несколько неопасных и бессмысленных функций
(рис. 1), скорее всего, чтобы защититься от обнаружения.
"
Рис. 1. Пример бесполезной функции, используемой
Taidoor
После этого малварь запускает основную функциональность в новом
потоке. Большинство строк вредоносной программы (например, названия
импортируемых функций) обфусцированы с использованием
нестандартного поточного шифра для усложнения обнаружения. Строки
деобфусцируются прямо перед использованием.
Соединение с сервером
управления
В начале основного цикла Taidoor проверяет имя приложения, при
помощи которого малварь была запущена, чтобы определить источник
параметров соединения с управляющим сервером:
- Если использовалась стандартная утилита
rundll32.exe
, то программа пытается загрузить
параметры соединения с сервером из параметра RValue
ключа реестра SOFTWARE\Microsoft\Windows
NT\CurrentVersion
.
- Если библиотека была запущена иным способом или параметр
RValue
не существует, настройки берутся из тела
Taidoor.
Настройки, полученные тем или иным способом, расшифровываются
алгоритмом AES
в режиме ECB
с ключом
2B7E151628AED2A6ABF7158809CF4F3C
(представлен в
шестнадцатеричном виде).
Далее Taidoor пытается подключиться к серверу управления. В
полученных ранее параметрах подключения может быть указано до 4
адресов сервера и до 3 портов на каждый сервер. Также может быть
указан адрес и порт HTTP-прокси-сервера. В изученном образце был
указан один управляющий сервер и один порт, а в 32-битной версии
указаны два управляющих сервера и по одному порту на каждый.
Подключение проходит по следующему алгоритму:
- Программа берет адрес и порт из конфигурации. Если в
конфигурации указаны параметры прокси-сервера, то программа
пытается подключиться к нему.
- Программа подключается к серверу управления или дает
прокси-серверу соответствующую команду (при наличии параметров
прокси и успешном подключении к нему).
- Программа отправляет на управляющий сервер массив из 263
символов, где:
- первые 3 символа фиксированная строка
F::
;
- следующие 4 количество миллисекунд, прошедших между стартом
системы и запуском программы;
- оставшиеся 256 строка
0x040x230x190x340xfe0xc1
,
зашифрованная при помощи алгоритма RSA_PKCS1v1.5
с
использованием криптографически стойкого генератора псевдослучайных
чисел (ГПСЧ).
- В ответ программа ожидает строку
200
OK\r\n\r\n
:
- Если программа получает такой ответ, фаза подключения к серверу
завершается.
- Если программа не получает ожидаемого ответа, то она пробует
соединиться со следующим сервером, указанным в параметрах. Если ни
к одному из них не удается подключиться, программа засыпает на
указанный в параметрах период времени (в данном образце 30 минут),
затем повторяет описанный выше цикл.
Работа с временными
метками
Перед соединением с сервером управления Taidoor открывает журнал
событий системы и начинает по очереди читать записи. Особое
внимание при этом программа обращает на записи типов
6005
(Начало работы службы журнала событий) и
6006
(Конец работы службы журнала событий) они могут
использоваться для определения времени работы машины. В
рассмотренном экземпляре реализован проход по этим данным, но
программа их не использует.
После подключения к серверу программа создает файл
%ALLUSERSPROFILE%\\Application
Data\\Microsoft\\~svc_.TMp
, а также обновляет его временные
метки. Затем программа проверяет файл
C:\Windows\win.ini
на наличие секции
Micros
с ключом source
. Если ключ
присутствует, утилита cmd.exe
копируется по указанному
в ключе адресу (в отчете CISA указан адрес
c:\temp\cmd.exe
).
Функциональные возможности основного модуля
Если в первом байте расшифрованного буфера, пришедшего от
сервера, стоит 1
, остаток буфера обрабатывается самой
Taidoor. Отдельные команды могут устанавливать или использовать
глобальные переменные. Вот самые важные из них:
<имя_файла>;
<файловый_дескриптор>;
<идентификатор>;
<глобальный_массив>;
<дополнительное_имя_файла>;
<дополнительный_дескриптор_файла>.
Первый байт остатка буфера, который передается на обработку,
идентифицирует одну из команд. Команды могут манипулировать
подключением малвари к серверу, обновлять ее настройки, загружать и
выгружать плагины, а также выполнять другие вредоносные
действия.
С полным списком команд можно ознакомиться тут.
Обратите внимание, что команды есть не у всех идентификаторов.
На рис. 2 можно увидеть реализацию команды с идентификатором 15,
которая запускает процесс открытия файла.
Рис. 2. Часть обработчика открытия файла
Работа плагинов
Инициализация плагинов
Taidoor инициализирует два встроенных плагина:
- MyPlugCmd для исполнения команд на машине. В качестве одного из
аргументов при инициализации передается путь, по которому
располагается копия
cmd.exe
. Если необходимый ключ в
win.ini
не найден или копирование сорвалось,
передается пустая строка.
- MyPlugInfo для получения базовой информации о зараженной
машине.
Вот как выглядит процесс загрузки нового плагина (функция
представлена на рис. 3):
- Библиотека загружается в память.
- Программа проверяет плагин на наличие следующих экспортируемых
функций:
Install,
Uninstall,
Proxy.
- Программа вызывает функцию
Install
, передает в нее
информацию о подключении к серверу управления. В качестве
идентификатора выставляется полученное из Install
значение.
- После инициализации модуль добавляется в массив плагинов и,
если имя файла соответствует схеме
uaq*.dll
, файл
удаляется.
Рис. 3. Функция загрузки плагина
Каждый модуль может быть деинициализирован, чтобы предоставить
место другому.
При получении команды от сервера управления Taidoor проверяет
первый байт, который указывает на адресата: команда может быть
предназначена либо для основного модуля, либо для одного из
плагинов. Если команда должна быть передана плагину, остаток
сообщения передается в функцию плагина Proxy
.
Активировав плагины, Taidoor в отдельном потоке запускает
функцию периодического обращения к серверу. В этой функции
программа каждые 10 секунд отправляет управляющему серверу
сообщение \x01\xff
.
Все обращения к серверу здесь и далее создаются по следующему
алгоритму:
- Высчитывается размер данных с паддингом. Он будет равен длине
сообщения + 4 байта это значение округляется до 16, обязательно в
большую сторону. Например, 16 20 32, a 12 16 32.
- Изначальный размер записывается в первые 4 байта нового массива
с вычисленным размером. Сразу после него копируются передаваемые
данные (т. е. по отступу 4). Лишние байты в конце массива
заполняются нулями. Таким образом данные запаковываются для
симметричного шифрования.
- Программа генерирует временный ключ из 16 символов нижнего
регистра в латинском алфавите. Механизм генерации небезопасен,
поскольку позволяет перебрать все возможные варианты за приемлемое
время. К тому же если известно примерное время заражения, можно
сократить количество вариантов.
- Программа шифрует созданный ключ при помощи алгоритма
RSA_PKCS1v1.5
с использованием криптографически
стойкого ГПСЧ на ключе, взятом из параметров.
- Программа шифрует запакованный массив при помощи алгоритма
AES-128
в режиме ECB
на временном
ключе.
- Программа отправляет на сервер 4 байта полного размера пакета:
256 (размер зашифрованного ключа) + размер зашифрованных данных.
Если удалось отправить размер, то программа последовательно
посылает 256 байт зашифрованного ключа и зашифрованные данные.
Общение плагинов
с сервером управления
Включив плагины, малварь начинает получать команды от сервера
управления. Дальнейшие действия вредоноса зависят от команд.
Если при получении данных от сервера возникла ошибка, программа
завершает соединение и ждет столько времени, сколько установлено в
параметрах (в изученном образце это 1 секунда), после чего вновь
пытается подключиться к серверу.
Если сервер ответил пустым сообщением, программа это запоминает.
Если сервер ответил так 300 раз подряд, программа завершает
соединение и столько времени, сколько установлено в параметрах (в
изученном образце это 30 минут), после чего пытается подключиться
снова.
Если размер сообщения от сервера больше или равен 256 байтам, то
программа действуют по следующему алгоритму:
- Taidoor берет первые 256 байт и расшифровывает их на публичном
ключе RSA c применением
RSA_PKCS1v1.5
. Полученные
данные используются в качестве симметричного ключа для следующих
данных. Использование подписи в данном случае бессмысленно, так как
не защищает от перехвата управления.
- Программа использует полученный ключ, чтобы расшифровать
остаток сообщения алгоритмом
AES-128
в режиме
ECB
.
- В первый байт полученного массива записывается идентификатор
адресата команды:
- Если он равен 1, то остальные данные предназначаются для
основного модуля и обрабатываются в отдельной функции.
- Все остальные значения обозначают тот или иной плагин.
Программа ищет его и передает ему данные. Если такой плагин не
найден, программа не делает ничего.
Функциональные
возможности плагинов
Встроенный модуль MyPlugCmd предназначен для запуска процессов и
передачи команд консоли. При инициализации ему передается параметр,
который может быть сохранен в файле
C:\Windows\win.ini
. Этот параметр указывает на копию
cmd.exe
, которая используется, чтобы затруднить
обнаружение программы.
Модуль хранит несколько переменных в своем теле. Вот наиболее
важные из них:
<файловый_дескриптор>;
<имя_файла>;
<альтернативный_путь_к_cmd>;
<шелл>.
Стоит отметить, что переменная <шелл> хранит информацию о
запущенном процессе консоли, которая нужна для записи в поток ввода
данного процесса и получения данных из потока вывода.
Полный список команд, выполняемых модулем MyPlugCmd
можно посмотреть тут.
Встроенный модуль MyPlugInfo может собирать и отправлять на
сервер информацию об IP-адресах и MAC-адресах сетевых интерфейсов,
идентификатор текущего процесса, а также идентификаторы заражения.
Еще он умеет выполнять команду 11 основного обработчика.
Команды с идентификаторами можно найти тут
Индикаторы компрометации (IoC) обоих вариантов
svchost.dll