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

ToddyCat — ваш скрытый почтовый ассистент. Часть 2

Введение

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

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

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

Umbrij

В этой кампании интерес злоумышленников привлекла корпоративная переписка в сервисе Gmail. Их действия были направлены на компрометацию доступа к почте через API. Дело в том, что для авторизации в Google API используется протокол OAuth 2.0, то есть при помощи токена OAuth приложения могут получать доступ к запрашиваемым ресурсам электронной почты. Чтобы получить этот токен, злоумышленники создали инструмент Umbrij и с его помощью подключались к консоли управления браузером в скрытом режиме (headless) через отладочный порт. Посредством нескольких запросов они получали код авторизации OAuth, который впоследствии обменивали на токен для доступа к целевым ресурсам через API. Эту технику мы назвали Shadow Token via Remote Debug (STRD).

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

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

Решения «Лаборатории Касперского» обнаруживают этот инструмент со следующими вердиктами: HEUR:Trojan-PSW.MSIL.Umbrij.gen, HEUR:Trojan.MSIL.Agent.gen, HEUR:Trojan-PSW.MSIL.Agent.gen.

Запуск

Инструмент Umbrij был обнаружен в рамках проактивного поиска угроз: на одном из пользовательских хостов выполнялась задача по расписанию KasperskyEndpointSecurityEDRAvp, которая запускала файл с цифровой подписью. Решения «Лаборатории Касперского» не создают запланированные задачи с таким именем — злоумышленники пытались замаскировать вредоносную активность под легитимный процесс.

Подписанный файл в свою очередь загружал с помощью техники DLL sideloading вредоносный инструмент.

События запуска инструмента в Kaspersky Managed Detection and Response

События запуска инструмента в Kaspersky Managed Detection and Response

За все время наблюдения нам удалось обнаружить следующие легитимные файлы, уязвимые к технике DLL sideloading, которые использовались для запуска Umbrij.

  1. Файл BDSubWiz.exe — компонент Submission Wizard в продукте Bitdefender ConnectAgent, который используется для поддержки функций подключения и взаимодействия с другими сервисами или агентами Bitdefender. Этот файл небезопасно загружает файл с именем log.dll.
  2. Файл VSTestVideoRecorder.exe — компонент инструмента для записи видеоматериалов в рамках тестирования с использованием Visual Studio (VS Test). Этот исполняемый файл небезопасно загружает файл с именем Microsoft.VisualStudio.QualityTools.VideoRecorderEngine.dll.
  3. Файл GoogleDesktop.exe — больше не поддерживаемая программа Google Desktop Search для индексации файлов и их быстрого поиска на локальном ПК. Этот исполняемый файл небезопасно загружает файл с именем GoogleServices.dll.

Эти файлы загружали различные версии Umbrij, причем один и тот же легитимный файл мог запускать различные модификации. Всего мы обнаружили 3 версии Umbrij, которые далее для удобства будем называть a, b и c.

Сам инструмент представляет собой DLL-библиотеку, написанную на .NET и обфусцированную с помощью ConfuserEx, обфускатора с открытым исходным кодом для .NET-приложений.

Пример фрагмента обфусцированного кода

Пример фрагмента обфусцированного кода

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

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

Версия Команда Описание
a -regex <string> Используется вместе с параметром -deepsearch. Задает подстроку для поиска в поле user_name файла пользовательского профиля (в нем обычно указан адрес электронной почты). Инструмент будет использовать профиль пользователя, который соответствует указанной подстроке.
a -user <username> Имя системного пользователя, от которого должен быть запущен инструмент
a -runas-currentuser Задает работу инструмента в контексте текущего пользователя
a -deepsearch Определяет дополнительные проверки поля user_name в пользовательском профиле: не является ли оно пустым и содержит ли подстроку, указанную в параметре -regex
a, b, c -path <path> Задает полный путь к папке, в которой находится исполняемый файл браузера
a, b, c -browser <both|msedge|chrome> Задает, какой браузер будет пытаться использовать инструмент: Google Chrome, Microsoft Edge или оба
a, b, c -debugport <port> Задает номер отладочного порта
a, b, c -sync При указании этого параметра в URL-адресе для запроса прав значение 279448736670 заменяется на 1095133494869
b -domainAd Указывает доменное имя, если учетная запись пользователя является доменной
b -savepdf Указывает, что необходимо сохранить скриншот пользовательского профиля в PDF-файле
c -lport То же, что и debugport

Подготовка окружения

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

Сначала Umbrij проверяет, доступен ли порт, который будет назначен для отладки браузера. Для этого в инструменте предусмотрена функция ChekPortAvailable() (сохранено оригинальное написание), которая принимает номер проверяемого порта, а затем с помощью функции .NET GetActiveTcpConnections() из пространства имен  System.Net.NetworkInformation получает информацию об активных подключениях на хосте. Инструмент перебирает каждое подключение в цикле и сравнивает номер порта с искомым.

Функция ChekPortAvaliable для проверки свободного порта

Функция ChekPortAvaliable для проверки свободного порта

Затем инструмент получает контекст пользователя. Для этого он ищет в системе процесс explorer.exe и копирует его токен, сохраняя все его права (T1134.003 Access Token Manipulation: Make and Impersonate Token). Такую же схему использует и другой инструмент группы — TomBerBil, о котором мы рассказывали ранее.

Функция ImpersonateWithProcess для получения контекста пользователя

Функция ImpersonateWithProcess для получения контекста пользователя

По умолчанию Umbrij дублирует токен первого найденного процесса explorer.exe. Если в системе работает несколько пользователей, имя целевого пользователя, чей токен необходимо скопировать, указывается при помощи ключа -user <username>. При использовании ключа -runas-currentuser инструмент будет работать в контексте текущего пользователя без копирования токена.

Затем Umbrij формирует путь к папке приложения браузера в общем репозитории данных приложений пользователя. Для этого он получает каталог репозитория из переменной окружения с помощью команды Environment.SpecialFolder.LocalApplicationData и добавляет к нему каталог нужного браузера. После этого инструмент ищет файл Local State в следующих папках:

  • %LOCALAPPDATA%\Google\Chrome\User Data\Local State
  • %LOCALAPPDATA%\Microsoft\Edge\User Data\Local State

Пример структуры файла Local State приведен ниже.

Структура JSON-файла Local State

Структура JSON-файла Local State

В этом файле инструмент ищет массив info_cache, где хранится информация о профилях пользователей в браузере. Umbrij перечисляет все профили пользователя и ищет такие, которые содержат поле user_name с адресом электронной почты. Его наличие свидетельствует о том, что пользователь аутентифицирован в сервисе Google. Инструмент может работать с каждым найденным профилем, но если через командную строку задан параметр -regex <string>, то он ищет указанную подстроку в перечисляемых почтовых адресах и далее работает с ними.

Затем Umbrij создает следующие папки для Google Chrome и Microsoft Edge соответственно:

  • %LOCALAPPDATA%\Google\Chrome\BackupFiles\
  • %LOCALAPPDATA%\Microsoft\Edge\BackupFiles\

В них инструмент копирует пользовательские файлы и папки каждого целевого профиля пользователя:

  • IndexedDB — папка с реляционной базой данных, которая используется для хранения структурированных данных на стороне клиента;
  • Local Storage — часть веб-хранилища браузера, которая предоставляет ключ-значение для хранения данных на стороне клиента;
  • Network — папка, в которой браузер хранит файлы, связанные с сетевыми запросами и кэшированием, такими как сетевой кэш и служебные файлы;
  • Login Data — файл, в котором хранятся сохраненные пароли для различных сайтов и приложений;
  • Login Data For Account — файл, в котором хранятся учетные данные, связанные с аккаунтом Google или другими синхронизированными учетными записями в браузере;
  • Preferences — файл настроек браузера на уровне всего профиля пользователя;
  • Secure Preferences — файл, который хранит защищенные настройки, такие как данные, связанные с безопасностью и синхронизацией;
  • Web Data — файл, который хранит данные для автозаполнения.

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

Функция ForceCopyFolder, которая копирует файлы, заблокированные другими процессами

Функция ForceCopyFolder, которая копирует файлы, заблокированные другими процессами

Следующим шагом инструмент ищет папку, в которой установлен браузер, в директориях Program Files и Program Files (x86). После того как исполняемый файл найден и скопированы все необходимые файлы, инструмент готов к получению токена авторизации.

Получение кода авторизации

На следующем этапе выполнения Umbrij запускает Google Chrome, Microsoft Edge либо оба браузера поочередно в зависимости от параметров, передаваемых через командную строку. Далее браузеру передаются параметры по шаблону ниже:

В него подставляются следующие значения:

  • {0} — путь к папке \BackupFiles\, в которую были скопированы файлы пользовательского профиля;
  • {1} — путь к исполняемому файлу браузера;
  • {2} — номер отладочного порта.

Ниже в таблице приведены параметры, которые используются в шаблоне для запуска браузера:

Параметр Описание
—user-data-dir Указывает путь к корневой директории, где будут храниться общие данные браузера и профили.
—remote-debugging-port Открывает порт для удаленной отладки браузера, используя протокол DevTools. Обычно используется для тестирования с помощью Selenium.
—profile-directory Указывает имя конкретной папки профиля внутри user-data-dir
—headless Запускает браузер в скрытом режиме, т. е. без графического интерфейса.

Процесс браузера запускается в скрытом режиме и использует скопированный профиль пользователя. Это значит, что будут использоваться все cookie-файлы пользователя и сайты с сохраненными учетными данными не будут запрашивать прохождение аутентификации. История браузера будет сохраняться уже в новой папке и не будет видна в основном аккаунте пользователя.

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

Фрагмент кода подключения инструмента к браузеру через порт отладки

Фрагмент кода подключения инструмента к браузеру через порт отладки

Далее инструмент подключается к отладочному порту с помощью библиотеки Puppeteer Sharp, .NET-версии библиотеки Puppeteer. Puppeteer — это библиотека, которая предоставляет высокоуровневый API для управления браузером Chrome или Chromium через протокол DevTools. В основном она используется для автоматизации тестирования.

Страница модуля Puppeteer на GitHub

Страница модуля Puppeteer на GitHub

Если подключение к отладочному порту прошло успешно, то инструмент передает в GET-запросе следующий URL браузеру для перехода:

Параметр в поле client_id принадлежит приложению Google Workspace Migration for Microsoft Outlook (GWMMO). Это инструмент от Google, который позволяет пользователям импортировать электронную почту, календари и контакты из учетных записей Microsoft Exchange или локальных PST-файлов в учетную запись Google Workspace.

В инструменте Umbrij есть возможность изменить значение client_id c 279448736670 на 1095133494869 с помощью параметра -sync. Этот идентификатор принадлежит другому приложению: Google Workspace Sync for Microsoft Outlook (GWSMO), которое позволяет загрузить электронную почту, календари и другую информацию из облачного аккаунта в Microsoft Outlook.

Фрагмент кода, в котором происходит замена client_id

Фрагмент кода, в котором происходит замена client_id

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

Параметр GET-запроса URL, используемый инструментом Исходный URL
flowName=GeneralOAuthFlow Есть Нет
code_challenge (PKCE) Нет Есть (method=S256)
state Нет Есть
login_hint Нет Есть
redirect_uri http://localhost http://localhost:61619/callback

Из приведенного списка видно, что инструмент не использует ряд параметров, которые характерны для оригинальных приложений. Например, в запросе Umbrij опускается параметр code_challenge, который используется для защиты данных при получении кода авторизации. Кроме того, изменяется адрес перенаправления: легитимное приложение указывает определенный порт и путь callback, в то время как инструмент указывает просто localhost.

В запросе кода авторизации указывается набор прав доступа к сервисам Google, которые требуются приложению для работы. Этот список также отличается в запросах от легитимного приложения и инструмента Umbrij. Ниже представлена таблица различий в параметрах запросов:

Параметр сервиса URL, используемый инструментом Исходный URL
https://www.google.com/m8/feeds/ Есть (указан дважды) Нет
https://www.googleapis.com/auth/contacts Нет Есть
https://www.googleapis.com/auth/admin.directory.resource.calendar.readonly Нет Есть
https://www.googleapis.com/auth/peopleapi.readonly Нет Есть

После перехода по URL-адресу, который использовал инструмент, открывается страница выбора учетной записи Google.

Выбор учетной записи

Выбор учетной записи

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

Поиск элементов HTML-кода страницы

Поиск элементов HTML-кода страницы

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

Имитация клика мышью по элементу страницы

Имитация клика мышью по элементу страницы

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

Подтверждение списка запрашиваемых прав доступа

Подтверждение списка запрашиваемых прав доступа

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

Затем браузер перенаправляется на локальный адрес, который был указан в параметре redirect_uri в первоначальном запросе. Инструмент не указывает порт и путь к конкретной странице в redirect_uri, поскольку настоящая цель этого действия — получение параметра code из контекста GET-запроса. В этом параметре находится код авторизации OAuth. Для этого Umbrij выделяет подстроку между параметрами code= и &scope.

Получение кода авторизации из GET-запроса

Получение кода авторизации из GET-запроса

Результаты работы

Umbrij, как и большинство других инструментов ToddyCat, подробно логирует свои действия и сохраняет их в файл. Полученный код авторизации также записывается в лог-файл, который выгружает оператор со скомпрометированного хоста.
Ниже представлен пример лог-файла, сгенерированного инструментом модификации a.

Из лога видно, что выбран режим sync (а значит, используется приложение Google Workspace Sync for Microsoft Outlook) и указан порт отладки 11111. После того как был найден профиль пользователя и скопирована его папка, запускается браузер Google Chrome. После этого производятся клики на необходимые кнопки для подтверждения прав и выводится результат операций — похищенный код авторизации OAuth.

Поскольку все запросы происходят в фоновом режиме браузера, в инструменте предусмотрена возможность создания PDF-файла снимка страницы, на которой остановился процесс подтверждения прав.

Сохранение веб-страницы в PDF-файл в случае ошибки

Сохранение веб-страницы в PDF-файл в случае ошибки

Кроме этого, в инструменте есть возможность создать PDF-файл для профиля пользователя в браузерах Google Chrome и Microsoft Edge при обращении к следующим адресам:

  • edge://profile-internals
  • chrome://profile-internals
Пример содержания создаваемого PDF-файла
Пример содержания создаваемого PDF-файла

Пример содержания создаваемого PDF-файла

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

Схема работы Umbrij

Схема работы Umbrij

Детектирование

DLL sideloading

В первую очередь необходимо отслеживать события загрузки библиотек известными приложениями, уязвимыми к DLL sideloading, которые использует инструмент: Bitdefender ConnectAgent, Visual Studio и Google Desktop Search.

Запуск браузера

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

Отзыв стороннего доступа

Для проверки выданных приложениям кодов авторизации необходимо открыть настройки учетной записи Google, раздел Third-party apps & services, либо перейти по следующему адресу:

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

Список приложений, подключенных к учетной записи Google

Список приложений, подключенных к учетной записи Google

Если в списке есть приложения Google Workspace Migration for Microsoft Outlook и Google Workspace Sync for Microsoft Outlook, но они не использовались, доступ к ним необходимо закрыть. Это позволит отозвать права у всех потенциально скомпрометированных токенов.

Уменьшение рисков

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

Это можно сделать с помощью политики DeveloperToolsAvailability. Для этого в реестре Windows нужно установить значение 0x00000002 для следующего ключа и перезапустить браузер:

Проверить, что политика успешно применяется, можно на странице политик браузера по адресу chrome://policy:

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

Выводы

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

Для защиты от подобных угроз корпоративным пользователям необходимо отслеживать подозрительные события загрузки от легитимных файлов, запуск браузера в режиме разработчика, а также регулярно проводить аудит сторонних приложений и сервисов, имеющих доступ к учетным записям Google. Кроме того, для своевременного выявления подобной вредоносной активности на хосте критически важно использовать надежное комплексное решение класса Endpoint Protection, например Kaspersky Endpoint Security для бизнеса.

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

Дополнительная информация об этой угрозе доступна клиентам сервиса аналитических отчетов Kaspersky Threat Intelligence Reporting. Для получения более подробной информации свяжитесь с нами по адресу intelreports@kaspersky.com.

Вредоносные файлы
1AB58838E5790EFB22F2D35AB98C0B7D              Umbrij ver. a
A7D7D6C4C3F227F7117261C63B9E23A9              Umbrij ver. a
3D3A621F852C42D97FD7260681E42508              Umbrij ver. a
3432DD9AC0DF80EF86EB80BD080F839B             Umbrij ver. a
22AAEB4946BA6D2F2E27FEB7DBB295DE             Umbrij ver. b
F61FBFB7AA1CD5DC8F70B055B51563E2              Umbrij ver. b
F169D6D172DFB775895A5E2B1540C854              Umbrij ver. c

Легитимные файлы, используемые для DLL sideloading

MD5 Имя файла Имя загружаемой DLL
9F5F2F0FB0A7F5AA9F16B9A7B6DAD89F GoogleDesktop.exe GoogleServices.DLL
28CB7B261F4EB97E8A4B3B0D32F8DEF1 BDSubWiz.exe log.dll
BAE82A15D1DBFB024617B9B56A8E5F66 VSTestVideoRecorder.exe Microsoft.VisualStudio.QualityTools.VideoRecorderEngine.dll

Пути файлов для DLL sideloading

Путь к файлу, загружающему DLL Путь к загружаемой DLL
C:\Users\<user>\AppData\Local\Temp\BDS.exe C:\Users\<user>\AppData\Local\Temp\log.dll
C:\Users\Public\BDS.exe C:\Users\Public\log.dll
c:\users\public\bdsubwiz.exe C:\Users\Public\log.dll
C:\Windows\Temp\BDS.exe C:\Windows\Temp\log.dll
C:\windows\vss\bds.exe C:\Windows\Vss\log.dll
c:\windows\temp\GoogleDesktop.exe c:\windows\temp\GoogleServices.DLL
c:\windows\temp\VSTestVideoRecorder.exe c:\windows\temp\Microsoft.VisualStudio.QualityTools.VideoRecorderEngine.dll

ToddyCat — ваш скрытый почтовый ассистент. Часть 2

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

Отчеты

ToddyCat — ваш скрытый почтовый ассистент. Часть 2

Разбираем Umbrij — новый инструмент APT-группы ToddyCat для компрометации корпоративной переписки в сервисе Gmail. Целью атак стал токен авторизации OAuth, при помощи которого злоумышленники получали доступ к сервисам Google.