
Mythic-C2-Profil, das Agentenverkehr über Microsoft Teams-Kanäle mithilfe der Microsoft Graph API tunnelt, mit AES256-Verschlüsselung, Jitter, Kill-Dates und Proxy-Unterstützung.
Ein Mythic C2-Profil, das die Microsoft Graph API verwendet, um über einen Microsoft Teams-Kanal zu kommunizieren.
Agent <---> Microsoft Teams Channel <---> C2 Server <---> Mythic
Die Kommunikation erscheint als normale Teams-Kanalaktivität.
Dieses Profil unterstützt:
Von deinem Mythic-Server aus:
sudo ./mythic-cli install github https://github.com/Whispergate/msteams
Oder aus einem lokalen Ordner:
sudo ./mythic-cli install folder /path/to/msteams
ChannelMessage.Read.All – Kanalnachrichten lesenChannelMessage.Send – Kanalnachrichten sendenWenn ChannelMessage.Send nicht verfügbar ist, verwende Group.ReadWrite.All oder konfiguriere eine Webhook-URL.
Vollständige Einrichtungsanweisungen findest du nach der Installation auf der Mythic-Dokumentationsseite unter https://<your-mythic-server>:7443/docs/c2-profiles/msteams.
Bearbeiten über die Mythic-UI: C2 Profiles > msteams > View/Edit Config.
| Parameter | Beschreibung | Standard |
|---|---|---|
tenant_id | Entra ID-Mandanten-(Verzeichnis-)ID | |
client_id | Client-ID der App-Registrierung | |
client_secret | Client Secret der App-Registrierung | |
team_id | Teams-Team-ID | |
channel_id | Teams-Kanal-ID | |
webhook_url | Optionale Webhook-URL zum Senden | |
graph_base | Basis-URL der Graph API | https://graph.microsoft.com/v1.0 |
login_base | Basis-URL des Login-Endpunkts | https://login.microsoftonline.com |
poll_interval | Sekunden zwischen Abfragen | 10 |
clear_messages | Nachrichten nach der Verarbeitung löschen | false |
debug | Ausführliches Logging aktivieren | false |
Jeder Mythic-Agent, der die Parameter des msteams-C2-Profils implementiert, kann dieses Profil verwenden. Der Agent muss:
Eine Mock-Testinfrastruktur ist in test/ enthalten, um lokal ohne Azure- oder M365-Konto zu testen. Damit kannst du die vollständige C2-Pipeline – einschließlich kompilierter Implants – gegen eine lokale Fake-Graph-API testen.
Kopiere test/mock_server.py auf deinen Mythic-Host und starte es:
python3 mock_server.py
Dies startet eine Fake-Graph-API auf Port 8443.
Konfiguriere das msteams-C2-Profil in Mythic mit Mock-Werten:
{
"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
}
Starte das msteams-Profil in der Mythic-UI.
Um einen echten kompilierten Agent gegen den Mock zu testen, muss das Agent-Binary mit der IP und dem Port des Mock-Servers fest verdrahtet gebaut werden, anstelle der echten Graph-API-Endpunkte. Im Starburst-Agent-Code (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
Installiere dann Starburst neu, baue ein Payload mit dem msteams-Profil (unter Verwendung derselben Fake-Tenant-/Client-/Team-/Kanal-IDs) und führe es auf einer Windows-VM aus, die den Mythic-Host erreichen kann.
Denke daran, diese Änderungen vor dem Bauen von Produktions-Payloads rückgängig zu machen:
#define GRAPH_API_HOST "graph.microsoft.com"
#define LOGIN_HOST "login.microsoftonline.com"
#define API_PORT 443
WINHTTP_DEFAULT_ACCEPT_TYPES,
WINHTTP_FLAG_SECURE
Für einen schnellen Pipeline-Test ohne Kompilierung eines Agents:
GRAPH_URL=http://<mythic-host-ip>:8443 python test/fake_agent.py
Weitere Details findest du in test/README.md.
clear_messages, um nach der Verarbeitung aufzuräumenpoll_interval angemessen (10-30s), um Rate-Limiting zu vermeidenmsteams/
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