
एक MITM (मॉन्स्टर-इन-द-मिडल) डिटेक्शन टूल। इसका उपयोग MALCOLM बनाने के लिए किया जाता है:
इस परियोजना का उद्देश्य HTTPS अवरोधन (इंटरसेप्शन) का सटीक पता लगाना और मजबूत TLS फिंगरप्रिंटिंग को सक्षम करना है। यह परियोजना The Security Impact of HTTPS Interception पर आधारित है, और उनकी प्रोसेसिंग स्क्रिप्ट्स और फिंगरप्रिंट्स के Go में पोर्ट के रूप में शुरू हुई।
MITMEngine के बारे में अधिक संदर्भ इस Cloudflare ब्लॉग पोस्ट में उपलब्ध है। त्वरित लिंक:
wireshark -v चलाएँ)विस्तृत दस्तावेज़ कोड के साथ रहता है (पहले पैकेज को $(GOPATH)/src/github.com/cloudflare/mitmengine में कॉपी करें)।
godoc -http=:6060
http://localhost:6060/pkg/github.com/cloudflare/mitmengine
इस परियोजना में, फिंगरप्रिंट किसी वस्तु के ठोस उदाहरणों से मैप होते हैं, जबकि हस्ताक्षर कई वस्तुओं का प्रतिनिधित्व कर सकते हैं। हम इस परंपरा का उपयोग करते हैं क्योंकि फिंगरप्रिंट आमतौर पर किसी वस्तु का अंतर्निहित गुण होता है, जबकि हस्ताक्षर को चुना जा सकता है। उसी तरह, सर्वर द्वारा देखा गया कोई वास्तविक क्लाइंट अनुरोध फिंगरप्रिंट होगा, जबकि अनुरोध उत्पन्न करने वाला सॉफ़्टवेयर अपना स्वयं का हस्ताक्षर चुन सकता है (उदाहरण के लिए, यह चुनकर कि वह किन सिफर सुइट्स का समर्थन करता है)।
एक क्लाइंट अनुरोध फिंगरप्रिंट क्लाइंट से सर्वर को भेजे गए अनुरोध से प्राप्त होता है, और इसमें TLS और HTTP दोनों विशेषताएँ शामिल होती हैं। एक क्लाइंट अनुरोध हस्ताक्षर उन सभी संभावित फिंगरप्रिंट्स का प्रतिनिधित्व करता है जो एक सॉफ़्टवेयर उत्पन्न कर सकता है। इसका उद्देश्य प्रत्येक हस्ताक्षर को इतना विशिष्ट बनाना है कि वह किसी सॉफ़्टवेयर की अद्वितीय पहचान कर सके।
एक उपयोगकर्ता एजेंट हस्ताक्षर एक ब्राउज़र द्वारा उत्पन्न उपयोगकर्ता एजेंटों के एक सेट का प्रतिनिधित्व करता है। एक ब्राउज़र के लिए उपयोगकर्ता एजेंट हस्ताक्षर ब्राउज़र संस्करणों की एक श्रेणी की अनुमति देता है, और अधिक सूक्ष्म हस्ताक्षर बनाने के लिए OS नाम, OS प्लेटफ़ॉर्म, OS संस्करण श्रेणी और डिवाइस प्रकार निर्दिष्ट करने की अनुमति देता है।
एक ब्राउज़र हस्ताक्षर में उपयोगकर्ता एजेंट हस्ताक्षर और क्लाइंट अनुरोध हस्ताक्षर दोनों शामिल होते हैं। यह एक हस्ताक्षर को उन सभी संभावित फिंगरप्रिंट्स का प्रतिनिधित्व करने की अनुमति देता है जो Chrome 31-38 Windows 10 पर उत्पन्न करता है, उदाहरण के लिए।
एक MITM हस्ताक्षर में क्लाइंट अनुरोध हस्ताक्षर के साथ-साथ MITM सॉफ़्टवेयर के बारे में अतिरिक्त विवरण शामिल होते हैं, जिसमें एक सुरक्षा ग्रेड भी शामिल है जो क्लाइंट अनुरोध के बाहर के कारकों से प्रभावित हो सकता है, जैसे कि सॉफ़्टवेयर प्रमाणपत्रों को मान्य करता है या नहीं।
हम एक HTTPS कनेक्शन को अवरोधित (इंटरसेप्टेड) मानते हैं जब उपयोगकर्ता एजेंट द्वारा पहचाने गए ब्राउज़र के अनुरूप अपेक्षित क्लाइंट अनुरोध हस्ताक्षर और अनुरोध के वास्तविक क्लाइंट अनुरोध फिंगरप्रिंट के बीच बेमेल होता है।
यदि कोई हस्ताक्षर किसी दिए गए क्लाइंट सॉफ़्टवेयर के लिए गलत या पुराना है, तो यह संभव है कि हस्ताक्षर गलत तरीके से कनेक्शन को अवरोधित के रूप में चिह्नित करेगा।
यदि कोई प्रॉक्सी क्लाइंट के अनुरोध की बारीकी से नकल करता है, तो हम बेमेल का पता लगाने की उम्मीद नहीं कर सकते। यदि ब्राउज़र हस्ताक्षर अत्यधिक व्यापक हैं, तो हम अवरोधन का पता लगाने में भी विफल रहेंगे।
MALCOLM में उपयोग किए जाने वाले संदर्भ ब्राउज़र और MITM सॉफ़्टवेयर फिंगरप्रिंट reference_fingerprints/mitmengine/ में पाए जा सकते हैं।
फिंगरप्रिंट का यह सेट reference_fingerprints/pcaps/ में TLS क्लाइंट हेलो pcaps से खींचे गए फिंगरप्रिंटों के साथ-साथ Cloudflare के नेटवर्क पर देखे गए शीर्ष 500 उपयोगकर्ता एजेंट + TLS क्लाइंट हेलो
जोड़ियों का संयोजन है, जिन्हें उच्च विश्वसनीयता रेटिंग (अर्थात, मानव और मैत्रीपूर्ण बॉट गतिविधि के अनुरूप ट्रैफ़िक) के साथ लेबल किया गया है।
आदर्श रूप से, हमें Cloudflare के नेटवर्क से नमूना संदर्भ फिंगरप्रिंट पर निर्भर नहीं रहना चाहिए; इसके बजाय, हमारे पास संदर्भ TLS क्लाइंट हेलो का एक सेट बनाने के लिए pcaps का एक व्यापक सेट होना चाहिए। हमारे डेटासेट को बनाने में मदद करने में रुचि रखते हैं? देखें कि आप कैसे योगदान कर सकते हैं!
पहले, उपयोगकर्ता को mitmengine.NewProcessor में पास करने के लिए एक mitmengine.Config संरचना बनानी होगी। एक mitmengine.Config
संरचना ब्राउज़र फिंगरप्रिंट, MITM फिंगरप्रिंट और MITM
हेडर वाली फ़ाइलों के फ़ाइल नाम निर्दिष्ट कर सकती है। वैकल्पिक रूप से, यह पूर्वोक्त फ़ाइलों को किसी अन्य
स्रोत से पढ़ने के लिए एक कॉन्फ़िगरेशन फ़ाइल भी निर्दिष्ट कर सकती है; अभी, MITMEngine इन फ़ाइलों को Amazon S3 क्लाइंट-संगत डेटाबेस (Amazon S3 और Ceph सहित) से पढ़ने का समर्थन करता है। डेटाबेस के लिए अतिरिक्त फ़ाइल रीडर (जिन्हें हम "लोडर" कहते हैं) को loaders पैकेज में परिभाषित किया जा सकता है, और जब तक नए लोडर लोडर इंटरफ़ेस को लागू करते हैं, उन्हें बाकी MITMEngine के साथ तुरंत काम करना चाहिए।
MITMEngine पैकेज का इच्छित प्रवेश बिंदु Processor.Check फ़ंक्शन के माध्यम से है, जो उपयोगकर्ता एजेंट और क्लाइंट अनुरोध फिंगरप्रिंट लेता है, और एक mitm पहचान रिपोर्ट लौटाता है। भविष्य में अतिरिक्त API फ़ंक्शन जोड़े जाएंगे, उदाहरण के लिए, चल रही प्रक्रिया में नए हस्ताक्षर जोड़ने की अनुमति देने के लिए।
API के उपयोग का एक उदाहरण नीचे दिया गया है। एक अधिक पूर्ण अनुप्रयोग cmd/demo/main.go पर उपलब्ध है, और इसे make bin/demo चलाकर बनाया जा सकता है।
rawUa := "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36"
requestFingerprintString := "303:dada,1301,1302,1303,c02b,c02f,c02c,c030,cca9,cca8,c013,c014,9c,9d,2f,35,a:aaaa,0,17,ff01,a,b,23,10,5,d,12,33,2d,2b,1b,dada,15:9a9a,1d,17,18:0::"
uaFingerprintString := "1:72.0.3626:2:3:10.14.3:1:"
requestFingerprint, _ := fp.NewRequestFingerprint(requestFingerprintString)
uaFingerprint, _ := fp.NewUAFingerprint(uaFingerprintString)
report := mitmProcessor.Check(uaFingerprint, rawUa, requestFingerprint)
TLS requestFingerprintString का निम्नलिखित प्रारूप है:
<tls_version>:<cipher_suites>:<extension_names>:<curves>:<ec_point_fmts>:<http_headers>:<quirks>
uaFingerprint का निम्नलिखित प्रारूप है:
# <browser_name>:<browser_version>:<os_platform>:<os_name>:<os_version>:<device_type>:<quirks>
उपयोगकर्ता एजेंटों को uaFingerprint के प्रारूप में पार्स करने का एक उदाहरण cmd/demo/main.go फ़ाइल में है।
MITMEngine का उपयोग करने के लिए, इसकी निर्भरताओं को खींचना याद रखें। आप शायद MITMEngine पर परीक्षण चलाने से पहले वेंडरिंग या gomod लॉजिक चलाना चाहेंगे।
परीक्षण के लिए, make test चलाएँ और कोड कवरेज देखने के लिए, make cover चलाएँ।
चूंकि ब्राउज़र और mitm फिंगरप्रिंट जल्दी ही पुराने हो जाते हैं, हम सक्रिय रूप से नए नमूनों के साथ फिंगरप्रिंट भंडार को अद्यतन करने का प्रयास कर रहे हैं।
एक फिंगरप्रिंट नमूना (जिसे "नमूना" कहा जाता है) योगदान करके, आप (अपनी ओर से या उस संगठन की ओर से जिसका आप प्रतिनिधित्व करते हैं या जिसके द्वारा प्रायोजित हैं (यदि कोई हो)) Cloudflare, Inc. और इसकी सहायक कंपनियों और संबद्ध कंपनियों को नमूने में सभी बौद्धिक संपदा अधिकारों के तहत एक स्थायी, अपरिवर्तनीय, गैर-अनन्य, रॉयल्टी-मुक्त, विश्वव्यापी अधिकार और लाइसेंस प्रदान करते हैं: (1) नमूने की प्रतिलिपि बनाना, प्रकाशित करना, प्रदर्शित करना और वितरित करना; और (2) व्युत्पन्न कार्य तैयार करना जो नमूने पर आधारित या उसका हिस्सा हैं।"
फिंगरप्रिंट नमूने योगदान करने के लिए, कृपया इन चरणों का पालन करें:
(macOS Mojave 10.14.3 पर परीक्षण किया गया)
सर्वर RSA प्रमाणपत्र और कुंजी जोड़ी बनाएँ:
openssl req -new -x509 -sha256 -out server.crt -nodes -keyout server.pem -subj /CN=localhost
सर्वर को पोर्ट 4433 पर प्रारंभ करें:
openssl s_server -www -cipher AES256-SHA -key server.pem -cert server.crt
HTTP हेडर को डिक्रिप्ट करने के लिए TShark कैप्चर प्रारंभ करें (TShark >= 3.0.0):
tshark -i loopback -o tls.keys_list:"127.0.0.1,4433,http,server.pem" -Tjson -e http.request.line -Y http > header.json
TLS क्लाइंट हेलो का TShark कैप्चर प्रारंभ करें:
tshark -i loopback -f "tcp port 4433" -w handshake.pcap
उस TLS क्लाइंट से https://localhost:4433 पर जाएँ जिसे आप फिंगरप्रिंट करना चाहते हैं। उदाहरण के लिए,
echo -e "GET /test HTTP/1.1\r\nHost:example.com\r\n\r\n" | openssl s_client -connect localhost:4433
ऊपर बताए अनुसार एक फिंगरप्रिंट नमूना (header.json, handshake.pcap) उत्पन्न करें, और इसे निर्देशिका reference_fingerprints/pcaps/<desc> में रखें, जहाँ <desc> एक अद्वितीय और वर्णनात्मक नाम है।
नीचे दिए गए फ़ील्ड के साथ reference_fingerprints/fingerprint_metadata.jsonl में एक पंक्ति जोड़ें। os, device, platform, और browser फ़ील्ड के लिए मान्यता प्राप्त विकल्प वे हैं जो uasurfer पैकेज में परिभाषित हैं। mitm_fingerprint.type के लिए मान्यता प्राप्त विकल्प नीचे सूचीबद्ध हैं। उदाहरणों के लिए reference_fingerprints/fingerprint_metadata.jsonl देखें; किसी भी अज्ञात फ़ील्ड को खाली छोड़ा जा सकता है या छोड़ा जा सकता है।
{ "desc": "", "comment": "", "handshake_pcap": "", "header_json": "<(optional) path to file containing the client HTTP request", "ua_fingerprint": {"raw_ua": "", "os": "<WindowsPhone|Windows|MacOSX|iOS|Android|...>", "os_version": "..", "device": "<Windows|Mac|Linux|...>", "platform": "<Computer|Tablet|Phone|...>", "browser": "<Chrome|IE|Safari|Firefox|...>", "browser_version": ".."}, "mitm_fingerprint": { "name": "", "type": "<Antivirus|FakeBrowser|Malware|Parental|Proxy>" }}
अन्य PR और फीचर अनुरोधों का स्वागत है!
mergeDB (cmd/mergedb में) ब्राउज़र या MITM सॉफ़्टवेयर के कई करीबी संस्करणों में समान TLS क्लाइंटहेलो फिंगरप्रिंट को मर्ज करने के लिए एक उपयोगिता है।
उपयोगकर्ता एजेंट / क्लाइंट हेलो फिंगरप्रिंट की बड़ी सूचियों को समेकित करने के लिए mergeDB का उपयोग करें:
go run cmd/mergedb/main.go
डिफ़ॉल्ट रूप से, mergeDB reference_fingerprints/mitmengine निर्देशिका में फिंगरप्रिंट पर चलेगा।
उपरोक्त परिवर्तनों के साथ एक पुल रिक्वेस्ट सबमिट करें।