Browser Extension Pentesting Methodology

जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert) के साथ!

HackTricks का समर्थन करने के अन्य तरीके:

मूल जानकारी

ब्राउज़र एक्सटेंशन JavaScript में लिखे जाते हैं और ब्राउज़र द्वारा पिछले प्लान में लोड किए जाते हैं। इसके पास DOM होता है लेकिन यह अन्य साइटों के DOM के साथ बातचीत कर सकता है। इसका मतलब है कि यह अन्य साइटों की गोपनीयता, अखंडता, और उपलब्धता (CIA) को कमजोर कर सकता है।

मुख्य घटक

एक्सटेंशन लेआउट जब विजुअलाइज़ किए जाते हैं तो सबसे अच्छा लगता है और तीन घटकों से मिलकर बनते हैं। चलिए हर घटक को गहराई से देखते हैं।

कंटेंट स्क्रिप्ट्स

प्रत्येक कंटेंट स्क्रिप्ट के पास एक एकल वेब पृष्ठ के DOM तक सीधा पहुंच होता है और इसलिए यह संभावित दुरुपयोगी इनपुट के लिए अव exposed होता है। हालांकि, कंटेंट स्क्रिप्ट में कोई अन्य अनुमतियाँ नहीं होतीं हैं सिवाय एक्सटेंशन कोर को संदेश भेजने की क्षमता की।

एक्सटेंशन कोर

एक्सटेंशन कोर में एक्सटेंशन की अधिकार/पहुंच शामिल है, लेकिन एक्सटेंशन कोर केवल XMLHttpRequest और कंटेंट स्क्रिप्ट्स के माध्यम से वेब सामग्री के साथ बातचीत कर सकता है। इसके अलावा, एक्सटेंशन कोर को मेज़बान मशीन तक सीधा पहुंच नहीं होती है।

नेटिव बाइनरी

एक्सटेंशन एक नेटिव बाइनरी को अनुमति देता है जो उपयोगकर्ता की पूर्ण अधिकारों के साथ मेज़बान मशीन तक पहुंच सकता है। नेटिव बाइनरी एक्सटेंशन कोर के साथ सामान्य नेटस्केप प्लगइन एप्लिकेशन प्रोग्रामिंग इंटरफेस (NPAPI) के माध्यम से बातचीत करता है जिसे फ्लैश और अन्य ब्राउज़र प्लगइन्स द्वारा उपयोग किया जाता है।

सीमाएँ

उपयोगकर्ता की पूर्ण अधिकारों को प्राप्त करने के लिए, एक हमलावर को एक्सटेंशन को दुरुपयोगी इनपुट को कंटेंट स्क्रिप्ट से एक्सटेंशन कोर और एक्सटेंशन कोर से नेटिव बाइनरी तक पहुंचने के लिए ओवरकन्विंस करना होगा।

एक्सटेंशन के प्रत्येक घटक को एक-दूसरे से मजबूत सुरक्षात्मक सीमाएँ द्वारा अलग किया गया है। प्रत्येक घटक एक अलग ऑपरेटिंग सिस्टम प्रक्रिया में चलता है। कंटेंट स्क्रिप्ट्स और एक्सटेंशन कोर सैंडबॉक्स प्रक्रियाओं में चलते हैं जो अधिकांश ऑपरेटिंग सिस्टम सेवाओं के लिए अनुपलब्ध होते हैं।

इसके अतिरिक्त, कंटेंट स्क्रिप्ट्स अपने संबंधित वेब पृष्ठों से एक अलग जावास्क्रिप्ट हीप में चलते हैं। कंटेंट स्क्रिप्ट और वेब पृष्ठ के पास एक ही आधारिक DOM होता है, लेकिन दोनों कभी भी जावास्क्रिप्ट पॉइंटर्स एक्सचेंज नहीं करते, जिससे जावास्क्रिप्ट कार्यक्षमता का लीक होने से बचा जा सकता है।

manifest.json

एक Chrome एक्सटेंशन बस एक .crx फ़ाइल एक्सटेंशन वाली ZIP फ़ोल्डर होती है। एक्सटेंशन कोर फ़ोल्डर की मूल जड़ में स्थित manifest.json फ़ाइल होती है, जो लेआउट, अनुमतियाँ, और अन्य कॉन्फ़िगरेशन विकल्पों को निर्दिष्ट करती है।

उदाहरण:

{
"manifest_version": 2,
"name": "My extension",
"version": "1.0",
"permissions": [
"storage"
],
"content_scripts": [
{
"js": [
"script.js"
],
"matches": [
"https://example.com/*",
"https://www.example.com/*"
],
"exclude_matches": ["*://*/*business*"],
}
],
"background": {
"scripts": [
"background.js"
]
},
"options_ui": {
"page": "options.html"
}
}

सामग्री_स्क्रिप्ट्स

Content scripts are loaded whenever the user navigates to a matching page, in our case any page matching the https://example.com/* expression and not matching the *://*/*/business* regex. They execute like the page’s own scripts and have arbitrary access to the page’s Document Object Model (DOM).

"content_scripts": [
{
"js": [
"script.js"
],
"matches": [
"https://example.com/*",
"https://www.example.com/*"
],
"exclude_matches": ["*://*/*business*"],
}
],

अधिक URL शामिल या अपवर्जित करने के लिए include_globs और exclude_globs का उपयोग करना भी संभव है।

यह एक उदाहरण सामग्री स्क्रिप्ट है जो पृष्ठ में एक स्पष्टीकरण बटन जोड़ेगा जब स्टोरेज API का उपयोग करके एक्सटेंशन के स्टोरेज से message मान प्राप्त करने के लिए।

chrome.storage.local.get("message", result =>
{
let div = document.createElement("div");
div.innerHTML = result.message + " <button>Explain</button>";
div.querySelector("button").addEventListener("click", () =>
{
chrome.runtime.sendMessage("explain");
});
document.body.appendChild(div);
});

जब यह बटन क्लिक किया जाता है, तो सामग्री स्क्रिप्ट द्वारा एक संदेश विस्तार पृष्ठों को भेजा जाता है, runtime.sendMessage() API का उपयोग करके। यह सामग्री स्क्रिप्ट की सीधी पहुंच की सीमा के कारण है, storage में कुछ अपवाद होने के बावजूद। इन अपवादों के परे कार्यक्षमताओं के लिए, संदेश विस्तार पृष्ठों को भेजे जाते हैं जिनके साथ सामग्री स्क्रिप्ट संवाद कर सकते हैं।

ब्राउज़र के आधार पर, सामग्री स्क्रिप्ट की क्षमताएँ थोड़ी भिन्न हो सकती हैं। क्रोमियम-आधारित ब्राउज़रों के लिए, क्षमताओं की सूची Chrome Developers दस्तावेज़ीकरण में उपलब्ध है, और फ़ायरफ़ॉक्स के लिए, MDN प्राथमिक स्रोत के रूप में काम करता है। यह भी महत्वपूर्ण है कि सामग्री स्क्रिप्टों को पृष्ठ स्क्रिप्टों के साथ संवाद करने की क्षमता होती है, जिससे उन्हें क्रियाएँ करने और प्रतिक्रियाएँ वापस भेजने की क्षमता होती है।

क्रोम में सामग्री स्क्रिप्ट को देखने और डीबग करने के लिए, क्रोम डेवलपर टूल्स मेनू को विकल्प > अधिक उपकरण > डेवलपर टूल्स से एक्सेस किया जा सकता है या Ctrl + Shift + I दबाकर।

डेवलपर टूल्स प्रदर्शित होने पर, स्रोत टैब पर क्लिक किया जाना चाहिए, जिसके बाद सामग्री स्क्रिप्ट्स टैब पर क्लिक किया जा सकता है। यह विभिन्न एक्सटेंशन्स से चल रहे सामग्री स्क्रिप्ट्स का अवलोकन करने और क्रियान्वयन फ्लो को ट्रैक करने के लिए ब्रेकपॉइंट सेट करने की अनुमति देता है।

इंजेक्टेड सामग्री स्क्रिप्ट्स

ध्यान दें कि सामग्री स्क्रिप्ट्स अनिवार्य नहीं हैं क्योंकि यह भी संभावना है कि स्क्रिप्टों को डायनामिक रूप से इंजेक्ट किया जा सकता है और उन्हें प्रोग्रामेटिक रूप से इंजेक्ट किया जा सकता है वेब पेजों में tabs.executeScript के माध्यम से। यह वास्तव में अधिक ग्रैनुलर नियंत्रण प्रदान करता है।

सामग्री स्क्रिप्ट का प्रोग्रामेटिक इंजेक्शन करने के लिए, एक्सटेंशन को पृष्ठ के लिए host permissions की आवश्यकता होती है जिसमें स्क्रिप्ट्स इंजेक्ट किए जाने हैं। ये अनुमतियाँ एक्सटेंशन के मैनिफ़ेस्ट में उन्हें मांगने या अस्थायी रूप से activeTab के माध्यम से सुरक्षित की जा सकती हैं।

उदाहरण activeTab आधारित एक्सटेंशन

manifest.json
{
"name": "My extension",
...
"permissions": [
"activeTab",
"scripting"
],
"background": {
"service_worker": "background.js"
},
"action": {
"default_title": "Action Button"
}
}
  • क्लिक पर एक JS फ़ाइल इंजेक्ट करें:

// content-script.js
document.body.style.backgroundColor = "orange";

//service-worker.js - Inject the JS file
chrome.action.onClicked.addListener((tab) => {
chrome.scripting.executeScript({
target: { tabId: tab.id },
files: ["content-script.js"]
});
});
  • क्लिक पर एक फ़ंक्शन इंजेक्ट करें:

//service-worker.js - Inject a function
function injectedFunction() {
document.body.style.backgroundColor = "orange";
}

chrome.action.onClicked.addListener((tab) => {
chrome.scripting.executeScript({
target : {tabId : tab.id},
func : injectedFunction,
});
});

अनुमतियों के साथ उदाहरण

// service-workser.js
chrome.scripting.registerContentScripts([{
id : "test",
matches : [ "https://*.example.com/*" ],
excludeMatches : [ "*://*/*business*" ],
js : [ "contentScript.js" ],
}]);

// Another example
chrome.tabs.executeScript(tabId, { file: "content_script.js" });

Content Scripts run_at

run_at फ़ील्ड जावास्क्रिप्ट फ़ाइलों को वेब पेज में इंजेक्ट करने का समय नियंत्रित करता है। पसंदीदा और डिफ़ॉल्ट मान "document_idle" है।

संभावित मान हैं:

  • document_idle: जब भी संभव हो

  • document_start: css से किसी भी फ़ाइल के बाद, लेकिन किसी भी अन्य DOM निर्मित नहीं है या कोई अन्य स्क्रिप्ट चल रहा है।

  • document_end: DOM पूरा होने के तुरंत बाद, लेकिन छवियों और फ्रेम्स जैसे सब-संसाधन लोड होने से पहले।

manifest.json के माध्यम से

{
"name": "My extension",
...
"content_scripts": [
{
"matches": ["https://*.example.com/*"],
"run_at": "document_idle",
"js": ["contentScript.js"]
}
],
...
}

द्वारा service-worker.js

chrome.scripting.registerContentScripts([{
id : "test",
matches : [ "https://*.example.com/*" ],
runAt : "document_idle",
js : [ "contentScript.js" ],
}]);

पृष्ठभूमि

कंटेंट स्क्रिप्ट्स द्वारा भेजे गए संदेश पृष्ठभूमि पृष्ठ द्वारा प्राप्त किए जाते हैं, जो एक्सटेंशन के घटकों को समन्वयित करने में मुख्य भूमिका निभाता है। विशेष रूप से, पृष्ठभूमि पृष्ठ एक्सटेंशन के जीवनकाल के दौरान बना रहता है, सीधे उपयोगकर्ता अंतर्क्रिया के बिना गुप्त रूप से कार्य करता है। इसमें अपना डॉक्यूमेंट ऑब्जेक्ट मॉडल (DOM) होता है, जो जटिल अंतरक्रियाएँ और स्थिति प्रबंधन की संभावनाएं सक्षम करता है।

मुख्य बिंदु:

  • पृष्ठभूमि पृष्ठ की भूमिका: एक्सटेंशन के बीच संचार और समन्वय सुनिश्चित करने के लिए नस केंद्र के रूप में कार्य करता है।

  • स्थिरता: यह एक सदैव मौजूदा एंटिटी है, उपयोगकर्ता के लिए अदृश्य होता है लेकिन एक्सटेंशन के कार्यक्षमता के लिए अभिन्न है।

  • स्वचालित उत्पादन: यदि स्पष्ट रूप से परिभाषित नहीं किया गया है, तो ब्राउज़र स्वचालित रूप से एक पृष्ठभूमि बनाएगा। यह स्वचालित उत्पादित पृष्ठ एक्सटेंशन के मैनिफेस्ट में निर्दिष्ट सभी पृष्ठभूमि स्क्रिप्ट शामिल करेगा, एक्सटेंशन के पृष्ठभूमि कार्यों के सहज कार्यान्वयन को सुनिश्चित करते हुए।

ब्राउज़र द्वारा स्वचालित रूप से पृष्ठभूमि उत्पन्न करने की सुविधा (जब स्पष्ट रूप से घोषित नहीं किया गया हो) सुनिश्चित करती है कि सभी आवश्यक पृष्ठभूमि स्क्रिप्ट एकीकृत और परिचालनशील हैं, एक्सटेंशन की सेटअप प्रक्रिया को सुगम बनाते हुए।

उदाहरण पृष्ठभूमि स्क्रिप्ट:

chrome.runtime.onMessage.addListener((request, sender, sendResponse) =>
{
if (request == "explain")
{
chrome.tabs.create({ url: "https://example.net/explanation" });
}
})

यह runtime.onMessage API का उपयोग संदेश सुनने के लिए करता है। जब एक "explain" संदेश प्राप्त होता है, तो यह tabs API का उपयोग करके एक पृष्ठ को एक नए टैब में खोलता है।

बैकग्राउंड स्क्रिप्ट को डीबग करने के लिए आप एक्सटेंशन विवरण पर जाकर सेवा कार्यकर्ता की जांच कर सकते हैं, यह डेवलपर टूल्स को बैकग्राउंड स्क्रिप्ट के साथ खोलेगा:

विकल्प पृष्ठ और अन्य

ब्राउज़र एक्सटेंशन में विभिन्न प्रकार के पृष्ठ हो सकते हैं:

  • क्रिया पृष्ठ एक ड्रॉप-डाउन में प्रदर्शित होते हैं जब एक्सटेंशन आइकॉन पर क्लिक किया जाता है

  • पृष्ठ जो एक्सटेंशन नए टैब में लोड करेगा

  • विकल्प पृष्ठ: यह पृष्ठ एक्सटेंशन पर क्लिक करने पर ऊपर प्रदर्शित होता है। पिछले मैनिफेस्ट में मेरी स्थिति में मैं इस पृष्ठ तक पहुंच सका chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca या क्लिक करके:

ध्यान दें कि ये पृष्ठ बैकग्राउंड पेज की तरह स्थायी नहीं हैं क्योंकि ये आवश्यकता पर डायनामिक रूप से सामग्री लोड करते हैं। इसके बावजूद, इन्हें बैकग्राउंड पेज के साथ कुछ योग्यताएँ साझा करनी पड़ती हैं:

  • कंटेंट स्क्रिप्ट्स के साथ संचार: बैकग्राउंड पेज की तरह, ये पृष्ठ कंटेंट स्क्रिप्ट्स से संदेश प्राप्त कर सकते हैं, एक्सटेंशन के भीतर बातचीत को सुविधाजनक बनाते हुए।

  • एक्सटेंशन-विशिष्ट API तक पहुंच: ये पृष्ठ एक्सटेंशन-विशिष्ट API तक व्यापक पहुंच का आनंद लेते हैं, जो एक्सटेंशन के लिए परिवेशनियमित अनुमतियों के लिए परिभाषित होती हैं।

permissions और host_permissions

permissions और host_permissions manifest.json से एंट्री हैं जो दिखाएगी किस प्रकार की अनुमतियाँ ब्राउज़र एक्सटेंशन के पास हैं (स्टोरेज, स्थान...) और किस वेब पृष्ठों में।

ब्राउज़र एक्सटेंशन इतनी विशेषाधिकारी हो सकती हैं, एक दुर्भाग्यपूर्ण या किसी भी एक्सटेंशन को कंप्रमाइज़ करने वाला एक आक्रामक उपयोगकर्ता को चोरी करने और जासूसी करने के लिए विभिन्न साधनों की अनुमति दे सकता है

देखें कि ये सेटिंग्स कैसे काम करती हैं और कैसे इनका दुरुपयोग किया जा सकता है:

pageBrowExt - permissions & host_permissions

content_security_policy

कंटेंट सुरक्षा नीति को manifest.json के अंदर भी घोषित किया जा सकता है। यदि एक परिभाषित है, तो यह वंशास्पद हो सकता है।

ब्राउज़र एक्सटेंशन पृष्ठों के लिए डिफ़ॉल्ट सेटिंग बहुत प्रतिबंधक है:

script-src 'self'; object-src 'self';

अधिक जानकारी के लिए CSP और संभावित बायपास की जांच करें:

pageContent Security Policy (CSP) Bypass

web_accessible_resources

एक वेबपेज को एक ब्राउज़र एक्सटेंशन के पेज तक पहुंचने के लिए, उदाहरण के लिए, एक .html पेज, इस पेज को manifest.json के web_accessible_resources फ़ील्ड में उल्लेखित किया जाना चाहिए। उदाहरण के लिए:

{
...
"web_accessible_resources": [
{
"resources": [ "images/*.png" ],
"matches": [ "https://example.com/*" ]
},
{
"resources": [ "fonts/*.woff" ],
"matches": [ "https://example.com/*" ]
}
],
...
}

ये पेज URL में एक्सेस करने योग्य हैं:

chrome-extension://<extension-id>/message.html

In public extensions the extension-id is accesible:

हालांकि, यदि manifest.json पैरामीटर use_dynamic_url का उपयोग किया जाता है, तो यह id गतिशील हो सकता है

इन पेजों तक पहुंचने की अनुमति देना इन पेजों को संभावित रूप से ClickJacking बना देता है:

pageBrowExt - ClickJacking

इन पेजों को केवल एक्सटेंशन द्वारा लोड करने की अनुमति देने से CLickJacking हमलों को रोका जा सकता है।

externally_connectable

दस्तावेज़ के अनुसार, "externally_connectable" मैनिफेस्ट प्रॉपर्टी घोषित करती है कि कौन सी एक्सटेंशन और वेब पेज आपकी एक्सटेंशन से runtime.connect और runtime.sendMessage के माध्यम से कनेक्ट कर सकते हैं।

  • यदि आपकी एक्सटेंशन के मैनिफेस्ट में externally_connectable कुंजी घोषित नहीं की गई है या यह "ids": ["*"] के रूप में घोषित किया गया है, तो सभी एक्सटेंशन कनेक्ट कर सकते हैं, लेकिन कोई वेब पेज कनेक्ट नहीं कर सकता है

  • यदि निर्दिष्ट आईडी घोषित किए गए हैं, जैसे "ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"], तो केवल वे एप्लिकेशन कनेक्ट कर सकते हैं

  • यदि मिलान निर्दिष्ट किए गए हैं, तो वे वेब ऐप्स कनेक्ट कर सकेंगे:

"matches": [
"https://*.google.com/*",
"*://*.chromium.org/*",
  • यदि यह रिक्त रूप में निर्दिष्ट है: "externally_connectable": {}, कोई भी ऐप या वेब कनेक्ट नहीं कर सकेगा।

यहाँ जितनी कम एक्सटेंशन और यूआरएल निर्दिष्ट की गई हैं, हमले की सतह उतनी ही छोटी होगी।

यदि कोई वेब पृष्ठ XSS या टेकओवर के लिए externally_connectable में निर्दिष्ट है, तो हमलवार को संदेश सीधे बैकग्राउंड स्क्रिप्ट में भेजने की क्षमता होगी, पूरी तरह से कंटेंट स्क्रिप्ट और इसकी सीएसपी को छोड़कर

इसलिए, यह एक बहुत शक्तिशाली बायपास है।

इसके अतिरिक्त, यदि क्लाइंट एक रूग एक्सटेंशन इंस्टॉल करता है, चाहे वह वंलरेबल एक्सटेंशन के साथ संवाद करने की अनुमति न दे लेकिन यह एक्सएसएस डेटा को एक अनुमत वेब पृष्ठ में इंजेक्ट कर सकता है या WebRequest या DeclarativeNetRequest एपीआई का दुरुपयोग करके एक लक्षित डोमेन पर अनुरोधों को संशोधित करने के लिए अनुरोध कर सकता है एक जावास्क्रिप्ट फ़ाइल के लिए। (ध्यान दें कि लक्षित पृष्ठ पर सीएसपी इन हमलों को रोक सकती है)। यह विचार इस लेख से आया है

वेब ↔︎ कंटेंट स्क्रिप्ट संचार

कंटेंट स्क्रिप्ट कार्यान्वित किए जाने वाले वातावरण और जहां मेज़बान पृष्ठ मौजूद हैं, वे एक दूसरे से अलग हैं, विभाजन सुनिश्चित करते हैं। इस विभाजन के बावजूद, दोनों को पृष्ठ के डॉक्यूमेंट ऑब्जेक्ट मॉडल (DOM), एक साझा संसाधन, के साथ बातचीत करने की क्षमता है। मेज़बान पृष्ठ को कंटेंट स्क्रिप्ट के साथ संवाद करने के लिए, या पृष्ठ के लिए एक्सटेंशन के माध्यम से अप्रत्यक्ष रूप से संवाद करने के लिए, दोनों पक्षों द्वारा पहुंचने योग्य DOM का उपयोग करना आवश्यक है।

पोस्ट संदेश

content-script.js
var port = chrome.runtime.connect();

window.addEventListener("message", (event) => {
// We only accept messages from ourselves
if (event.source !== window) {
return;
}

if (event.data.type && (event.data.type === "FROM_PAGE")) {
console.log("Content script received: " + event.data.text);
port.postMessage(event.data.text);
}
}, false);
उदाहरण.js
document.getElementById("theButton").addEventListener("click", () => {
window.postMessage(
{type : "FROM_PAGE", text : "Hello from the webpage!"}, "*");
}, false);

एक सुरक्षित पोस्ट संदेश संचार को प्राप्त संदेश की मान्यता की जांच करनी चाहिए, यह किया जा सकता है इसे जांचकर:

  • event.isTrusted: यह केवल तब सच है जब घटना किसी उपयोगकर्ता क्रिया द्वारा प्रेरित की गई थी

  • सामग्री स्क्रिप्ट संदेश की अपेक्षा कर सकती है केवल यदि उपयोगकर्ता कोई क्रिया करता है

  • मूल डोमेन: संदेश की अपेक्षा केवल डोमेन की allowlist कर सकता है।

  • यदि एक रेगेक्स का उपयोग किया गया है, तो बहुत सावधान रहें

  • स्रोत: received_message.source !== window का उपयोग किया जा सकता है यह जांचने के लिए कि संदेश वही विंडो से था जहां सामग्री स्क्रिप्ट सुन रहा था।

पिछली जांचें, यदि की गई हों, भी विकल्पशील हो सकती हैं, इसलिए निम्नलिखित पृष्ठ में संभावित पोस्ट संदेश बायपास की जांच करें:

pagePostMessage Vulnerabilities

आईफ्रेम

एक और संभावित संचार का तरीका आईफ्रेम URL के माध्यम से हो सकता है, आप निम्नलिखित में एक उदाहरण पा सकते हैं:

pageBrowExt - XSS Example

DOM

यह "ठीक-ठाक" एक संचार तरीका नहीं है, लेकिन वेब और सामग्री स्क्रिप्ट को वेब DOM तक पहुंच होगी। इसलिए, यदि सामग्री स्क्रिप्ट कुछ जानकारी पढ़ रहा है, वेब DOM पर भरोसा करते हुए, तो वेब इस डेटा को संशोधित कर सकता है (क्योंकि वेब पर भरोसा नहीं किया जाना चाहिए, या क्योंकि वेब XSS के लिए विकल्पशील है) और सामग्री स्क्रिप्ट को क्षति पहुंचा सकता है

आप एक DOM आधारित XSS का उदाहरण भी पा सकते हैं एक ब्राउज़र एक्सटेंशन को क्षति पहुंचाने के लिए में:

pageBrowExt - XSS Example

मेमोरी/कोड में संवेदनशील जानकारी

यदि एक ब्राउज़र एक्सटेंशन अपनी मेमोरी में संवेदनशील जानकारी संग्रहित करता है, तो यह डंप किया जा सकता है (विशेष रूप से Windows मशीनों में) और इस जानकारी के लिए खोजी की जा सकती है।

इसलिए, ब्राउज़र एक्सटेंशन की मेमोरी सुरक्षित मानी नहीं जानी चाहिए और संवेदनशील जानकारी जैसे क्रेडेंशियल या म्नेमोनिक वाक्यांश संग्रहित नहीं किए जाने चाहिए

बेशक, कोड में संवेदनशील जानकारी न डालें, क्योंकि यह सार्वजनिक होगा।

ब्राउज़र से मेमोरी डंप करने के लिए आप प्रक्रिया मेमोरी को डंप कर सकते हैं या ब्राउज़र एक्सटेंशन की सेटिंग्स में जाने के लिए Inspect pop-up पर क्लिक करें -> Memory खंड में -> Take a snaphost और संवेदनशील जानकारी के लिए स्नैपशॉट के अंदर खोजने के लिए CTRL+F

सामग्री स्क्रिप्ट ↔︎ बैकग्राउंड स्क्रिप्ट संचार

एक सामग्री स्क्रिप्ट फ़ंक्शन runtime.sendMessage() या tabs.sendMessage() का उपयोग कर सकता है एक एक-बार का JSON-serializable संदेश भेजने के लिए।

प्रतिक्रिया को संभालने के लिए, वापसी Promise का उपयोग करें। हालांकि, पिछले संगतता के लिए, आप अब भी आखिरी तरीके के रूप में एक कॉलबैक पारित कर सकते हैं।

सामग्री स्क्रिप्ट से एक अनुरोध भेजना इस प्रकार दिखता है:

(async () => {
const response = await chrome.runtime.sendMessage({greeting: "hello"});
// do something with response here, not outside the function
console.log(response);
})();

एक अनुरोध भेजना एक्सटेंशन से (सामान्यत: एक बैकग्राउंड स्क्रिप्ट) एक सामग्री स्क्रिप्ट फ़ंक्शन का उपयोग कर सकता है, केवल आपको यह स्पष्ट करना होगा कि आप उसे किस टैब पर भेजना चाहते हैं। चयनित टैब में सामग्री स्क्रिप्ट को संदेश भेजने का उदाहरण:

// From https://stackoverflow.com/questions/36153999/how-to-send-a-message-between-chrome-extension-popup-and-content-script
(async () => {
const [tab] = await chrome.tabs.query({active: true, lastFocusedWindow: true});
const response = await chrome.tabs.sendMessage(tab.id, {greeting: "hello"});
// do something with response here, not outside the function
console.log(response);
})();

प्राप्ति स्थिति पर, आपको संदेश को संभालने के लिए runtime.onMessage घटना सुनने वाला सेट करने की आवश्यकता है। यह एक सामग्री स्क्रिप्ट या एक्सटेंशन पेज से एक जैसा दिखता है।

// From https://stackoverflow.com/questions/70406787/javascript-send-message-from-content-js-to-background-js
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
console.log(sender.tab ?
"from a content script:" + sender.tab.url :
"from the extension");
if (request.greeting === "hello")
sendResponse({farewell: "goodbye"});
}
);

उदाहरण में, sendResponse() को समवर्ती ढंग से क्रियान्वित किया गया था। sendResponse() को असमवर्ती ढंग से क्रियान्वित करने के लिए sendResponse() को असमवर्ती ढंग से क्रियान्वित करने के लिए onMessage इवेंट हैंडलर में return true; शामिल करना अत्यावश्यक है।

एक महत्वपूर्ण विचार यह है कि जहां कई पृष्ठ onMessage इवेंट्स प्राप्त करने के लिए सेट किए गए हैं, एक विशिष्ट इवेंट के लिए sendResponse() को क्रियान्वित करने वाला पहला पृष्ठ केवल प्रतिक्रिया प्रभावी ढंग से पहुंचा सकेगा। एक ही इवेंट के लिए किसी भी आगामी प्रतिक्रियाएँ ध्यान में नहीं ली जाएंगी।

नए एक्सटेंशन बनाते समय, प्राथमिकता प्रमिसेस की ओर निर्देशित करनी चाहिए बजाय कॉलबैक्स की। कॉलबैक्स का उपयोग करने के संबंध में, sendResponse() फ़ंक्शन को केवल तभी मान्य माना जाता है जब यह सीधे समवर्ती संदर्भ में क्रियान्वित किया जाता है, या यदि इवेंट हैंडलर true लौटाता है कि एक असमवर्ती क्रिया का संकेत देता है। यदि कोई भी हैंडलर true नहीं लौटाता है या यदि sendResponse() फ़ंक्शन को मेमोरी से हटा दिया जाता है (गार्बेज-कलेक्टेड), तो sendMessage() फ़ंक्शन के साथ संबंधित कॉलबैक डिफ़ॉल्ट रूप से ट्रिगर होगा।

ब्राउज़र में एक एक्सटेंशन लोड करना

  1. डाउनलोड करें ब्राउज़र एक्सटेंशन और अनज़िप करें

  2. chrome://extensions/ पर जाएं और डेवलपर मोड को सक्षम करें

  3. Load unpacked बटन पर क्लिक करें

Firefox में आप about:debugging#/runtime/this-firefox पर जाएं और Load Temporary Add-on बटन पर क्लिक करें।

स्टोर से स्रोत कोड प्राप्त करना

एक Chrome एक्सटेंशन का स्रोत कोड विभिन्न तरीकों से प्राप्त किया जा सकता है। नीचे हर विकल्प के लिए विस्तृत स्पष्टीकरण और निर्देश दिए गए हैं।

कमांड लाइन के माध्यम से ZIP के रूप में एक्सटेंशन डाउनलोड करें

Chrome एक्सटेंशन का स्रोत कोड कमांड लाइन का उपयोग करके ZIP फ़ाइल के रूप में डाउनलोड किया जा सकता है। इसमें curl का उपयोग होता है एक विशिष्ट URL से ZIP फ़ाइल को प्राप्त करने के लिए और फिर ZIP फ़ाइल की सामग्री को एक निर्दिष्ट निर्देशिका में निकालना। निम्नलिखित कदम हैं:

  1. "extension_id" को वास्तविक एक्सटेंशन की आईडी के साथ बदलें।

  2. निम्नलिखित कमांड निष्पादित करें:

extension_id=your_extension_id   # Replace with the actual extension ID
curl -L -o "$extension_id.zip" "https://clients2.google.com/service/update2/crx?response=redirect&os=mac&arch=x86-64&nacl_arch=x86-64&prod=chromecrx&prodchannel=stable&prodversion=44.0.2403.130&x=id%3D$extension_id%26uc"
unzip -d "$extension_id-source" "$extension_id.zip"

CRX व्यूअर वेबसाइट का उपयोग करें

https://robwu.nl/crxviewer/

CRX व्यूअर एक्सटेंशन का उपयोग करें

एक और सुविधाजनक तरीका है क्रोम एक्सटेंशन सोर्स व्यूअर का उपयोग करना, जो एक ओपन-सोर्स परियोजना है। इसे Chrome Web Store से स्थापित किया जा सकता है। व्यूअर का सोर्स कोड इसके GitHub भंडार में उपलब्ध है।

स्थानीय रूप से स्थापित एक्सटेंशन का सोर्स देखें

स्थानीय रूप से स्थापित क्रोम एक्सटेंशन की जांच भी की जा सकती है। निम्नलिखित तरीके से:

  1. "Profile Path" फील्ड को ढूंढकर chrome://version/ पर जाकर अपने क्रोम स्थानीय प्रोफ़ाइल निर्देशिका तक पहुंचें।

  2. प्रोफ़ाइल निर्देशिका के अंदर Extensions/ उपनिर्देशिका में जाएं।

  3. यह फ़ोल्डर सभी स्थापित एक्सटेंशन को सम्मिलित करता है, जो सामान्यत: उनके सोर्स कोड को एक पठनीय स्वरूप में रखते हैं।

एक्सटेंशन की पहचान करने के लिए, आप उनके आईडी को नामों से मैप कर सकते हैं:

  • about:extensions पृष्ठ पर "Developer Mode" को सक्षम करें ताकि प्रत्येक एक्सटेंशन की आईडी देख सकें।

  • प्रत्येक एक्सटेंशन के फ़ोल्डर के अंदर, manifest.json फ़ाइल में एक पठनीय name फ़ील्ड होता है, जो आपको एक्सटेंशन की पहचान करने में मदद करता है।

फ़ाइल आर्काइवर या अनपैकर का उपयोग करें

क्रोम वेब स्टोर पर जाएं और एक्सटेंशन को डाउनलोड करें। फ़ाइल का .crx एक्सटेंशन होगा। फ़ाइल एक्सटेंशन को .zip में बदलें। किसी भी फ़ाइल आर्काइवर (जैसे WinRAR, 7-Zip, आदि) का उपयोग करके ZIP फ़ाइल की सामग्री को निकालें।

क्रोम में डेवलपर मोड का उपयोग करें

क्रोम खोलें और chrome://extensions/ पर जाएं। ऊपर दाएं में "Developer mode" को सक्षम करें। "Load unpacked extension..." पर क्लिक करें। अपने एक्सटेंशन के निर्देशिका तक पहुंचें। यह सोर्स कोड डाउनलोड नहीं करता है, लेकिन एक पहले से ही डाउनलोड या विकसित एक्सटेंशन के कोड को देखने और संशोधित करने के लिए उपयोगी है।

सुरक्षा मुआयना चेकलिस्ट

हालांकि ब्राउज़र एक्सटेंशन का सीमित हमले क्षेत्र होता है, कुछ उनमें कमजोरियां या संभावित मजबूती बढ़ाने के सुधार हो सकते हैं। निम्नलिखित सबसे सामान्य हैं:

उपकरण

  • किसी भी Chrome एक्सटेंशन को एक प्रदान किए गए Chrome वेबस्टोर लिंक से खींचता है।

  • manifest.json व्यूअर: बस एक्सटेंशन के मैनिफेस्ट का JSON-सुंदर संस्करण प्रदर्शित करता है।

  • फिंगरप्रिंट विश्लेषण: web_accessible_resources का पता लगाना और क्रोम एक्सटेंशन फिंगरप्रिंटिंग जावास्क्रिप्ट का स्वचालित उत्पादन।

  • संभावित क्लिकजैकिंग विश्लेषण: web_accessible_resources निर्देशित प्रविष्टियों के साथ एक्सटेंशन HTML पेज का पता लगाना। ये पृष्ठ किसी खास उद्देश्य पर निर्भर करते हैं, इसके अनुसार क्लिकजैकिंग के लिए संवेदनशील हो सकते हैं।

  • अनुमति चेतावनी व्यूअर: जो उन सभी क्रोम अनुमति प्रॉम्प्ट चेतावनियों की सूची प्रदर्शित करता है जो एक उपयोगकर्ता को एक्सटेंशन स्थापित करने का प्रयास करने पर प्रदर्शित की जाएगी।

  • खतरनाक कार्य(ए): जो एक हमलावर द्वारा शायद शोषित किया जा सकने वाले खतरनाक कार्यों की स्थान दिखाता है (जैसे innerHTML, chrome.tabs.executeScript जैसे कार्य)।

  • प्रवेश बिंदु(ए): जहाँ एक्सटेंशन उपयोगकर्ता/बाह्य इनपुट लेता है, वहाँ दिखाने के लिए। यह एक्सटेंशन के सतह क्षेत्र को समझने और एक्सटेंशन को दुरुपयोग किए गए डेटा भेजने के संभावित बिंदुओं की खोज के लिए उपयोगी है।

  • दोनों खतरनाक कार्य(ए) और प्रवेश बिंदु(ए) स्कैनर्स के लिए निम्नलिखित हैं:

  • महत्वपूर्ण कोड स्निपेट और अलर्ट का कारण वाली पंक्ति।

  • समस्या का विवरण।

  • एक "फ़ाइल देखें" बटन पूर्ण स्रोत फ़ाइल देखने के लिए।

  • अलर्ट की फ़ा

  • यदि आप अपनी कंपनी की विज्ञापनित देखना चाहते हैं या PDF में HackTricks डाउनलोड करना चाहते हैं तो सब्सक्रिप्शन प्लान्स देखें!

  • The PEASS Family की खोज करें, हमारा विशेष NFTs संग्रह

  • शामिल हों 💬 डिस्कॉर्ड ग्रुप या टेलीग्राम ग्रुप या हमें ट्विटर पर फॉलो करें 🐦 @carlospolopm.

  • अपने हैकिंग ट्रिक्स साझा करें, PRs सबमिट करके HackTricks और HackTricks Cloud github repos में।

Last updated