
गैर-HTTP प्रोटोकॉल को Burp और अन्य के माध्यम से इंटरसेप्ट और संशोधित करने का थोड़ा कम हैकिश तरीका।
गैर-HTTP प्रोटोकॉल को Burp और अन्य के माध्यम से SSL और TLS इंटरसेप्शन समर्थन के साथ इंटरसेप्ट और संशोधित करने का थोड़ा कम हैकिश तरीका। यह टूल शोधकर्ताओं और एप्लिकेटिव पेनिट्रेशन टेस्टर्स के लिए है जो थिक क्लाइंट सुरक्षा मूल्यांकन करते हैं।
शानदार mitm_relay प्रोजेक्ट का एक बेहतर संस्करण।
CyberArk Labs के शोध विभाग में अपने काम के भाग के रूप में, हमें TCP के माध्यम से SSL और TLS संचार का निरीक्षण करने और पैकेट की सामग्री को मक्खी पर संशोधित करने का विकल्प चाहिए था। ऐसा करने के कई तरीके हैं (उदाहरण के लिए, ज्ञात Burp Suite एक्सटेंशन NoPE), लेकिन उनमें से कोई भी कुछ मामलों में हमारे लिए काम नहीं आया। अंत में हम mitm_relay पर आ गए।
mitm_relay Burp Suite के प्रॉक्सी जैसे मौजूदा HTTP इंटरसेप्शन सॉफ्टवेयर के माध्यम से किसी भी TCP-आधारित प्रोटोकॉल का MITM करने का एक त्वरित और आसान तरीका है। यह विशेष रूप से थिक क्लाइंट सुरक्षा मूल्यांकन के लिए उपयोगी है। लेकिन यह हमारे लिए पूरी तरह से काम नहीं करता था, इसलिए हमें इसे अनुकूलित करने की आवश्यकता थी। बहुत सारे अनुकूलन के बाद, हर नए बदलाव के लिए बहुत काम करना पड़ता था, और अंत में हमने सब कुछ अधिक मॉड्यूलर तरीके से फिर से लिखा।
हम आशा करते हैं कि दूसरों को यह स्क्रिप्ट उपयोगी लगेगी, और हम आशा करते हैं कि कार्यक्षमता जोड़ना आसान होगा।
शुरुआत के लिए, श्रोताओं के पते और पोर्ट कॉन्फ़िगर किए जाने की आवश्यकता है। प्रत्येक श्रोता के लिए, एक लक्ष्य (पता और पोर्ट) भी कॉन्फ़िगर किया जाना चाहिए। श्रोता से प्राप्त प्रत्येक डेटा को "CLIENT_REQUEST" वाले URL के साथ एक HTTP POST अनुरोध के बॉडी में लपेटा जाएगा। लक्ष्य से प्राप्त प्रत्येक डेटा को "SERVER_RESPONSE" वाले URL के साथ एक HTTP POST अनुरोध के बॉडी में लपेटा जाएगा। ये अनुरोध एक स्थानीय HTTP इंटरसेप्शन सर्वर को भेजे जाते हैं।
एक HTTP प्रॉक्सी कॉन्फ़िगर करने और burp suite जैसे टूल को HTTP इंटरसेप्शन टूल के रूप में उपयोग करने और वहाँ संदेशों को देखने का विकल्प है। इस तरह, Burp के "Match and Replace", एक्सटेंशन या मैन्युअल रूप से भी संदेशों को संशोधित करना आसान है (याद रखें, इंटरसेप्ट किए गए प्रोटोकॉल का टाइमआउट तंत्र बहुत छोटा हो सकता है)।
संदेशों को संशोधित करने का दूसरा तरीका एक पायथन स्क्रिप्ट का उपयोग करना है जो HTTP इंटरसेप्शन सर्वर चलाएगा जब वह संदेश प्राप्त करता है।
HTTP इंटरसेप्शन सर्वर को भेजे गए संदेशों का बॉडी शेल पर प्रिंट किया जाएगा। यदि संशोधन स्क्रिप्ट दी गई है, तो संशोधन के बाद संदेश मुद्रित किए जाएंगे। सभी संशोधनों के बाद, इंटरसेप्शन सर्वर HTTP प्रतिक्रिया बॉडी के रूप में वापस गूंज भी देगा।
SSL/TLS संचार को डिक्रिप्ट करने के लिए, mitm_intercept को एक प्रमाणपत्र और एक कुंजी प्रदान करने की आवश्यकता है जिसे क्लाइंट श्रोता के साथ हैंडशेक शुरू करते समय स्वीकार करेगा। यदि लक्ष्य सर्वर को हैंडशेक के लिए किसी विशिष्ट प्रमाणपत्र की आवश्यकता है, तो एक प्रमाणपत्र और एक कुंजी देने का विकल्प है।
एक छोटा चार्ट जो सामान्य ट्रैफ़िक प्रवाह दिखाता है:

mitm_intercept पायथन 3 (पायथन 3.9) के नए संस्करणों के साथ संगत है और विंडोज (उदाहरण के लिए, socket.MSG_DONTWAIT विंडोज में मौजूद नहीं है) के साथ भी संगत है। हमने "STARTTLS" का उपयोग करने का विकल्प रखा है, और हमने इसे "मिक्स्ड" मोड कहा है। SSL कुंजी लॉग फ़ाइल का उपयोग अद्यतन किया गया है (इसे उपयोग करने का अंतर्निहित विकल्प पायथन 3.8 से नया है), और हमने sni हेडर को बदलने का विकल्प जोड़ा है। अब, आने वाले और जाने वाले संचार का प्रबंधन socketserver द्वारा किया जाता है, और सभी डेटा ThreadingHTTPServer के एक उपवर्ग को भेजा जाता है जो डेटा प्रतिनिधित्व और संशोधन को संभालता है। इस तरह, प्रतिक्रिया में संशोधन स्क्रिप्ट द्वारा लागू किए गए परिवर्तनों को देखना संभव है (Burp का उपयोग करने के लिए सुविधाजनक)। साथ ही, अब हम OpenSSL सिफर सूची प्रारूप का उपयोग करके स्क्रिप्ट द्वारा उपयोग किए जाने वाले उपलब्ध सिफर को बदल सकते हैं।
$ python -m pip install requestsusage: mitm_intercept.py [-h] [-m] -l [u|t:]<interface>:<port> [[u|t:]<interface>:<port> ...] -t
[u|t:]<addr>:<port> [[u|t:]<addr>:<port> ...] [-lc <cert_path>]
[-lk <key_path>] [-tc <cert_path>] [-tk <key_path>] [-w <interface>:<port>]
[-p <addr>:<port>] [-s <script_path>] [--sni <server_name>]
[-tv <defualt|tls12|tls11|ssl3|tls1|ssl2>] [-ci <ciphers>]
mitm_intercept संस्करण 1.6
विकल्प:
-h, --help यह सहायता संदेश दिखाएं और बाहर निकलें
-m, --mix-connection SSL हैंडशेक के बिना TCP रिले करें। यदि रिले का कोई भी पक्ष SSL हैंडशेक शुरू करता है, तो कनेक्शन को SSL में लपेटें, और संचार को इंटरसेप्ट करें। एक श्रोता प्रमाणपत्र और निजी कुंजी प्रदान की जानी चाहिए।
-l [u|t:]<interface>:<port> [[u|t:]<interface>:<port> ...], --listen [u|t:]<interface>:<port> [[u|t:]<interface>:<port> ...]
निर्दिष्ट इंटरफ़ेस और पोर्ट पर सुनने वाला SSLInterceptServer श्रोता बनाता है। पैरामीटर के बीच एक स्थान के साथ कई श्रोता बना सकता है। पते से पहले "u:" जोड़ने से श्रोता UDP प्रोटोकॉल में सुनेगा। TCP प्रोटोकॉल डिफ़ॉल्ट है लेकिन सफाई के लिए "t:" जोड़ना संभव है। श्रोताओं की संख्या लक्ष्यों की संख्या से मेल खानी चाहिए। i-वां श्रोता i-वें लक्ष्य पर रिले करेगा।
-t [u|t:]<addr>:<port> [[u|t:]<addr>:<port> ...], --target [u|t:]<addr>:<port> [[u|t:]<addr>:<port> ...]
प्रत्येक SSLInterceptServer श्रोता को एक लक्ष्य पते और पोर्ट पर संचार अग्रेषित करने का निर्देश देता है। पैरामीटर के बीच एक स्थान के साथ कई लक्ष्य बना सकता है। पते से पहले "u:" जोड़ने से लक्ष्य UDP प्रोटोकॉल में संचार करेगा। TCP प्रोटोकॉल डिफ़ॉल्ट है लेकिन सफाई के लिए "t:" जोड़ना संभव है। श्रोताओं की संख्या लक्ष्यों की संख्या से मेल खानी चाहिए। i-वां श्रोता i-वें लक्ष्य पर रिले करेगा।
-lc <cert_path>, --listener-cert <cert_path>
वह प्रमाणपत्र जो श्रोता उपयोग करता है जब कोई क्लाइंट उससे संपर्क करता है। यदि क्लाइंट इसे स्वीकार करेगा तो एक स्व-हस्ताक्षरित प्रमाणपत्र हो सकता है।
-lk <key_path>, --listener-key <key_path>
श्रोता प्रमाणपत्र के लिए निजी कुंजी पथ।
-tc <cert_path>, --target-cert <cert_path>
वह प्रमाणपत्र जो लक्ष्य के साथ कनेक्शन बनाने के लिए उपयोग किया जाता है। यदि लक्ष्य इसे स्वीकार करेगा तो एक स्व-हस्ताक्षरित प्रमाणपत्र हो सकता है। आवश्यक नहीं है यदि लक्ष्य को किसी विशिष्ट प्रमाणपत्र की आवश्यकता नहीं है।
-tk <key_path>, --target-key <key_path>
लक्ष्य प्रमाणपत्र के लिए निजी कुंजी पथ।
-w <interface>:<port>, --webserver <interface>:<port>
वह इंटरफ़ेस और पोर्ट निर्दिष्ट करता है जिस पर InterceptionServer वेबसर्वर सुनेगा। यदि छोड़ दिया जाए तो डिफ़ॉल्ट 127.0.0.1:49999 है।
-p <addr>:<port>, --proxy <addr>:<port>
InterceptionServer वेबसर्वर और SSLInterceptServer के बीच एक प्रॉक्सी का पता और पोर्ट निर्दिष्ट करता है। कॉन्फ़िगर किया जा सकता है ताकि संचार Burp जैसे स्थानीय प्रॉक्सी के माध्यम से जाए। यदि छोड़ दिया जाए, तो संचार केवल शेल पर मुद्रित किया जाएगा।
-s <script_path>, --script <script_path>
एक स्क्रिप्ट का पथ जिसे InterceptionServer वेबसर्वर निष्पादित करता है। इसमें function handle_request(message) होना चाहिए जो इसे लक्ष्य पर भेजने से पहले चलेगा, या लक्ष्य से संदेश प्राप्त करने के बाद handle_response(message) चलेगा। यदि आवश्यक न हो तो छोड़ा जा सकता है।
--sni <server_name> यदि लक्ष्य के साथ SSL हैंडशेक में सर्वर नाम बदलने की आवश्यकता है। यदि छोड़ दिया जाए, तो यह श्रोता के साथ हैंडशेक से सर्वर नाम होगा।
-tv <defualt|tls12|tls11|ssl3|tls1|ssl2>, --tls-version <defualt|tls12|tls11|ssl3|tls1|ssl2>
यदि आवश्यक हो तो एक विशिष्ट TLS संस्करण निर्दिष्ट किया जा सकता है।
-ci <ciphers>, --ciphers <ciphers>
TLS हैंडशेक के लिए पायथन डिफ़ॉल्ट से भिन्न सिफर सेट करता है। यह OpenSSL सिफर सूची प्रारूप (https://www.openssl.org/docs/manmaster/man1/ciphers.html) में एक स्ट्रिंग होना चाहिए।
SSL (pre-)master secrets को एक फ़ाइल में डंप करने के लिए, SSLKEYLOGFILE पर्यावरण चर को फ़ाइल पथ के साथ सेट करें। Wireshark के लिए उपयोगी।
किसी भी मनमाने प्रोटोकॉल को इंटरसेप्ट करने के लिए संचार को श्रोता की ओर निर्देशित किया जाना चाहिए। ऐसा करने का तरीका इस बात पर निर्भर करता है कि क्लाइंट कैसे संचालित होता है। कभी-कभी यह DNS पते का उपयोग करता है, और होस्ट फ़ाइल को बदलना श्रोता के पते को हल करने के लिए पर्याप्त होगा। यदि पता हार्ड-कोडित है, तो अधिक रचनात्मक तरीकों को लागू करने की आवश्यकता है (आमतौर पर रूटिंग टेबल के कुछ संशोधन, क्लाइंट को पैच करना, या VM और iptables का उपयोग करना)।
HTTP इंटरसेप्शन सर्वर -s फ्लैग के साथ दी गई एक स्क्रिप्ट चला सकता है। यह स्क्रिप्ट तब चलती है जब HTTP अनुरोध प्राप्त होते हैं। HTTP इंटरसेप्शन सर्वर से प्रतिक्रिया स्क्रिप्ट चलाने के बाद प्राप्त अनुरोध होती है।
जब एक प्रॉक्सी कॉन्फ़िगर किया जाता है (जैसे Burp), तो अनुरोध में संशोधन स्क्रिप्ट चलाने से पहले होंगे, और प्रतिक्रिया में संशोधन उसके बाद होंगे। प्रॉक्सी या संशोधन स्क्रिप्ट द्वारा अनुरोध और प्रतिक्रिया में किए गए परिवर्तन गंतव्य पर जाने से पहले मूल संदेश को बदल देंगे।
स्क्रिप्ट में handle_request(message) और handle_response(message) फंक्शन होने चाहिए। HTTP इंटरसेप्शन सर्वर handle_request(message) को कॉल करेगा जब संदेश क्लाइंट से सर्वर की ओर हो, और handle_response(message) को कॉल करेगा जब संदेश सर्वर से क्लाइंट की ओर हो।
एक स्क्रिप्ट का उदाहरण जो संदेश के अंत में एक नल बाइट जोड़ता है:
def handle_request(message):
return message + b"\x00"
def handle_response(message):
# दोनों फंक्शन को एक संदेश वापस करना होगा।
return message
SSL इंटरसेप्शन के लिए टूल को एक सर्वर प्रमाणपत्र और एक निजी कुंजी की आवश्यकता होती है। स्व-हस्ताक्षरित प्रमाणपत्र या Burp के प्रमाणपत्र को उत्पन्न करने के बारे में जानकारी यहाँ पाई जा सकती है।
यदि सर्वर को किसी विशिष्ट प्रमाणपत्र की आवश्यकता है, तो टूल को एक प्रमाणपत्र और एक कुंजी प्रदान की जा सकती है।
नीचे डेमो दिखाता है कि MSSQL के साथ कनेक्शन को कैसे इंटरसेप्ट किया जाए (यह डेमो DVTA पर किया गया था):
MSSQL से कनेक्शन टीसीपी के ऊपर TDS प्रोटोकॉल द्वारा बनाया गया है। प्रमाणीकरण स्वयं TDS प्रोटोकॉल के ऊपर TLS के साथ किया जाता है। उस TLS प्रक्रिया को इंटरसेप्ट करने के लिए, हमें दो पैची संशोधन स्क्रिप्ट की आवश्यकता होगी।
demo_script.py:
from time import time
from struct import pack
from pathlib import Path
def handle_request(message):
if message.startswith(b"\x17\x03"):
return message
with open("msg_req" + str(time()), "wb") as f:
f.write(message[:8])
return message[8:]
def handle_response(message):
if message.startswith(b"\x17\x03"):
return message
path = Path(".")
try:
msg_res = min(i for i in path.iterdir() if i.name.startswith("msg_res"))
data = msg_res.read_bytes()
msg_res.unlink()
except ValueError:
data = b'\x12\x01\x00\x00\x00\x00\x01\x00'
return data[:2] + pack(">h", len(message)+8) + data[4:] + message
demo_script2.py:
from time import time
from struct import pack
from pathlib import Path
def handle_request(message):
if message.startswith(b"\x17\x03"):
return message
path = Path(".")
try:
msg_req = min(i for i in path.iterdir() if i.name.startswith("msg_req"))
data = msg_req.read_bytes()
msg_req.unlink()
except ValueError:
data = b'\x12\x01\x00\x00\x00\x00\x01\x00'
return data[:2] + pack(">h", len(message)+8) + data[4:] + message
def handle_response(message):
if message.startswith(b"\x17\x03"):
return message
with open("msg_res" + str(time()), "wb") as f:
f.write(message[:8])
return message[8:]
हम उन पैची स्क्रिप्ट्स के साथ कुछ TLS संचार देखेंगे, लेकिन फिर क्लाइंट विफल हो जाएगा (क्योंकि उन हैकी स्क्रिप्ट्स के साथ, हम TLS भाग को छोड़कर TDS संचार को बुरी तरह से बदल देते हैं)।
कॉपीराइट (c) 2022 CyberArk Software Ltd. सर्वाधिकार सुरक्षित
यह रिपॉजिटरी Apache-2.0 लाइसेंस के तहत लाइसेंस प्राप्त है - अधिक विवरण के लिए LICENSE देखें।