
Perfil de Mythic C2 que tunela el tráfico del agente a través de canales de Microsoft Teams usando la API de Microsoft Graph, con cifrado AES256, jitter, fechas de finalización y soporte de proxy.
Un perfil C2 de Mythic que utiliza la API de Microsoft Graph para comunicarse a través de un canal de Microsoft Teams.
Agent <---> Microsoft Teams Channel <---> C2 Server <---> Mythic
La comunicación aparece como actividad normal del canal de Teams.
Este perfil admite:
Desde tu servidor Mythic:
sudo ./mythic-cli install github https://github.com/Whispergate/msteams
O desde una carpeta local:
sudo ./mythic-cli install folder /path/to/msteams
ChannelMessage.Read.All - Leer mensajes del canalChannelMessage.Send - Enviar mensajes al canalSi ChannelMessage.Send no está disponible, usa Group.ReadWrite.All o configura una URL de webhook.
Las instrucciones completas de configuración están en la página de documentación de Mythic tras la instalación en https://<your-mythic-server>:7443/docs/c2-profiles/msteams.
Editar a través de la interfaz de Mythic: C2 Profiles > msteams > View/Edit Config.
| Parámetro | Descripción | Predeterminado |
|---|---|---|
tenant_id | ID de inquilino (directorio) de Entra ID | |
client_id | ID de cliente del registro de aplicación | |
client_secret | Secreto de cliente del registro de aplicación | |
team_id | ID del equipo de Teams | |
channel_id | ID del canal de Teams | |
webhook_url | URL de webhook opcional para el envío | |
graph_base | URL base de la API de Graph | https://graph.microsoft.com/v1.0 |
login_base | URL base del endpoint de inicio de sesión | https://login.microsoftonline.com |
poll_interval | Segundos entre consultas | 10 |
clear_messages | Eliminar mensajes tras procesarlos | false |
debug | Habilitar registro detallado | false |
Cualquier agente de Mythic que implemente los parámetros del perfil C2 msteams puede usar este perfil. El agente necesita:
Se incluye una infraestructura de pruebas simulada en test/ para realizar pruebas locales sin ninguna cuenta de Azure o M365. Esto te permite probar todo el pipeline C2 —incluidos implantes compilados— contra una API de Graph falsa local.
Copia test/mock_server.py a tu host de Mythic e inícialo:
python3 mock_server.py
Esto inicia una API de Graph falsa en el puerto 8443.
Configura el perfil C2 msteams en Mythic con valores simulados:
{
"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
}
Inicia el perfil msteams en la interfaz de Mythic.
Para probar un agente compilado real contra el servidor simulado, el binario del agente debe compilarse con la IP y el puerto del servidor simulado codificados de forma fija en lugar de los endpoints reales de la API de Graph. En el código del 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
Después, reinstala Starburst, compila un payload con el perfil msteams (usando los mismos IDs falsos de tenant/client/team/channel) y ejecútalo en una VM de Windows que pueda alcanzar el host de Mythic.
Recuerda revertir estos cambios antes de compilar payloads de producción:
#define GRAPH_API_HOST "graph.microsoft.com"
#define LOGIN_HOST "login.microsoftonline.com"
#define API_PORT 443
WINHTTP_DEFAULT_ACCEPT_TYPES,
WINHTTP_FLAG_SECURE
Para una prueba rápida del pipeline sin compilar un agente:
GRAPH_URL=http://<mythic-host-ip>:8443 python test/fake_agent.py
Consulta test/README.md para más detalles.
clear_messages para limpiar después del procesamientopoll_interval razonable (10-30s) para evitar la limitación de velocidadmsteams/
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