Как TWINLOOT прячет атаку внутри Microsoft 365?

TWINLOOT — модульный имплант на Python, защищённый обфускатором PyArmor и прежде публично не описывавшийся. Его обнаружил Cyber Defense Center компании Ontinue в ходе расследования действующей вредоносной кампании в июле 2026 года; технический отчёт был передан изданию The Hacker News. Личность оператора остаётся неизвестной, но разработчик явно разбирается в наступательных техниках, устройстве Microsoft 365 и Azure, автоматизации браузеров, отладочных интерфейсах, сетевых туннелях и закреплении в Windows. Ontinue назвала TWINLOOT первым известным фреймворком, где одновременно соединены Microsoft 365 dead-drop C2, ретрансляторы Microsoft Teams TURN и передача трафика через браузер жертвы, запущенный без видимого окна.
Как TWINLOOT прячет атаку внутри Microsoft 365?
Изображение носит иллюстративный характер

Вероятная точка входа — звонок или сообщение в Microsoft Teams. Злоумышленник представляется сотрудником ИТ-поддержки и убеждает пользователя выполнить команду PowerShell. Она загружает архив с интерпретатором Python и скомпилированным файлом bootstrap-fat.pyc размером 39 МБ. Этот файл служит загрузчиком TWINLOOT. Сценарий совпадает с привычной схемой голосового фишинга, или vishing: сложная уязвимость не требуется, если человек сам запускает предложенную «техподдержкой» команду. Крупный Python-пакет в таком случае неслучаен: злоумышленник приносит собственную среду выполнения и меньше зависит от того, какие компоненты установлены на компьютере.
Первый канал управления размещён в инфраструктуре, которой организации обычно доверяют. Имплант входит в контролируемый атакующим арендатор Azure, обращается через Microsoft Graph API к диску SharePoint Online и раз в 15 секунд проверяет его на наличие новых заданий. Там же появляются результаты команд, снимки экрана, собранные сведения и похищенные пароли. При этом TWINLOOT не отправляет запросы к Graph напрямую: он запускает установленный у жертвы Microsoft Edge в headless-режиме, включает удалённую отладку, подключается через Chrome DevTools Protocol, CDP, открывает вкладку с адресом [.]com и работает с Microsoft Graph Drive API. Для сетевых средств защиты это выглядит как Edge, общающийся с настоящими узлами Microsoft, а не неизвестный процесс, стучащийся на подозрительный сервер.
Параллельно TWINLOOT поднимает обратный SOCKS5-туннель для интерактивной работы и перемещения по внутренней сети. Он способен идти напрямую к серверу оператора через TLS/WebSocket либо передавать WebRTC DataChannels через TURN-ретрансляторы Microsoft Teams; реализация WebRTC построена на aiortc. У атакующего появляется локальный SOCKS5-порт 127.0.0.1:1080, а отправленный туда трафик выходит во внутреннюю сеть через заражённый компьютер. На конечной машине соединения создаёт pythonw.exe. Через такой маршрут удобно обращаться к SMB на порту 445, RDP на 3389, WinRM на 5985 и Microsoft SQL Server, или MSSQL, на 1433. В журналах внутренних систем источником окажется уже знакомая рабочая станция, поэтому обычные правила периметра тут мало помогают.
Пароли Windows TWINLOOT получает без чтения памяти LSASS и без перебора хешей. Оператор отправляет команду credz_waiting, после чего поверх рабочего стола возникает тщательно скопированный экран блокировки Windows. Введённый пароль с системной аутентификацией не сверяется. Пользователь всегда видит фразу: «Пароль неверен. Попробуйте ещё раз». Расчёт довольно житейский: человек решает, что опечатался, и при второй попытке вводит пароль медленнее и внимательнее. После получения данных поддельное окно закрывается, каждый перехваченный вариант шифруется и загружается на диск SharePoint. Полученные учётные данные оператор может сразу проверить через SOCKS5-туннель, подключившись по RDP или WinRM к другим компьютерам.
Закрепление зависит от параметра сборки PERSIST_ENABLED=True или PERSIST_ENABLED=False. В доступном арсенале есть перехват COM-объекта через TypeLib COM scriptlet hijacking, а также манипуляции структурами Windows TaskCache в духе техники GhostTask. Для обновления предусмотрен манифест reobf.json. Ещё один вариант связан с HKCU Run Key, но куда любопытнее работа с обязательным профилем пользователя. Она основана на открытом инструменте Swarmer, который компания Praetorian выпустила в 2025 году. Swarmer преобразует экспорт реестра в файл hive, способный заменить , а затем незаметно добавить нужные значения в HKEY_CURRENT_USER, или HKCU, без прав администратора и, при удачном стечении обстоятельств, мимо защитного ПО.
Файл обязательного профиля собирается офлайн. Вызов RegLoadAppKeyW загружает hive в закрытое пространство приложения, не требуя административных привилегий; библиотека Microsoft offreg.dll и функции ORCreateKey, ORSetValue, ORSaveHive создают разделы, записывают значения и сохраняют готовую структуру. Результат помещается по адресу %USERPROFILE%\NTUSER.MAN. При загрузке профиля Windows сначала проверяет именно и лишь затем стандартный NTUSER.DAT, поэтому содержимое обязательного профиля получает приоритет. По оценке Ontinue, это первый зафиксированный случай вредоносного применения такой техники в реальной атаке. Для защитников отсюда следует вполне конкретная проверка: появление в обычном пользовательском профиле и обращения pythonw.exe к offreg.dll заслуживают отдельного расследования.
Помимо двух каналов связи, фреймворк умеет обследовать компьютер и сеть, собирать параметры среды, выполнять произвольные команды, делать снимки экрана, похищать файлы и учётные данные, обновляться, поддерживать интерактивную сессию и превращать заражённый узел в точку перехода к соседним системам. Основную конфигурацию он способен получать через dead-drop в Azure Blob Storage. Если этот способ не сработает, предусмотрен резервный механизм в стиле EtherHiding с разрешением данных через Ethereum. В исследованной сборке Ethereum-ветка не использовалась, но оставленный код плохо сочетается с идеей одноразового инструмента: архитектура рассчитана на замену транспорта и дальнейшую доработку.
TURN расшифровывается как Traversal Using Relays around NAT. Такие серверы передают трафик реального времени, когда два участника не могут соединиться напрямую. Удобство для звонков оборачивается удобством для атакующего: соединение уходит к инфраструктуре известной коммуникационной платформы и похоже на обычный медиатрафик. В июне 2026 года принадлежащая Broadcom компания Symantec вместе с Carbon Black сообщила, что вымогательская группировка DragonForce применяла написанный на Go троян удалённого доступа Backdoor.Turn. Он тоже скрывал C2 внутри ретрансляторов Microsoft Teams, но передавал через них сессию QUIC. TWINLOOT выбрал другую реализацию: WebRTC DataChannels на aiortc.
В конце июля 2026 года исследователи обнаружили msaRAT, связанный с группировкой Chaos ransomware. Этот RAT написан на Rust, использует асинхронную среду Tokio и запускается перед шифровальщиком. DLL с именем lib.dll доставляется внутри MSI-установщика, загруженного с внешнего узла. Модуль находит Chrome или Edge, запускает браузер без окна, внедряет JavaScript в новую вкладку и через CDP создаёт WebRTC-канал к серверу оператора. По данным Cisco Talos, сам msaRAT в сеть вообще не выходит: встроенный адрес Cloudflare Workers передаётся браузеру, который выполняет HTTP-запросы, проводит сигнализацию WebRTC и обмен SDP Offer/Answer. После согласования DataChannel трафик проходит через Twilio TURN. TWINLOOT тоже управляет headless-браузером по CDP, но направляет Edge к Microsoft Graph и SharePoint, а интерактивный канал прячет в Microsoft Teams TURN.
Публично метод злоупотребления TURN-ретрансляторами компания Praetorian описала под кодовым названием Ghost Calls. За год после публикации близкие идеи появились сразу в нескольких криминальных экосистемах. При этом одинаковая сетевой приём не означает общего автора: Backdoor.Turn использует QUIC, msaRAT опирается на Cloudflare Workers и Twilio, TWINLOOT совмещает SharePoint dead-drop, Graph API и Teams TURN. Особенно занятно совпадение TWINLOOT и msaRAT по времени: в одном месяце два внешне не связанных оператора независимо заставили браузер жертвы выполнять C2-запросы вместо вредоносного файла. Контроль CDP, headless-запуски Chrome или Edge и неожиданные WebRTC-сессии на обычных рабочих местах поэтому стоит рассматривать вместе, а не как разрозненные мелочи.
Ontinue также нашла параллели с кластером STAC4749, известным голосовым фишингом через Microsoft Teams и операциями, после которых разворачивался Chaos ransomware. Совпадают социальная инженерия, Python-бэкдор под PyArmor/PyArmour, обратный SOCKS5, закрепление через HKCU Run Key и близкие сроки активности. Различия пока мешают атрибуции. STAC4749 связывают с упаковкой PyInstaller, имплантами на Go, отдельными SOCKS5-инструментами и доменами зоны .top за Cloudflare. TWINLOOT исполняет сырой .pyc, написан целиком на Python, содержит встроенный SOCKS5-мультиплексор, пользуется перехваченными после освобождения старыми доменами и dead-drop в SharePoint. Если оператор всё же один, инструментарий, вероятнее всего, переписали с нуля, а не постепенно обновили.
Практический поиск TWINLOOT нельзя сводить к блокировке адресов Microsoft: это скорее сломает рабочие сервисы, чем остановит атаку. Проверке подлежат PowerShell-загрузки после неожиданных обращений «ИТ-поддержки» в Teams, архивы с Python и bootstrap-fat.pyc, headless-запуски Edge с включённой удалённой отладкой, управление браузером через CDP, регулярные обращения к Graph с интервалом около 15 секунд, необычная активность pythonw.exe и его соединения к внутренним портам 445, 3389, 5985 и 1433. Отдельные сигналы дают создание %USERPROFILE%\NTUSER.MAN, загрузка offreg.dll, обращения к Azure Blob Storage, непривычные WebRTC-сеансы через Teams TURN и загрузки данных в посторонний арендатор SharePoint. Здесь цепочка заметнее каждого элемента: Teams убеждает человека запустить код, Edge маскирует C2, SharePoint хранит задания и добычу, TURN открывает дорогу внутрь сети, а поддельная блокировка превращает обычную опечатку в украденный пароль.[/final]


Новое на сайте

Ссылка