def get_displayed_node_by_id(node_id, for_report=False): if ObjectId(node_id) == NodeService.get_monkey_island_pseudo_id(): return NodeService.get_monkey_island_node() new_node = {"id": node_id} node = NodeService.get_node_by_id(node_id) if node is None: monkey = NodeService.get_monkey_by_id(node_id) if monkey is None: return new_node # node is infected new_node = NodeService.monkey_to_net_node(monkey, for_report) for key in monkey: if key not in [ '_id', 'modifytime', 'parent', 'dead', 'description' ]: new_node[key] = monkey[key] else: # node is uninfected new_node = NodeService.node_to_net_node(node, for_report) new_node["ip_addresses"] = node["ip_addresses"] new_node["domain_name"] = node["domain_name"] accessible_from_nodes = [] accessible_from_nodes_hostnames = [] exploits = [] edges = DisplayedEdgeService.get_displayed_edges_by_dst( node_id, for_report) for edge in edges: from_node_id = edge['from'] from_node_label = Monkey.get_label_by_id(from_node_id) from_node_hostname = Monkey.get_hostname_by_id(from_node_id) accessible_from_nodes.append(from_node_label) accessible_from_nodes_hostnames.append(from_node_hostname) for edge_exploit in edge['exploits']: edge_exploit['origin'] = from_node_label exploits.append(edge_exploit) exploits = sorted(exploits, key=lambda exploit: exploit['timestamp']) new_node["exploits"] = exploits new_node["accessible_from_nodes"] = accessible_from_nodes new_node[ "accessible_from_nodes_hostnames"] = accessible_from_nodes_hostnames if len(edges) > 0: new_node["services"] = edges[-1]["services"] else: new_node["services"] = [] new_node[ 'has_log'] = monkey_island.cc.services.log.LogService.log_exists( ObjectId(node_id)) return new_node
def get_label_for_endpoint(endpoint_id): if endpoint_id == ObjectId("000000000000000000000000"): return 'MonkeyIsland' if Monkey.is_monkey(endpoint_id): return Monkey.get_label_by_id(endpoint_id) else: return NodeService.get_node_label(NodeService.get_node_by_id(endpoint_id))
def monkey_to_net_node(monkey, for_report=False): monkey_id = monkey["_id"] label = Monkey.get_hostname_by_id(monkey_id) if for_report else Monkey.get_label_by_id(monkey_id) monkey_group = NodeService.get_monkey_group(monkey) return \ { "id": monkey_id, "label": label, "group": monkey_group, "os": NodeService.get_monkey_os(monkey), # The monkey is running IFF the group contains "_running". Therefore it's dead IFF the group does NOT # contain "_running". This is a small optimisation, to not call "is_dead" twice. "dead": "_running" not in monkey_group, "domain_name": "", "pba_results": monkey["pba_results"] if "pba_results" in monkey else [] }