
PowerShell إلى Slack C2
تتضمن وحدة PowerShell هذه العديد من الدوال التي تستخدم Slack API لإنشاء قناة تحكم وأوامر (command and control). الدالة الرئيسية، Start-Shell، ستتصل بقناة Slack يحددها المستخدم وتقوم بالمصادقة باستخدام توكن مصادقة API مقدم لفريق ومستخدم Slack معينين. سيتم بعد ذلك تنفيذ أي أمر يُكتب في القناة، في PowerShell، على المضيف.
يتطلب مشروع SlackShell إصدار PowerShell v3 أو أحدث بسبب استخدام Invoke-RestMethod لاستدعاءات API. سيواصل التطوير المستقبلي استخدام أوامر ودوال PowerShell الحالية. ومع ذلك، تم إنشاء نسخة منقولة إلى PowerShell v2 في SlackShell-Poshv2.psm1.
يمكن استيراد سكربتات PS إضافية إلى الجلسة الجارية عن طريق رفعها أولاً إلى قناة Slack. تقوم ميزة الاستيراد بتنزيل الملفات، التي تُستضاف افتراضيًا على https://slack-files.com، واستيرادها في الذاكرة. لا تلمس الملفات القرص. على العكس، يمكن استخدام ميزة التنزيل لحفظ نسخة محلية من أي ملف على القرص.
يمكن رفع الملفات المحلية إلى قناة Slack عبر API باستخدام ميزة الرفع.
إذا لزم الأمر، يمكن إنشاء عملية PS منفصلة لتشغيل أمر يستخدم cmdlet المدمج Invoke-Command.
يبدأ مراقبة قناة Slack بحثًا عن أوامر سيتم تنفيذها في PowerShell. سيتصل بقناة Slack كل $sleep ثانية ويسحب جميع الأوامر الجديدة. سيتم تنفيذ الأوامر على المضيف في PowerShell.
يرسل رسالة إلى قناة Slack المحددة عبر API. تُرسل الرسائل مع ترويسة نصية ويكون جسم الرسالة مرفق Slack.
يبدأ عملية جديدة وينفذ أمرًا في PowerShell على المضيف. يستخدم طريقة Start-Job في PowerShell لإنشاء عملية جديدة، والانتظار حتى انتهاء المهمة، ثم إرجاع المخرجات.
ينفذ أمرًا في PowerShell على المضيف في السياق الحالي للعملية الجارية ويعيد المخرجات.
يعيد جميع الرسائل في قناة Slack محددة من أقدم فترة زمنية حتى الوقت الحالي. يتم إرجاع الرسائل بتنسيق JSON وفقًا لمواصفات API.
يستخدم استدعاء Slack API لاختبار ما إذا كان توكن API المقدم صالحًا.
يستخدم استدعاء Slack API لإرجاع قائمة بالملفات المستضافة حاليًا في قناة Slack.
يقوم بتحديث قائمة الملفات ثم ينزّل الملف المحدد إلى الذاكرة، وينشئ وحدة جديدة، ثم يستورد تلك الوحدة. يمكن بعد ذلك إدخال الأوامر الخاصة بتلك الوحدة مباشرة في قناة Slack. الملف الذي يتم تنزيله لا يلمس القرص. يجب اعتبار هذه الدالة في مرحلة تجريبية (Beta) بينما تستمر اختبارات إضافية. بعض الوحدات تتصرف بشكل غير مستقر
يقوم بتحديث قائمة الملفات ثم ينزّل الملف المحدد إلى القرص. يمكن تضمين مسار تخزين إضافي، والافتراضي هو الموقع الحالي.
يرفع ملفًا محليًا إلى قناة Slack.
هو توكن API المستخدم للمصادقة. يمثل هذا التوكن مستخدمًا محددًا على فريق Slack محدد. يمكن العثور على مزيد من المعلومات هنا: https://api.slack.com/custom-integrations/legacy-tokens
هو معرّف القناة الذي يحدد قناة Slack التي سيتم استخدامها في الفريق. ستتم معالجة جميع النصوص في هذه القناة كأوامر على المضيف عند تشغيل Start-Shell. يمكن العثور على معرّف القناة في عنوان URL عند الوصول إلى صفحة القناة من موقع Slack المستند إلى الويب.
مثال: https://slackteam1.slack.com/messages/ABC123456. معرّف القناة هو "ABC123456".
Import-Module ./SlackShell.psm1
Start-Shell -Token "xoxp-175828824580-175707545555-176600001223-826315a84e533c482bb7e20e8312fh45k" -Channel "ABC123456" -Sleep 5
انضم إلى نفس قناة Slack كمستخدم مختلف عن المستخدم الذي تم استخدامه لإنشاء التوكن. أي شيء يُكتب في القناة كمستخدم مختلف سيتم تنفيذه على المضيف تحت نفس سياق المستخدم المحلي الذي تم استخدامه لبدء البرنامج النصي. بدلاً من ذلك، يمكن استخدام "runjob" لتنفيذ الأوامر في عملية PowerShell منشأة حديثًا.
يغلق الصدفة والاتصال.
يغيّر الدليل في سياق العملية الرئيسية. يمكن استخدام مسارات نسبية (على سبيل المثال cd ..)
يغيّر مدة الانتظار.
يسرد الملفات المتاحة في قناة Slack المرتبطة.
يستورد الملف المحدد. يجب أن يكون الملف مشتركًا مع قناة Slack المستخدمة.
ينزّل الملف المحدد إلى القرص ويخزنه في موقع المسار الاختياري. يجب أن يكون الملف مشتركًا مع قناة Slack المستخدمة.
يرفع الملف المحلي إلى Slack ويشاركه مع القناة المستخدمة.
يشغّل الأمر المحدد في عملية PowerShell جديدة.
يُعزى الإلهام للعمل مع Slack API في PowerShell إلى Warren Frame. كانت مستودعاته مصدرًا رائعًا للبدء: https://github.com/RamblingCookieMonster/PSSlack
شكر خاص إلى @thesubtlety لقيامه بالنقل إلى POSHv2 وإضافة التحسينات.