diff --git a/ad_miner/sources/modules/objects.py b/ad_miner/sources/modules/objects.py index b7b7866..0e64f24 100755 --- a/ad_miner/sources/modules/objects.py +++ b/ad_miner/sources/modules/objects.py @@ -1,4 +1,3 @@ -import random import time from ad_miner.sources.modules import logger @@ -22,6 +21,8 @@ def __init__(self, arguments, neo4j): self.objects_to_dcsync = neo4j.all_requests["objects_to_dcsync"]["result"] self.dcsync_list = neo4j.all_requests["dcsync_list"]["result"] + self.dcsync_paths = neo4j.all_requests["set_dcsync1"]["result"] + neo4j.all_requests["set_dcsync2"]["result"] + self.users_nb_domain_admins = neo4j.all_requests["nb_domain_admins"]["result"] end_nodes = [] @@ -49,6 +50,7 @@ def genNodesDCsyncPage(self): data = [] for n in self.can_dcsync_nodes: + # Graph path to DCSync page = Page( self.arguments.cache_prefix, f"path_to_{n.name}_with_dcsync", @@ -57,20 +59,30 @@ def genNodesDCsyncPage(self): ) graph = Graph() - paths = [] + paths_left = [] for path in self.objects_to_dcsync: if path.nodes[-1].name == n.name: - paths.append(path) + paths_left.append(path) + + graph.setPaths(paths_left) + page.addComponent(graph) + page.render() + + # Graph DCSync detail + page = Page( + self.arguments.cache_prefix, + f"dcsync_from_{n.name}", + f"DCSync detail for {n.name}", + "can_dcsync_graph", + ) + graph = Graph() - # TODO : vérifier que le droit DCSync correspond TOUJOURS à un DCSync sur le domaine d'appartenance du noeud - # -> Si ce n'est pas la cas alors il faut adapter la ligne suivante (n.domain) - n.relation_type = "DCSync" - end = Node(f"{random.randint(1,10000):06}", "Domain", n.domain, n.domain, "") - #rel = Relation(int(str(n.id) + "00" + str(n.id)), [n, end], "DCSync") - path = Path([n, end]) - paths.append(path) + paths_right = [] + for path in self.dcsync_paths: + if path.nodes[0].name == n.name: + paths_right.append(path) - graph.setPaths(paths) + graph.setPaths(paths_right) page.addComponent(graph) page.render() @@ -86,7 +98,7 @@ def genNodesDCsyncPage(self): else: name_icon = type_icon - sortClass = str(len(paths)).zfill(6) + sortClass = str(len(paths_left)).zfill(6) data.append( { "domain": ' ' + n.domain, @@ -94,7 +106,12 @@ def genNodesDCsyncPage(self): "name": name_icon + ' ' + n.name, "path to account": grid_data_stringify({ "link": "path_to_%s_with_dcsync.html" % quote(str(n.name)), - "value": f"{len(paths)} paths ", + "value": f"{len(paths_left)} paths ", + "before_link": f"" + }), + "path to dcsync": grid_data_stringify({ + "link": "dcsync_from_%s.html" % quote(str(n.name)), + "value": f"DCSync path ", "before_link": f"" }), } @@ -107,7 +124,7 @@ def genNodesDCsyncPage(self): "can_dcsync", ) grid = Grid("DCsync objects") - headers = ["domain", "type", "name", "path to account"] + headers = ["domain", "type", "name", "path to account", "path to dcsync"] grid.setheaders(headers) grid.setData(data) page.addComponent(grid)