shadowbrokers-exploits/windows/fuzzbunch/deployablemanager.py
2017-04-14 11:45:07 +02:00

157 lines
7.1 KiB
Python

"""
EDF Plugin Manager
"""
from command import CmdCtx
from iohandler import truncate
import exception
import util
import traceback
from pluginmanager import PluginManager
MAX_PARAM_ECHO_LEN = 60
EDF_PLUGIN_INFO = """
Name: %s
Version: %s
Type: %s
"""
__all__ = ["DeployableManager"]
class DeployableManager(PluginManager):
def __init__(self, type, fb):
PluginManager.__init__(self, type, fb)
def exe_print_params(self, plugin, redirid):
args = {'title' : plugin.getName(),
'session' : self.fb.redirection.get_session(redirid),
'vars' : plugin.getParameters(hidden=True)}
self.io.print_exe_set_names(args)
def do_execute(self, input):
"""Execute the current plugin"""
session = None
self.io.newline()
inputList = input.strip().split()
if len(inputList) > 0:
consolemode = inputList[0].lower()
consolemode = util.convert_consolemode(consolemode)
else:
consolemode = 0
plugin = self.get_active_plugin()
self.io.print_warning("Preparing to Execute %s" % plugin.name)
if plugin.validate(self.session.get_dirs(), globalvars=self.fb.fbglobalvars) and plugin.isValid():
# XXX - Get the description before redirection.
# This really should be fixed to not care about order
runMode = 'FB'
plugin_desc = plugin.getSessionDescription()
modes = [
("DANE", "Forward deployment via DARINGNEOPHYTE"),
#("DAVE", "Forward deployment via DARINGVETERAN"),
("FB", "Traditional deployment from within FUZZBUNCH"),
]
self.io.print_prompt_param({
"name": "Mode",
"description": "Delivery mechanism",
"type": "Choice",
"attribs": modes
}, "0")
runMode = self.io.prompt_user("Mode", params=modes, default="0", gvars=self.fb.fbglobalvars)
self.io.print_success("Run Mode: %s" % (runMode))
self.io.newline()
listenPort = 0
if runMode in ("DANE", "DAVE"):
pairs = sorted((k, k) for k in plugin.package_arches.iterkeys())
self.io.print_prompt_param({
"name": "ArchOs",
"description": "Architecture/OS of REDIRECTOR",
"required": "YES",
"valid": "YES",
"type": "Choice",
"attribs": pairs
}, "0")
archOs = self.io.prompt_user("ArchOS", "0", pairs, gvars=self.fb.fbglobalvars)
# Prompt for proxy port
listenPort = int(self.io.prompt_user("Linkup TCP port (0=none)?", default="0", gvars=self.fb.fbglobalvars))
if listenPort:
plugin.set("DaveProxyPort", str(listenPort))
self.io.print_success("set DaveProxyPort ==> %d" % (listenPort))
# TODO: prompt operator to verify remote callback tunnel exists for localhost comms
else:
archOs = 'x86-Windows'
if runMode == "FB":
if not self.io.prompt_yn("This will execute locally like traditional Fuzzbunch plugins. Are you sure? (y/n)"):
raise exception.CmdErr("User abort")
redirid = self.fb.redirection.pre_exec(plugin)
else:
redirid = ''
newwindow = False
try:
# Last chance to quit, print execution info and prompt
if redirid:
self.fb.redirection.print_session(redirid)
#self.fb.do_redirect("")
self.io.print_warning("Verify Redirection Tunnels Exist")
self.io.prompt_confirm_redir()
self.exe_print_params(plugin, redirid)
self.io.prompt_continue()
self.io.print_msg("Executing Plugin")
if self.fb.log:
try:
self.fb.log[plugin.getName()] = self.fb.log.launch_from_command('execute', plugin.getName(), plugin.getConfigVersion()).start()
except:
pass
# Generate a new session and execute
session = self.session.add_item(plugin.getName(),
plugin_desc)
newwindow, logfile = plugin.execute(session,
consolemode,
self.fb.is_interactive(),
self.fb.is_scripted(),
globalvars=self.fb.fbglobalvars,
runMode=runMode,
archOs=archOs,
listenPort=listenPort)
except Exception as e:
self.io.print_error("Error running plugin: {0}".format(e))
newwindow = False
session = None
finally:
self.fb.redirection.post_exec(plugin, redirid)
if self.fb.log and plugin.name in self.fb.log:
try:
try: session
except: pass
else:
if 'Project' in self.fb.fbglobalvars: self.fb.log[plugin.name].set(project_name=self.fb.fbglobalvars['Project'])
self.fb.log[plugin.name].queue(**dict([(k,v) for k,v in session.history.params.values()]+[(v[0],v[1]) for v in session.contract.params.values()]))
if session.is_failed(): parent = self.fb.log[plugin.name].failed_exploit()
else: parent = self.fb.log[plugin.name].successful_exploit()
self.fb.log[plugin.name].file_from_path(logfile, parent)
except:
if self.fb.log: self.fb.log.notify_of_error('Recording use of ' + str(plugin.name))
if runMode in ('DANE', 'DAVE'):
return
if newwindow:
self.io.print_warning("Plugin Spawned in New Console - Running Detached")
else:
if session and not session.is_failed():
self.io.print_success("%s Succeeded" % plugin.name)
if plugin.createsRendezvous():
self.io.newline()
self.io.print_warning("Connection to Target Established")
self.io.print_warning("Waiting For Next Stage")
else:
raise exception.CmdErr, "%s Failed" % plugin.name
else:
#self.do_validate()
raise exception.CmdErr, "Execution Aborted"
self.io.newline()