
Profil Mythic C2 qui tunnelise le trafic de l'agent via les canaux Microsoft Teams en utilisant l'API Microsoft Graph, avec chiffrement AES256, jitter, kill dates et prise en charge de proxy.
Un profil C2 Mythic qui utilise l'API Microsoft Graph pour communiquer via un canal Microsoft Teams.
Agent <---> Canal Microsoft Teams <---> Serveur C2 <---> Mythic
La communication apparaît comme une activité normale de canal Teams.
Ce profil prend en charge :
Depuis votre serveur Mythic :
sudo ./mythic-cli install github https://github.com/Whispergate/msteams
Ou depuis un dossier local :
sudo ./mythic-cli install folder /path/to/msteams
ChannelMessage.Read.All - Lire les messages du canalChannelMessage.Send - Envoyer des messages dans le canalSi ChannelMessage.Send n'est pas disponible, utilisez Group.ReadWrite.All ou configurez une URL de webhook.
Les instructions complètes de configuration se trouvent dans la page de documentation Mythic après l'installation à l'adresse https://<your-mythic-server>:7443/docs/c2-profiles/msteams.
Modifiez via l'interface Mythic : C2 Profiles > msteams > View/Edit Config.
| Paramètre | Description | Valeur par défaut |
|---|---|---|
tenant_id | ID du tenant (annuaire) Entra ID | |
client_id | ID client de l'enregistrement d'application | |
client_secret | Secret client de l'enregistrement d'application | |
team_id | ID de l'équipe Teams | |
channel_id | ID du canal Teams | |
webhook_url | URL de webhook optionnelle pour l'envoi | |
graph_base | URL de base de l'API Graph | https://graph.microsoft.com/v1.0 |
login_base | URL de base du point de terminaison de connexion | https://login.microsoftonline.com |
poll_interval | Secondes entre les interrogations | 10 |
clear_messages | Supprimer les messages après traitement | false |
debug | Activer la journalisation détaillée | false |
Tout agent Mythic qui implémente les paramètres du profil C2 msteams peut utiliser ce profil. L'agent doit :
Une infrastructure de test simulée est incluse dans test/ pour les tests locaux sans aucun compte Azure ou M365. Cela vous permet de tester le pipeline C2 complet — y compris les implants compilés — contre une fausse API Graph locale.
Copiez test/mock_server.py sur votre hôte Mythic et démarrez-le :
python3 mock_server.py
Cela démarre une fausse API Graph sur le port 8443.
Configurez le profil C2 msteams dans Mythic avec des valeurs simulées :
{
"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
}
Démarrez le profil msteams dans l'interface Mythic.
Pour tester un véritable agent compilé contre le serveur simulé, le binaire de l'agent doit être compilé avec l'IP et le port du serveur simulé codés en dur au lieu des véritables points de terminaison de l'API Graph. Dans le code de l'agent 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
Réinstallez ensuite Starburst, compilez une charge utile avec le profil msteams (en utilisant les mêmes ID fictifs de tenant/client/équipe/canal), et exécutez-la sur une VM Windows pouvant atteindre l'hôte Mythic.
N'oubliez pas de rétablir ces modifications avant de compiler des charges utiles de production :
#define GRAPH_API_HOST "graph.microsoft.com"
#define LOGIN_HOST "login.microsoftonline.com"
#define API_PORT 443
WINHTTP_DEFAULT_ACCEPT_TYPES,
WINHTTP_FLAG_SECURE
Pour un test rapide du pipeline sans compiler d'agent :
GRAPH_URL=http://<mythic-host-ip>:8443 python test/fake_agent.py
Voir test/README.md pour plus de détails.
clear_messages pour nettoyer après traitementpoll_interval raisonnable (10-30s) pour éviter la limitation de débitmsteams/
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