
🧙♂️ 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á.| 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 |
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
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", -> "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",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.