diff --git a/monkey_island/cc/resources/monkey.py b/monkey_island/cc/resources/monkey.py index d344949bc..997e2a72e 100644 --- a/monkey_island/cc/resources/monkey.py +++ b/monkey_island/cc/resources/monkey.py @@ -65,7 +65,7 @@ class Monkey(flask_restful.Resource): # if new monkey telem, change config according to "new monkeys" config. db_monkey = mongo.db.monkey.find_one({"guid": monkey_json["guid"]}) if not db_monkey: - new_config = ConfigService.get_flat_config() + new_config = ConfigService.get_flat_config(False, True) monkey_json['config'] = monkey_json.get('config', {}) monkey_json['config'].update(new_config) else: diff --git a/monkey_island/cc/resources/monkey_configuration.py b/monkey_island/cc/resources/monkey_configuration.py index 81ceab56e..db4d17167 100644 --- a/monkey_island/cc/resources/monkey_configuration.py +++ b/monkey_island/cc/resources/monkey_configuration.py @@ -12,7 +12,7 @@ __author__ = 'Barak' class MonkeyConfiguration(flask_restful.Resource): @jwt_required() def get(self): - return jsonify(schema=ConfigService.get_config_schema(), configuration=ConfigService.get_config()) + return jsonify(schema=ConfigService.get_config_schema(), configuration=ConfigService.get_config(False, True)) @jwt_required() def post(self): diff --git a/monkey_island/cc/services/config.py b/monkey_island/cc/services/config.py index e2072b7cf..2f62db0d6 100644 --- a/monkey_island/cc/services/config.py +++ b/monkey_island/cc/services/config.py @@ -1,5 +1,5 @@ import copy - +import functools from jsonschema import Draft4Validator, validators from cc.database import mongo @@ -813,6 +813,12 @@ class ConfigService: @staticmethod def get_config(is_initial_config=False, should_decrypt=True): + """ + Gets the entire global config. + :param is_initial_config: If True, the initial config will be returned instead of the current config. + :param should_decrypt: If True, all config values which are set as encrypted will be decrypted. + :return: The entire global config. + """ config = mongo.db.config.find_one({'name': 'initial' if is_initial_config else 'newconfig'}) or {} for field in ('name', '_id'): config.pop(field, None) @@ -822,7 +828,15 @@ class ConfigService: @staticmethod def get_config_value(config_key_as_arr, is_initial_config=False, should_decrypt=True): - config_key = reduce(lambda x, y: x + '.' + y, config_key_as_arr) + """ + Get a specific config value. + :param config_key_as_arr: The config key as an array. e.g. ['basic', 'credentials', 'exploit_password_list']. + :param is_initial_config: If True, returns the value of the initial config instead of the current config. + :param should_decrypt: If True, the value of the config key will be decrypted + (if it's in the list of encrypted config values). + :return: The value of the requested config key. + """ + config_key = functools.reduce(lambda x, y: x + '.' + y, config_key_as_arr) config = mongo.db.config.find_one({'name': 'initial' if is_initial_config else 'newconfig'}, {config_key: 1}) for config_key_part in config_key_as_arr: config = config[config_key_part] @@ -890,10 +904,10 @@ class ConfigService: ConfigService.default_config = config @staticmethod - def get_default_config(should_decrypt=True): + def get_default_config(should_encrypt=False): ConfigService.init_default_config() config = copy.deepcopy(ConfigService.default_config) - if not should_decrypt: + if should_encrypt: ConfigService.encrypt_config(config) return config @@ -905,7 +919,7 @@ class ConfigService: @staticmethod def reset_config(): - config = ConfigService.get_default_config(should_decrypt=False) + config = ConfigService.get_default_config(True) ConfigService.set_server_ips_in_config(config) ConfigService.update_config(config, should_encrypt=False) @@ -952,14 +966,14 @@ class ConfigService: @staticmethod def decrypt_config(config): - ConfigService._encrypt_config(config, True) + ConfigService._encrypt_or_decrypt_config(config, True) @staticmethod def encrypt_config(config): - ConfigService._encrypt_config(config, False) + ConfigService._encrypt_or_decrypt_config(config, False) @staticmethod - def _encrypt_config(config, is_decrypt=False): + def _encrypt_or_decrypt_config(config, is_decrypt=False): for config_arr_as_array in ENCRYPTED_CONFIG_ARRAYS: config_arr = config for config_key_part in config_arr_as_array: diff --git a/monkey_island/cc/services/report.py b/monkey_island/cc/services/report.py index c197c55f3..cbef9d973 100644 --- a/monkey_island/cc/services/report.py +++ b/monkey_island/cc/services/report.py @@ -293,19 +293,19 @@ class ReportService: @staticmethod def get_config_users(): - return ConfigService.get_config_value(['basic', 'credentials', 'exploit_user_list'], True) + return ConfigService.get_config_value(['basic', 'credentials', 'exploit_user_list'], True, True) @staticmethod def get_config_passwords(): - return ConfigService.get_config_value(['basic', 'credentials', 'exploit_password_list'], True) + return ConfigService.get_config_value(['basic', 'credentials', 'exploit_password_list'], True, True) @staticmethod def get_config_exploits(): exploits_config_value = ['exploits', 'general', 'exploiter_classes'] - default_exploits = ConfigService.get_default_config() + default_exploits = ConfigService.get_default_config(False) for namespace in exploits_config_value: default_exploits = default_exploits[namespace] - exploits = ConfigService.get_config_value(exploits_config_value, True) + exploits = ConfigService.get_config_value(exploits_config_value, True, True) if exploits == default_exploits: return ['default'] @@ -315,13 +315,13 @@ class ReportService: @staticmethod def get_config_ips(): - if ConfigService.get_config_value(['basic_network', 'network_range', 'range_class'], True) != 'FixedRange': + if ConfigService.get_config_value(['basic_network', 'network_range', 'range_class'], True, True) != 'FixedRange': return [] - return ConfigService.get_config_value(['basic_network', 'network_range', 'range_fixed'], True) + return ConfigService.get_config_value(['basic_network', 'network_range', 'range_fixed'], True, True) @staticmethod def get_config_scan(): - return ConfigService.get_config_value(['basic_network', 'general', 'local_network_scan'], True) + return ConfigService.get_config_value(['basic_network', 'general', 'local_network_scan'], True, True) @staticmethod def get_issues_overview(issues, config_users, config_passwords): diff --git a/monkey_island/requirements.txt b/monkey_island/requirements.txt index a090a3b4b..29c364c9f 100644 --- a/monkey_island/requirements.txt +++ b/monkey_island/requirements.txt @@ -13,4 +13,4 @@ jsonschema netifaces ipaddress enum34 -PyCrypto \ No newline at end of file +PyCrypto