Отчеты о целевых атаках (APT)

ToddyCat: неизвестная APT-группа, нацеленная на организации Европы и Азии

ToddyCat является относительно новой APT-группой, ответственной за серии атак на высокостатусные организации Европы и Азии. Деятельность этой группы мы фиксируем с декабря 2020 года. Нам не удалось связать ToddyCat с какими-либо другими известными злоумышленниками и составить ее исчерпывающий профиль, но мы можем назвать два ключевых отличительных признака этой группы — два ранее неизвестных инструмента, которые мы назвали «бэкдор Samurai» и «троянец Ninja».

Группа начала проявлять активность в декабре 2020 года, когда скомпрометировала избранные тайваньские и вьетнамские серверы Microsoft Exchange посредством неизвестного эксплойта. Затем она воспользовалась широко известным веб-шеллом China Chopper, чтобы инициировать многоступенчатую цепочку заражения. В этой цепочке мы обнаружили ряд компонентов, в том числе кастомные загрузчики, которые подготавливали почву для выполнения окончательной полезной нагрузки в виде пассивного бэкдора Samurai.

В первый период своей активности, с декабря 2020 года по февраль 2021 года, ToddyCat атаковала очень ограниченный перечень серверов на Тайване и во Вьетнаме, связанных с тремя организациями.

В промежуток с 26 февраля и до середины марта мы зафиксировали резкую эскалацию: атакующие воспользовались уязвимостью ProxyLogon, чтобы скомпрометировать несколько организаций в Европе и Азии.

Предположительно группа начала эксплуатировать уязвимость в Microsoft Exchange с декабря 2020 года, но, к сожалению, у нас нет весомых доказательств этой гипотезы. Стоит отметить, что все зараженные с декабря по февраль системы являлись серверами Microsoft Exchange с ОС Windows и что злоумышленники скомпрометировали их с помощью неизвестного эксплойта, при этом остальная часть цепочки заражения была аналогична мартовской.

Специалисты по безопасности из других компаний зафиксировали мартовские атаки. Наши коллеги из ESET дали этому кластеру активности название Websiic. Вьетнамская компания GTSC опубликовала отчет с описанием вектора заражения и метода развертывания первого дроппера. Тем не менее, насколько нам известно, пока еще ни одна ИБ-компания не опубликовала описание полной цепочки заражения и вредоносного ПО более поздних этапов, внедряемого группой в рамках данной активности.

Первая волна атак была нацелена исключительно на серверы Microsoft Exchange, которые были скомпрометированы с помощью Samurai — продвинутого пассивного бэкдора, обычно работающего на портах 80 и 443. Этот зловред позволяет выполнение произвольного кода на языке C# и развертывается в сопровождении нескольких модулей, позволяющих атакующему удаленно управлять системой и переходить на другие узлы в целевой сети.

В отдельных случаях с помощью бэкдора Samurai также запускался другой сложный зловред, которому мы дали название Ninja. Вероятно, он является компонентом неизвестного инструментария, который имеется исключительно в арсенале группы ToddyCat и применяется ею после компрометации цели.

Логическая структура кода указывает на то, что Ninja позволяет нескольким злоумышленникам одновременно работать с одной и той же зараженной системой. Зловред предлагает широкий спектр команд для управления удаленными системами, защиты от обнаружения и глубокого проникновения в целевую сеть. Некоторые функции реализованы по аналогии с другими известными инструментариями, используемыми после компрометации. Например, в Ninja есть функция, аналогичная перенаправляющему прослушиванию (pivot listener) в наборе Cobalt Strike. Она ограничивает число прямых соединений из целевой сети к удаленному командному серверу и системам управления без доступа к интернету. Также зловред способен управлять индикаторами HTTP и маскировать вредоносный трафик под легитимные HTTP-запросы, модифицируя заголовки HTTP и пути URL. Такая функциональность напомнила нам реализацию профиля Malleable для взаимодействия с командными серверами в том же Cobalt Strike.

С момента своего дебюта в декабре 2020 года группа ToddyCat сохраняла высокую активность, особенно в азиатском регионе, где мы обнаружили множество разновидностей загрузчиков и установщиков, схожих с теми, что участвовали в доставке вредоносного ПО Samurai и Ninja. Также мы наблюдали другие волны атак против рабочих станций, заражаемых посредством передачи вредоносных загрузчиков через Telegram.

Первая кампания

Вектор заражения

Как показывают данные нашей телеметрии, злоумышленники из ToddyCat начали компрометировать серверы 22 декабря 2020 года, применив неизвестный эксплойт для Microsoft Exchange. Эксплойт позволил им развернуть веб-шелл China Chopper, через который был впоследствии загружен и выполнен другой дроппер — debug.exe.

26 февраля мы увидели те же образцы и цепочку заражения, что и в декабрьских и январских атаках, но для развертывания этих образцов применялась уязвимость ProxyLogon.

Этап 1. Дроппер

Дроппер устанавливает все оставшиеся компоненты и создает множество записей в реестре, чтобы заставить легитимный процесс svchost.exe выполнить финальную полезную нагрузку в виде бэкдора Samurai.

Порядок заражения

Порядок заражения

Программа debug.exe задействует специальную функцию разрешения при каждом обращении к Windows API. Код проверяет, разрешен ли уже указатель и помещен ли он в глобальную переменную. Если значение не найдено, программа пытается извлечь адрес с помощью функции разрешения, которая получает указатель на библиотеку, содержащую API, и зашифрованную строку с именем запрошенного API, после чего расшифровывает строку по алгоритму на базе XOR.

Фрагмент кода, отвечающий за разрешение и вызов функций CryptDestroyKey и CryptReleaseContext

Фрагмент кода, отвечающий за разрешение и вызов функций CryptDestroyKey и CryptReleaseContext

Дроппер сконфигурирован для загрузки зашифрованной полезной нагрузки, хранящейся в другом файле — debug.xml. Он расшифровывается с помощью стандартных функций WinCrypt по алгоритму CALG_3DES_112 посредством статического ключа, встроенного в код. Структура расшифрованного файла включает множество полезных нагрузок и значений, используемых для развертывания следующих ступеней.

Поле Значение
magic 0x12345678
DotNet_Loader_v2_Payload Полезная нагрузка websvc.dll, совместимая с .NET Framework v2.0
DotNet_Loader_v4_Payload Полезная нагрузка websvc.dll, совместимая с .NET Framework v4.0
Loader_Dll_Payload Загрузчик библиотеки iiswmi.dll
ServiceName WebUpdate
Path_DotNet_Loader %COMMONPROGRAMFILES%\System\websvc.dll
Path_Loader_Dll %COMMONPROGRAMFILES%\microsoft shared\WMI\iiswmi.dll
RegKey_Path_Service_SvcHost SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost
RegKey_Path_Interface SOFTWARE\Classes\Interface\{6FD0637B-85C6-D3A9-CCE9-65A3F73ADED9}
Reg_Interface_Payload_v4 Бэкдор Samurai для .NET Framework v4.0
Reg_Interface_Payload_v2 Бэкдор Samurai для .NET Framework v2.0

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

  1. Пытается создать каталог %COMMONPROGRAMFILES%\Microsoft Shared\wmi\, содержащий DLL-библиотеку для следующего этапа.
  2. Проверяет, существует ли уже служба, необходимая на следующем этапе, и если да, то пытается ее остановить.
  3. Проверяет, установлен ли .NET Framework v2.0, пытаясь открыть следующий раздел реестра: SOFTWARE\Microsoft\.NETFramework\policy\v2.0
  4. Если раздел существует, зловред внедряет компонент DotNet_Loader_v2_Payload по пути %COMMONPROGRAMFILES%\System\websvc.dll. В противном случае он сохраняет DotNet_Loader_v4_Payload по тому же пути.
  5. Сохраняет DLL-загрузчик, выполняющий полезную нагрузку второго этапа, по пути %COMMONPROGRAMFILES%\microsoft shared\WMI\iiswmi.dll.
  6. Как только перечисленные файлы будут сохранены, зловред попытается создать указанный ниже раздел реестра, чтобы закрепиться в системе. Значение параметра в этом разделе указывает имя службы, создаваемой для запуска исполняемого файла. В примере ниже связанный со службой процесс после запуска ассоциируется с командной строкой %SystemRoot%\System32\svchost.exe -k httpsvc.
  7. После создания службы зловред пытается сконфигурировать DLL-библиотеку второго этапа и точку входа внутри нее, которая будет вызываться при запуске службы. Для этого перечисленным разделам реестра присваиваются следующие значения:
  8. Зловред сохраняет последнюю в цепочке заражения полезную нагрузку в виде сжатого и зашифрованного блока данных в кодировке base64 в следующем разделе реестра:

Этап 2. DLL-загрузчик

Разделы реестра, созданные на предыдущем этапе, привели к загрузке процессом svchost.exe вредоносной библиотеки iiswmi.dll, написанной на C++. Код библиотеки во многом схож с кодом дроппера — он обращается к Windows API через ту же специальную функцию разрешения, которая обнаружилась в дроппере.

Этот компонент представляет собой обычный загрузчик, который пытается извлечь зашифрованную полезную нагрузку из реестра и передать ее как аргумент другой DLL-библиотеке, загружаемой вручную во время выполнения.

Зловред пытается считать содержимое записанного ранее раздела реестра SOFTWARE\Classes\Interface\{6FD0637B-85C6-D3A9-CCE9-65A3F73ADED9}. В случае успеха он загружает ранее сохраненную DLL-библиотеку — %COMMONPROGRAMFILES%\System\websvc.dll.

Чтобы инициировать следующий этап заражения, зловред вызывает экспортируемую функцию Init в загруженной DLL-библиотеке (websvc.dll), передавая ей в качестве аргумента содержимое указанного выше раздела реестра.

Фрагмент кода, который загружает и выполняет библиотеку websvc.dll

Фрагмент кода, который загружает и выполняет библиотеку websvc.dll

Этап 3. Загрузчик .NET

Библиотека websvc.dll, разработанная на языке C#, является очередным загрузчиком, который ожидает зашифрованную полезную нагрузку в качестве входного аргумента. На вход должны поступить две строки в кодировке base64, разделенные символом вертикальной черты «|». Первая строка содержит компонент последнего этапа, а вторая — зашифрованную конфигурацию, которая используется при его запуске.

Библиотека декодирует первую строку, после чего результат еще раз декодируется по простому алгоритму с одиночной операцией XOR с ключом 0x3F, а затем распаковывается с помощью Gzip. Получившаяся полезная нагрузка является очередной библиотекой на C#, которая затем загружается в память и выполняется посредством вызова метода Equals из класса X, определенного в коде загрузчика. Вторая строка в кодировке base64, извлеченная из реестра, передается в качестве аргумента новой библиотеке на C#.

Фрагмент кода, который загружает и выполняет полезную нагрузку последнего этапа

Фрагмент кода, который загружает и выполняет полезную нагрузку последнего этапа

Бэкдор Samurai

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

Библиотека написана на C# и использует класс .NET HTTPListener, чтобы принимать и обрабатывать запросы HTTP POST. Она ищет специальным образом созданные запросы, которые содержат зашифрованный исходный код на C#, подготовленный злоумышленниками. Этот код будет компилироваться и выполняться во время работы зловреда.

Зловред обфусцирован по алгоритму, который усложняет реверс-инжиниринг за счет трудночитаемости кода. Множеству функций в коде присвоены случайные имена, даже если они отвечают за примитивные задачи, такие как извлечение свойства объекта, переданного на вход.

Более того, в зловреде массово применяются циклы while и конструкции switch-case для перехода от одной инструкции к другой (техника control flow flattening), чтобы усложнить отслеживание последовательности действий в коде. Для управления потоком изменяется значение выражения switch-case и задействуются операторы break и goto, чтобы перезапустить цикл, повторно сравнить выражение switch и перейти к нужной инструкции.

Фрагмент кода с циклом while и конструкцией switch-case

Фрагмент кода с циклом while и конструкцией switch-case

Зловред начинает свою работу с расшифровки данных конфигурации, переданных в качестве входного аргумента. Они представлены в кодировке base64 и зашифрованы по алгоритму DES с использованием жестко заданного ключа 90 EE 0C E1 6C 0D C9 0C. Результирующая полезная нагрузка представляет собой файл конфигурации, подготовленный злоумышленниками с учетом специфики жертвы. Он содержит множество строк с параметрами, которые определяют поведение бэкдора.

Ниже приведен пример структуры файла конфигурации:

Первая строка содержит ключевое слово, которое было включено в принятый POST-запрос в виде переменной. Оно служит маркировкой, по которой бэкдор определяет, что файл подлежит обработке, а также используется в определении важных параметров сессии, таких как AES-ключ сессии и список с именами переменных, содержащих данные для последующей обработки.

В некоторых вариациях зловреда во второй строке указывается путь к каталогу, значение которого впоследствии переопределяет переменную окружения TEMP. Все остальные строки представляют собой префиксы URI, которые нужны для настройки компонента HTTPListener. Каждая такая строка состоит из таких элементов, как схема (HTTPS или HTTPS), хост, порт (необязательный параметр) и путь (необязательный параметр, определяющий, какой запрос будет обработан объектом HTTPListener).

В нескольких случаях префиксы URL, указанные в конфигурации, включали домен жертвы, как в следующем примере: https://mail.%скрыто%.gov.%скрыто%/owa/auth/sslauth.

Сразу после успешной дешифровки конфигурации бэкдор запускает в соответствии с ней обработчики событий (listener) и ожидает входящих запросов. Запрос должен иметь структуру как в следующем примере:

Где:

Тело запроса должно включать три значения, одно из которых соответствует ключевому слову, извлеченному из конфигурации на входе. Связанное значение должно быть представлено в кодировке base64 и зашифровано по алгоритму AES с помощью заранее определенного ключа. В получившейся строке будет три значения, разделенных запятой: первое из них является еще одним ключом AES, необходимым для расшифровки других значений POST, второе — это имя переменной, содержащей исходный код на C#, а третье — имя переменной с аргументами и списком ссылок на сборки, которые нужно добавить в скомпилированный проект.

После компиляции бэкдор пытается вызвать метод run из класса core, который должен присутствовать в полученной программе. Вызываемый метод ожидает на входе два аргумента:

  • первый представляет собой словарь, содержащий ключ с именем samurai, значением которого является путь к текущему рабочему каталогу;
  • второй — значение, передаваемое злоумышленником в третьем элементе POST-запроса.

Если запрос корректный и код удалось исполнить, бэкдор направляет ответ с кодом HTTP 200 и включает в тело ответа результат, сгенерированный вызванной сборкой .NET. Сообщение будет зашифровано по алгоритму AES с помощью ключа сессии и представлено в кодировке base64.

Загруженные модули

В ходе расследования нам удалось обнаружить несколько модулей, загруженных атакующими и скомпилированных бэкдором Samurai:

Модуль Описание
Модуль удаленных команд Выполнение произвольных команд через командную строку Windows (cmd.exe).
Модуль составления списка файлов Получение списка файлов и каталогов по определенному пути, указанному атакующим в качестве аргумента.
Модуль эксфильтрации файлов Загрузка произвольных файлов, находящихся на скомпрометированных компьютерах.
Модуль соединения с прокси Установление подключения к удаленному IP-адресу и TCP-порту, которые заданы в коде.
Обработчик прокси Перенаправление полезной нагрузки, полученной в HTTP-запросе, на удаленный IP-адрес и наоборот.

Стоит отметить, что аргументы, передаваемые модулям, в некоторых случаях являются структурами в особых форматах. Все модули должны включать метод run, ожидающий два аргумента: словарь с ключевым словом samurai с текущим рабочим каталогом и строку, предоставленную атакующим. Строка должна представлять собой список значений, разделенных точкой с запятой («;»).

В качестве примера мы приводим корректную строку, принимаемую модулем удаленных команд:

Строка содержит три разных поля, отдельно закодированных по алгоритму base64. После раскодирования она принимает следующий вид:

Первое значение — название выполняемой программы, второе — аргумент, передаваемый новому процессу, и последнее — переменная окружения.

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

Еще одно доказательство этой теории связано с модулями прокси, являющимися двумя разными программами на C#, которые перенаправляют TCP-пакеты на произвольные хосты. С помощью этих модулей злоумышленники устанавливают соединение между запущенным экземпляром бэкдора Samurai и удаленным хостом, чтобы перенаправлять пакеты через бэкдор и использовать его как прокси. Вероятно, эта функция требуется для дальнейшего распространения в скомпрометированной сети. Большинство выявленных модулей сконфигурированы на обмен данными с внутренними IP-адресами через стандартные порты, такие как 135, 445, 389, 80 и 443.

Первая программа инициализирует соединение и встраивает в код IP-адрес и порт удаленного хоста.

Фрагмент кода, отвечающего за создание объекта сокета

Фрагмент кода, отвечающего за создание объекта сокета

После установки соединения объект сокета добавляется к первому аргументу, полученному методом run. Обычно этим аргументом является словарь с ключевым словом samurai.

Таким образом, объект сокета сохраняется в словаре в качестве значения уникального параметра, название которого состоит из слова ninja, за которым следует уникальный буквенно-цифровой код. Это же значение впоследствии встраивается во вторую программу, ответственную за обработку пакетов.

Фрагмент кода, отвечающего за обработку объекта сокета

Фрагмент кода, отвечающего за обработку объекта сокета

Предположительно исходный код C# динамически генерируется программой на клиентской стороне, контролирующей сессии прокси.

Троянец Ninja

В отдельных случаях бэкдор Samurai использовался для развертывания другого продвинутого зловреда, который мы назвали Ninja. Этот инструмент написан на языке C++ и, скорее всего, входит в состав разработанного группой ToddyCat неизвестного инструментария, применяемого после компрометации.

Инструмент обеспечивает полный контроль над удаленной системой и позволяет атакующему глубоко проникнуть в целевую сеть. Злоумышленнику доступно множество разных команд, предлагающих следующие возможности:

  • составление списка запущенных процессов и управление ими;
  • управление файловой системой;
  • организация нескольких сессий удаленного терминала (reverse shell);
  • внедрение кода в произвольные процессы;
  • загрузка дополнительных модулей (вероятно, плагинов) во время выполнения;
  • функции прокси для перенаправления TCP-пакетов между командным сервером и удаленным хостом.

Более того, зловред поддерживает обмен данными по нескольким протоколам и имеет защиту от обнаружения, которая маскирует его вредоносный трафик внутри запросов HTTP и HTTPS, выглядящих легитимно за счет указания популярных комбинаций имен хостов и путей URL. Конфигурация полностью настраиваемая, и ее возможности схожи с другими известными инструментами, используемыми после компрометации, такими как Cobalt Strike и его профили Malleable для взаимодействия с командными серверами.

Атакующий может сконфигурировать агент на работу только в определенные промежутки времени и менять эту конфигурацию динамически с помощью специальной команды.

И наконец, каждый агент может работать как серверный компонент, который получает пакеты от других агентов, парсит запросы и направляет их на другой заранее указанный командный сервер. Благодаря этой функции атакующие могут строить цепочки серверов и обмениваться данными с агентами без прямого подключения к интернету. Кроме того, можно избежать обнаружения в сети, перенаправляя весь вредоносный трафик, сгенерированный в пределах целевой корпоративной сети, через уникальный узел, не привлекая внимания к операциям на всех скомпрометированных системах.

Загрузчик

Мы ни разу не наблюдали, чтобы троянец Ninja хранился в файловой системе — как правило, он загружался в память другим компонентом. Загрузчик обычно представляет собой исполняемый файл, во многом похожий на библиотеку iiswmi.dll и установщики Samurai, такие как упомянутый ранее debug.exe.

Загрузчик полагается на ту же «специальную функцию разрешения» для вызова Windows API и расшифровывает файл полезной нагрузки с помощью алгоритма 3DES со 112-разрядным ключом, а затем распаковывает расшифрованные данные посредством алгоритма LZSS.

Получившаяся полезная нагрузка является библиотекой, которая будет размечаться в памяти без заголовка DOS и вызываться через экспортируемую функцию Debug.

Мы наблюдали несколько вариаций инструмента и отметили его эволюцию в течение года. В первых образцах не было некоторых функций, например поддержки множества сессий на стороне клиента и обмена данными по протоколам HTTP и HTTPS. Также немного отличалась структура встроенной конфигурации.

В этой статье будет рассматриваться самая последняя обнаруженная версия.

Конфигурация

Зловред начинает работу с извлечения параметров конфигурации из зашифрованной полезной нагрузки, встроенной в бинарный файл, которая подверглась операции XOR с константным значением 0xAA и была сжата по алгоритму LZSS.

Проанализированная конфигурация включает список из 15 элементов со следующими значениями:

Параметр Описание
2B847033-C95F-92E3-D847-29C6AE934CDC Имя мьютекса, гарантирующего атомарное исполнение.
C2_INFO В этой структуре содержится информация для взаимодействия с командными серверами.
/Collector/3.0/ Путь URL, используемый для протоколов HTTP и HTTPS.
Content-Type: application/x-www-form-urlencoded Заголовок HTTP, используемый для протоколов HTTP и HTTPS.
Host: mobile.pipe.microsoft.com:8080 Заголовок HTTP, используемый для протоколов HTTP и HTTPS.
Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv 11.0) like Gecko Поле User-Agent, используемое для протоколов HTTP и HTTPS.
0 Часы начала работы.
0 Минуты начала работы.
0 Секунды начала работы.
0 Часы остановки работы.
0 Минуты остановки работы.
0 Секунды остановки работы.
0 Интервал обмена данными с командным сервером через TCP.
300 Интервал обмена данными с командным сервером через HTTP.
0 Порт локального сервера.

Первый элемент — имя мьютекса. Строка может выглядеть как угодно, но обычно — как значение GUID. C2_INFO представляет собой строку со множеством значений, структурированных в специальном порядке.

Конфигурация HTTP

Атакующий также может указать произвольные заголовки для протокола HTTP и путь URL, чтобы замаскироваться под легитимные сервисы и скрыть вредоносный трафик. Приведенные в примере значения позволяют генерировать запросы следующего вида:

Предположительно злоумышленники пытались сымитировать поведение Microsoft Teams, но в этом случае они ошиблись в заголовках User-Agent и Host.

Параметры командного сервера

Структура C2_INFO содержит несколько параметров, приведенных в следующем формате:

В качестве протокола указывается численное значение, определяющее протокол связи:

  • HTTP;
  • HTTPS;
  • TCP.

Поля имени хоста и порта командного сервера говорят сами за себя.

Тип прокси может принимать три разных числовых значения:

  • нет прокси, прямое подключение к командному серверу;
  • системный прокси;
  • указанный вручную прокси.

Если указанное значение равно трем, агент попытается декодировать строку base64 из поля «данные_прокси», содержимое которого напрямую зависит от заданного протокола. В случае протокола HTTP или HTTPS указывается следующая информация:

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

На основе этих параметров агент должен установить соединение с командным сервером.

Конфигурация времени работы

Агент Ninja оснащен интересной функцией «время работы», благодаря которой зловред будет функционировать только в определенный промежуток времени. Например, его можно сконфигурировать на работу только с 9 часов утра и до 6 часов вечера, то есть в стандартное рабочее время. Благодаря этой функции можно избежать обнаружения зловреда специализированными защитными решениями, которые выявляют подозрительное поведение. Если все значения равны нулю, функция отключается и агент может работать в любое время. Атакующий может удаленно задать эти параметры с помощью специальной команды.

Локальный сервер

Последнее значение — порт локального сервера. Когда включена функция локального сервера, агент выполняет роль командного сервера. Он ожидает соединений с другими агентами, декодирует полученные запросы и перенаправляет их на удаленный командный сервер. Вероятнее всего, эта функция применяется для продвижения в целевой локальной сети (pivoting) и для доступа к другим внутренним системам через скомпрометированный компьютер. Это значение также может изменить атакующий с помощью специальной команды.

Протокол связи

Коммуникации зловреда защищены серией алгоритмов шифрования и кодирования, которая может немного различаться в зависимости от протокола, HTTP или TCP.

В обоих протоколах используется следующий формат сообщений:

Сегмент «ID_сообщения» изменяется с учетом типа команды, а «полезная_нагрузка_сообщения» содержит реальную полезную нагрузку в сжатом виде, которая подверглась операции XOR со статическим значением 0x3F и была закодирована по алгоритму base64 с произвольным алфавитом.

Результирующее сообщение затем проходит шифрование AES-256 с ключом сессии, сгенерированным путем выбора двух случайных символов из алфавита base64. Хеш SHA1, участвующий в AES-шифровании, агент генерирует из случайных символов.

Зашифрованные данные снова кодируются по алгоритму base64, после чего получившаяся строка присоединяется к ранее сгенерированному случайному символу, что позволит серверу расшифровать информацию.

Если агент должен использовать протокол HTTP/S, эти данные включаются в стандартные POST-запросы.

Если же командный сервер обменивается данными через протокол TCP, агент сначала отправит первый пакет с константным значением 0x6CC8DF01, а затем — остальные пакеты со сгенерированной полезной нагрузкой. Сервер должен ответить пакетом с тем же константным значением 0x6CC8DF01, а затем прислать остальные пакеты, зашифрованные по тем же алгоритмам. Константное значение не всегда одинаково и может меняться в разных вариациях зловреда.

Первое сообщение отправляется с «ID_сообщения», равным 10001, и содержит информацию о зараженной системе и конфигурации агента.

  • Сведения о системе (собранные с помощью функции Kernel32.GetNativeSystemInfo)
  • Сведения об ОС (собранные с помощью функции Ntdll.RtlGetVersion)
  • Имя компьютера
  • Локальный IP-адрес
  • Путь к файлу агента
  • PID агента
  • Время бездействия агента
  • Конфигурация командного сервера агента (имя хоста командного сервера, порт и данные прокси)

Команды

Ответ сервера обычно имеет следующую структуру:

  • магическая константа 0x887766;
  • число команд;
  • список команд.

Магическая константа представлена целочисленным значением, которое меняется в разных версиях зловреда. Список команд является массивом, для каждого элемента в котором атакующий может указать:

  • ID команды;
  • размер аргументов;
  • аргументы.

Значения аргументов меняются в зависимости от ID команды, но обычно представлены в виде строк со множеством значений, разделенных символом «*».

ID команды Описание ID ответа
20000 Активация сессии
20001 Деактивация сессии
20002 Обновление времени бездействия
20003 Завершение работы бота
20004 Выполнение программы от имени пользователя
20005 Задание порта локального сервера
20006 Безопасный выход
20010 Терминал: начало новой сессии 30010
20011 Терминал: обработка команды 30011
20012 Терминал: закрытие сессии 30012
20013 Терминал: завершение работы дерева сессии 30013
20020 Файлы: получение списка накопителей 30020
20021 Файлы: получение содержимого каталога 30021
20022 Файлы: создание каталога 30022
20023 Файлы: удаление файла 30023
20024 Файлы: удаление каталога 30024
20025 Файлы: перемещение файла 30025
20026 Файлы: изменение времени создания, последнего доступа или последней записи 30026
20030 Файлы: чтение файла 30030
20031 Файлы: запись файла 30031
20040 Прокси: начало сессии 30040
20041 Прокси: разрешение записи в сокет 30041
20042 Прокси: передача данных 30042
20043 Прокси: получение данных 30043
20044 Прокси: закрытие сессии 30044
20045 Прокси: повторное подключение 30045
20050 Вывод списка процессов (имя файла | PID | число потоков) 30050
20051 Завершение работы процессов по списку
20052 Внедрение процесса 30052
20053 Плагины: загрузка 30053
20054 Плагины: чтение результата 30054
20055 Плагины: выгрузка 30055
20056 Вывод списка процессов (ID сессии \ PID \ домен \ имя пользователя) 30056
20060 Внедрение: начало новой сессии 30060
20061 Внедрение: список активных сессий 30061
20062 Внедрение: закрытие сессии 30062
20064 Внедрение: внедрение кода в новый процесс 30064
20065 Внедрение: считывание pobject 30065
20068 Внедрение: считывание create_object 30068
21000 Настройка времени работы 31000

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

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

Команды в категориях «Терминал», «Прокси» и «Внедрение» поддерживают несколько параллельных сессий, что в теории позволяет нескольким операторам работать с целевым компьютером одновременно. Агент управляет тремя структурами, соответствующими этим трем категориям команд.

Например, если атакующий захочет начать сессию терминала, он должен воспользоваться командой 20010, которая приведет к созданию агентом нового процесса и новых каналов, необходимых для перенаправления стандартных входных и выходных данных. Атакующий должен указать ID сессии терминала, значение которого будет внесено в локальный массив со списком активных сессий. В случае успешного выполнения команды агент пришлет ответ со списком, включающим такие данные, как новый PID и дескрипторы каналов.

Команда 20011 позволяет считывать данные из каналов и записывать в них. Злоумышленник должен предоставить корректные ID сессии терминала, ID события и дескрипторы канала. Прежде чем обработать команду, агент проверит предоставленные ID на корректность, сравнив их значения с теми, которые хранятся в локальной структуре.

Команда 20012 предназначена для закрытия активной сессии, удаления ID сессии из локального массива, завершения работы запущенных процессов и закрытия дескрипторов канала. По такому же принципу реализовано управление командами категории «Прокси», которые позволяют перенаправлять пакеты на другие удаленные хосты через протокол TCP.

Команды категории «Плагины» дают возможность загружать другие неизвестные библиотеки в адресное пространство процесса агента. У нас нет сведений о других модулях, но мы предполагаем, что они имеют вид дополнительных плагинов, расширяющих арсенал атакующего.

Посредством статического анализа мы выяснили, что библиотеки должны экспортировать по меньшей мере три функции: GET, RUN и CLOSE, а затем передавать данные в главный процесс с помощью объекта файла, отображаемого в памяти.

По причине существенных различий команда внедрения процесса (20052) не входит в набор команд категории «Внедрение», что порождает некоторую путаницу. Эта команда позволяет внедрять произвольный шелл-код в запущенный процесс, а упомянутый набор команд — внедрять другой модуль агента в новый процесс, указанный атакующим. Внедренный код должен обмениваться данными с главным агентом посредством специальных объектов файлов, отображаемых в памяти, и по своей природе не является произвольным шелл-кодом.

Атакующий начинает новую сессию внедрения командой 20060, по сути предоставляя шелл-код, внедряемый в новую программу, путь к которой задается командой 20064.

Команда «Внедрение: внедрение кода в новый процесс» приведет к запуску агентом программы, указанной атакующим. Эта программа будет создана в приостановленном состоянии, и агент запишет шелл-код в новый участок памяти в созданном процессе.

Затем зловред извлечет контекст удаленного потока, чтобы узнать адрес указателя инструкции и заменить ее по этому смещению на следующие:

Наконец, код продолжит удаленный процесс, который впоследствии выполнит внедренный код.

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

Другие кампании и варианты

Другие варианты

В процессе исследования мы обнаружили несколько разновидностей загрузчиков и установщиков, которые применялись в различных кампаниях и совершенствовались в течение 2021 года.

Установщики

Все установщики действуют по схожей логике: они загружают полезную нагрузку из внешнего файла, который обычно расположен в том же каталоге и обладает одним из следующих имен в зависимости от разновидности зловреда:

  • debug.xml
  • web.xml
  • access.log
  • cache.dat
  • reg.txt
  • logo.jpg

Файлы всегда расшифровываются по одному и тому же алгоритму (CALG_3DES_112), но сами данные обычно заготавливаются с учетом специфики жертвы.

Все установщики создают новую службу с именем и описанием, которые указаны в зашифрованном файле. Также они задают значение (httpsvc или w3esvc) в следующем разделе реестра Windows:

Вследствие этого процесс svchost.exe будет автоматически запускать вредоносную службу и загружать ее код в адресное пространство легитимного процесса. В значениях реестра содержится название вредоносной службы. Основная разница между вариациями установщиков заключается в финальной полезной нагрузке. Наши первоначальные исследования показали, что первые вариации (с декабря 2020 года по май 2021 года) были сконфигурированы таким образом, чтобы хранить свою полезную нагрузку внутри раздела реестра, такого как:

Начиная с марта нам также попадались новые версии, которые скрывали финальный бэкдор внутри других зашифрованных файлов, хранящихся в файловой системе. В большинстве случаев загрузчик второго этапа размещался по одному из следующих путей:

  • %System32%\Triedit.dll
  • %System32%\fveapi.dll

А загрузчик третьего этапа и зашифрованная полезная нагрузка размещались по следующим путям:

  • %WINDIR%\Microsoft.NET\Framework\sbs_clrhost.dll
  • %WINDIR%\Microsoft.NET\Framework\sbs_clrhost.dat
  • %WINDIR%\Microsoft.NET\Framework\Util.dll
  • %WINDIR%\Microsoft.NET\Framework\Util.dat

С сентября 2021 года нам стали попадаться новые образцы, которые снова конфигурировались на хранение финальной полезной нагрузки в реестре Windows, но вместо применения статических значений раздела реестра они динамически генерировали название раздела в ветке $HKLM\SOFTWARE\Classes\Interface\ на основе серийного номера дискового накопителя:

Фрагмент кода, создающий раздел реестра на основе серийного номера тома

Фрагмент кода, создающий раздел реестра на основе серийного номера тома

В каждом новом образце были другие константы, участвующие в генерации конечного названия раздела реестра.

Загрузчики

Загрузчики являют собой базовые инструменты, отвечающие за расшифровку полезных нагрузок по алгоритму 3DES и их загрузку в память. Со временем они также претерпевали изменения наряду с установщиками, адаптируясь к используемому методу хранения финальной полезной нагрузки.

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

Другие же загрузчики настраивались для загрузки полезной нагрузки из реестра и ее передачи библиотеке третьего этапа.

Некоторые варианты оснащались функцией, которая способна напрямую исполнять код .NET во время выполнения, не полагаясь на другую внешнюю библиотеку третьего этапа.

Нам встречались и другие загрузчики, которые преимущественно применялись на персональных компьютерах для загрузки троянца Ninja.

Другие атаки на персональные компьютеры

Первые волны атак были направлены исключительно на серверы Microsoft Exchange, но с сентября 2021 года атакующие стали применять новую подгруппу загрузчиков, выявленных нами на компьютерах в Центральной Азии под такими именами, как «01.09.2021 г..exe», «03.09.2021 г.exe», «нота мид кр регламент.exe» и «Тех.Инструкции.exe».

Эти загрузчики запускали компонент Ninja и распространялись через популярный мессенджер Telegram в виде исполняемых файлов, запакованных в ZIP-архив.

Полезную нагрузку они загружают из другого файла, license.txt, который должен располагаться в том же каталоге. Затем зловред применяет ранее описанную «специальную функцию разрешения» для вызова Windows API и расшифровывает файл полезной нагрузки с помощью алгоритма 3DES со 112-разрядным ключом, а затем распаковывает расшифрованные данные.

Получившаяся полезная нагрузка является библиотекой Ninja, которая будет размечаться в памяти без заголовка DOS и вызываться через экспортируемую функцию Debug.

Как обнаружить бэкдор Samurai

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

Как уже было сказано, вредоносный код загружается легитимным процессом svchost.exe, то есть бэкдор невозможно обнаружить простым прочесыванием списка процессов.

Более того, бэкдор нельзя вычислить путем прослушивания открытых портов TCP, так как он задействует класс .NET HTTPListener, который основан на HTTP.sys и позволяет различным процессам совместно пользоваться одним и тем же портом. В случае бэкдора Samurai используются порты 80 и 443, которыми также пользуется Microsoft Exchange.

Наша защита детектирует этот бэкдор как HEUR:Backdoor.MSIL.Samurai.gen, но если вы по какой-то причине не пользуетесь нашей продукцией, самый простой способ выяснить, запущен ли бэкдор в системе, — попробовать найти один из индикаторов компрометации, приведенных в этой статье, или выполнить следующую команду:

Согласно описанию Microsoft, эта команда выводит снимок состояния службы HTTP, в котором можно попытаться найти подозрительные зарегистрированные URL-адреса следующего вида:

Жертвы

На основе собранных данных мы знаем, что группа ToddyCat сосредоточила свои усилия на высокостатусных целях, преимущественно на правительственных и военных организациях, включая военных подрядчиков.

Атаки, имевшие место до февраля 2021 года, были нацелены против небольшого числа государственных организаций следующих стран:

  • Тайвань
  • Вьетнам

Как только была обнародована уязвимость ProxyLogon, количество обнаружений по всему миру резко возросло, и мы также зафиксировали жертвы в следующих странах:

  • Афганистан
  • Индия
  • Иран
  • Малайзия
  • Пакистан
  • Россия
  • Словакия
  • Таиланд
  • Великобритания

С марта 2021 года нам встречались другие вариации и кампании, которые мы приписали той же APT-группе и которые затронули большинство упомянутых ранее стран Азии, а также следующие страны:

  • Киргизия
  • Узбекистан
  • Индонезия

Атрибуция

К сожалению, нам не удалось связать эти атаки с какой-либо известной APT-группой, поэтому мы отнесли эту активность к новой группе, названной нами ToddyCat.

В ходе расследований мы отметили, что жертвы ToddyCat имеют отношение к странам и отраслям, на которые обычно нацеливаются множество различных китайскоязычных групп. Более того, мы стали свидетелями компрометации трех различных высокостатусных организаций за схожий временной промежуток группой ToddyCat и другой китайскоязычной APT-группой, которую мы называем FunnyDream.

Такое совпадение привлекло наше внимание, поскольку, согласно нашей телеметрии, вредоносный кластер ToddyCat редко появляется на радарах, но несмотря на это, одни и те же цели в трех разных странах были скомпрометированы двумя упомянутыми APT-группами. Более того, во всех упомянутых случаях наблюдалась некая близость используемых путей, а в одном из случаев они использовали одну и ту же директорию.

Цель 1

C:\ProgramData\Microsoft\DRM\rundll.dll — FunnyDream

C:\ProgramData\Microsoft\mf\svchost.dll — ToddyCat

Цель 2

C:\ProgramData\adobe\avps.exe — FunnyDream

C:\ProgramData\adobe\2.dll — ToddyCat

Несмотря на пересечения, на данный момент у нас нет достаточной уверенности для слияния кластера активности ToddyCat с FunnyDream. Учитывая высокий ранг всех обнаруженных нами жертв, вполне вероятно, что они являлись предметом интереса нескольких APT-групп. Хотя и наблюдается некое сходство в путях размещения, у нас нет весомых доказательств прямого взаимодействия двух семейств зловредов (допустим, когда одно семейство развертывало другое), а вышеупомянутые директории часто используются многими злоумышленниками.

Выводы

ToddyCat — это продвинутая APT-группа, которая задействует множество механизмов обхода обнаружения и таким образом не привлекает к себе лишнего внимания. В ходе расследования нам удалось собрать множество образцов, но несмотря на количество файлов и высокую продолжительность активности, мы не смогли связать эти атаки с какой-либо известной группой и выяснить многие технические аспекты операций.

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

Согласно данным нашей телеметрии, группа проявляет повышенный интерес к целям в Юго-Восточной Азии, но их активность также затрагивает цели в Европе и остальной части Азии.

Мы продолжим следить за действиями этой группы и держать вас в курсе своих находок.

Дополнительная информация об индикаторах компрометации и правилах YARA для группы ToddyCat доступна клиентам сервиса Kaspersky Intelligence Reporting. Обращайтесь по адресу intelreports@kaspersky.com.

Индикаторы компрометации (IoC)

5cfdb7340316abc5586448842c52aabc Дроппер, google.log
93c186c33e4bbe2abdcc6dfea86fbbff Дроппер
5a912beec77d465fc2a27f0ce9b4052b DLL — загрузчик 2-го этапа, iiswmi.dll
f595edf293af9b5b83c5ffc2e4c0f14b DLL — загрузчик 3-го этапа, websvc.dll
5a531f237b8723396bcfd7c24885177f DLL — загрузчик 2-го этапа, fveapi.dll
1ad6dccb520893b3831a9cfe94786b82 DLL — загрузчик 2-го этапа, fveapi.dll
f595edf293af9b5b83c5ffc2e4c0f14b DLL — загрузчик 3-го этапа, sbs_clrhost.dll
8a00d23192c4441c3ee3e56acebf64b0 Бэкдор Samurai
5e721804f556e20bf9ddeec41ccf915d Троянец Ninja

Другие варианты
33694faf25f95b4c7e81d52d82e27e7b 1.dll — установщик
832bb747262fed7bd45d88f28775bca6 «Техинстр egov — ГЦП — Акрамов.exe» — загрузчик
8fb70ba9b7e5038710b258976ea97c98 «28.09.2021. Управление ИР и ИС.exe» — загрузчик
ee881e0e8b496bb62ed0b699f63ce7a6 Загрузчик
ae5d2cef136ac1994b63c7f8d95c9c84 Загрузчик
5c3bf5d7c3a113ee495e967f236ab614 System.Core.dll — загрузчик
bde2073dea3a0f447eeb072c7e568ee7 wabext.dll — загрузчик
350313b5e1683429c9ffcbc0f7aebf3b rcdll.dll — загрузчик

Командный сервер Ninja
149.28.28[.]159
eohsdnsaaojrhnqo.windowshost[.]us

Пути к файлам
C:\inetpub\temp\debug.exe
C:\Windows\Temp\debug.exe
C:\Windows\Temp\debug.xml
C:\Windows\Microsoft.NET\Framework64\v2.0.50727\Temporary ASP.NET Files\web.exe
C:\Users\Public\Downloads\dw.exe
C:\Users\Public\Downloads\chrome.log
C:\Windows\System32\chr.exe
C:\googleup.exe
C:\Program Files\microsoft\exchange server\v15\frontend\httpproxy\owa\auth\googleup.log
C:\google.exe
C:\Users\Public\Downloads\x64.exe
C:\Users\Public\Downloads\1.dll
C:\Program Files\Common Files\microsoft shared\WMI\iiswmi.dll
C:\Program Files\Common Files\microsoft shared\Triedit\Triedit.dll
C:\Program Files\Common Files\System\websvc.dll
C:\Windows\Microsoft.NET\Framework\sbs_clrhost.dll
C:\Windows\Microsoft.NET\Framework\sbs_clrhost.dat
C:\Windows\Microsoft.NET\Framework64\v2.0.50727\Temporary ASP.NET Files\web.xml
C:\Users\Public\Downloads\debug.xml
C:\Users\Public\Downloads\cache.dat
C:\Windows\System32\config\index.dat
C:\Windows\Microsoft.NET\Framework\netfx.dat
%ProgramData%\adobe\2.dll
%ProgramData%\adobe\acrobat.exe
%ProgramData%\git\git.exe
%ProgramData%\intel\mstacx.dll
%ProgramData%\microsoft\drm\svchost.dll
%ProgramData%\microsoft\mf\svchost.dll
%ProgramData%\microsoft\mf\svhost.dll
%program files%\Common Files\services\System.Core.dll
%public%\Downloads\1.dll
%public%\Downloads\config.dll
%system%\Triedit.dll
%userprofile%\Downloads\Telegram Desktop\03.09.2021 г.zip
%userprofile%\Downloads\Telegram Desktop\Тех.Инструкции.zip
%userprofile%\libraries\1.dll
%userprofile%\libraries\chrome.exe
%userprofile%\libraries\chrome.log
%userprofile%\libraries\config.dll
C:\intel\2.dll
C:\intel\86.dll
C:\intel\x86.dll

Разделы реестра
$HKLM\System\ControlSet\Services\WebUpdate
$HKLM\System\ControlSet\Services\PowerService
$HKLM\SOFTWARE\Classes\Interface\{6FD0637B-85C6-D3A9-CCE9-65A3F73ADED9}
$HKLM\SOFTWARE\Classes\Interface\{AFDB6869-CAFA-25D2-C0E0-09B80690F21D}

ToddyCat: неизвестная APT-группа, нацеленная на организации Европы и Азии

Ваш e-mail не будет опубликован. Обязательные поля помечены *

 

  1. Дина

    Благодарю за предупреждение! Я вас очень люблю и все ваши продуты тоже.

Отчеты

StripedFly: двуликий и незаметный

Разбираем фреймворк StripedFly для целевых атак, использовавший собственную версию эксплойта EternalBlue и успешно прикрывавшийся майнером.

Азиатские APT-группировки: тактики, техники и процедуры

Делимся с сообществом подходами, которые используют азиатские APT-группировки при взломе инфраструктуры, и подробной информацией о тактиках, техниках и процедурах (TTPs) злоумышленников, основанной на методологии MITRE ATT&CK.

Как поймать «Триангуляцию»

Эксперты «Лаборатории Касперского» смогли получить все этапы «Операции Триангуляция»: эксплойты нулевого дня для iOS, валидаторы, имплант TriangleDB и дополнительные модули.

Подпишитесь на еженедельную рассылку

Самая актуальная аналитика – в вашем почтовом ящике