forked from p34709852/monkey
126 lines
4.0 KiB
Python
126 lines
4.0 KiB
Python
|
from bson import ObjectId
|
||
|
|
||
|
from cc.database import mongo
|
||
|
from cc.services.edge import EdgeService
|
||
|
|
||
|
__author__ = "itay.mizeretz"
|
||
|
|
||
|
|
||
|
class NodeService:
|
||
|
|
||
|
@staticmethod
|
||
|
def get_displayed_node_by_id(node_id):
|
||
|
|
||
|
edges = EdgeService.get_displayed_edges_by_to(node_id)
|
||
|
accessible_from_nodes = []
|
||
|
exploits = []
|
||
|
|
||
|
new_node = {"id": node_id}
|
||
|
|
||
|
node = mongo.db.node.find_one({"_id": ObjectId(node_id)})
|
||
|
if node is None:
|
||
|
monkey = mongo.db.monkey.find_one({"_id": ObjectId(node_id)})
|
||
|
if monkey is None:
|
||
|
return new_node
|
||
|
|
||
|
# node is infected
|
||
|
for key in monkey:
|
||
|
# TODO: do something with tunnel
|
||
|
if key not in ["_id", "modifytime", "parent", "tunnel", "tunnel_guid"]:
|
||
|
new_node[key] = monkey[key]
|
||
|
|
||
|
new_node["os"] = NodeService.get_monkey_os(monkey)
|
||
|
new_node["label"] = NodeService.get_monkey_label(monkey)
|
||
|
new_node["group"] = NodeService.get_monkey_group(monkey)
|
||
|
|
||
|
else:
|
||
|
# node is uninfected
|
||
|
new_node["ip_addresses"] = node["ip_addresses"]
|
||
|
new_node["group"] = "clean"
|
||
|
|
||
|
for edge in edges:
|
||
|
accessible_from_nodes.append({"id": edge["from"]})
|
||
|
for exploit in edge["exploits"]:
|
||
|
exploit["origin"] = edge["from"]
|
||
|
exploits.append(exploit)
|
||
|
|
||
|
exploits.sort(cmp=NodeService._cmp_exploits_by_timestamp)
|
||
|
|
||
|
new_node["exploits"] = exploits
|
||
|
new_node["accessible_from_nodes"] = accessible_from_nodes
|
||
|
if len(edges) > 0:
|
||
|
new_node["services"] = edges[-1]["services"]
|
||
|
new_node["os"] = edges[-1]["os"]["type"]
|
||
|
if "label" not in new_node:
|
||
|
new_node["label"] = edges[-1]["os"]["version"] + " : " + node["ip_addresses"][0]
|
||
|
|
||
|
# TODO: add exploited by
|
||
|
|
||
|
return new_node
|
||
|
|
||
|
@staticmethod
|
||
|
def _cmp_exploits_by_timestamp(exploit_1, exploit_2):
|
||
|
if exploit_1["timestamp"] == exploit_2["timestamp"]:
|
||
|
return 0
|
||
|
if exploit_1["timestamp"] > exploit_2["timestamp"]:
|
||
|
return 1
|
||
|
return -1
|
||
|
|
||
|
@staticmethod
|
||
|
def get_monkey_os(monkey):
|
||
|
os = "unknown"
|
||
|
if monkey["description"].lower().find("linux") != -1:
|
||
|
os = "linux"
|
||
|
elif monkey["description"].lower().find("windows") != -1:
|
||
|
os = "windows"
|
||
|
return os
|
||
|
|
||
|
@staticmethod
|
||
|
def get_monkey_manual_run(monkey):
|
||
|
# TODO: find better implementation
|
||
|
return monkey["parent"][0][1] == None
|
||
|
|
||
|
@staticmethod
|
||
|
def get_monkey_label(monkey):
|
||
|
return monkey["hostname"] + " : " + monkey["ip_addresses"][0]
|
||
|
|
||
|
@staticmethod
|
||
|
def get_monkey_group(monkey):
|
||
|
return "manuallyInfected" if NodeService.get_monkey_manual_run(monkey) else "infected"
|
||
|
|
||
|
@staticmethod
|
||
|
def monkey_to_net_node(monkey):
|
||
|
return \
|
||
|
{
|
||
|
"id": monkey["_id"],
|
||
|
"label": NodeService.get_monkey_label(monkey),
|
||
|
"group": NodeService.get_monkey_group(monkey),
|
||
|
"os": NodeService.get_monkey_os(monkey),
|
||
|
"dead": monkey["dead"],
|
||
|
}
|
||
|
|
||
|
@staticmethod
|
||
|
def node_to_net_node(node):
|
||
|
os_version = "undefined"
|
||
|
os_type = "undefined"
|
||
|
found = False
|
||
|
# TODO: Set this as data when received
|
||
|
for edge in mongo.db.edge.find({"to": node["_id"]}):
|
||
|
for scan in edge["scans"]:
|
||
|
if scan["scanner"] != "TcpScanner":
|
||
|
continue
|
||
|
os_type = scan["data"]["os"]["type"]
|
||
|
if "version" in scan["data"]["os"]:
|
||
|
os_version = scan["data"]["os"]["version"]
|
||
|
found = True
|
||
|
break
|
||
|
if found:
|
||
|
break
|
||
|
|
||
|
return \
|
||
|
{
|
||
|
"id": node["_id"],
|
||
|
"label": os_version + " : " + node["ip_addresses"][0],
|
||
|
"group": "clean",
|
||
|
"os": os_type
|
||
|
}
|