Browser Extension Pentesting Methodology
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
ब्राउज़र एक्सटेंशन जावास्क्रिप्ट में लिखे जाते हैं और ब्राउज़र द्वारा बैकग्राउंड में लोड किए जाते हैं। इसका DOM होता है लेकिन यह अन्य साइटों के DOM के साथ इंटरैक्ट कर सकता है। इसका मतलब है कि यह अन्य साइटों की गोपनीयता, अखंडता और उपलब्धता (CIA) को खतरे में डाल सकता है।
एक्सटेंशन लेआउट सबसे अच्छे लगते हैं जब उन्हें विज़ुअलाइज़ किया जाता है और इसमें तीन घटक होते हैं। आइए प्रत्येक घटक को गहराई से देखें।
प्रत्येक कंटेंट स्क्रिप्ट के पास एकल वेब पृष्ठ के DOM तक सीधी पहुंच होती है और इस प्रकार यह संभावित रूप से दुर्भावनापूर्ण इनपुट के लिए उजागर होता है। हालाँकि, कंटेंट स्क्रिप्ट में एक्सटेंशन को संदेश भेजने की क्षमता के अलावा कोई अनुमति नहीं होती है।
एक्सटेंशन कोर में अधिकांश एक्सटेंशन विशेषाधिकार/पहुँच होती है, लेकिन एक्सटेंशन कोर केवल XMLHttpRequest और कंटेंट स्क्रिप्ट के माध्यम से वेब सामग्री के साथ इंटरैक्ट कर सकता है। इसके अलावा, एक्सटेंशन कोर के पास होस्ट मशीन तक सीधी पहुंच नहीं होती है।
एक्सटेंशन एक नैटिव बाइनरी की अनुमति देता है जो उपयोगकर्ता के पूर्ण विशेषाधिकार के साथ होस्ट मशीन तक पहुंच सकता है। नैटिव बाइनरी एक्सटेंशन कोर के साथ मानक नेटस्केप प्लगइन एप्लिकेशन प्रोग्रामिंग इंटरफेस (NPAPI) के माध्यम से इंटरैक्ट करता है जिसका उपयोग फ्लैश और अन्य ब्राउज़र प्लग-इन्स द्वारा किया जाता है।
उपयोगकर्ता के पूर्ण विशेषाधिकार प्राप्त करने के लिए, एक हमलावर को एक्सटेंशन को यह मनाने की आवश्यकता होती है कि वह कंटेंट स्क्रिप्ट से दुर्भावनापूर्ण इनपुट को एक्सटेंशन के कोर में और एक्सटेंशन के कोर से नैटिव बाइनरी में पास करे।
एक्सटेंशन के प्रत्येक घटक को मजबूत सुरक्षात्मक सीमाओं द्वारा एक-दूसरे से अलग किया गया है। प्रत्येक घटक अलग ऑपरेटिंग सिस्टम प्रक्रिया में चलता है। कंटेंट स्क्रिप्ट और एक्सटेंशन कोर सैंडबॉक्स प्रक्रियाओं में चलते हैं जो अधिकांश ऑपरेटिंग सिस्टम सेवाओं के लिए अनुपलब्ध हैं।
इसके अलावा, कंटेंट स्क्रिप्ट अपने संबंधित वेब पृष्ठों से अलग जावास्क्रिप्ट हीप में चलती है। कंटेंट स्क्रिप्ट और वेब पृष्ठ एक ही अंतर्निहित DOM तक पहुंच रखते हैं, लेकिन दोनों कभी भी जावास्क्रिप्ट पॉइंटर्स का आदान-प्रदान नहीं करते, जिससे जावास्क्रिप्ट कार्यक्षमता का लीक होना रोकता है।
manifest.json
एक क्रोम एक्सटेंशन बस एक ZIP फ़ोल्डर है जिसमें .crx फ़ाइल एक्सटेंशन होता है। एक्सटेंशन का कोर फ़ोल्डर के रूट में manifest.json
फ़ाइल है, जो लेआउट, अनुमतियों और अन्य कॉन्फ़िगरेशन विकल्पों को निर्दिष्ट करता है।
Example:
content_scripts
कंटेंट स्क्रिप्ट्स लोड होती हैं जब भी उपयोगकर्ता मिलते-जुलते पृष्ठ पर नेविगेट करता है, हमारे मामले में कोई भी पृष्ठ जो https://example.com/*
अभिव्यक्ति से मेल खाता है और *://*/*/business*
regex से मेल नहीं खाता। ये पृष्ठ के अपने स्क्रिप्ट्स की तरह निष्पादित होती हैं और पृष्ठ के डॉक्यूमेंट ऑब्जेक्ट मॉडल (DOM) तक मनमाना पहुंच होती है।
URLs को शामिल या बाहर करने के लिए include_globs
और exclude_globs
का उपयोग करना भी संभव है।
यह एक उदाहरण सामग्री स्क्रिप्ट है जो पृष्ठ पर एक व्याख्या बटन जोड़ेगी जब स्टोरेज API का उपयोग करके एक्सटेंशन के स्टोरेज से message
मान प्राप्त किया जाएगा।
जब इस बटन पर क्लिक किया जाता है, तो सामग्री स्क्रिप्ट द्वारा एक्सटेंशन पृष्ठों को एक संदेश भेजा जाता है, runtime.sendMessage() API का उपयोग करके। यह सामग्री स्क्रिप्ट की APIs तक सीधे पहुंच की सीमा के कारण है, जिसमें storage
कुछ अपवादों में से एक है। इन अपवादों से परे कार्यक्षमताओं के लिए, संदेश एक्सटेंशन पृष्ठों पर भेजे जाते हैं जिनसे सामग्री स्क्रिप्ट संवाद कर सकती हैं।
ब्राउज़र के आधार पर, सामग्री स्क्रिप्ट की क्षमताएँ थोड़ी भिन्न हो सकती हैं। क्रोमियम-आधारित ब्राउज़रों के लिए, क्षमताओं की सूची Chrome Developers documentation में उपलब्ध है, और फ़ायरफ़ॉक्स के लिए, MDN प्राथमिक स्रोत के रूप में कार्य करता है। यह भी ध्यान देने योग्य है कि सामग्री स्क्रिप्ट के पास बैकग्राउंड स्क्रिप्ट के साथ संवाद करने की क्षमता होती है, जिससे उन्हें क्रियाएँ करने और प्रतिक्रियाएँ वापस भेजने की अनुमति मिलती है।
Chrome में सामग्री स्क्रिप्ट को देखने और डिबग करने के लिए, Chrome डेवलपर टूल मेनू को Options > More tools > Developer tools से या Ctrl + Shift + I दबाकर एक्सेस किया जा सकता है।
डेवलपर टूल प्रदर्शित होने पर, Source tab पर क्लिक किया जाना चाहिए, उसके बाद Content Scripts टैब पर। यह विभिन्न एक्सटेंशनों से चल रही सामग्री स्क्रिप्टों का अवलोकन करने और निष्पादन प्रवाह को ट्रैक करने के लिए ब्रेकपॉइंट सेट करने की अनुमति देता है।
ध्यान दें कि Content Scripts अनिवार्य नहीं हैं क्योंकि यह डायनामिकली inject स्क्रिप्ट और programatically inject करने के लिए भी संभव है tabs.executeScript
के माध्यम से। यह वास्तव में अधिक granular controls प्रदान करता है।
एक सामग्री स्क्रिप्ट के प्रोग्रामेटिक इंजेक्शन के लिए, एक्सटेंशन को उस पृष्ठ के लिए host permissions होना आवश्यक है जिसमें स्क्रिप्ट को इंजेक्ट किया जाना है। ये अनुमतियाँ या तो एक्सटेंशन के मैनिफेस्ट में उनकी मांग करके या activeTab के माध्यम से अस्थायी आधार पर सुरक्षित की जा सकती हैं।
क्लिक पर एक JS फ़ाइल इंजेक्ट करें:
क्लिक पर एक फ़ंक्शन इंजेक्ट करें:
URLs को शामिल या बाहर करने के लिए include_globs
और exclude_globs
का उपयोग करना भी संभव है।
run_at
run_at
फ़ील्ड यह नियंत्रित करती है कि JavaScript फ़ाइलें वेब पृष्ठ में कब इंजेक्ट की जाती हैं। पसंदीदा और डिफ़ॉल्ट मान "document_idle"
है।
संभव मान हैं:
document_idle
: जब भी संभव हो
document_start
: css
से किसी भी फ़ाइल के बाद, लेकिन किसी अन्य DOM के निर्माण या किसी अन्य स्क्रिप्ट के चलने से पहले।
document_end
: DOM के पूर्ण होने के तुरंत बाद, लेकिन छवियों और फ़्रेम जैसी उप-संसाधनों के लोड होने से पहले।
manifest.json
के माध्यम सेservice-worker.js
के माध्यम से
background
सामग्री स्क्रिप्ट द्वारा भेजे गए संदेश बैकग्राउंड पेज द्वारा प्राप्त होते हैं, जो एक्सटेंशन के घटकों के समन्वय में एक केंद्रीय भूमिका निभाता है। विशेष रूप से, बैकग्राउंड पेज एक्सटेंशन के जीवनकाल के दौरान बना रहता है, सीधे उपयोगकर्ता इंटरैक्शन के बिना काम करता है। इसमें अपना खुद का दस्तावेज़ ऑब्जेक्ट मॉडल (DOM) होता है, जो जटिल इंटरैक्शन और स्थिति प्रबंधन को सक्षम बनाता है।
मुख्य बिंदु:
बैकग्राउंड पेज की भूमिका: एक्सटेंशन के लिए नर्व सेंटर के रूप में कार्य करता है, विभिन्न भागों के बीच संचार और समन्वय सुनिश्चित करता है।
स्थायीता: यह एक हमेशा उपस्थित इकाई है, जो उपयोगकर्ता के लिए अदृश्य है लेकिन एक्सटेंशन की कार्यक्षमता के लिए अनिवार्य है।
स्वचालित निर्माण: यदि स्पष्ट रूप से परिभाषित नहीं किया गया है, तो ब्राउज़र स्वचालित रूप से एक बैकग्राउंड पेज बनाएगा। यह स्वचालित रूप से उत्पन्न पृष्ठ एक्सटेंशन के मैनिफेस्ट में निर्दिष्ट सभी बैकग्राउंड स्क्रिप्ट्स को शामिल करेगा, जिससे एक्सटेंशन के बैकग्राउंड कार्यों का निर्बाध संचालन सुनिश्चित होता है।
ब्राउज़र द्वारा स्वचालित रूप से बैकग्राउंड पेज उत्पन्न करने की सुविधा (जब स्पष्ट रूप से घोषित नहीं किया गया हो) यह सुनिश्चित करती है कि सभी आवश्यक बैकग्राउंड स्क्रिप्ट्स एकीकृत और कार्यशील हैं, जिससे एक्सटेंशन की सेटअप प्रक्रिया को सरल बनाया जा सके।
Example background script:
यह runtime.onMessage API का उपयोग संदेशों को सुनने के लिए करता है। जब एक "explain"
संदेश प्राप्त होता है, तो यह tabs API का उपयोग करके एक नए टैब में एक पृष्ठ खोलता है।
बैकग्राउंड स्क्रिप्ट को डिबग करने के लिए आप एक्सटेंशन विवरण पर जा सकते हैं और सेवा कार्यकर्ता का निरीक्षण कर सकते हैं, यह बैकग्राउंड स्क्रिप्ट के साथ डेवलपर टूल्स खोलेगा:
ब्राउज़र एक्सटेंशन में विभिन्न प्रकार के पृष्ठ हो सकते हैं:
एक्शन पृष्ठ तब प्रदर्शित होते हैं जब एक्सटेंशन आइकन पर क्लिक किया जाता है।
पृष्ठ जो एक्सटेंशन नए टैब में लोड करेगा।
विकल्प पृष्ठ: यह पृष्ठ क्लिक करने पर एक्सटेंशन के शीर्ष पर प्रदर्शित होता है। पिछले मैनिफेस्ट में, मैं इस पृष्ठ तक पहुँचने में सक्षम था chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca
या क्लिक करके:
ध्यान दें कि ये पृष्ठ बैकग्राउंड पृष्ठों की तरह स्थायी नहीं होते हैं क्योंकि वे आवश्यकता के अनुसार गतिशील सामग्री लोड करते हैं। इसके बावजूद, वे बैकग्राउंड पृष्ठ के साथ कुछ क्षमताएँ साझा करते हैं:
सामग्री स्क्रिप्ट के साथ संचार: बैकग्राउंड पृष्ठ के समान, ये पृष्ठ सामग्री स्क्रिप्ट से संदेश प्राप्त कर सकते हैं, जो एक्सटेंशन के भीतर इंटरैक्शन को सुविधाजनक बनाता है।
एक्सटेंशन-विशिष्ट APIs तक पहुँच: इन पृष्ठों को एक्सटेंशन-विशिष्ट APIs तक व्यापक पहुँच प्राप्त होती है, जो एक्सटेंशन के लिए परिभाषित अनुमतियों के अधीन होती है।
permissions
& host_permissions
permissions
और host_permissions
manifest.json
से प्रविष्टियाँ हैं जो यह संकेत करेंगी कि ब्राउज़र एक्सटेंशन के पास कौन सी अनुमतियाँ हैं (स्टोरेज, स्थान...) और कौन से वेब पृष्ठों में।
चूंकि ब्राउज़र एक्सटेंशन इतने विशिष्ट हो सकते हैं, एक दुर्भावनापूर्ण या एक जो समझौता किया गया हो, हमलावर को संवेदनशील जानकारी चुराने और उपयोगकर्ता पर जासूसी करने के लिए विभिन्न साधनों की अनुमति दे सकता है।
जांचें कि ये सेटिंग्स कैसे काम करती हैं और कैसे इनका दुरुपयोग किया जा सकता है:
BrowExt - permissions & host_permissionscontent_security_policy
एक सामग्री सुरक्षा नीति को manifest.json
के अंदर भी घोषित किया जा सकता है। यदि एक परिभाषित है, तो यह कमजोर हो सकता है।
ब्राउज़र एक्सटेंशन पृष्ठों के लिए डिफ़ॉल्ट सेटिंग काफी प्रतिबंधात्मक है:
CSP और संभावित बायपास के बारे में अधिक जानकारी के लिए देखें:
Content Security Policy (CSP) Bypassweb_accessible_resources
किसी वेबपेज को ब्राउज़र एक्सटेंशन के एक पृष्ठ, जैसे कि .html
पृष्ठ, तक पहुँचने के लिए, इस पृष्ठ को manifest.json
के web_accessible_resources
क्षेत्र में उल्लेखित होना चाहिए।
उदाहरण के लिए:
ये पृष्ठ URL में इस तरह से पहुँच योग्य हैं:
In सार्वजनिक एक्सटेंशनों में extension-id उपलब्ध है:
हालांकि, यदि manifest.json
पैरामीटर use_dynamic_url
का उपयोग किया जाता है, तो यह id गतिशील हो सकता है।
ध्यान दें कि यहां एक पृष्ठ का उल्लेख होने पर भी, यह ClickJacking के खिलाफ सुरक्षित हो सकता है धन्यवाद Content Security Policy के। इसलिए ClickJacking हमले की पुष्टि करने से पहले आपको इसे भी जांचना होगा (frame-ancestors अनुभाग)।
इन पृष्ठों तक पहुँचने की अनुमति होने से ये पृष्ठ संभावित रूप से कमजोर ClickJacking बन जाते हैं:
BrowExt - ClickJackingइन पृष्ठों को केवल एक्सटेंशन द्वारा लोड करने की अनुमति देना और यादृच्छिक URLs द्वारा नहीं, ClickJacking हमलों को रोक सकता है।
ध्यान दें कि web_accessible_resources
से पृष्ठ और एक्सटेंशन के अन्य पृष्ठ भी पृष्ठभूमि स्क्रिप्ट से संपर्क करने में सक्षम हैं। इसलिए यदि इनमें से कोई पृष्ठ XSS के लिए कमजोर है, तो यह एक बड़ी कमजोरी खोल सकता है।
इसके अलावा, ध्यान दें कि आप केवल web_accessible_resources
में निर्दिष्ट पृष्ठों को iframes के अंदर खोल सकते हैं, लेकिन एक नए टैब से आप एक्सटेंशन ID जानकर एक्सटेंशन में किसी भी पृष्ठ तक पहुँच सकते हैं। इसलिए, यदि एक XSS पाया जाता है जो समान पैरामीटर का दुरुपयोग करता है, तो इसका दुरुपयोग किया जा सकता है भले ही पृष्ठ web_accessible_resources
में कॉन्फ़िगर न किया गया हो।
externally_connectable
docs के अनुसार, "externally_connectable"
मैनिफेस्ट प्रॉपर्टी यह घोषित करती है कि कौन सी एक्सटेंशन और वेब पृष्ठ आपके एक्सटेंशन से runtime.connect और runtime.sendMessage के माध्यम से कनेक्ट कर सकते हैं।
यदि externally_connectable
कुंजी आपके एक्सटेंशन के मैनिफेस्ट में नहीं घोषित की गई है या इसे "ids": ["*"]
के रूप में घोषित किया गया है, तो सभी एक्सटेंशन कनेक्ट कर सकते हैं, लेकिन कोई वेब पृष्ठ कनेक्ट नहीं कर सकता।
यदि विशिष्ट IDs निर्दिष्ट की गई हैं, जैसे "ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]
, तो केवल वही एप्लिकेशन कनेक्ट कर सकते हैं।
यदि matches निर्दिष्ट किए गए हैं, तो वे वेब ऐप्स कनेक्ट कर सकेंगे:
यदि इसे खाली के रूप में निर्दिष्ट किया गया है: "externally_connectable": {}
, तो कोई ऐप या वेब कनेक्ट नहीं कर सकेगा।
यहां निर्दिष्ट कम एक्सटेंशन और URL के साथ, हमला सतह छोटी होगी।
यदि एक वेब पृष्ठ XSS या टेकओवर के लिए संवेदनशील है और इसे externally_connectable
में निर्दिष्ट किया गया है, तो एक हमलावर पृष्ठभूमि स्क्रिप्ट को सीधे संदेश भेजने में सक्षम होगा, पूरी तरह से कंटेंट स्क्रिप्ट और इसके CSP को बायपास करते हुए।
इसलिए, यह एक बहुत शक्तिशाली बायपास है।
इसके अलावा, यदि क्लाइंट एक रॉग एक्सटेंशन स्थापित करता है, भले ही इसे संवेदनशील एक्सटेंशन के साथ संवाद करने की अनुमति न हो, यह एक अनुमत वेब पृष्ठ में XSS डेटा इंजेक्ट कर सकता है या WebRequest
या DeclarativeNetRequest
APIs का दुरुपयोग कर सकता है ताकि लक्षित डोमेन पर अनुरोधों में हेरफेर किया जा सके, एक पृष्ठ के अनुरोध को JavaScript फ़ाइल के लिए बदलते हुए। (ध्यान दें कि लक्षित पृष्ठ पर CSP इन हमलों को रोक सकता है)। यह विचार इस लेख से आया है।
कंटेंट स्क्रिप्ट और वेब पृष्ठ के बीच संवाद करने के लिए आमतौर पर पोस्ट संदेशों का उपयोग किया जाता है। इसलिए, वेब एप्लिकेशन में आपको आमतौर पर window.postMessage
फ़ंक्शन के लिए कॉल मिलेंगे और कंटेंट स्क्रिप्ट में window.addEventListener
जैसे श्रोता। हालाँकि, ध्यान दें कि एक्सटेंशन भी एक पोस्ट संदेश भेजकर वेब एप्लिकेशन के साथ संवाद कर सकता है (और इसलिए वेब को इसकी अपेक्षा करनी चाहिए) या बस वेब को एक नया स्क्रिप्ट लोड करने के लिए मजबूर कर सकता है।
आम तौर पर chrome.runtime.sendMessage
का उपयोग एक्सटेंशन के अंदर एक संदेश भेजने के लिए किया जाता है (आमतौर पर background
स्क्रिप्ट द्वारा संभाला जाता है) और इसे प्राप्त करने और संभालने के लिए एक श्रोता घोषित किया जाता है जो chrome.runtime.onMessage.addListener
को कॉल करता है।
यह chrome.runtime.connect()
का उपयोग करके एक स्थायी कनेक्शन बनाने के लिए भी संभव है, एकल संदेश भेजने के बजाय, इसे संदेश भेजने और प्राप्त करने के लिए उपयोग किया जा सकता है जैसे कि निम्नलिखित उदाहरण में:
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)