From 6895549bbe25df4492bc067d48f2b3a23cac1d65 Mon Sep 17 00:00:00 2001 From: acepace Date: Tue, 14 Jun 2016 14:40:14 +0300 Subject: [PATCH] Add scan lines --- monkey_island/cc/admin/ui/js/monkeys-admin.js | 90 ++++++++++++++++++- 1 file changed, 86 insertions(+), 4 deletions(-) diff --git a/monkey_island/cc/admin/ui/js/monkeys-admin.js b/monkey_island/cc/admin/ui/js/monkeys-admin.js index 25021cc6c..3cc3db334 100644 --- a/monkey_island/cc/admin/ui/js/monkeys-admin.js +++ b/monkey_island/cc/admin/ui/js/monkeys-admin.js @@ -1,6 +1,9 @@ const jsonFile = "/api/monkey"; +const jsonFileTelemetry = "/api/telemetry"; var monkeys = null; +var scannedMachines = []; var generationDate = null; +var temelGenerationDate = null; // The JSON must be fully loaded before onload() happens for calling draw() on 'monkeys' $.ajaxSetup({ @@ -13,6 +16,7 @@ $.getJSON(jsonFile, function(json) { generationDate = json.timestamp; }); + // The objects used by vis var network = null; var nodes = []; @@ -24,6 +28,7 @@ const ICONS_EXT = ".png"; const EDGE_TYPE_PARENT = "parent"; const EDGE_TYPE_TUNNEL = "tunnel"; +const EDGE_TYPE_SCAN = "scan"; // General options // If variable from local storage != null, assign it, otherwise set it's default value. @@ -47,6 +52,8 @@ function initAdmin() { createEdges(); createTunnels(); + createScanned(); + var data = { nodes: createNodes(), edges: edges @@ -118,7 +125,7 @@ function updateMonkeys() { else { monkeys.push(new_monkeys[i]); - nodes.push(createNode(new_monkeys[i])); + nodes.push(createMonkeyNode(new_monkeys[i])); } } @@ -126,9 +133,10 @@ function updateMonkeys() { { createEdges(); createTunnels(); + network.setData({nodes: nodes, edges: edges}); } - + createScanned(); window.setTimeout(updateMonkeys, 10000); }); } @@ -140,13 +148,13 @@ function createNodes() { for (var i = 0; i < monkeys.length; i++) { var monkey = monkeys[i]; - nodes.push(createNode(monkey)); + nodes.push(createMonkeyNode(monkey)); } return nodes; } -function createNode(monkey) { +function createMonkeyNode(monkey) { var title = undefined; var img = "monkey"; @@ -173,6 +181,21 @@ function createNode(monkey) { }; } +function createMachineNode(machine) { + img = ICONS_DIR + "computer" + ICONS_EXT; + + return { + 'id': machine.ip_addr, + 'label': machine.os.version + "\n" + machine.ip_addr, + 'shape': 'image', + 'color': undefined, + 'image': img, + 'title': undefined, + 'value': undefined, + 'mass': 0, + }; +} + function createEdges() { for (var i = 0; i < monkeys.length; i++) { var monkey = monkeys[i]; @@ -203,6 +226,42 @@ function createTunnels() { return edges; } +function createScanned() { + //For each existing monkey, gets all the scans performed by it + //For each non exploited machine, adds a new node and connects it as a scanned node. + for (var i = 0; i < monkeys.length; i++) { + var monkey = monkeys[i]; + //Get scans for each monkey + // Reading the JSON file containing the monkeys' informations + $.getJSON(jsonFileTelemetry +'?timestamp='+ temelGenerationDate+ "&monkey_guid=" + monkey.guid+"&telem_type=scan", function(json) { + temelGenerationDate = json.timestamp; + var scans = json.objects; + for (var i = 0; i < scans.length; i++) { + var scan = scans[i]; + //Check if we already exploited this machine from another PoV, if so no point in scanning. + if (null != getMonkeyByIP(scan.data.machine.ip_addr)) { + //if so, make sure we don't already have such a node + nodes = nodes.filter(function (node) { + return (node.id != ip_addr); + }); + continue; + } + //And check if we've already added this scanned machine + var machineNode = getScannedByIP(scan.data.machine.ip_addr) + if (null == machineNode) { + machineNode = createMachineNode(scan.data.machine); + scannedMachines.push(machineNode); + nodes.push(machineNode); + } + + if(!edgeExists([monkey.id, machineNode.id, EDGE_TYPE_SCAN])) { + edges.push({from: monkey.id, to: machineNode.id, arrows:'middle', type: EDGE_TYPE_SCAN, color: 'red'}); + } + } + }); + } +} + /** * Builds node description */ @@ -486,6 +545,29 @@ function getMonkeyByGuid(guid) { } } +function getMonkeyByIP(ip) { + for (var i = 0; i < monkeys.length; i++) { + var monkey = monkeys[i]; + for (var j = 0; j< monkey.ip_addresses; j++) { + if (monkeys[i].ip == ip) { + return monkeys[i]; + } + } + } + return null; +} + +function getScannedByIP(ip) +{ + for (var i = 0; i < scannedMachines.length; i++) { + var machine = scannedMachines[i]; + if (machine.id == ip) { + return machine + } + } + return null; +} + function getMonkeyIndex(guid) { for (var i = 0; i < monkeys.length; i++) { if (monkeys[i].guid == guid) {