This commit is contained in:
Itay Mizeretz 2018-03-08 14:17:27 +02:00
parent d8210bf731
commit 795885b322
5 changed files with 32 additions and 18 deletions

View File

@ -65,7 +65,7 @@ class Monkey(flask_restful.Resource):
# if new monkey telem, change config according to "new monkeys" config. # if new monkey telem, change config according to "new monkeys" config.
db_monkey = mongo.db.monkey.find_one({"guid": monkey_json["guid"]}) db_monkey = mongo.db.monkey.find_one({"guid": monkey_json["guid"]})
if not db_monkey: 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'] = monkey_json.get('config', {})
monkey_json['config'].update(new_config) monkey_json['config'].update(new_config)
else: else:

View File

@ -12,7 +12,7 @@ __author__ = 'Barak'
class MonkeyConfiguration(flask_restful.Resource): class MonkeyConfiguration(flask_restful.Resource):
@jwt_required() @jwt_required()
def get(self): 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() @jwt_required()
def post(self): def post(self):

View File

@ -1,5 +1,5 @@
import copy import copy
import functools
from jsonschema import Draft4Validator, validators from jsonschema import Draft4Validator, validators
from cc.database import mongo from cc.database import mongo
@ -813,6 +813,12 @@ class ConfigService:
@staticmethod @staticmethod
def get_config(is_initial_config=False, should_decrypt=True): 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 {} config = mongo.db.config.find_one({'name': 'initial' if is_initial_config else 'newconfig'}) or {}
for field in ('name', '_id'): for field in ('name', '_id'):
config.pop(field, None) config.pop(field, None)
@ -822,7 +828,15 @@ class ConfigService:
@staticmethod @staticmethod
def get_config_value(config_key_as_arr, is_initial_config=False, should_decrypt=True): 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}) 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: for config_key_part in config_key_as_arr:
config = config[config_key_part] config = config[config_key_part]
@ -890,10 +904,10 @@ class ConfigService:
ConfigService.default_config = config ConfigService.default_config = config
@staticmethod @staticmethod
def get_default_config(should_decrypt=True): def get_default_config(should_encrypt=False):
ConfigService.init_default_config() ConfigService.init_default_config()
config = copy.deepcopy(ConfigService.default_config) config = copy.deepcopy(ConfigService.default_config)
if not should_decrypt: if should_encrypt:
ConfigService.encrypt_config(config) ConfigService.encrypt_config(config)
return config return config
@ -905,7 +919,7 @@ class ConfigService:
@staticmethod @staticmethod
def reset_config(): 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.set_server_ips_in_config(config)
ConfigService.update_config(config, should_encrypt=False) ConfigService.update_config(config, should_encrypt=False)
@ -952,14 +966,14 @@ class ConfigService:
@staticmethod @staticmethod
def decrypt_config(config): def decrypt_config(config):
ConfigService._encrypt_config(config, True) ConfigService._encrypt_or_decrypt_config(config, True)
@staticmethod @staticmethod
def encrypt_config(config): def encrypt_config(config):
ConfigService._encrypt_config(config, False) ConfigService._encrypt_or_decrypt_config(config, False)
@staticmethod @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: for config_arr_as_array in ENCRYPTED_CONFIG_ARRAYS:
config_arr = config config_arr = config
for config_key_part in config_arr_as_array: for config_key_part in config_arr_as_array:

View File

@ -293,19 +293,19 @@ class ReportService:
@staticmethod @staticmethod
def get_config_users(): 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 @staticmethod
def get_config_passwords(): 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 @staticmethod
def get_config_exploits(): def get_config_exploits():
exploits_config_value = ['exploits', 'general', 'exploiter_classes'] 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: for namespace in exploits_config_value:
default_exploits = default_exploits[namespace] 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: if exploits == default_exploits:
return ['default'] return ['default']
@ -315,13 +315,13 @@ class ReportService:
@staticmethod @staticmethod
def get_config_ips(): 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 []
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 @staticmethod
def get_config_scan(): 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 @staticmethod
def get_issues_overview(issues, config_users, config_passwords): def get_issues_overview(issues, config_users, config_passwords):