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
Дроппер сконфигурирован для загрузки зашифрованной полезной нагрузки, хранящейся в другом файле — 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 |
После извлечения значений из файла зловред выполняет серию операций, чтобы подготовить к работе следующий компонент в цепочке заражения:
- Пытается создать каталог %COMMONPROGRAMFILES%\Microsoft Shared\wmi\, содержащий DLL-библиотеку для следующего этапа.
- Проверяет, существует ли уже служба, необходимая на следующем этапе, и если да, то пытается ее остановить.
- Проверяет, установлен ли .NET Framework v2.0, пытаясь открыть следующий раздел реестра: SOFTWARE\Microsoft\.NETFramework\policy\v2.0
- Если раздел существует, зловред внедряет компонент DotNet_Loader_v2_Payload по пути %COMMONPROGRAMFILES%\System\websvc.dll. В противном случае он сохраняет DotNet_Loader_v4_Payload по тому же пути.
- Сохраняет DLL-загрузчик, выполняющий полезную нагрузку второго этапа, по пути %COMMONPROGRAMFILES%\microsoft shared\WMI\iiswmi.dll.
- Как только перечисленные файлы будут сохранены, зловред попытается создать указанный ниже раздел реестра, чтобы закрепиться в системе. Значение параметра в этом разделе указывает имя службы, создаваемой для запуска исполняемого файла. В примере ниже связанный со службой процесс после запуска ассоциируется с командной строкой %SystemRoot%\System32\svchost.exe -k httpsvc.
123Раздел реестра: HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SvcHostИмя параметра: httpsvcЗначение: WebUpdate - После создания службы зловред пытается сконфигурировать DLL-библиотеку второго этапа и точку входа внутри нее, которая будет вызываться при запуске службы. Для этого перечисленным разделам реестра присваиваются следующие значения:
1234567Раздел реестра: $HKLM\System\ControlSet\Services\WebUpdate\ParametersИмя параметра: ServiceDllЗначение: %ProgramFiles%\Common Files\microsoft shared\WMI\iiswmi.dllРаздел реестра: $HKLM\System\ControlSet\Services\WebUpdate\ParametersИмя параметра: ServiceMainЗначение: INIT - Зловред сохраняет последнюю в цепочке заражения полезную нагрузку в виде сжатого и зашифрованного блока данных в кодировке base64 в следующем разделе реестра:
123Раздел реестра: $HKLM\SOFTWARE\Classes\Interface\{6FD0637B-85C6-D3A9-CCE9-65A3F73ADED9}Имя параметра:Значение: ILQ3Pz8/Pz87P9IFVEskWKpIeTB0jZx5SVXYXhh1fG...%зашифрованные данные%
Этап 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
Этап 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
Зловред начинает свою работу с расшифровки данных конфигурации, переданных в качестве входного аргумента. Они представлены в кодировке base64 и зашифрованы по алгоритму DES с использованием жестко заданного ключа 90 EE 0C E1 6C 0D C9 0C. Результирующая полезная нагрузка представляет собой файл конфигурации, подготовленный злоумышленниками с учетом специфики жертвы. Он содержит множество строк с параметрами, которые определяют поведение бэкдора.
Ниже приведен пример структуры файла конфигурации:
1 2 3 4 |
ключевое_слово_xyz C:\Windows\Temp\ http://*:80/owa/auth/sslauth/ https://*:443/owa/auth/sslauth/ |
Первая строка содержит ключевое слово, которое было включено в принятый POST-запрос в виде переменной. Оно служит маркировкой, по которой бэкдор определяет, что файл подлежит обработке, а также используется в определении важных параметров сессии, таких как AES-ключ сессии и список с именами переменных, содержащих данные для последующей обработки.
В некоторых вариациях зловреда во второй строке указывается путь к каталогу, значение которого впоследствии переопределяет переменную окружения TEMP. Все остальные строки представляют собой префиксы URI, которые нужны для настройки компонента HTTPListener. Каждая такая строка состоит из таких элементов, как схема (HTTPS или HTTPS), хост, порт (необязательный параметр) и путь (необязательный параметр, определяющий, какой запрос будет обработан объектом HTTPListener).
В нескольких случаях префиксы URL, указанные в конфигурации, включали домен жертвы, как в следующем примере: https://mail.%скрыто%.gov.%скрыто%/owa/auth/sslauth.
Сразу после успешной дешифровки конфигурации бэкдор запускает в соответствии с ней обработчики событий (listener) и ожидает входящих запросов. Запрос должен иметь структуру как в следующем примере:
1 2 3 4 5 6 7 |
POST /owa/auth/sslauth/ HTTP/1.0 Хост: example.xyz Заголовки... ключевое_слово_xyz={AES_ключ_сессии,переменная2,переменная3}&переменная2=[исходный код на C#]&переменная3=[аргумент_для_скомпилированной_программы\r\nссылка_на_сборку1; ссылка_на_сборку2] |
Где:
1 2 3 4 5 6 7 |
{} = зашифровано с помощью ключа AES по умолчанию + закодировано по алгоритму base64 [] = зашифровано с помощью ключа AES сессии + закодировано по алгоритму base64 ### Входная конфигурация ### ключевое_слово_xyz C:\Windows\Temp\ http://*:80/owa/auth/sslauth/ |
Тело запроса должно включать три значения, одно из которых соответствует ключевому слову, извлеченному из конфигурации на входе. Связанное значение должно быть представлено в кодировке base64 и зашифровано по алгоритму AES с помощью заранее определенного ключа. В получившейся строке будет три значения, разделенных запятой: первое из них является еще одним ключом AES, необходимым для расшифровки других значений POST, второе — это имя переменной, содержащей исходный код на C#, а третье — имя переменной с аргументами и списком ссылок на сборки, которые нужно добавить в скомпилированный проект.
После компиляции бэкдор пытается вызвать метод run из класса core, который должен присутствовать в полученной программе. Вызываемый метод ожидает на входе два аргумента:
- первый представляет собой словарь, содержащий ключ с именем samurai, значением которого является путь к текущему рабочему каталогу;
- второй — значение, передаваемое злоумышленником в третьем элементе POST-запроса.
Если запрос корректный и код удалось исполнить, бэкдор направляет ответ с кодом HTTP 200 и включает в тело ответа результат, сгенерированный вызванной сборкой .NET. Сообщение будет зашифровано по алгоритму AES с помощью ключа сессии и представлено в кодировке base64.
Загруженные модули
В ходе расследования нам удалось обнаружить несколько модулей, загруженных атакующими и скомпилированных бэкдором Samurai:
Модуль | Описание |
Модуль удаленных команд | Выполнение произвольных команд через командную строку Windows (cmd.exe). |
Модуль составления списка файлов | Получение списка файлов и каталогов по определенному пути, указанному атакующим в качестве аргумента. |
Модуль эксфильтрации файлов | Загрузка произвольных файлов, находящихся на скомпрометированных компьютерах. |
Модуль соединения с прокси | Установление подключения к удаленному IP-адресу и TCP-порту, которые заданы в коде. |
Обработчик прокси | Перенаправление полезной нагрузки, полученной в HTTP-запросе, на удаленный IP-адрес и наоборот. |
Стоит отметить, что аргументы, передаваемые модулям, в некоторых случаях являются структурами в особых форматах. Все модули должны включать метод run, ожидающий два аргумента: словарь с ключевым словом samurai с текущим рабочим каталогом и строку, предоставленную атакующим. Строка должна представлять собой список значений, разделенных точкой с запятой («;»).
В качестве примера мы приводим корректную строку, принимаемую модулем удаленных команд:
1 |
Y21kLmV4ZQ==;ZGlyICVNQUxESVIlXCoubXdy;TUFMRElSPUM6XE1hbGRpcg== |
Строка содержит три разных поля, отдельно закодированных по алгоритму base64. После раскодирования она принимает следующий вид:
1 |
cmd.exe;dir %MALDIR%\*.mwr;MALDIR=C:\Maldir |
Первое значение — название выполняемой программы, второе — аргумент, передаваемый новому процессу, и последнее — переменная окружения.
Громоздкий процесс администрирования бэкдора 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, чтобы замаскироваться под легитимные сервисы и скрыть вредоносный трафик. Приведенные в примере значения позволяют генерировать запросы следующего вида:
1 2 3 4 5 6 |
POST /Collector/3.0/ HTTP/1.1 Content-Type: application/x-www-form-urlencoded Host: mobile.pipe.microsoft.com:8080 User-Agent: Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv 11.0) like Gecko Content-Length: 430 Cache-Control: no-cache |
Предположительно злоумышленники пытались сымитировать поведение Microsoft Teams, но в этом случае они ошиблись в заголовках User-Agent и Host.
Параметры командного сервера
Структура C2_INFO содержит несколько параметров, приведенных в следующем формате:
1 |
%протокол% \r %имя_хоста_командного_сервера% \r %порт_командного_сервера% \r %тип_прокси% \r данные_прокси |
В качестве протокола указывается численное значение, определяющее протокол связи:
- HTTP;
- HTTPS;
- TCP.
Поля имени хоста и порта командного сервера говорят сами за себя.
Тип прокси может принимать три разных числовых значения:
- нет прокси, прямое подключение к командному серверу;
- системный прокси;
- указанный вручную прокси.
Если указанное значение равно трем, агент попытается декодировать строку base64 из поля «данные_прокси», содержимое которого напрямую зависит от заданного протокола. В случае протокола HTTP или HTTPS указывается следующая информация:
1 |
%адрес_прокси% : %порт_прокси% \t %имя_пользователя_для_прокси% \t %пароль_для_прокси% |
Если используется протокол TCP, в раскодированной строке может быть цепочка прокси, насчитывающая до 255 транзитных узлов.
1 2 3 4 5 6 7 8 9 |
%адрес_прокси% \t %порт_прокси% \t %удаленный_хост% \t %удаленный_порт% \r %адрес_прокси% \t %порт_прокси% \t %удаленный_хост% \t %удаленный_порт% \r %адрес_прокси% \t %порт_прокси% \t %удаленный_хост% \t %удаленный_порт% \r %адрес_прокси% \t %порт_прокси% \t %удаленный_хост% \t %удаленный_порт% \r …до 255 записей |
На основе этих параметров агент должен установить соединение с командным сервером.
Конфигурация времени работы
Агент Ninja оснащен интересной функцией «время работы», благодаря которой зловред будет функционировать только в определенный промежуток времени. Например, его можно сконфигурировать на работу только с 9 часов утра и до 6 часов вечера, то есть в стандартное рабочее время. Благодаря этой функции можно избежать обнаружения зловреда специализированными защитными решениями, которые выявляют подозрительное поведение. Если все значения равны нулю, функция отключается и агент может работать в любое время. Атакующий может удаленно задать эти параметры с помощью специальной команды.
Локальный сервер
Последнее значение — порт локального сервера. Когда включена функция локального сервера, агент выполняет роль командного сервера. Он ожидает соединений с другими агентами, декодирует полученные запросы и перенаправляет их на удаленный командный сервер. Вероятнее всего, эта функция применяется для продвижения в целевой локальной сети (pivoting) и для доступа к другим внутренним системам через скомпрометированный компьютер. Это значение также может изменить атакующий с помощью специальной команды.
Протокол связи
Коммуникации зловреда защищены серией алгоритмов шифрования и кодирования, которая может немного различаться в зависимости от протокола, HTTP или TCP.
В обоих протоколах используется следующий формат сообщений:
1 |
ID_сообщения@полезная_нагрузка_сообщения |
Сегмент «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.
Команда «Внедрение: внедрение кода в новый процесс» приведет к запуску агентом программы, указанной атакующим. Эта программа будет создана в приостановленном состоянии, и агент запишет шелл-код в новый участок памяти в созданном процессе.
Затем зловред извлечет контекст удаленного потока, чтобы узнать адрес указателя инструкции и заменить ее по этому смещению на следующие:
1 2 3 4 5 |
dec eax sub esp, 40h dec eax mov eax, %адрес_шелл-кода% call eax |
Наконец, код продолжит удаленный процесс, который впоследствии выполнит внедренный код.
Затем с помощью команд 20065 и 20068 производится считывание данных из объектов файлов, отображаемых в памяти, в которых должна содержаться информация, сгенерированная внедренным кодом.
Другие кампании и варианты
Другие варианты
В процессе исследования мы обнаружили несколько разновидностей загрузчиков и установщиков, которые применялись в различных кампаниях и совершенствовались в течение 2021 года.
Установщики
Все установщики действуют по схожей логике: они загружают полезную нагрузку из внешнего файла, который обычно расположен в том же каталоге и обладает одним из следующих имен в зависимости от разновидности зловреда:
- debug.xml
- web.xml
- access.log
- cache.dat
- reg.txt
- logo.jpg
Файлы всегда расшифровываются по одному и тому же алгоритму (CALG_3DES_112), но сами данные обычно заготавливаются с учетом специфики жертвы.
Все установщики создают новую службу с именем и описанием, которые указаны в зашифрованном файле. Также они задают значение (httpsvc или w3esvc) в следующем разделе реестра Windows:
1 |
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SvcHost |
Вследствие этого процесс svchost.exe будет автоматически запускать вредоносную службу и загружать ее код в адресное пространство легитимного процесса. В значениях реестра содержится название вредоносной службы. Основная разница между вариациями установщиков заключается в финальной полезной нагрузке. Наши первоначальные исследования показали, что первые вариации (с декабря 2020 года по май 2021 года) были сконфигурированы таким образом, чтобы хранить свою полезную нагрузку внутри раздела реестра, такого как:
1 2 |
$HKLM\SOFTWARE\Classes\Interface\{6FD0637B-85C6-D3A9-CCE9-65A3F73ADED9} $HKLM\SOFTWARE\Classes\Interface\{AFDB6869-CAFA-25D2-C0E0-09B80690F21D} |
Начиная с марта нам также попадались новые версии, которые скрывали финальный бэкдор внутри других зашифрованных файлов, хранящихся в файловой системе. В большинстве случаев загрузчик второго этапа размещался по одному из следующих путей:
- %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, но если вы по какой-то причине не пользуетесь нашей продукцией, самый простой способ выяснить, запущен ли бэкдор в системе, — попробовать найти один из индикаторов компрометации, приведенных в этой статье, или выполнить следующую команду:
1 |
#>netsh http show servicestate verbose=yes |
Согласно описанию Microsoft, эта команда выводит снимок состояния службы HTTP, в котором можно попытаться найти подозрительные зарегистрированные URL-адреса следующего вида:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Server session ID: ED00000020000013 Version: 2.0 State: Active Properties: ... Max bandwidth: inherited Max connections: inherited Timeouts: Timeout values inherited Number of registered URLs: 2 Registered URLs: HTTP://*:80/OWA/AUTH/TOKEN/ HTTPS://*:443/OWA/AUTH/TOKEN/ |
Жертвы
На основе собранных данных мы знаем, что группа 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-группа, нацеленная на организации Европы и Азии
Дина
Благодарю за предупреждение! Я вас очень люблю и все ваши продуты тоже.