From 02e27eabbdfa2b901b5a8cf5d9cefe45f8eeb3e1 Mon Sep 17 00:00:00 2001
From: qweqweasdasd <qweqweasdasd@infn.it>
Date: Tue, 26 Jul 2022 13:00:26 +0200
Subject: [PATCH] Minor Bug fixes

---
 utils/script.py | 115 ++++++++++++++++++++++++++----------------------
 1 file changed, 63 insertions(+), 52 deletions(-)

diff --git a/utils/script.py b/utils/script.py
index d7f7b6b..3e3d9e6 100644
--- a/utils/script.py
+++ b/utils/script.py
@@ -2,17 +2,16 @@
 #auth_name = 'backbone'
 #auth_passwd = 'krowfodwas3olrab'
 
-from hashlib import new
 from gvm.connections import TLSConnection
 from gvm.protocols.gmpv208 import Gmp, AliveTest 
 from gvm.transforms import EtreeTransform
 from gvm.xml import pretty_print
 from time import time, sleep
 import logging
-from datetime import datetime
 import json
 import base64
 from sys import argv, exit
+import socket
 
 def get_version():
 	with Gmp(connection, transform=transform) as gmp:
@@ -71,7 +70,7 @@ def get_or_create_port_list(port_list_name, ports):
 
 ############## TARGET  ##################################
 
-def create_target(name,ip,port_list,ovs_ssh_credential_id):
+def create_target(name,ip,port_list,ovs_ssh_credential):
     o = dict()
     with Gmp(connection, transform=transform) as gmp:
         gmp.authenticate(auth_name, auth_passwd)
@@ -80,7 +79,7 @@ def create_target(name,ip,port_list,ovs_ssh_credential_id):
                 comment = "",
                 hosts=[ip],
                 port_list_id = port_list['id'],
-                ssh_credential_id = ovs_ssh_credential_id,
+                ssh_credential_id = ovs_ssh_credential['id'],
                 alive_test=AliveTest('Consider Alive'))
         status = res.xpath('@status')[0]
         status_text = res.xpath('@status_text')[0]
@@ -116,10 +115,10 @@ def delete_target(target):
         else:
             print(f"ERROR {status}: {status_text}")
 
-def get_or_create_target(target_name,ip,port_list,ovs_ssh_credential_id):
+def get_or_create_target(target_name,ip,port_list,ovs_ssh_credential):
     res = get_targets(target_name)
     if len(res) == 0:
-        t = create_target(target_name,ip,port_list,ovs_ssh_credential_id)
+        t = create_target(target_name,ip,port_list,ovs_ssh_credential)
         return get_targets(t['id'])[0]
     elif len(res) == 1:
         return res[0]
@@ -141,15 +140,15 @@ def search_and_delete_all_targets(target_name):
 
 ############## TASK ##################################
 
-def create_task(name, config_id, target_id, scanner_id):
+def create_task(name, config, target, scanner):
     o = dict()
     with Gmp(connection, transform=transform) as gmp:
         gmp.authenticate(auth_name, auth_passwd)
         res = gmp.create_task(
                 name=name,
-                config_id=config_id,
-                target_id=target_id,
-                scanner_id=scanner_id)
+                config_id=config['id'],
+                target_id=target['id'],
+                scanner_id=scanner['id'])
         status = res.xpath('@status')[0]
         status_text = res.xpath('@status_text')[0]
         if status == "201":
@@ -179,10 +178,10 @@ def get_tasks(filter_str):
                 res.append(o)
     return res
 
-def get_or_create_task(task_name, config_id, target_id, scanner_id):
+def get_or_create_task(task_name, config, target, scanner):
     res = get_tasks(task_name)
     if len(res) == 0:
-        t = create_task(task_name, config_id, target_id, scanner_id)
+        t = create_task(task_name, config, target, scanner)
         return get_tasks(t['id'])[0]
     elif len(res) == 1:
         return res[0]
@@ -240,6 +239,14 @@ def delete_task(task):
 
 ############## REPORTS #####################################3
 
+class report_formats:
+    anonymous_xml = "5057e5cc-b825-11e4-9d0e-28d24461215b"
+    csv_results   = "c1645568-627a-11e3-a660-406186ea4fc5"
+    itg           = "77bd6c4a-1f62-11e1-abf0-406186ea4fc5"
+    pdf           = "c402cc3e-b531-11e1-9163-406186ea4fc5"
+    txt           = "a3810a62-1f62-11e1-9219-406186ea4fc5"
+    xml           = "a994b278-1f62-11e1-96ac-406186ea4fc5"
+
 def get_report_formats():
     # |------------- ID -----------------| |--- NAME ---|
     # 5057e5cc-b825-11e4-9d0e-28d24461215b Anonymous XML
@@ -297,7 +304,7 @@ def save_severity_report(task, severity_filename):
     with Gmp(connection, transform=transform) as gmp:
         gmp.authenticate(auth_name, auth_passwd)
         res = gmp.get_report(task['report_id'],
-                            report_format_id="5057e5cc-b825-11e4-9d0e-28d24461215b", 
+                            report_format_id=report_formats.anonymous_xml, 
                             ignore_pagination=True,
                             details="1")
         severities = res.xpath('report/report/ports/port/threat/text()')
@@ -315,7 +322,7 @@ def get_severity(task):
     with Gmp(connection, transform=transform) as gmp:
         gmp.authenticate(auth_name, auth_passwd)
         res = gmp.get_report(task['report_id'],
-                            report_format_id="5057e5cc-b825-11e4-9d0e-28d24461215b", 
+                            report_format_id=report_formats.anonymous_xml, 
                             ignore_pagination=True,
                             details="1")
         severities = res.xpath('report/report/ports/port/threat/text()')
@@ -339,8 +346,7 @@ def get_reports(filter_str="rows=-1"):
             lo.append(o)
         return lo
 
-def print_pretty_json(j):
-    print(json.dumps(j,sort_keys=True,indent=4))
+
 
 def get_numeric_severity(severity):
     if severity == "Log":
@@ -378,50 +384,55 @@ def process_global_severity(severities):
     else:
         severities['global'] = "NOK"
     return severities
-    
-    
+
+def print_pretty_json(j):
+    print(json.dumps(j,sort_keys=True,indent=4))
+        
+def import_dep_info(file_path, endpoints_to_scan):
+    with open(file_path) as f:
+        data = json.load(f)
+
+    endpoints = dict()
+    for key in data['outputs'].keys():
+        if key in endpoints_to_scan:
+            endpoint = str(data['outputs'][key]).split("/")[2]
+            print("endpoint",endpoint)
+            host,port = endpoint.split(':')
+            if host not in endpoints:
+                endpoints[host] = {"22"}
+            endpoints[host].add(port)
+    return endpoints
+                
 ################ MAIN #######################################
 
 auth_name = "jenkins"
 auth_passwd = "bleyrauvHecsUbDy"
 logging.basicConfig(filename='debug.log', level=logging.DEBUG)
-connection = TLSConnection(hostname='172.17.0.2')
+local_ip = socket.gethostbyname(socket.gethostname())
+connection = TLSConnection(hostname=local_ip)
 transform = EtreeTransform()
-config_id = "9866edc1-8869-4e80-acac-d15d5647b4d9"
-scanner_id = "08b69003-5fc2-4037-a479-93b440211c73"
-ovs_ssh_credential_id = "a89d5ebf-01bf-4836-ae72-a65bc633219a"
-txt_report_format_id = "a3810a62-1f62-11e1-9219-406186ea4fc5"
-csv_report_format_id = "c1645568-627a-11e3-a660-406186ea4fc5"
-xml_report_format_id = "5057e5cc-b825-11e4-9d0e-28d24461215b"
+config = {'id':"9866edc1-8869-4e80-acac-d15d5647b4d9"}
+scanner = {'id': "08b69003-5fc2-4037-a479-93b440211c73"}
+ovs_ssh_credential = {'id': "a89d5ebf-01bf-4836-ae72-a65bc633219a"}
 wait_timeout = 3600 #1h
-print("len_argv:",len(argv))
-for i in range(len(argv)):
-    print(i,argv[i])
-  
-endpoints = argv[1].split(',')
+
+if len(argv) != 4:
+    print("Please pass three parameters:")
+    print("- endpoints to scans [endpoints1,endpoint2,endpoint3,...]")
+    print("- dep.json path [/home/gmp/workspace/dep.json]")
+    print("- output directory [/home/gmp/workspace]")
+    exit(1)
+
+endpoints_to_scan = argv[1].split(',')
 dep_json = argv[2]
 output_dir = argv[3]
-
-print("endpoints", endpoints)
+print("endpoints_to_scan", endpoints_to_scan)
 print("dep_json", dep_json)
 print("output_dir", output_dir)
 
-with open(dep_json) as f:
-    data = json.load(f)
-
-endpoints = dict()
-for key in data['outputs'].keys():
-    if "endpoint" in key:
-        endpoint = str(data['outputs'][key]).split("://")[1]
-        print("endpoint",endpoint)
-        host,port = endpoint.split(':')
-        if host not in endpoints:
-            endpoints[host] = ["22"]
-        endpoints[host].append(port)
-
-print(json.dumps(endpoints,sort_keys=True,indent=4))      
+endpoints = import_dep_info(dep_json, endpoints_to_scan)
+print_pretty_json(endpoints)      
 severities = dict()
-
 for host,ports in endpoints.items():
     print(host,ports)
   
@@ -431,16 +442,16 @@ for host,ports in endpoints.items():
     report_filename = f"{output_dir}/{host}-report.txt"
     severity_filename = f"{output_dir}/severity.json"
 
-    pl = get_or_create_port_list(port_list_name,ports)
-    print_pretty_json(pl)
-    target = get_or_create_target(target_name,host,pl,ovs_ssh_credential_id)
+    port_list = get_or_create_port_list(port_list_name,ports)
+    print_pretty_json(port_list)
+    target = get_or_create_target(target_name,host,port_list,ovs_ssh_credential)
     print_pretty_json(target)
-    task = get_or_create_task(task_name, config_id, target['id'],scanner_id)
+    task = get_or_create_task(task_name, config, target,scanner)
     print_pretty_json(task)
     if task['status'] == 'New':
         task = start_task(task)
     if wait_for_task_completition(task,wait_timeout):
-        save_report(task,txt_report_format_id, report_filename)
+        save_report(task,report_formats.txt, report_filename)
         severities[host] = get_severity(task)
     else:
         severities[host] = f"ERROR Task: {task['id']}"
-- 
GitLab