Skip to content
Snippets Groups Projects
scan.py 4.98 KiB
Newer Older
  • Learn to ignore specific revisions
  • #!/usr/bin/env python3
    
    import logging
    import json
    import os
    
    Gioacchino Vino's avatar
    Gioacchino Vino committed
    from gvm_library import GVMClient, ReportFormats, GvmException
    
    Gioacchino Vino's avatar
    Gioacchino Vino committed
    from gvm_library import PortList, Task, Target
    
    Gioacchino Vino's avatar
    Gioacchino Vino committed
    from gvm_library import ReportManager
    from utilities import import_dep_info
    
    import argparse
    
    ### GVM Options ###
    
    WAIT_TIMEOUT = 7200 #2h
    
    Gioacchino Vino's avatar
    Gioacchino Vino committed
    ## TEMPLATE CONSTANTs ###
    OS_DISTR = "os_distribution"
    OS_VERS = "os_version"
    
    ## FILENAMES
    SUMMARY_FILENAME = "summary-report.json"
    OIDS_FILENAME = "oids.yaml"
    LOG_FILENAME = "log_scan.log"
    
    
    
    
    parser = argparse.ArgumentParser(
        description='Scan endpoints and machines')
                
    parser.add_argument(
        "--endpoint-keys",
    
        help="Orchestrator output endpoints to scan (endpoints1,endpoints2)",
        default="None"
    
        )
    parser.add_argument(
        "--dep-json", 
        default="./dep.json"
        )
    
    
    parser.add_argument(
        "--template-url", 
        default="None"
        )
    
    
    Gioacchino Vino's avatar
    Gioacchino Vino committed
    parser.add_argument(
        "--template-input",
        default="None"
        )
    
    
    parser.add_argument(
        "--output-dir", 
        default="."
        )
    
    args = parser.parse_args()
    
    logging.basicConfig(
    
    Gioacchino Vino's avatar
    Gioacchino Vino committed
        filename = LOG_FILENAME,
        level = logging.DEBUG,
        format = '%(asctime)s %(levelname)-8s %(message)s',
        datefmt = '%Y-%m-%d %H:%M:%S',
        filemode = 'w')
    
    logging.info("\n\nStart scan application")
    
    if os.environ.get('GMP_USER') is not None and \
            os.environ.get('GMP_USER') != '':
        auth_name = os.getenv('GMP_USER')
    else:
        logging.error("GMP_USER env var is not defined\nexit")
    
        raise GvmException("GMP_USER env var is not defined")
    
    
    if os.environ.get('GMP_PASSWORD') is not None and \
            os.environ.get('GMP_PASSWORD') != '':
        auth_passwd = os.getenv('GMP_PASSWORD')
    else:
        logging.error("GMP_PASSWORD env var is not defined\nexit")
    
        raise GvmException("GMP_PASSWORD env var is not defined")
    
    Gioacchino Vino's avatar
    Gioacchino Vino committed
    # Import passed parameters
    
    dep_json = args.dep_json
    
    template_url = args.template_url
    
    Gioacchino Vino's avatar
    Gioacchino Vino committed
    template_input = args.template_input
    
    output_dir = args.output_dir
    
    dep_name = (template_url.split('/')[-1]).split('.')[0]
    
    Gioacchino Vino's avatar
    Gioacchino Vino committed
    summary_filename = os.path.join(output_dir, SUMMARY_FILENAME)
    oids_filename = os.path.join(output_dir, OIDS_FILENAME)
    
    # Log imported parameters
    
    logging.info(f"endpoint_keys: {args.endpoint_keys}")
    logging.info(f"dep_json: {dep_json}")
    
    logging.info(f"template_url: {template_url}")
    logging.info(f"dep_name: {dep_name}")
    
    logging.info(f"output_dir: {output_dir}")
    
    
    Gioacchino Vino's avatar
    Gioacchino Vino committed
    d_input = json.loads(template_input)
    os_name = None
    if OS_DISTR in d_input and OS_VERS in d_input:
        os_name = f"{d_input[OS_DISTR]}{d_input[OS_VERS]}"
    logging.info(f"os_name: {os_name}")
    
    # Check if this script will scans an operating system
    is_os: bool = "single_vm" in dep_name and os_name is not None
    logging.info(f"is_os: {is_os}")
    
    Gioacchino Vino's avatar
    Gioacchino Vino committed
    endpoints = import_dep_info(dep_json, args.endpoint_keys)
    
    logging.info(f"endpoints: {endpoints}")
    
    
    # Create GVM client
    
    Gioacchino Vino's avatar
    Gioacchino Vino committed
    gvm = GVMClient(auth_n = auth_name, auth_p = auth_passwd)
    
    
    # Print GVM library version
    
    Gioacchino Vino's avatar
    Gioacchino Vino committed
    logging.info(f"gvm version: {gvm.get_version()}")
    
    Gioacchino Vino's avatar
    Gioacchino Vino committed
    # Retrieve os related issues
    report_manager = ReportManager(os_name, is_os)
    
    Gioacchino Vino's avatar
    Gioacchino Vino committed
    # init variables
    
    tasks = list()
    targets = list()
    port_lists = list()
    
    reports = dict()
    
    Gioacchino Vino's avatar
    Gioacchino Vino committed
    oids = dict()
    
    for host,ports in endpoints.items():
        logging.info(f"endpoint: {host}:{ports}")
        
    
        target_name = f"{auth_name}_target_{dep_name}_{host}"
        task_name = f"{auth_name}_task_{dep_name}_{host}"
        port_list_name = f"{auth_name}_pl_{dep_name}_{host}"
    
        report_filename = f"{output_dir}/{host}-report"
    
    Gioacchino Vino's avatar
    Gioacchino Vino committed
        # Create PortList obj related to endpoint
    
    Gioacchino Vino's avatar
    Gioacchino Vino committed
        port_list = PortList(client = gvm.client, 
    
    Gioacchino Vino's avatar
    Gioacchino Vino committed
                             name = port_list_name, 
                             ports = ports)
    
        logging.info(f"Port list:\n {port_list}")
    
    Gioacchino Vino's avatar
    Gioacchino Vino committed
        # Create Target obj related to endpoint
    
    Gioacchino Vino's avatar
    Gioacchino Vino committed
        target = Target(client = gvm.client,
    
    Gioacchino Vino's avatar
    Gioacchino Vino committed
                        name = target_name, 
                        host = host, 
    
    Gioacchino Vino's avatar
    Gioacchino Vino committed
                        port_list = port_list)
    
        logging.info(f"Target:\n {target}")
    
    Gioacchino Vino's avatar
    Gioacchino Vino committed
        task = Task(client = gvm.client,
    
    Gioacchino Vino's avatar
    Gioacchino Vino committed
                    name = task_name,
                    target = target)
    
        logging.info(f"Task:\n {task}")
    
    
        tasks.append(task)
        targets.append(target)
        port_lists.append(port_list)
    
        if task.status == 'New':
            task.start()
        if task.wait(WAIT_TIMEOUT):
            task.save_report(format = ReportFormats.pdf, 
                             filename = f"{report_filename}.pdf")
            task.save_report(format = ReportFormats.txt, 
                             filename = f"{report_filename}.txt")
    
    Gioacchino Vino's avatar
    Gioacchino Vino committed
            report_manager.import_report(host,task.get_report())
    
    Gioacchino Vino's avatar
    Gioacchino Vino committed
            task_report = {"severity": ReportManager.MAX_SEVERITY, 
                           "threat": f"Scan Error. task.id: {task.id}"}
            report_manager.import_report(host,task_report)
    
    Gioacchino Vino's avatar
    Gioacchino Vino committed
        task.delete()
        target.delete()
        port_list.delete()
    
    
    Gioacchino Vino's avatar
    Gioacchino Vino committed
    report_manager.classify_reports()
    logging.info("Reports")
    logging.info(report_manager.get_summary())
    logging.info("Classified oids")
    logging.info(report_manager.get_classified_oids())
    
    Gioacchino Vino's avatar
    Gioacchino Vino committed
    # Write reports on file
    report_manager.write_data(summary_filename,
                              oids_filename)