Автор: Иннокентий Сенновский Taidoor — крайне эффективная вредоносная программа класса RAT (remote access trojan), предназначенная для использования без закрепления в системе. Модульная система, реализованная в Taidoor, отличается от многих других RAT гибкостью: операторы программы могут отправлять на зараженную систему только те модули, которые нужны для достижения целей конкретной атаки. Чтобы затруднить обнаружение, Taidoor использует несколько разных методов: манипуляции с временными метками, удаление файлов с модулями, обфускацию строк, поиск антивируса на атакуемой машине и др. Мы изучили функциональные возможности и алгоритмы работы Taidoor, а также ее загрузчиков, и хотим поделиться своими наблюдениями. Источник информации о зараженной системе, включая имена файлов, — отчет агентства кибербезопасности и безопасности инфраструктуры США (CISA) номер AR20-216A. С точки зрения злоумышленника, Taidoor — достойный базовый инструмент удаленного управления с многочисленными возможностями для динамического расширения. К тому же у малвари довольно удобный интерфейс для запуска процессов и взаимодействия с консолью. Два встроенных модуля позволяют собирать информацию о зараженной системе. По мере необходимости с сервера управления можно отправлять дополнительные модули. В ходе общения с управляющим сервером Taidoor использует криптоконверт RSA + AES для обеспечения конфиденциальности. Однако криптография в программе реализована слабо: при перехвате трафика можно подменить команды от сервера. Также при использовании указанного алгоритма на сервере может появиться уязвимость, позволяющая расшифровать отправляемые на сервер данные, к которым удалось получить доступ. Загрузчики основного тела Taidoor — файлы rasautoex.dll и ml.dll, идентичные по функциональности. Они отличаются только разрядностью: первый является 64-битной версией малвари, второй — 32-битной. Их свойства представлены в табл. 1. Табл. 1. Свойства загрузчиков Taidoor Ниже мы поделимся результатами исследования 64-битной версии. Файл rasautoex.dll предназначен для загрузки основного тела Taidoor в память системы. Он может быть запущен через вызов экспортируемой функции MyStart или зарегистрирован как служба — об этом свидетельствует экспортируемая функция ServiceMain. При запуске загрузчик ищет в той же директории, в которой он находится, файл svchost.dll — зашифрованное основное тело Taidoor. Обнаружив необходимый файл, загрузчик выполняет следующие действия: Строка: ar1z7d6556sAyAXtUQc2 Основное зашифрованное тело Taidoor представлено в виде одного из файлов svchost.dll, которые отличаются разрядностью. Их свойства описаны в табл. 2. Табл. 2. Свойства файлов основного тела Taidoor В файле с MD5-хешем, оканчивающимся на 7edd, зашифрована 64-битная версия программы. В файле с MD5-хешем, оканчивающимся на 2664c, — 32-битная. Файлы почти идентичны, но в них прописаны разные адреса серверов управления. Далее речь пойдет об исследовании 64-битной версии. Изученный образец — зашифрованная вредоносная библиотека, которую запускает отдельная программа, описанная выше. При запуске с помощью rundll32 Taidoor проверяет наличие сохраненных вне тела программы зашифрованных настроек в параметре RValue ключа реестра SOFTWARE\Microsoft\Windows NT\CurrentVersion. При их отсутствии или другом типе запуска программа использует стандартные настройки, сохраненные в ее теле. Далее Taidoor расшифровывает настройки, которые включают в себя следующие данные: Если указан прокси, программа пытается подключиться к серверу управления через него. При подключении Taidoor отправляет один зашифрованный по алгоритму RSA пакет с идентификатором и ждет от сервера ответ. Если попытка успешна, программа создает файл %ALLUSERSPROFILE%\\Application Data\\Microsoft\\~svc_.TMp— вероятнее всего, это индикатор успешного заражения, который предотвращает повторную загрузку Taidoor. Программа в ходе основного цикла инициализирует два плагина: один для сбора информации о системе, другой — для создания процессов и работы с командной строкой. После этого программа запускает в отдельном потоке цикл отстука, в котором она обращается к управляющему серверу каждые 10 секунд. В основном же потоке программа начинает цикл получения команд от сервера. При отправке сообщений на сервер используется криптоконверт RSA + AES. На каждое сообщение генерируется отдельный ключ AES. Вот какие действия может совершать злоумышленник в зараженной системе при помощи Taidoor в базовой комплектации (основной модуль и два встроенных плагина): У каждого плагина Taidoor есть свой идентификатор, который указывается в начале каждого сообщения с обеих сторон. Это позволяет оператору программы адресовать команды конкретному плагину и различать источники сообщений от программы (основной модуль и конкретные плагины). По умолчанию используются следующие идентификаторы: Внешние плагины Taidoor загружает в виде динамических библиотек по команде с сервера управления. В каждом плагине есть три экспортируемые функции: Taidoor применяет всевозможные методы, чтобы затруднить обнаружение и расследование атаки: Перед использованием модуль должен быть расшифрован — это делает специализированный загрузчик, описанный выше. Исполнение самого образца начинается с вызова экспортируемой функции Start. В начале процесса используется механизм для препятствования ручной отладке, в ходе которого программа: При ручной отладке с момента вычисления ожидаемого значения до вызова функции wait может пройти больше секунды, в результате чего цикл может сбиться и исполняться вечно. После запуска Taidoor препятствует ручной отладке с помощью примитивной функции. Далее программа сама импортирует все необходимые функции за исключением LoadLibrary и GetProcAddress. Taidoor вызывает еще несколько неопасных и бессмысленных функций (рис. 1), скорее всего, чтобы защититься от обнаружения. "
Рис. 1. Пример бесполезной функции, используемой Taidoor После этого малварь запускает основную функциональность в новом потоке. Большинство строк вредоносной программы (например, названия импортируемых функций) обфусцированы с использованием нестандартного поточного шифра для усложнения обнаружения. Строки деобфусцируются прямо перед использованием. В начале основного цикла Taidoor проверяет имя приложения, при помощи которого малварь была запущена, чтобы определить источник параметров соединения с управляющим сервером: Настройки, полученные тем или иным способом, расшифровываются алгоритмом AES в режиме ECB с ключом 2B7E151628AED2A6ABF7158809CF4F3C (представлен в шестнадцатеричном виде). Далее Taidoor пытается подключиться к серверу управления. В полученных ранее параметрах подключения может быть указано до 4 адресов сервера и до 3 портов на каждый сервер. Также может быть указан адрес и порт HTTP-прокси-сервера. В изученном образце был указан один управляющий сервер и один порт, а в 32-битной версии указаны два управляющих сервера и по одному порту на каждый. Подключение проходит по следующему алгоритму: Перед соединением с сервером управления 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 инициализирует два встроенных плагина: Вот как выглядит процесс загрузки нового плагина (функция представлена на рис. 3): 
Рис. 3. Функция загрузки плагина Каждый модуль может быть деинициализирован, чтобы предоставить место другому. При получении команды от сервера управления Taidoor проверяет первый байт, который указывает на адресата: команда может быть предназначена либо для основного модуля, либо для одного из плагинов. Если команда должна быть передана плагину, остаток сообщения передается в функцию плагина Proxy. Активировав плагины, Taidoor в отдельном потоке запускает функцию периодического обращения к серверу. В этой функции программа каждые 10 секунд отправляет управляющему серверу сообщение \x01\xff. Все обращения к серверу здесь и далее создаются по следующему алгоритму: Включив плагины, малварь начинает получать команды от сервера управления. Дальнейшие действия вредоноса зависят от команд. Если при получении данных от сервера возникла ошибка, программа завершает соединение и ждет столько времени, сколько установлено в параметрах (в изученном образце это 1 секунда), после чего вновь пытается подключиться к серверу.  Если сервер ответил пустым сообщением, программа это запоминает. Если сервер ответил так 300 раз подряд, программа завершает соединение и столько времени, сколько установлено в параметрах (в изученном образце это 30 минут), после чего пытается подключиться снова. Если размер сообщения от сервера больше или равен 256 байтам, то программа действуют по следующему алгоритму: Встроенный модуль MyPlugCmd предназначен для запуска процессов и передачи команд консоли. При инициализации ему передается параметр, который может быть сохранен в файле C:\Windows\win.ini. Этот параметр указывает на копию cmd.exe, которая используется, чтобы затруднить обнаружение программы. Модуль хранит несколько переменных в своем теле. Вот наиболее важные из них: Стоит отметить, что переменная <шелл> хранит информацию о запущенном процессе консоли, которая нужна для записи в поток ввода данного процесса и получения данных из потока вывода. Встроенный модуль MyPlugInfo может собирать и отправлять на сервер информацию об IP-адресах и MAC-адресах сетевых интерфейсов, идентификатор текущего процесса, а также идентификаторы заражения. Еще он умеет выполнять команду 11 основного обработчика.