Taidoor — это очень эффективна вирусная программа класса RAT (remotes access trojan), которая предназначена для использования без закрепления в системе. С помощью модульной системы, реализованной в Taidoor можно осуществлять доставку на зараженную территорию только тех модулей, которые необходимы для достижения целей конкретной атаки. В данной статье мы разберем как эффективно работать с Taidoor.
Чтобы усложнить обнаружение, Taidoor использует различные методы: манипулирование отметками времени, удаление файлов с модулями, запутывание строк, поиск антивирусных программ на атакуемом компьютере и т.д.
Taidoor в арсенале хакера
Два независимых модуля позволяют собрать всю необходимую информацию о зараженной системе. Если необходимо, то с сервера управления можно отправить дополнительные модули.
С помощью криптовалюты RSA + AES
, которая используется в Taidoor, обеспечивается секретность при работе с сервером управления. С точки зрения реализации программы, криптография в ней не очень хорошая. При захвате трафика нужно использовать команды с сервера. Помимо этого в этом алгоритме есть уязвимость, которая позволяет расшифровать полученную информацию, отправленную на сервер.
Загрузчики Taidoor
Основными загрузчиками Taidoor являются rasautoex.dll
и ml.dll,
которые имеют идентичную функциональность. Они различаются только битовой глубиной: первая — это 64-битная версия зловреда, вторая — 32-битная версия. Их свойства приведены в таблице 1.
Табл. 1. Свойства загрузчиков Taidoor
Возможности загрузчика
Файл 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 расшифровывает настройки, которые включают в себя следующие данные:
Далее Taidoor расшифровывает настройки, которые включают в себя следующие данные:
- адреса сервера управления (домены или IP-адреса и порты);
- адрес прокси-сервера (необязательно);
- настройки ожидания (время переподключения к серверу в различных ситуациях);
- публичный RSA-ключ сервера.
В случае, если в настройках программы установлен прокси, программа пытается через него выйти на сервер управления. Taidoor посылает один зашифрованный RSA пакет, который содержит идентификатор и ожидает ответа от сервера. После успешной попытки программа создает файл % ALLUSERSPROFILE%\Application Data\ Microsoft\~ svc_.TMp – возможно, это индикатор успешного заражения, который не позволяет перезагрузить Taidoor.
После того, как основной цикл завершается, программа создает два плагина: один для сбора системных данных, второй для создания процессов и работы с командной строкой.
Затем программа запускает цикл отстука в отдельном потоке, где она связывается с C&C сервером каждые 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), скорее всего, чтобы защититься от обнаружения.
Пример бесполезной функции, используемой 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
с использованием криптографически стойкого генератора псевдослучайных чисел (ГПСЧ).
- первые 3 символа — фиксированная строка
- В ответ программа ожидает строку
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. Отдельные команды могут устанавливать или использовать глобальные переменные. Вот самые важные:
<имя_файла>;
<файловый_дескриптор>;
<идентификатор>;
<глобальный_массив>;
<дополнительное_имя_файла>;
<дополнительный_дескриптор_файла>.
Первый байт оставшейся части буфера, отправленный на обработку, идентифицирует одну из команд. Команды могут управлять подключением вредоносного ПО к серверу, обновлять его настройки, загружать и скачивать плагины и выполнять другие вредоносные действия.
Полный список команд
Часть обработчика открытия файла
Плагины
Инициализация плагинов
Taidoor инициализирует два встроенных плагина:
- MyPlugCmd — для исполнения команд на машине. В качестве одного из аргументов при инициализации передается путь, по которому располагается копия
cmd.exe
. Если необходимый ключ вwin.ini
не найден или копирование сорвалось, передается пустая строка. - MyPlugInfo — для получения базовой информации о зараженной машине.
Вот как выглядит процесс загрузки нового плагина (функция представлена на рис. 3):
- Библиотека загружается в память.
- Программа проверяет плагин на наличие следующих экспортируемых функций:
Install,
Uninstall,
Proxy.
- Софтина вызывает функцию
Install
, передает в нее информацию о подключении к серверу управления. В качестве идентификатора выставляется полученное изInstall
значение. - После инициализации модуль добавляется в массив плагинов и, если имя файла соответствует схеме
uaq*.dll
, файл удаляется.
Функция загрузки плагина
Каждый модуль может быть деинициализирован, чтобы предоставить место другому.
В случае получения команды от управляющего сервера, Taidoor проверяет первый байт, который указывает на место назначения: команда может быть направлена либо для основного модуля, либо для одного из плагинов. После того, как команда была передана плагину, остальной текст сообщения передаётся прокси-функции
плагина.
Функция периодического входа на сервер запускается после активации плагинов Taidoor. В этой функции программа отправляет сообщение \ x01 \ xff
на C&C сервер каждые 10 секунд.
Все обращения к серверу здесь и далее создаются по следующему алгоритму:
- Высчитывается размер данных с паддингом. Он будет равен длине сообщения + 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
Вывод
В качестве цели злоумышленник видит в Taidoor – удобный инструмент дистанционного управления для начального уровня с множеством возможностей динамического расширения. В то же время вредоносная программа имеет достаточно удобный интерфейс, чтобы запускать процессы и взаимодействовать с консолью.