class Plugins: def __init__(self): self.local_storage = LocalStorage() def check_exist(self, name): all_plugins = self.local_storage.get("plugins") if all_plugins: for database in all_plugins.keys(): plugins = all_plugins[database] if name in plugins.keys(): return True return False def check_loaded(self, name): loaded_plugins = self.local_storage.get("loaded_plugins") if loaded_plugins: if name in loaded_plugins: return True return False def get_database(self, name): all_plugins = self.local_storage.get("plugins") if all_plugins: for database in all_plugins.keys(): plugins = all_plugins[database] if name in plugins.keys(): return database return None
class ModulesChecks: def __init__(self): self.badges = Badges() self.importer = Importer() self.local_storage = LocalStorage() self.modules = Modules() def perform_check(self): fail = False all_modules = self.local_storage.get("modules") if all_modules: for database in all_modules.keys(): self.badges.output_process("Checking modules from " + database + " database...") modules = all_modules[database] for category in modules.keys(): for platform in modules[category].keys(): for module in modules[category][platform].keys(): try: _ = self.importer.import_module( modules[category][platform][module] ['Path']) self.badges.output_success( self.modules.get_full_name( category, platform, module) + ': OK') except Exception: self.badges.output_error( self.modules.get_full_name( category, platform, module) + ': FAIL') fail = True return fail
class PayloadsTests: def __init__(self): self.badges = Badges() self.importer = Importer() self.local_storage = LocalStorage() self.payloads = Payloads() def perform_test(self): fail = False all_payloads = self.local_storage.get("payloads") if all_payloads: for database in all_payloads.keys(): self.badges.output_process("Testing payloads from " + database + " database...") payloads = all_payloads[database] for platform in payloads.keys(): for architecture in payloads[platform].keys(): for payload in payloads[platform][architecture].keys(): try: _ = self.importer.import_payload( payloads[platform][architecture][payload] ['Path']) self.badges.output_success( self.payloads.get_full_name( platform, architecture, payload) + ': OK') except Exception: self.badges.output_error( self.payloads.get_full_name( platform, architecture, payload) + ': FAIL') fail = True return fail
class Config: def __init__(self): self.badges = Badges() self.local_storage = LocalStorage() self.base_path = '/opt/hsf/' self.config_path = self.base_path + 'config/' self.db_config_file = self.config_path + 'db_config.yml' self.path_config_file = self.config_path + 'path_config.yml' self.core_config_file = self.config_path + 'core_config.yml' self.db_config = self.local_storage.get("db_config") self.path_config = self.local_storage.get("path_config") self.core_config = self.local_storage.get("core_config") @staticmethod def get_config_file(content): return yaml.safe_load(content) def configure(self): db_config = self.get_config_file(open(self.db_config_file)) path_config = self.get_config_file(open(self.path_config_file)) core_config = self.get_config_file(open(self.core_config_file)) self.db_config = db_config self.path_config = path_config self.core_config = core_config self.local_storage.set("db_config", self.db_config) self.local_storage.set("path_config", self.path_config) self.local_storage.set("core_config", self.core_config) self.global_storage = GlobalStorage( self.path_config['base_paths']['storage_path']) self.global_storage.set_all()
class IO: def __init__(self): self.colors = Colors() self.local_storage = LocalStorage() self.fmt = FMT() def output(self, message, start='\033[1K\r', end='\n'): sys.stdout.write(start + message + end) sys.stdout.flush() if self.local_storage.get("current_prompt") and self.local_storage.get("active_input"): prompt = start + self.local_storage.get("current_prompt") + readline.get_line_buffer() sys.stdout.write(prompt) sys.stdout.flush() def input(self, prompt_message): self.local_storage.set("current_prompt", prompt_message) self.local_storage.set("active_input", True) commands = input(self.colors.REMOVE + prompt_message) commands = self.fmt.format_commands(commands) arguments = list() if commands: arguments = commands[1:] self.local_storage.set("active_input", False) return commands, arguments
class PluginsChecks: def __init__(self): self.badges = Badges() self.importer = Importer() self.local_storage = LocalStorage() def perform_check(self): fail = False all_plugins = self.local_storage.get("plugins") if all_plugins: for database in all_plugins.keys(): self.badges.output_process("Checking plugins from " + database + " database...") plugins = all_plugins[database] for plugin in plugins.keys(): try: _ = self.importer.import_plugin(plugins[plugin]['Path']) self.badges.output_success(plugin + ': OK') except Exception: self.badges.output_error(plugin + ': FAIL') fail = True return fail
class Payloads: def __init__(self): self.importer = Importer() self.local_storage = LocalStorage() self.badges = Badges() def check_exist(self, name): if self.check_style(name): all_payloads = self.local_storage.get("payloads") if all_payloads: for database in all_payloads.keys(): payloads = all_payloads[database] platform = self.get_platform(name) architecture = self.get_architecture(name) if platform in payloads.keys(): if architecture in payloads[platform].keys(): payload = self.get_name(name) if payload in payloads[platform][ architecture].keys(): return True return False @staticmethod def check_style(name): if len(name.split('/')) >= 3: return True return False def get_platform(self, name): if self.check_style(name): return name.split('/')[0] return None def get_architecture(self, name): if self.check_style(name): return name.split('/')[1] return None def get_name(self, name): if self.check_style(name): return os.path.join(*(name.split(os.path.sep)[2:])) return None def get_payload_object(self, platform, architecture, name): payload_full_name = self.get_full_name(platform, architecture, name) if self.check_exist(payload_full_name): database = self.get_database(payload_full_name) return self.local_storage.get( "payloads")[database][platform][architecture][name] return None def get_database(self, name): if self.check_style(name): all_payloads = self.local_storage.get("payloads") if all_payloads: for database in all_payloads.keys(): payloads = all_payloads[database] platform = self.get_platform(name) architecture = self.get_architecture(name) if platform in payloads.keys(): if architecture in payloads[platform].keys(): payload = self.get_name(name) if payload in payloads[platform][ architecture].keys(): return database return None @staticmethod def get_full_name(platform, architecture, name): return platform + '/' + architecture + '/' + name def check_current_module(self): if self.local_storage.get("current_module"): if len(self.local_storage.get("current_module")) > 0: return True return False def get_current_module_object(self): if self.check_current_module(): return self.local_storage.get_array( "current_module", self.local_storage.get("current_module_number")) return None def get_current_module_name(self): if self.check_current_module(): return self.local_storage.get_array( "current_module", self.local_storage.get( "current_module_number")).details['Module'] return None def import_payload(self, module_name, platform, architecture, name): payloads = self.get_payload_object(platform, architecture, name) try: payload_object = self.importer.import_payload(payloads['Path']) current_module_name = module_name imported_payloads = self.local_storage.get("imported_payloads") if imported_payloads: if current_module_name in imported_payloads.keys(): imported_payloads[current_module_name].update({ payload_object.details['Payload']: copy.copy(payload_object) }) else: imported_payloads.update({ current_module_name: { payload_object.details['Payload']: copy.copy(payload_object) } }) else: imported_payloads = { current_module_name: { payload_object.details['Payload']: copy.copy(payload_object) } } self.local_storage.set("imported_payloads", imported_payloads) except Exception: return None return payload_object def check_imported(self, module_name, name): imported_payloads = self.local_storage.get("imported_payloads") current_module_name = module_name if imported_payloads: if current_module_name in imported_payloads.keys(): if name in imported_payloads[current_module_name].keys(): return True return False def get_current_payload(self): imported_payloads = self.local_storage.get("imported_payloads") current_module_object = self.get_current_module_object() current_module_name = current_module_object.details['Module'] if hasattr(current_module_object, "payload"): name = current_module_object.payload['Value'] if current_module_name in imported_payloads.keys(): if name in imported_payloads[current_module_name].keys(): return imported_payloads[current_module_name][name] return None def add_payload(self, module_name, platform, architecture, name): payloads = self.get_payload_object(platform, architecture, name) not_installed = list() for dependence in payloads['Dependencies']: if not self.importer.import_check(dependence): not_installed.append(dependence) if not not_installed: full_name = self.get_full_name(platform, architecture, name) if not self.check_imported(module_name, full_name): payload_object = self.import_payload(module_name, platform, architecture, name) if not payload_object: self.badges.output_error( "Failed to select payload from database!") return False else: self.badges.output_error( "Payload depends this dependencies which is not installed:") for dependence in not_installed: self.badges.output_empty(" * " + dependence) return False return True
class DB: def __init__(self): self.badges = Badges() self.local_storage = LocalStorage() def disconnect_payloads_database(self, name): if self.local_storage.get("connected_payloads_databases"): if name in self.local_storage.get("connected_payloads_databases"): self.local_storage.delete_element( "connected_payloads_databases", name) self.local_storage.delete_element("payloads", name) return self.badges.output_error("No such payloads database connected!") def disconnect_modules_database(self, name): if self.local_storage.get("connected_modules_databases"): if name in self.local_storage.get("connected_modules_databases"): self.local_storage.delete_element( "connected_modules_databases", name) self.local_storage.delete_element("modules", name) return self.badges.output_error("No such modules database connected!") def disconnect_plugins_database(self, name): if self.local_storage.get("connected_plugins_databases"): if name in self.local_storage.get("connected_plugins_databases"): self.local_storage.delete_element( "connected_plugins_databases", name) self.local_storage.delete_element("plugins", name) return self.badges.output_error("No such plugins database connected!") def connect_payloads_database(self, name, path): if self.local_storage.get("connected_payloads_databases"): if name in self.local_storage.get("connected_payloads_databases"): self.bagdes.output_error( "Payloads database already connected!") return if not os.path.exists(path) or not str.endswith(path, "json"): self.badges.output_error("Not a payloads database!") return try: database = json.load(open(path)) except Exception: self.badges.output_error("Failed to connect payloads database!") return if '__database__' not in database.keys(): self.badges.output_error("No __database__ section found!") return if database['__database__']['type'] != "payloads": self.badges.output_error("Not a payloads database!") return del database['__database__'] payloads = {name: database} data = {name: {'path': path}} if not self.local_storage.get("connected_payloads_databases"): self.local_storage.set("connected_payloads_databases", dict()) self.local_storage.update("connected_payloads_databases", data) if self.local_storage.get("payloads"): self.local_storage.update("payloads", payloads) else: self.local_storage.set("payloads", payloads) def connect_modules_database(self, name, path): if self.local_storage.get("connected_modules_databases"): if name in self.local_storage.get("connected_modules_databases"): self.bagdes.output_error("Modules database already connected!") return if not os.path.exists(path) or not str.endswith(path, "json"): self.badges.output_error("Not a modules database!") return try: database = json.load(open(path)) except Exception: self.badges.output_error("Failed to connect modules database!") return if '__database__' not in database.keys(): self.badges.output_error("No __database__ section found!") return if database['__database__']['type'] != "modules": self.badges.output_error("Not a modules database!") return del database['__database__'] modules = {name: database} data = {name: {'path': path}} if not self.local_storage.get("connected_modules_databases"): self.local_storage.set("connected_modules_databases", dict()) self.local_storage.update("connected_modules_databases", data) if self.local_storage.get("modules"): self.local_storage.update("modules", modules) else: self.local_storage.set("modules", modules) def connect_plugins_database(self, name, path): if self.local_storage.get("connected_plugins_databases"): if name in self.local_storage.get("connected_plugins_databases"): self.bagdes.output_error("Plugins database already connected!") return if not os.path.exists(path) or not str.endswith(path, "json"): self.badges.output_error("Not a database!") return try: database = json.load(open(path)) except Exception: self.badges.output_error("Failed to connect plugins database!") return if '__database__' not in database.keys(): self.badges.output_error("No __database__ section found!") return if database['__database__']['type'] != "plugins": self.badges.output_error("Not a plugins database!") return del database['__database__'] plugins = {name: database} data = {name: {'path': path}} if not self.local_storage.get("connected_plugins_databases"): self.local_storage.set("connected_plugins_databases", dict()) self.local_storage.update("connected_plugins_databases", data) if self.local_storage.get("plugins"): self.local_storage.update("plugins", plugins) else: self.local_storage.set("plugins", plugins)
class Sessions: def __init__(self): self.badges = Badges() self.local_storage = LocalStorage() def add_session(self, session_platform, session_type, session_host, session_port, session_object): if not self.local_storage.get("sessions"): self.local_storage.set("sessions", dict()) session_id = 0 if session_platform in self.local_storage.get("sessions").keys(): sessions = self.local_storage.get("sessions") session_id = len(sessions[session_platform]) sessions[session_platform][int(session_id)] = { 'type': session_type, 'host': session_host, 'port': session_port, 'object': session_object } else: sessions = { session_platform: { int(session_id): { 'type': session_type, 'host': session_host, 'port': session_port, 'object': session_object } } } self.local_storage.update("sessions", sessions) return session_id def check_session_exist(self, session_platform, session_id): sessions = self.local_storage.get("sessions") if sessions: if session_platform in sessions.keys(): if int(session_id) in sessions[session_platform].keys(): return True return False def spawn_interactive_connection(self, session_platform, session_id): sessions = self.local_storage.get("sessions") if self.check_session_exist(session_platform, session_id): self.badges.output_process("Interacting with session " + str(session_id) + "...") self.badges.output_success("Interactive connection spawned!") self.badges.output_information("Type commands below.\n") sessions[session_platform][int(session_id)]['object'].interact() else: self.badges.output_error("Invalid session given!") def close_session(self, session_platform, session_id): sessions = self.local_storage.get("sessions") if self.check_session_exist(session_platform, session_id): try: sessions[session_platform][int(session_id)]['object'].close() del sessions[session_platform][int(session_id)] if not sessions[session_platform]: del sessions[session_platform] self.local_storage.update("sessions", sessions) except Exception: self.badges.output_error("Failed to close session!") else: self.badges.output_error("Invalid session given!") def get_session(self, session_platform, session_type, session_id): sessions = self.local_storage.get("sessions") if self.check_session_exist(session_platform, session_id): if session_type == sessions[session_platform][int( session_id)]['type']: return sessions[session_platform][int(session_id)]['object'] self.badges.output_error("Session with invalid type!") return None return None
class Execute: def __init__(self): self.fmt = FMT() self.badges = Badges() self.local_storage = LocalStorage() self.modules = Modules() def execute_command(self, commands, arguments): if commands: if not self.execute_builtin_method(commands, arguments): if not self.execute_core_command(commands, arguments): if not self.execute_module_command(commands, arguments): if not self.execute_plugin_command( commands, arguments): self.badges.output_error("Unrecognized command: " + commands[0] + "!") def execute_from_file(self, input_file): if os.path.exists(input_file): file = open(input_file, 'r') file_text = file.read().split('\n') file.close() for line in file_text: commands = self.fmt.format_commands(line) arguments = commands[1:] self.execute_command(commands, arguments) def execute_builtin_method(self, commands, arguments): if commands[0][0] == '!': if len(commands[0]) > 1: commands[0] = commands[0].replace('!', '', 1) self.execute_system(commands) else: self.badges.output_usage("!<command>") return True return False def execute_system(self, commands): self.badges.output_process("Executing system command: " + commands[0] + "\n") try: subprocess.call(commands) except Exception: self.badges.output_error("Unrecognized system command: " + commands[0] + "!") def execute_core_command(self, commands, arguments): if commands[0] in self.local_storage.get("commands").keys(): command = self.local_storage.get("commands")[commands[0]] if (len(commands) - 1) < command.details['MinArgs']: self.badges.output_usage(command.details['Usage']) else: command.run(len(arguments), arguments) return True return False def execute_module_command(self, commands, arguments): if self.modules.check_current_module(): if hasattr(self.modules.get_current_module_object(), "commands"): if commands[0] in self.modules.get_current_module_object( ).commands.keys(): command_object = self.modules.get_current_module_object() command = self.modules.get_current_module_object( ).commands[commands[0]] self.parse_and_execute_command(commands, command, arguments, command_object) return True return False def execute_plugin_command(self, commands, arguments): if self.local_storage.get("loaded_plugins"): for plugin in self.local_storage.get("loaded_plugins").keys(): if hasattr( self.local_storage.get("loaded_plugins")[plugin], "commands"): for label in self.local_storage.get( "loaded_plugins")[plugin].commands.keys(): if commands[0] in self.local_storage.get( "loaded_plugins")[plugin].commands[label].keys( ): command_object = self.local_storage.get( "loaded_plugins")[plugin] command = command_object.commands[label][ commands[0]] self.parse_and_execute_command( commands, command, arguments, command_object) return True return False def parse_and_execute_command(self, commands, command, arguments, command_object): if hasattr(command_object, commands[0]): if (len(commands) - 1) < command['MinArgs']: self.badges.output_usage(command['Usage']) else: getattr(command_object, commands[0])(len(arguments), arguments) else: self.badges.output_error("Failed to execute command!")
class Console: def __init__(self): self.io = IO() self.tip = Tip() self.jobs = Jobs() self.execute = Execute() self.loader = Loader() self.config = Config() self.badges = Badges() self.banner = Banner() self.colors = Colors() self.local_storage = LocalStorage() self.modules = Modules() self.exceptions = Exceptions() self.history = self.config.path_config['base_paths']['history_path'] def check_root(self): if os.getuid() == 0: return True self.badges.output_error("Operation not permitted!") return False def check_install(self): if os.path.exists(self.config.path_config['base_paths']['root_path']): return True self.badges.output_error("HatSploit is not installed!") self.badges.output_information("Consider running ./install.sh") return False def start_hsf(self): try: self.loader.load_all() except Exception: sys.exit(1) def launch_menu(self): while True: try: if not self.modules.check_current_module(): prompt = '(hsf)> ' else: module = self.modules.get_current_module_name() name = self.modules.get_current_module_object( ).details['Name'] prompt = '(hsf: ' + self.modules.get_category( module ) + ': ' + self.colors.RED + name + self.colors.END + ')> ' commands, arguments = self.io.input(prompt) self.jobs.stop_dead() self.execute.execute_command(commands, arguments) if self.local_storage.get("history"): readline.write_history_file(self.history) except (KeyboardInterrupt, EOFError, self.exceptions.GlobalException): pass except Exception as e: self.badges.output_error("An error occurred: " + str(e) + "!") def enable_history_file(self): if not os.path.exists(self.history): open(self.history, 'w').close() readline.read_history_file(self.history) def launch_shell(self): using_history = self.local_storage.get("history") if using_history: self.enable_history_file() readline.parse_and_bind("tab: complete") version = self.config.core_config['details']['version'] codename = self.config.core_config['details']['codename'] if self.config.core_config['console']['clear']: self.badges.output_empty(self.colors.CLEAR, end='') if self.config.core_config['console']['banner']: self.banner.print_random_banner() if self.config.core_config['console']['header']: plugins = self.local_storage.get("plugins") modules = self.local_storage.get("modules") payloads = self.local_storage.get("payloads") plugins_total = 0 modules_total = 0 payloads_total = 0 if payloads: for database in payloads.keys(): for payload_platform in payloads[database].keys(): for payload_architecture in payloads[database][ payload_platform].keys(): payloads_total += len( payloads[database][payload_platform] [payload_architecture]) if plugins: for database in plugins.keys(): plugins_total += len(plugins[database]) if modules: for database in modules.keys(): for module_category in modules[database].keys(): for module_platform in modules[database][ module_category].keys(): modules_total += len( modules[database][module_category] [module_platform]) header = "" header += f"{self.colors.END}\n" if codename and not codename.isspace(): header += f" --=( {self.colors.YELLOW}HatSploit Framework {codename} {version}{self.colors.END}\n" else: header += f" --=( {self.colors.YELLOW}HatSploit Framework {version}{self.colors.END}\n" header += f"--==--=( Developed by EntySec ({self.colors.LINE}https://entysec.netlify.app/{self.colors.END})\n" header += f" --=( {modules_total} modules | {payloads_total} payloads | {plugins_total} plugins\n" header += f"{self.colors.END}" self.badges.output_empty(header) if self.config.core_config['console']['tip']: self.tip.print_random_tip() self.badges.output_empty("") def shell(self): self.start_hsf() self.launch_shell() self.launch_menu()
class Modules: def __init__(self): self.types = Types() self.badges = Badges() self.sessions = Sessions() self.payloads = Payloads() self.local_storage = LocalStorage() self.importer = Importer() def check_exist(self, name): if self.check_style(name): all_modules = self.local_storage.get("modules") if all_modules: for database in all_modules.keys(): modules = all_modules[database] category = self.get_category(name) platform = self.get_platform(name) if category in modules.keys(): if platform in modules[category].keys(): module = self.get_name(name) if module in modules[category][platform].keys(): return True return False def check_imported(self, name): imported_modules = self.local_storage.get("imported_modules") if imported_modules: if name in imported_modules.keys(): return True return False @staticmethod def check_style(name): if len(name.split('/')) >= 3: return True return False def check_current_module(self): if self.local_storage.get("current_module"): if len(self.local_storage.get("current_module")) > 0: return True return False def get_module_object(self, category, platform, name): module_full_name = self.get_full_name(category, platform, name) if self.check_exist(module_full_name): database = self.get_database(module_full_name) return self.local_storage.get( "modules")[database][category][platform][name] return None def get_current_module_object(self): if self.check_current_module(): return self.local_storage.get_array( "current_module", self.local_storage.get("current_module_number")) return None def get_current_module_platform(self): if self.check_current_module(): return self.local_storage.get_array( "current_module", self.local_storage.get( "current_module_number")).details['Platform'] return None def get_current_module_name(self): if self.check_current_module(): return self.local_storage.get_array( "current_module", self.local_storage.get( "current_module_number")).details['Module'] return None def get_database(self, name): if self.check_style(name): all_modules = self.local_storage.get("modules") if all_modules: for database in all_modules.keys(): modules = all_modules[database] category = self.get_category(name) platform = self.get_platform(name) if category in modules.keys(): if platform in modules[category].keys(): module = self.get_name(name) if module in modules[category][platform].keys(): return database return None def get_category(self, name): if self.check_style(name): return name.split('/')[0] return None def get_platform(self, name): if self.check_style(name): return name.split('/')[1] return None def get_name(self, name): if self.check_style(name): return os.path.join(*(name.split(os.path.sep)[2:])) return None @staticmethod def get_full_name(category, platform, name): return category + '/' + platform + '/' + name def compare_types(self, value_type, value): if value_type and not value_type.lower == 'all': if value_type.lower() == 'mac': if not self.types.is_mac(value): self.badges.output_error( "Invalid value, expected valid MAC!") return False if value_type.lower() == 'ip': if not self.types.is_ip(value): self.badges.output_error( "Invalid value, expected valid IP!") return False if value_type.lower() == 'ipv4': if not self.types.is_ipv4(value): self.badges.output_error( "Invalid value, expected valid IPv4!") return False if value_type.lower() == 'ipv6': if not self.types.is_ipv6(value): self.badges.output_error( "Invalid value, expected valid IPv6!") return False if value_type.lower() == 'ipv4_range': if not self.types.is_ipv4_range(value): self.badges.output_error( "Invalid value, expected valid IPv4 range!") return False if value_type.lower() == 'ipv6_range': if not self.types.is_ipv6_range(value): self.badges.output_error( "Invalid value, expected valid IPv6 range!") return False if value_type.lower() == 'port': if not self.types.is_port(value): self.badges.output_error( "Invalid value, expected valid port!") return False if value_type.lower() == 'port_range': if not self.types.is_port_range(value): self.badges.output_error( "Invalid value, expected valid port range!") return False if value_type.lower() == 'number': if not self.types.is_number(value): self.badges.output_error( "Invalid value, expected valid number!") return False if value_type.lower() == 'integer': if not self.types.is_integer(value): self.badges.output_error( "Invalid value, expected valid integer!") return False if value_type.lower() == 'float': if not self.types.is_float(value): self.badges.output_error( "Invalid value, expected valid float!") return False if value_type.lower() == 'boolean': if not self.types.is_boolean(value): self.badges.output_error( "Invalid value, expected valid boolean!") return False if value_type.lower() == 'session': module_platform = self.get_current_module_platform() if not self.sessions.check_exist(module_platform, value): return False return True def set_current_module_option(self, option, value): if self.check_current_module(): current_module = self.get_current_module_object() if not hasattr(current_module, "options") and not hasattr( current_module, "payload"): self.badges.output_warning("Module has no options.") return if hasattr(current_module, "payload") and option.lower() == "payload": if self.payloads.check_exist(value): module_name = self.get_current_module_name() platform = self.payloads.get_platform(value) architecture = self.payloads.get_architecture(value) name = self.payloads.get_name(value) payload = self.payloads.get_payload_object( platform, architecture, name) module_payload = current_module.payload valid = 0 if module_payload['Types'] is None or payload[ 'Type'] in module_payload['Types']: valid += 1 if module_payload['Categories'] is None or payload[ 'Category'] in module_payload['Categories']: valid += 1 if module_payload['Platforms'] is None or payload[ 'Platform'] in module_payload['Platforms']: valid += 1 if module_payload['Architectures'] is None or payload[ 'Architecture'] in module_payload['Architectures']: valid += 1 if valid == 4: if not self.payloads.add_payload( module_name, platform, architecture, name): self.badges.output_error( "Invalid payload, expected valid payload!") return self.badges.output_information(option + " ==> " + value) self.local_storage.set_module_payload( "current_module", self.local_storage.get("current_module_number"), value) return self.badges.output_error( "Incompatible payload type, category or platform!") return self.badges.output_error( "Invalid payload, expected valid payload!") return if hasattr(current_module, "options"): if option in current_module.options.keys(): value_type = current_module.options[option]['Type'] if self.compare_types(value_type, value): self.badges.output_information(option + " ==> " + value) self.local_storage.set_module_option( "current_module", self.local_storage.get("current_module_number"), option, value) return if hasattr(current_module, "payload"): current_payload = self.payloads.get_current_payload() if current_payload and hasattr(current_payload, "options"): if option in current_payload.options.keys(): value_type = current_payload.options[option]['Type'] if self.compare_types(value_type, value): self.badges.output_information(option + " ==> " + value) self.local_storage.set_payload_option( current_module.details['Module'], current_payload.details['Payload'], option, value) else: self.badges.output_error("Unrecognized option!") else: self.badges.output_error("Unrecognized option!") else: self.badges.output_warning("No module selected.") def import_module(self, category, platform, name): modules = self.get_module_object(category, platform, name) try: module_object = self.importer.import_module(modules['Path']) if not self.local_storage.get("imported_modules"): self.local_storage.set("imported_modules", dict()) self.local_storage.update( "imported_modules", {self.get_full_name(category, platform, name): module_object}) except Exception: return None return module_object def add_module(self, category, platform, name): modules = self.get_module_object(category, platform, name) not_installed = list() for dependence in modules['Dependencies']: if not self.importer.import_check(dependence): not_installed.append(dependence) if not not_installed: imported_modules = self.local_storage.get("imported_modules") full_name = self.get_full_name(category, platform, name) if self.check_imported(full_name): module_object = imported_modules[full_name] self.add_to_global(module_object) else: module_object = self.import_module(category, platform, name) if module_object: if hasattr(module_object, "payload"): payload_name = module_object.payload['Value'] platform = self.payloads.get_platform(payload_name) architecture = self.payloads.get_architecture( payload_name) name = self.payloads.get_name(payload_name) self.badges.output_process("Using default payload " + payload_name + "...") if self.payloads.check_exist(payload_name): if self.payloads.add_payload( full_name, platform, architecture, name): self.add_to_global(module_object) return self.badges.output_error("Invalid default payload!") return self.add_to_global(module_object) else: self.badges.output_error( "Failed to select module from database!") else: self.badges.output_error( "Module depends this dependencies which is not installed:") for dependence in not_installed: self.badges.output_empty(" * " + dependence) def add_to_global(self, module_object): if self.check_current_module(): self.local_storage.add_array("current_module", '') self.local_storage.set( "current_module_number", self.local_storage.get("current_module_number") + 1) self.local_storage.set_array( "current_module", self.local_storage.get("current_module_number"), module_object) else: self.local_storage.set("current_module", []) self.local_storage.set("current_module_number", 0) self.local_storage.add_array("current_module", '') self.local_storage.set_array( "current_module", self.local_storage.get("current_module_number"), module_object)
class Jobs: def __init__(self): self.exceptions = Exceptions() self.tables = Tables() self.badges = Badges() self.local_storage = LocalStorage() self.modules = Modules() self.job_process = None def stop_dead(self): jobs = self.local_storage.get("jobs") if jobs: for job_id in list(jobs): if not jobs[job_id]['job_process'].is_alive(): self.delete_job(job_id) def check_jobs(self): if not self.local_storage.get("jobs"): return True return False def check_module_job(self, module_name): jobs = self.local_storage.get("jobs") if jobs: for job_id in jobs.keys(): if jobs[job_id]['module_name'] == module_name: return True return False def exit_jobs(self): if self.check_jobs(): return True self.badges.output_warning("You have some running jobs.") if self.badges.input_question("Exit anyway? [y/N] ").lower() in [ 'yes', 'y' ]: self.badges.output_process("Stopping all jobs...") self.stop_all_jobs() return True return False def stop_all_jobs(self): if not self.check_jobs(): for job_id in list(self.local_storage.get("jobs").keys()): self.delete_job(job_id) def stop_job(self, job): if job.is_alive(): exc = ctypes.py_object(SystemExit) res = ctypes.pythonapi.PyThreadState_SetAsyncExc( ctypes.c_long(job.ident), exc) if res == 0: raise self.exceptions.GlobalException if res > 1: ctypes.pythonapi.PyThreadState_SetAsyncExc(job.ident, None) raise self.exceptions.GlobalException def start_job(self, job_function, job_arguments): self.job_process = threading.Thread(target=job_function, args=job_arguments) self.job_process.setDaemon(True) self.job_process.start() def delete_job(self, job_id): if not self.check_jobs(): job_id = int(job_id) if job_id in list(self.local_storage.get("jobs").keys()): try: self.stop_job( self.local_storage.get("jobs")[job_id]['job_process']) self.local_storage.delete_element("jobs", job_id) except Exception: self.badges.output_error("Failed to stop job!") else: self.badges.output_error("Invalid job id!") else: self.badges.output_error("Invalid job id!") def create_job(self, job_name, module_name, job_function, job_arguments=()): self.start_job(job_function, job_arguments) if not self.local_storage.get("jobs"): self.local_storage.set("jobs", dict()) job_id = len(self.local_storage.get("jobs")) job_data = { job_id: { 'job_name': job_name, 'module_name': module_name, 'job_process': self.job_process } } self.local_storage.update("jobs", job_data) return job_id