
ملف تعريف Mythic C2 الذي ينفق حركة مرور الوكيل عبر قنوات Microsoft Teams باستخدام Microsoft Graph API، مع تشفير AES256، والتذبذب، وتواريخ الإيقاف، ودعم البروكسي.
ملف تعريف C2 لـ Mythic يستخدم Microsoft Graph API للتواصل عبر قناة Microsoft Teams.
Agent <---> Microsoft Teams Channel <---> C2 Server <---> Mythic
يظهر التواصل كنشاط عادي في قناة Teams.
يدعم ملف التعريف هذا:
من خادم Mythic الخاص بك:
sudo ./mythic-cli install github https://github.com/Whispergate/msteams
أو من مجلد محلي:
sudo ./mythic-cli install folder /path/to/msteams
ChannelMessage.Read.All - قراءة رسائل القناةChannelMessage.Send - إرسال رسائل القناةإذا لم يكن ChannelMessage.Send متاحًا، استخدم Group.ReadWrite.All أو قم بإعداد webhook URL.
توجد تعليمات الإعداد الكاملة في صفحة وثائق Mythic بعد التثبيت على https://<your-mythic-server>:7443/docs/c2-profiles/msteams.
قم بالتحرير عبر واجهة Mythic: C2 Profiles > msteams > View/Edit Config.
أي وكيل Mythic يطبق معاملات ملف تعريف C2 الخاص بـ msteams يمكنه استخدام ملف التعريف هذا. يحتاج الوكيل إلى:
توجد بنية اختبار وهمية في test/ للاختبار المحلي بدون أي حساب Azure أو M365. يتيح لك هذا اختبار خط أنابيب C2 الكامل — بما في ذلك الحمولات المُجمّعة — مقابل Graph API وهمي محلي.
انسخ test/mock_server.py إلى مضيف Mythic الخاص بك وابدأه:
python3 mock_server.py
يبدأ هذا Graph API وهمي على المنفذ 8443.
قم بإعداد ملف تعريف msteams C2 في Mythic بقيم وهمية:
{
"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
}
ابدأ ملف تعريف msteams في واجهة Mythic.
لاختبار وكيل مُجمّع حقيقي مقابل الخادم الوهمي، يجب بناء ملف الوكيل التنفيذي مع تضمين IP ومنفذ الخادم الوهمي بشكل ثابت بدلاً من نقاط نهاية Graph API الحقيقية. في كود وكيل 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
ثم أعد تثبيت Starburst، وابنِ حمولة باستخدام ملف تعريف msteams (باستخدام نفس معرفات tenant/client/team/channel الوهمية)، وشغّلها على جهاز Windows VM يمكنه الوصول إلى مضيف Mythic.
تذكر إعادة هذه التغييرات قبل بناء الحمولات الإنتاجية:
#define GRAPH_API_HOST "graph.microsoft.com"
#define LOGIN_HOST "login.microsoftonline.com"
#define API_PORT 443
WINHTTP_DEFAULT_ACCEPT_TYPES,
WINHTTP_FLAG_SECURE
لاختبار سريع لخط الأنابيب بدون تجميع وكيل:
GRAPH_URL=http://<mythic-host-ip>:8443 python test/fake_agent.py
راجع test/README.md لمزيد من التفاصيل.
clear_messages للتنظيف بعد المعالجةpoll_interval معقولاً (10-30 ثانية) لتجنب تحديد المعدلmsteams/
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
| Parameter | Description | Default |
|---|
tenant_id | Entra ID tenant (directory) ID | |
client_id | App registration client ID | |
client_secret | App registration client secret | |
team_id | Teams team ID | |
channel_id | Teams channel ID | |
webhook_url | Optional webhook URL for sending | |
graph_base | Graph API base URL | https://graph.microsoft.com/v1.0 |
login_base | Login endpoint base URL | https://login.microsoftonline.com |
poll_interval | Seconds between polls | 10 |
clear_messages | Delete messages after processing | false |
debug | Enable verbose logging | false |