
हथियारबंद ब्राउज़र-इन-द-मिडल (BitM) पेनिट्रेशन टेस्टर्स के लिए

प्रवेश परीक्षकों के लिए शस्त्रीकृत बहु-उपयोगकर्ता ब्राउज़र-इन-द-मिडिल (BitM)। यह हमला कई उच्च-मूल्य वाले वेब अनुप्रयोगों पर बहु-कारक प्रमाणीकरण को बायपास करने के लिए इस्तेमाल किया जा सकता है। यह उन अनुप्रयोगों पर भी काम करता है जो सत्र टोकन का उपयोग नहीं करते हैं, और इसलिए पारंपरिक टोकन चोरी हमलों का उपयोग करके शोषण योग्य नहीं होंगे। यह एक सामाजिक इंजीनियरिंग उपकरण है और लक्ष्य सेवा में किसी भी तकनीकी खामी का शोषण नहीं करता है।
यह उपकरण एक विशिष्ट वेब सर्वर है। इसे Debian 11 (Bullseye) Linux सर्वर पर चलाने के लिए डिज़ाइन किया गया है और प्रशासन कार्यक्षमता की सुरक्षा के लिए सार्वजनिक IP जानकारी पर निर्भर करता है। कुछ गंभीर बाधाओं को पार किए बिना स्थानीय रूप से परीक्षण करने की अपेक्षा न करें।
चेतावनी: Chromium ARM पर समर्थित नहीं है। हालांकि ARM क्रोमियम बाइनरी का उपयोग करने के लिए मजबूर करना तकनीकी रूप से संभव है, आप puppeteer-extra की सभी अतिरिक्त सुविधाओं/सुरक्षाओं को खो देंगे।
यह उदाहरण सेटअप TLS, SNI को संभालने और प्रत्येक अनुरोध में 'X-Real-IP' जैसे कुछ कस्टम हेडर जोड़ने के लिए Caddy का उपयोग करता है। Cuddlephish के साथ Caddy का उपयोग करना आवश्यक नहीं है, क्योंकि वही रिवर्स प्रॉक्सी Nginx, Apache आदि का उपयोग करके सेट किया जा सकता है। मुझे Caddy पसंद है क्योंकि इसे Docker के साथ स्थापित करना आसान है, और इसमें अधिकांश डोमेन रजिस्ट्रारों के लिए Letsencrypt प्रमाणपत्र प्रबंधित करने के लिए प्लगइन हैं। उदाहरण Caddyfile दिखाता है कि आप इसे Gandi के लिए कैसे सेट करेंगे। अपने रजिस्ट्रार के दस्तावेज़ देखें।
Docker, Node, XVFB और कुछ अन्य निर्भरताएँ स्थापित करें:
git clone https://github.com/fkasler/cuddlephish
cd cuddlephish
sudo bash install_deps.sh
फिर आप अपने रजिस्ट्रार के लिए वाइल्डकार्ड सर्ट प्लगइन के साथ Caddy बनाने के लिए Docker का उपयोग कर सकते हैं। उदाहरण Gandi के लिए है। दस्तावेज़ यहाँ और DNS प्रदाता मॉड्यूल की सूची यहाँ देखें। आप बनाने से पहले अपने रजिस्ट्रार के लिए Dockerfile को संशोधित कर सकते हैं:
sudo docker build -t caddy .
अब अपने डोमेन और Gandi (या अन्य रजिस्ट्रार) API कुंजी को बदलने के लिए Caddyfile को संशोधित करें, और Caddy शुरू करें। मैं इसे screen या tmux विंडो में शुरू करने की सलाह देता हूँ ताकि आप एक क्षण में दूसरी विंडो में Node सर्वर चला सकें:
sudo docker run -p 80:80 -p 443:443 -p 2019:2019 -v $PWD/Caddyfile:/etc/caddy/Caddyfile --network=host caddy:latest
Caddy के साथ 80 और 443 पर हमारे लिए ट्रैफिक संभालने के बाद, हम अंततः उपकरण चला सकते हैं!
Node निर्भरताएँ स्थापित करें:
npm install
कुछ कॉन्फ़िग ट्वीक: महत्वपूर्ण कदम: सुनिश्चित करें कि उदाहरण config.json को संशोधित करके प्रशासन पहुंच के लिए अपने स्वीकृत सार्वजनिक IP(s) जोड़ें। IPs की यह श्वेतसूची "/admin" वेब इंटरफ़ेस तक पहुंच निर्धारित करती है। आपको डिफ़ॉल्ट सॉकेट कुंजी को भी अधिक सुरक्षित में बदलना चाहिए।
उपकरण डिफ़ॉल्ट रूप से किसी भी लॉगिन को लक्षित करने के लिए सेट नहीं है, इसलिए आपको कुछ जोड़ने की आवश्यकता होगी। इस चरण को आसान बनाने के लिए एक 'add_target.js' स्क्रिप्ट है। बस स्क्रिप्ट चलाएँ और संकेत मिलने पर उस लॉगिन पोर्टल का URL पेस्ट करें जिसे आप लक्षित करना चाहते हैं:
node add_target.js
यह आपके लिए सेवा का नाम, टैब शीर्षक और फ़ेविकॉन प्राप्त करेगा और 'targets.json' में एक प्रविष्टि जोड़ेगा। आप इस स्क्रिप्ट को कई बार चला सकते हैं और यह आपके नए लक्ष्यों को जोड़ देगी। स्क्रिप्ट प्रत्येक सेवा का नाम डोमेन के आधार पर रखेगी, शीर्ष स्तर के बिना। इसलिए, 'https://www.example.com/login.php' के लिए सेवा सिर्फ 'example' होगी जब आप अपने लक्ष्य को निर्दिष्ट करेंगे जब आप...
इसे चलाएँ!
node index.js example
कुछ सेकंड के बाद, आपको कंसोल में एक संदेश दिखना चाहिए जब आपका पहला स्वचालित क्रोम इंस्टेंस websockets पर चेक इन करता है। अब आपके फ़िशिंग साइट के आगंतुकों को वह दिखना चाहिए जो लक्ष्य लॉगिन पृष्ठ प्रतीत होता है, लेकिन वास्तव में यह आपके स्वचालित ब्राउज़र इंस्टेंस का वीडियो फ़ीड है। वे आपके ब्राउज़र इंस्टेंस के साथ बातचीत भी कर सकते हैं और आपके लिए लॉग इन कर सकते हैं।
यदि आपने config.json में अपने प्रशासन IP(s) को ठीक से कॉन्फ़िगर किया है, तो आपको उपयोगकर्ताओं को ट्रैक करने, कुंजी लॉग देखने, लॉग इन किए गए ब्राउज़र इंस्टेंस पर नियंत्रण लेने, कुकीज़ चुराने और अवांछित ब्राउज़र इंस्टेंस को हटाने के लिए एक विशेष '/admin' वेब इंटरफ़ेस देखने में सक्षम होना चाहिए।
नोट: आपको प्रशासन पृष्ठ में तब तक कुछ नहीं दिखेगा जब तक आपके कुछ पीड़ित न हों। एक बार जब आपके पास कोई पीड़ित हो, तो उनका ब्राउज़र इंस्टेंस प्रशासन UI पर पॉप अप होना चाहिए।
मेरे पास कई लोगों ने "Blank White Page" के बारे में समस्या खोली है, जो कई संभावित समस्याओं का एक लक्षण है, और अपने आप में कोई समस्या नहीं है। कृपया अस्पष्ट लक्षण नामों के तहत समस्या न खोलें। इसके बजाय, यदि आपके पास उपयोगकर्ता पक्ष पर एक खाली पृष्ठ है, तो पहले निम्नलिखित में देखने का प्रयास करें:
उच्च स्तर पर, यदि आप फ्रंट-एंड पर सिर्फ एक खाली पृष्ठ देखते हैं, तो इसका मतलब है कि डेटा प्रवाह की श्रृंखला में "Start WebRTC" > "Select Tab to Broadcast" > "Negotiate ICE with Victim's Browser" > "Stream Video" में कुछ टूट-फूट हो रही है। उपरोक्त समस्या निवारण कदम आपको इस प्रक्रिया के माध्यम से डेटा का अनुसरण करने में मदद करने के लिए हैं। जब ठीक से काम कर रहा हो, तो आपको सर्वर पर निम्नलिखित के समान एक लॉग स्ट्रीम देखने की उम्मीद करनी चाहिए:
मुझे आशा है कि यह किसी भी समस्या में मदद करता है, और हमेशा की तरह, किसी समस्या को लगातार दोहराने के लिए पर्याप्त जानकारी आगे की जांच के लिए समस्या प्रस्तुत करने के लिए एक शर्त है।
JavaScript के माध्यम से पीड़ित के सिस्टम पर डाउनलोड करने के लिए मैन्युअल रूप से एक पेलोड ट्रिगर करें। प्रत्येक लक्ष्य एक परीक्षण पेलोड के रूप में 'payload.txt' से शुरू होता है। कस्टम पेलोड भेजने के लिए बस targets.json में फ़ाइल स्थान बदलें।
पीड़ित को वास्तविक लॉगिन पोर्टल पर भेजने के लिए window.location परिवर्तन भेजता है। ऐसा लगेगा जैसे उन्हें केवल पुन: प्रमाणित करने के लिए मजबूर किया जा रहा है और उन्हें आपको नियंत्रण लेते देखने से रोकता है। यदि आप कोड को संशोधित करते हैं, तो आप इस सामान्य तकनीक के साथ कुछ और फैंसी चीजें कर सकते हैं ;)
आपको प्रशासन पोर्टल से सीधे ब्राउज़र इंस्टेंस पर नियंत्रण लेने की अनुमति देता है। इंस्टेंस को नियंत्रित करना बंद करने के लिए, ESCAPE कुंजी दबाएँ। नोट, यह फ़िशिंग पीड़ित से नियंत्रण छीन लेगा और यदि आप पहले उन्हें बाहर नहीं निकालते हैं तो वे आपकी गतिविधियों को देख पाएंगे। आपको चेतावनी दी गई है।
आपको मैन्युअल रूप से स्वचालित ब्राउज़र इंस्टेंस का नियंत्रण उपयोगकर्ता को वापस देने की अनुमति देता है। यह IT को स्पूफ करते समय कुछ सामाजिक इंजीनियरिंग परिदृश्यों के लिए उपयोगी हो सकता है। आप उपयोगकर्ता को बता सकते हैं कि आप एक सहायता सत्र शुरू कर रहे हैं, नियंत्रण लें और लक्ष्य सेवा पर नेविगेट करें, नियंत्रण वापस दें और उन्हें लॉग इन करने दें, फिर से नियंत्रण लें आदि।
ब्राउज़र इंस्टेंस से सभी कुकी और स्थानीय संग्रहण आइटम निकालता है, और इसे एक JSON फ़ाइल के रूप में डाउनलोड करता है। इस क्रेडेंशियल सामग्री को आपके स्थानीय सिस्टम पर चल रहे ब्राउज़र इंस्टेंस में वापस इंजेक्ट करने के लिए, प्रोजेक्ट में 'stealer.js' नामक एक स्क्रिप्ट है। इसे आपकी मशीन से चलाने का इरादा है, न कि सर्वर से, इसलिए इसका उपयोग करने के लिए आपको अपने सिस्टम पर प्रोजेक्ट के Node घटकों को भी स्थापित करना होगा।
node stealer.js ~/Downloads/cuddle_asdf1234.json
जब आपको इसकी आवश्यकता न हो तो ब्राउज़र इंस्टेंस को मार देता है। कभी-कभी उपयोगकर्ता आपको पूरी तरह से लॉग इन नहीं करते हैं। कभी-कभी WebRTC कनेक्शन विफल हो जाता है। कभी-कभी आपके उपयोग करने से पहले कोई सत्र समाप्त हो जाता है। इन मामलों में, यह बटन प्रशासन पोर्टल के माध्यम से बेकार ब्राउज़र इंस्टेंस को साफ करने में मदद कर सकता है।
प्रत्येक ब्राउज़र अपने स्वयं के यादृच्छिक "browser id" और प्रोजेक्ट के "user_data" फ़ोल्डर में मेल खाते उपयोगकर्ता डेटा निर्देशिका के साथ स्पॉन किया जाता है। कुछ मामलों में जहां 'stealer.js' काम नहीं कर रहा है, आपको उस इंस्टेंस के लिए उपयोगकर्ता डेटा को भी दोहराने की आवश्यकता हो सकती है। यह उन सेवाओं को लक्षित करने वाले मामलों में उपयोगी हो सकता है जिनमें "remember this browser" सुविधा है, यह इस बात पर निर्भर करता है कि वह सुविधा कैसे कार्यान्वित की गई है।
प्रत्येक उपयोगकर्ता डेटा निर्देशिका में पीड़ित उपयोगकर्ता के पूर्ण कुंजी लॉग के साथ एक keylog.txt भी है। प्रशासन पोर्टल में सामान्य कुंजी लॉग बैकस्पेस जैसी चीजों को ध्यान में रखने का प्रयास करता है, जबकि इस keylog.txt में सभी रिकॉर्ड की गई कुंजी स्ट्रोक होंगे।
उदाहरण pm.json:
{
"tacking_id": "id",
"logging_endpoint": "https://www.phishmongerserver.com/create_event",
"admin_cookie": "admin_cookie=s3cret",
"post_url_search": "ppsecure"
}
यह उपकरण फ़िशिंग साइट आगंतुकों को फ़िशिंग सर्वर पर चल रहे एक स्वचालित क्रोम ब्राउज़र के साथ जोड़कर काम करता है। हमलावर-नियंत्रित क्रोम इंस्टेंस का एक वीडियो फ़ीड फिर WebRTC पर फ़िशिंग पीड़ित को स्ट्रीम किया जाता है, और सभी उपयोगकर्ता-आपूर्ति किए गए माउस आंदोलनों और कीबोर्ड इनपुट पीड़ित के ब्राउज़र से उनके संबद्ध क्रोम इंस्टेंस तक अग्रेषित किए जाते हैं। सर्वर पीड़ितों को ट्रैक करने, उन्हें ब्राउज़र के साथ जोड़ने, WebRTC वीडियो फ़ीड की मध्यस्थता करने, और उपयोगकर्ता इनपुट को मैन-इन-द-मिडिल करने के लिए websockets का उपयोग करता है। प्रत्येक नए आगंतुक के लिए, सर्वर एक नया क्रोम इंस्टेंस स्पॉन करता है। चूंकि हम प्रत्येक क्रोम इंस्टेंस को चलाने के लिए क्रोम डेवटूल्स प्रोटोकॉल (CDP) का उपयोग कर रहे हैं, हम उपयोगकर्ता के हमारे लिए लॉग इन करने के बाद लक्ष्य साइटों के लिए सत्र कुकीज़ निकालने के लिए "Storage.getCookie" जैसे API का उपयोग कर सकते हैं। हम किसी भी समय कदम उठा सकते हैं और सीधे प्रत्येक क्रोम इंस्टेंस को चला सकते हैं, उसी विधि का लाभ उठाते हुए जिसका उपयोग हम पहले स्थान पर पीड़ितों को दूरस्थ नियंत्रण देने के लिए करते हैं।
Node सर्वर निम्नलिखित करता है:
मेरी समझ में यह तकनीक कई वर्षों से सिद्धांतित और शस्त्रीकृत भी की गई है (शाउटआउट देखें)। इसलिए, जबकि खतरे के अभिनेता इस तकनीक का लाभ उठा सकते हैं, और संभवतः कुछ समय से ले रहे हैं, आक्रामक सुरक्षा पेशेवरों के पास इस तकनीक को दोहराने का आसान तरीका नहीं है और वे इसके अस्तित्व से अनजान भी हो सकते हैं। उपकरण जारी करने का मेरा इरादा प्रवेश परीक्षकों और रेड टीमर्स को संचालन पर BitM का उपयोग करने, इसके संभावित प्रभाव को प्रदर्शित करने और नेटवर्क रक्षकों को वास्तविक खतरों के लिए तैयार करने में मदद करने की अनुमति देना है।
पहले, समझें कि यह हमला किसी उपयोगकर्ता को एक दुर्भावनापूर्ण वेबसाइट पर जाने के लिए सामाजिक इंजीनियरिंग पर निर्भर करता है। डोमेन श्वेतसूची इस और अन्य प्रकार की सामाजिक इंजीनियरिंग को रोकने में बहुत मदद करेगी। यदि हम उपयोगकर्ताओं पर एक वेब सेवा के लिए 100% क्रेडेंशियल डेटा (पासवर्ड, OTP, SMS, PhoneFactor, Push नोटिफिकेशन, आदि) का प्रबंधन करने के लिए भरोसा करते हैं, तो हम संभावित रूप से इस हमले के प्रति संवेदनशील हैं। इसलिए, इस हमले को विफल करने के लिए, हमें उस क्रेडेंशियल डेटा का लाभ उठाने की आवश्यकता है जिसे उपयोगकर्ता प्रबंधित नहीं करते हैं। उदाहरण के लिए, क्लाइंट TLS प्रमाणपत्र क्लाइंट डिवाइसों को जारी किए जा सकते हैं, और केवल वास्तविक वेब सेवा के लिए मान्य होंगे। प्रमाणपत्र ब्राउज़र और ऑपरेटिंग सिस्टम द्वारा प्रबंधित किया जाता है, और हमलावर के सर्वर के लिए पीड़ित के TLS प्रमाणपत्र की एक प्रति प्राप्त करने का कोई तरीका नहीं है। एक अन्य विकल्प कुछ आवश्यक क्रेडेंशियल डेटा का प्रबंधन करने के लिए YubiKey जैसे हार्डवेयर के साथ U2F या FIDO2 का उपयोग करना है। किसी हैकर की वेबसाइट के लिए पीड़ित के कंप्यूटर में प्लग किए गए YubiKey के साथ बातचीत करने का कोई तरीका नहीं है।
मैं Docker विशेषज्ञ नहीं हूँ (अभी तक)। यदि आप एक सरल Dockerized सेटअप के साथ आ सकते हैं, तो मुझे वास्तव में एक पुल रिक्वेस्ट पसंद आएगी।
यह Cuttlefish पर एक नाटक है, एक बहादुर समुद्री प्राणी जो अपने परिवेश में घुल-मिल सकता है, Phishing, क्योंकि हमले को करने के लिए सामाजिक इंजीनियरिंग की आवश्यकता होती है, और अद्वितीय, चंचल और मूर्खतापूर्ण बनाने के लिए जानबूझकर गलत वर्तनी की गई है। यह सोचकर मुझे खुशी होती है कि इस मजेदार उपकरण नाम का उल्लेख पेंटेस्ट रिपोर्ट में महत्वपूर्ण-जोखिम निष्कर्षों के साथ किया जाएगा।
जबकि मैं इस तकनीक और कार्यान्वयन के साथ स्वतंत्र रूप से आया था, मैंने तब से सीखा है कि कुछ अन्य शोधकर्ताओं ने खोज में मुझे हराया। उनमें से प्रत्येक ने समान परिणाम प्राप्त करने के लिए वेब-आधारित VNC क्लाइंट का उपयोग करने का दृष्टिकोण अपनाया। यह एक सहज दृष्टिकोण है और अन्य सॉफ्टवेयर के खिलाफ MitM हमले करने के लिए लागू हो सकता है, न कि केवल ब्राउज़र (शायद ब्राउज़र में VPN?)। देखने लायक है:
Franco Tommasi, Christian Catalano & Ivan Taurino https://link.springer.com/article/10.1007/s10207-021-00548-5
@mrd0x https://mrd0x.com/bypass-2fa-using-novnc/
Also:
Daniel Aaron @majordmg को WebRTC प्रूफ-ऑफ-कॉन्सेप्ट के शुरुआती चरणों में मदद करने के लिए शाउटआउट।
RJ Stallkamp @Z3rO-C00L को प्रशासन इंटरफ़ेस को ठीक करने और स्टाइल करने, और प्यारे नए लोगो के लिए बहुत-बहुत धन्यवाद।