
PowerShell से Slack C2
इस PowerShell मॉड्यूल में विभिन्न फ़ंक्शन शामिल हैं जो Slack API का उपयोग करके एक कमांड और कंट्रोल चैनल बनाते हैं। मुख्य फ़ंक्शन, Start-Shell, उपयोगकर्ता द्वारा निर्दिष्ट Slack चैनल से कनेक्ट होगा और किसी दिए गए Slack टीम और उपयोगकर्ता के लिए आपूर्ति किए गए API प्रमाणीकरण टोकन का उपयोग करके प्रमाणित करेगा। चैनल में टाइप किया गया कोई भी कमांड फिर होस्ट पर PowerShell में निष्पादित किया जाएगा।
SlackShell प्रोजेक्ट को API कॉल्स के लिए Invoke-RestMethod के उपयोग के कारण PowerShell v3 और उससे ऊपर की आवश्यकता है। भविष्य के विकास में वर्तमान PowerShell cmdlets और फ़ंक्शन का उपयोग जारी रहेगा। हालाँकि, PowerShell v2 के लिए एक पोर्ट SlackShell-Poshv2.psm1 में बनाया गया था।
अतिरिक्त PS स्क्रिप्ट्स को पहले उन्हें Slack चैनल पर अपलोड करके चालू सत्र में आयात किया जा सकता है। आयात सुविधा फ़ाइलों को डाउनलोड करेगी, जो डिफ़ॉल्ट रूप से https://slack-files.com पर होस्ट की जाती हैं, और उन्हें मेमोरी में आयात करेगी। फ़ाइलें डिस्क को स्पर्श नहीं करती हैं। इसके विपरीत, डाउनलोड सुविधा का उपयोग किसी भी फ़ाइल की स्थानीय प्रति को डिस्क पर सहेजने के लिए किया जा सकता है।
अपलोड सुविधा का उपयोग करके स्थानीय फ़ाइलों को API के माध्यम से Slack चैनल पर अपलोड किया जा सकता है।
यदि आवश्यक हो, तो एक अलग PS प्रक्रिया को स्पॉन किया जा सकता है जो अंतर्निहित Invoke-Command cmdlet का उपयोग करके एक कमांड चलाती है।
PowerShell में निष्पादित किए जाने वाले कमांड के लिए Slack चैनल की निगरानी शुरू करता है। हर $sleep सेकंड में Slack चैनल से कनेक्ट होगा और सभी नए कमांड खींचेगा। कमांड होस्ट पर PowerShell में निष्पादित किए जाएंगे।
API के माध्यम से विशिष्ट Slack चैनल पर एक संदेश भेजता है। संदेश एक टेक्स्ट हेडर के साथ भेजे जाते हैं, जिसमें संदेश का मुख्य भाग एक Slack अटैचमेंट होता है।
एक नई प्रक्रिया शुरू करता है और होस्ट पर PowerShell में एक कमांड निष्पादित करता है। एक नई प्रक्रिया को स्पॉन करने, कार्य समाप्त होने की प्रतीक्षा करने और आउटपुट लौटाने के लिए PowerShell में Start-Job विधि का उपयोग करता है।
चालू प्रक्रिया के वर्तमान संदर्भ में होस्ट पर PowerShell में एक कमांड निष्पादित करता है और आउटपुट लौटाता है।
किसी विशिष्ट Slack चैनल में सबसे पुरानी समय अवधि से वर्तमान तक के सभी संदेश लौटाता है। संदेश API विनिर्देशों के अनुसार JSON प्रारूप में लौटाए जाते हैं।
यह परीक्षण करने के लिए कि आपूर्ति किया गया API टोकन मान्य है या नहीं, एक Slack API कॉल का उपयोग करता है।
Slack चैनल में वर्तमान में होस्ट की गई फ़ाइलों की सूची लौटाने के लिए एक Slack API कॉल का उपयोग करता है।
फ़ाइल सूची को रीफ्रेश करता है, फिर निर्दिष्ट फ़ाइल को मेमोरी में डाउनलोड करता है, एक नया मॉड्यूल बनाता है, और फिर उस मॉड्यूल को आयात करता है। उस मॉड्यूल से संबंधित कमांड को सीधे Slack चैनल में दर्ज किया जा सकता है। डाउनलोड की गई फ़ाइल डिस्क को स्पर्श नहीं करती है। इस फ़ंक्शन को बीटा माना जाना चाहिए जबकि अतिरिक्त परीक्षण चल रहा है। कुछ मॉड्यूल अनियमित व्यवहार करते हैं
फ़ाइल सूची को रीफ्रेश करता है, फिर निर्दिष्ट फ़ाइल को डिस्क पर डाउनलोड करता है। एक अतिरिक्त भंडारण पथ शामिल किया जा सकता है, डिफ़ॉल्ट वर्तमान स्थान है।
एक स्थानीय फ़ाइल को 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 चैनल से जुड़ें। भिन्न उपयोगकर्ता के रूप में चैनल में लिखी गई कोई भी चीज़ स्क्रिप्ट शुरू करने के लिए उपयोग किए गए उसी स्थानीय उपयोगकर्ता संदर्भ के अंतर्गत होस्ट पर निष्पादित की जाएगी। वैकल्पिक रूप से, नई स्पॉन की गई PowerShell प्रक्रिया में कमांड निष्पादित करने के लिए "runjob" का उपयोग किया जा सकता है।
शेल और कनेक्शन बंद करता है।
मुख्य प्रक्रिया के संदर्भ में निर्देशिका बदलता है। सापेक्ष पथों का उपयोग किया जा सकता है (जैसे cd ..)
स्लीप समय बदलता है।
संबंधित Slack चैनल में उपलब्ध फ़ाइलों को सूचीबद्ध करता है।
निर्दिष्ट फ़ाइल आयात करता है। फ़ाइल उस Slack चैनल के साथ साझा की जानी चाहिए जिसका उपयोग किया जा रहा है।
निर्दिष्ट फ़ाइल को डिस्क पर डाउनलोड करता है और उसे वैकल्पिक पथ पैरामीटर स्थान पर संग्रहीत करता है। फ़ाइल उस Slack चैनल के साथ साझा की जानी चाहिए जिसका उपयोग किया जा रहा है।
स्थानीय फ़ाइल को Slack पर अपलोड करता है और उसे उस चैनल के साथ साझा करता है जिसका उपयोग किया जा रहा है।
निर्दिष्ट कमांड को एक नई PowerShell प्रक्रिया में चलाता है।
PowerShell में Slack API के साथ काम करने की प्रेरणा का श्रेय Warren Frame को दिया जाता है। उनका रेपो शुरू करने के लिए एक बहुत अच्छा संसाधन था: https://github.com/RamblingCookieMonster/PSSlack
POSHv2 पर पोर्ट करने और संवर्द्धन जोड़ने के लिए @thesubtlety का विशेष धन्यवाद।