Ejemplo n.º 1
0
    def post(self, **kw):
        monkey_json = json.loads(request.data)
        monkey_json['creds'] = []
        monkey_json['dead'] = False
        if 'keepalive' in monkey_json:
            monkey_json['keepalive'] = dateutil.parser.parse(monkey_json['keepalive'])
        else:
            monkey_json['keepalive'] = datetime.now()

        monkey_json['modifytime'] = datetime.now()

        ConfigService.save_initial_config_if_needed()

        # if new monkey telem, change config according to "new monkeys" config.
        db_monkey = mongo.db.monkey.find_one({"guid": monkey_json["guid"]})

        # Update monkey configuration
        new_config = ConfigService.get_flat_config(False, False)
        monkey_json['config'] = monkey_json.get('config', {})
        monkey_json['config'].update(new_config)

        # try to find new monkey parent
        parent = monkey_json.get('parent')
        parent_to_add = (monkey_json.get('guid'), None)  # default values in case of manual run
        if parent and parent != monkey_json.get('guid'):  # current parent is known
            exploit_telem = [x for x in
                             mongo.db.telemetry.find({'telem_category': {'$eq': 'exploit'}, 'data.result': {'$eq': True},
                                                      'data.machine.ip_addr': {'$in': monkey_json['ip_addresses']},
                                                      'monkey_guid': {'$eq': parent}})]
            if 1 == len(exploit_telem):
                parent_to_add = (exploit_telem[0].get('monkey_guid'), exploit_telem[0].get('data').get('exploiter'))
            else:
                parent_to_add = (parent, None)
        elif (not parent or parent == monkey_json.get('guid')) and 'ip_addresses' in monkey_json:
            exploit_telem = [x for x in
                             mongo.db.telemetry.find({'telem_category': {'$eq': 'exploit'}, 'data.result': {'$eq': True},
                                                      'data.machine.ip_addr': {'$in': monkey_json['ip_addresses']}})]

            if 1 == len(exploit_telem):
                parent_to_add = (exploit_telem[0].get('monkey_guid'), exploit_telem[0].get('data').get('exploiter'))

        if not db_monkey:
            monkey_json['parent'] = [parent_to_add]
        else:
            monkey_json['parent'] = db_monkey.get('parent') + [parent_to_add]

        tunnel_host_ip = None
        if 'tunnel' in monkey_json:
            tunnel_host_ip = monkey_json['tunnel'].split(":")[-2].replace("//", "")
            monkey_json.pop('tunnel')

        ttl = create_monkey_ttl_document(DEFAULT_MONKEY_TTL_EXPIRY_DURATION_IN_SECONDS)
        monkey_json['ttl_ref'] = ttl.id

        mongo.db.monkey.update({"guid": monkey_json["guid"]},
                               {"$set": monkey_json},
                               upsert=True)

        # Merge existing scanned node with new monkey

        new_monkey_id = mongo.db.monkey.find_one({"guid": monkey_json["guid"]})["_id"]

        if tunnel_host_ip is not None:
            NodeService.set_monkey_tunnel(new_monkey_id, tunnel_host_ip)

        existing_node = mongo.db.node.find_one({"ip_addresses": {"$in": monkey_json["ip_addresses"]}})

        if existing_node:
            node_id = existing_node["_id"]
            for edge in mongo.db.edge.find({"to": node_id}):
                mongo.db.edge.update({"_id": edge["_id"]}, {"$set": {"to": new_monkey_id}})
            for creds in existing_node['creds']:
                NodeService.add_credentials_to_monkey(new_monkey_id, creds)
            mongo.db.node.remove({"_id": node_id})

        return {"id": new_monkey_id}
Ejemplo n.º 2
0
    def post(self, **kw):
        monkey_json = json.loads(request.data)
        monkey_json["creds"] = []
        monkey_json["dead"] = False
        if "keepalive" in monkey_json:
            monkey_json["keepalive"] = dateutil.parser.parse(monkey_json["keepalive"])
        else:
            monkey_json["keepalive"] = datetime.now()

        monkey_json["modifytime"] = datetime.now()

        ConfigService.save_initial_config_if_needed()

        # if new monkey telem, change config according to "new monkeys" config.
        db_monkey = mongo.db.monkey.find_one({"guid": monkey_json["guid"]})

        # Update monkey configuration
        new_config = ConfigService.get_flat_config(False, False)
        monkey_json["config"] = monkey_json.get("config", {})
        monkey_json["config"].update(new_config)

        # try to find new monkey parent
        parent = monkey_json.get("parent")
        parent_to_add = (monkey_json.get("guid"), None)  # default values in case of manual run
        if parent and parent != monkey_json.get("guid"):  # current parent is known
            exploit_telem = [
                x
                for x in mongo.db.telemetry.find(
                    {
                        "telem_category": {"$eq": "exploit"},
                        "data.result": {"$eq": True},
                        "data.machine.ip_addr": {"$in": monkey_json["ip_addresses"]},
                        "monkey_guid": {"$eq": parent},
                    }
                )
            ]
            if 1 == len(exploit_telem):
                parent_to_add = (
                    exploit_telem[0].get("monkey_guid"),
                    exploit_telem[0].get("data").get("exploiter"),
                )
            else:
                parent_to_add = (parent, None)
        elif (not parent or parent == monkey_json.get("guid")) and "ip_addresses" in monkey_json:
            exploit_telem = [
                x
                for x in mongo.db.telemetry.find(
                    {
                        "telem_category": {"$eq": "exploit"},
                        "data.result": {"$eq": True},
                        "data.machine.ip_addr": {"$in": monkey_json["ip_addresses"]},
                    }
                )
            ]

            if 1 == len(exploit_telem):
                parent_to_add = (
                    exploit_telem[0].get("monkey_guid"),
                    exploit_telem[0].get("data").get("exploiter"),
                )

        if not db_monkey:
            monkey_json["parent"] = [parent_to_add]
        else:
            monkey_json["parent"] = db_monkey.get("parent") + [parent_to_add]

        tunnel_host_ip = None
        if "tunnel" in monkey_json:
            tunnel_host_ip = monkey_json["tunnel"].split(":")[-2].replace("//", "")
            monkey_json.pop("tunnel")

        ttl = create_monkey_ttl_document(DEFAULT_MONKEY_TTL_EXPIRY_DURATION_IN_SECONDS)
        monkey_json["ttl_ref"] = ttl.id

        mongo.db.monkey.update({"guid": monkey_json["guid"]}, {"$set": monkey_json}, upsert=True)

        # Merge existing scanned node with new monkey

        new_monkey_id = mongo.db.monkey.find_one({"guid": monkey_json["guid"]})["_id"]

        if tunnel_host_ip is not None:
            NodeService.set_monkey_tunnel(new_monkey_id, tunnel_host_ip)

        existing_node = mongo.db.node.find_one(
            {"ip_addresses": {"$in": monkey_json["ip_addresses"]}}
        )

        if existing_node:
            node_id = existing_node["_id"]
            EdgeService.update_all_dst_nodes(old_dst_node_id=node_id, new_dst_node_id=new_monkey_id)
            for creds in existing_node["creds"]:
                NodeService.add_credentials_to_monkey(new_monkey_id, creds)
            mongo.db.node.remove({"_id": node_id})

        return {"id": new_monkey_id}