
Profilo C2 Mythic che incanala il traffico dell'agente attraverso i canali di Microsoft Teams utilizzando l'API Microsoft Graph, con crittografia AES256, jitter, kill date e supporto proxy.
Un profilo C2 per Mythic che utilizza l'API Microsoft Graph per comunicare attraverso un canale Microsoft Teams.
Agent <---> Microsoft Teams Channel <---> C2 Server <---> Mythic
La comunicazione appare come una normale attività del canale Teams.
Questo profilo supporta:
Dal tuo server Mythic:
sudo ./mythic-cli install github https://github.com/Whispergate/msteams
Oppure da una cartella locale:
sudo ./mythic-cli install folder /path/to/msteams
ChannelMessage.Read.All - Legge i messaggi del canaleChannelMessage.Send - Invia messaggi al canaleSe ChannelMessage.Send non è disponibile, usa Group.ReadWrite.All oppure configura un URL webhook.
Le istruzioni complete di configurazione sono nella pagina della documentazione di Mythic dopo l'installazione all'indirizzo https://<your-mythic-server>:7443/docs/c2-profiles/msteams.
Modifica tramite l'interfaccia di Mythic: C2 Profiles > msteams > View/Edit Config.
| Parametro | Descrizione | Predefinito |
|---|---|---|
tenant_id | ID tenant (directory) di Entra ID | |
client_id | ID client della registrazione dell'app | |
client_secret | Segreto client della registrazione dell'app | |
team_id | ID del team Teams | |
channel_id | ID del canale Teams | |
webhook_url | URL webhook opzionale per l'invio | |
graph_base | URL base dell'API Graph | https://graph.microsoft.com/v1.0 |
login_base | URL base dell'endpoint di login | https://login.microsoftonline.com |
poll_interval | Secondi tra i polling | 10 |
clear_messages | Elimina i messaggi dopo l'elaborazione | false |
debug | Abilita il logging dettagliato | false |
Qualsiasi agente Mythic che implementa i parametri del profilo C2 msteams può utilizzare questo profilo. L'agente deve:
Un'infrastruttura di test mock è inclusa in test/ per il test locale senza alcun account Azure o M365. Questo ti permette di testare l'intera pipeline C2 — inclusi gli impianti compilati — contro una fake Graph API locale.
Copia test/mock_server.py sul tuo host Mythic e avvialo:
python3 mock_server.py
Questo avvia una fake Graph API sulla porta 8443.
Configura il profilo C2 msteams in Mythic con valori mock:
{
"tenant_id": "fake-tenant-id",
"client_id": "fake-client-id",
"client_secret": "fake-client-secret",
"team_id": "fake-team-id",
"channel_id": "fake-channel-id",
"graph_base": "http://<mythic-host-ip>:8443/v1.0",
"login_base": "http://<mythic-host-ip>:8443",
"poll_interval": 3,
"clear_messages": true,
"debug": true
}
Avvia il profilo msteams nell'interfaccia di Mythic.
Per testare un agente compilato reale contro il mock, il binario dell'agente deve essere compilato con l'IP e la porta del server mock hardcoded invece degli endpoint reali dell'API Graph. Nel codice dell'agente Starburst (agent_code/src/transport/msteams.cc):
// Change these for mock testing:
#define GRAPH_API_HOST "<mythic-host-ip>"
#define LOGIN_HOST "<mythic-host-ip>"
#define API_PORT 8443
// And change WINHTTP_FLAG_SECURE to 0 in WinHttpOpenRequest
// since the mock server uses plain HTTP:
WINHTTP_DEFAULT_ACCEPT_TYPES,
0
Poi reinstalla Starburst, compila un payload con il profilo msteams (usando gli stessi ID fake tenant/client/team/channel) ed eseguilo su una VM Windows che può raggiungere l'host Mythic.
Ricorda di ripristinare queste modifiche prima di compilare payload di produzione:
#define GRAPH_API_HOST "graph.microsoft.com"
#define LOGIN_HOST "login.microsoftonline.com"
#define API_PORT 443
WINHTTP_DEFAULT_ACCEPT_TYPES,
WINHTTP_FLAG_SECURE
Per un rapido test della pipeline senza compilare un agente:
GRAPH_URL=http://<mythic-host-ip>:8443 python test/fake_agent.py
Vedi test/README.md per maggiori dettagli.
clear_messages per pulire dopo l'elaborazionepoll_interval ragionevole (10-30s) per evitare il rate limitingmsteams/
config.json # Mythic container config
C2_Profiles/msteams/
Dockerfile # Container image
main.py # Mythic service entrypoint
requirements.txt # Python dependencies
rabbitmq_config.json # RabbitMQ settings
msteams/
c2_functions/msteams.py # C2Profile class + parameters
c2_code/
server.py # Main polling loop
graph_client.py # MS Graph API client
mythic_client.py # Mythic API forwarder
config.py # Config singleton
config.json # Default config values
documentation-c2/msteams/_index.md # Mythic docs page
test/
mock_server.py # Mock Graph API server
fake_agent.py # Simulated agent for testing
test_c2_server.py # Standalone C2 server test harness
test_config.json # Test config with fake values