mirror of https://github.com/MISP/misp-modules
				
				
				
			
		
			
				
	
	
		
			99 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			99 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Python
		
	
	
"""vt_graph_parser.importers.base.
 | 
						|
 | 
						|
This module provides a common method to import graph from misp attributes.
 | 
						|
"""
 | 
						|
 | 
						|
 | 
						|
import vt_graph_api
 | 
						|
from vt_graph_parser.helpers.rules import MispEventInitialRule
 | 
						|
 | 
						|
 | 
						|
def import_misp_graph(
 | 
						|
        misp_attributes, graph_id, vt_api_key, fetch_information, name,
 | 
						|
        private, fetch_vt_enterprise, user_editors, user_viewers, group_editors,
 | 
						|
        group_viewers, use_vt_to_connect_the_graph, max_api_quotas,
 | 
						|
        max_search_depth):
 | 
						|
    """Import VirusTotal Graph from MISP.
 | 
						|
 | 
						|
    Args:
 | 
						|
      misp_attributes  ([MispAttribute]): list with the MISP attributes which
 | 
						|
        will be added to the returned graph.
 | 
						|
      graph_id: if supplied, the graph will be loaded instead of compute it again.
 | 
						|
      vt_api_key (str): VT API Key.
 | 
						|
      fetch_information (bool): whether the script will fetch
 | 
						|
        information for added nodes in VT. Defaults to True.
 | 
						|
      name (str): graph title. Defaults to "".
 | 
						|
      private (bool): True for private graphs. You need to have
 | 
						|
        Private Graph premium features enabled in your subscription. Defaults
 | 
						|
        to False.
 | 
						|
      fetch_vt_enterprise (bool, optional): if True, the graph will search any
 | 
						|
        available information using VirusTotal Intelligence for the node if there
 | 
						|
        is no normal information for it. Defaults to False.
 | 
						|
      user_editors ([str]): usernames that can edit the graph.
 | 
						|
        Defaults to None.
 | 
						|
      user_viewers ([str]): usernames that can view the graph.
 | 
						|
        Defaults to None.
 | 
						|
      group_editors ([str]): groups that can edit the graph.
 | 
						|
        Defaults to None.
 | 
						|
      group_viewers ([str]): groups that can view the graph.
 | 
						|
        Defaults to None.
 | 
						|
      use_vt_to_connect_the_graph (bool): if True, graph nodes will
 | 
						|
        be linked using VirusTotal API. Otherwise, the links will be generated
 | 
						|
        using production rules based on MISP attributes order. Defaults to
 | 
						|
        False.
 | 
						|
      max_api_quotas (int): maximum number of api quotas that could
 | 
						|
        be consumed to resolve graph using VirusTotal API. Defaults to 20000.
 | 
						|
      max_search_depth (int, optional): max search depth to explore
 | 
						|
        relationship between nodes when use_vt_to_connect_the_graph is True.
 | 
						|
        Defaults to 3.
 | 
						|
 | 
						|
    If use_vt_to_connect_the_graph is True, it will take some time to compute
 | 
						|
    graph.
 | 
						|
 | 
						|
    Returns:
 | 
						|
      vt_graph_api.graph.VTGraph: the imported graph.
 | 
						|
    """
 | 
						|
 | 
						|
    rule = MispEventInitialRule()
 | 
						|
 | 
						|
    # Check if the event has been already computed in VirusTotal Graph. Otherwise
 | 
						|
    # a new graph will be created.
 | 
						|
    if not graph_id:
 | 
						|
        graph = vt_graph_api.VTGraph(
 | 
						|
            api_key=vt_api_key, name=name, private=private,
 | 
						|
            user_editors=user_editors, user_viewers=user_viewers,
 | 
						|
            group_editors=group_editors, group_viewers=group_viewers)
 | 
						|
    else:
 | 
						|
        graph = vt_graph_api.VTGraph.load_graph(graph_id, vt_api_key)
 | 
						|
 | 
						|
    attributes_to_add = [attr for attr in misp_attributes
 | 
						|
                         if not graph.has_node(attr.value)]
 | 
						|
 | 
						|
    total_expandable_attrs = max(sum(
 | 
						|
        1 for attr in attributes_to_add
 | 
						|
        if attr.type in vt_graph_api.Node.SUPPORTED_NODE_TYPES),
 | 
						|
        1)
 | 
						|
 | 
						|
    max_quotas_per_search = max(
 | 
						|
        int(max_api_quotas / total_expandable_attrs), 1)
 | 
						|
 | 
						|
    previous_node_id = ""
 | 
						|
    for attr in attributes_to_add:
 | 
						|
        # Add the current attr as node to the graph.
 | 
						|
        added_node = graph.add_node(
 | 
						|
            attr.value, attr.type, fetch_information, fetch_vt_enterprise,
 | 
						|
            attr.label)
 | 
						|
        # If use_vt_to_connect_the_grap is True the nodes will be connected using
 | 
						|
        # VT API.
 | 
						|
        if use_vt_to_connect_the_graph:
 | 
						|
            if (attr.type not in vt_graph_api.Node.SUPPORTED_NODE_TYPES and previous_node_id):
 | 
						|
                graph.add_link(previous_node_id, attr.value, "manual")
 | 
						|
            else:
 | 
						|
                graph.connect_with_graph(
 | 
						|
                    attr.value, max_quotas_per_search, max_search_depth,
 | 
						|
                    fetch_info_collected_nodes=fetch_information)
 | 
						|
        else:
 | 
						|
            rule = rule.resolve_relation(graph, added_node, attr.category)
 | 
						|
 | 
						|
    return graph
 |