2017-04-05 8 views
1

Ich bin sehr neu in Python-Programmierung und habe ein Problem beim Versuch, Code zu aktualisieren. Ich arbeite mit einer App, die Daten über eine API aus gespeicherten Daten eines Scans bezieht.AttributeError: 'Unicode' -Objekt hat kein Attribut 'Schlüssel'

hier ist der Code, wie es

def _collect_one_host_scan_info(self, host_id, sid, scan_info): 
    """ 
    The method to collect all the vulnerabilities of one host and generate the event data. 
    """ 
    count = 0 
    host_uri = self.endpoint + '/' + str(sid) + '/hosts/' + str(host_id) 
    result = self.client.request(host_uri).get("content") 
    # if there is exception in request, return None 
    if result is None: 
     _LOGGER.info("There is exception in request, return None") 
     return None 
    else: 
     host_info = result.get("info", {}) 
     host_end_time = host_info.get("host_end", "") 
     if self.ckpt.is_new_host_scan(host_end_time, 
             self.config.get("start_date")): 
      self.source = self.url + self.endpoint + '/' + str(
       sid) + '/hosts/' + str(host_id) 
      for vuln in result.get("vulnerabilities", []): 
       vuln["sid"] = sid 
       vuln["host_id"] = host_id 

       #get the port info 
       plugin_id = vuln.get("plugin_id", "") 
       port_info = [] 
       if plugin_id: 
        plugin_uri = "{}/plugins/{}".format(host_uri, 
                 plugin_id) 
        plugin_outputs = self.client.request(plugin_uri).get(
         "content", {}).get("outputs") 
        ports = [] 
        for output in plugin_outputs: 
         ports.extend(output.get("ports", {}).keys()) 
        for port in ports: 
         port_elem = {} 
         port_items = re.split(r"\s*/\s*", port) 
         port_elem["port"] = int(port_items[0]) 
         if port_items[1]: 
          port_elem["transport"] = port_items[1] 
         if port_items[2]: 
          port_elem["protocol"] = port_items[2] 
         port_info.append(port_elem) 

       vuln = dict(vuln, **scan_info) 
       vuln = dict(vuln, **host_info) 
       if port_info: 
        vuln["ports"] = port_info 
       entry = NessusObject(
        vuln.get("timestamp"), self.sourcetype, self.source, 
        vuln) 
       self._print_stream(entry) 
       count += 1 
    return count 

Die Daten arbeiten sitzt, die von wie folgt aussieht

"outputs": [ 
    { 
     "ports": { 
      "445/tcp/cifs": [ 
       { 
        "hostname": "computer.domain.com" 
       } 
      ] 
     }, 
     "has_attachment": 0, 
     "custom_description": null, 
     "plugin_output": "\nPath : c:\\program files (x86)\\folder\\bin\\fax.exe\nUsed by services : RFDB\nFile write allowed for groups : Domain Users\nFull control of directory allowed for groups : Domain Users\n\nPath : c:\\program files (x86)\\folder\\bin\\faxrpc.exe\nUsed by services : RFRPC\nFile write allowed for groups : Domain Users\nFull control of directory allowed for groups : Domain Users\n\nPath : c:\\program files (x86)\\folder\\bin\\faxserv.exe\nUsed by services : RFSERVER\nFile write allowed for groups : Domain Users\nFull control of directory allowed for groups : Domain Users\n`, 
     "hosts": null, 
     "severity": 3 
    } 

mit dem Arbeitscode die Rückkehr

ports{}.port 445 
ports{}.protocol tcp 
ports{}.transport cifs 

gezogen wird Was ich wirklich möchte, ist die "plugin_output" Daten mit den "Port" Daten

zu greifen

Ich versuche zur Zeit nur mit „plugin_output“ Daten

die „Port“ Daten zu ersetzen
#get the output info 
      plugin_id = vuln.get("plugin_id", "") 
      output_info = [] 
      if plugin_id: 
       plugin_uri = "{}/plugins/{}".format(host_uri, 
                plugin_id) 
       plugin_outputs = self.client.request(plugin_uri).get(
        "content", {}).get("outputs") 
       outputs = [] 
       for output in plugin_outputs: 
        outputs.extend(output.get("plugin_output", "").keys()) 
       for plugin in plugin_outputs: 
        plugin_elem = {} 
        plugin_items = re.split(r"nPath\s*", plugin) 
        plugin_elem["location1"] = plugin_items[0] 
        if plugin_items[1]: 
         plugin_elem["location2"] = plugin_items[1] 
        if plugin_items[2]: 
         plugin_elem["location3"] = plugin_items[2] 
        output_info.append(plugin_elem) 

      vuln = dict(vuln, **scan_info) 
      vuln = dict(vuln, **host_info) 
      if output_info: 
       vuln["plugin_output"] = output_info 
      entry = NessusObject(
       vuln.get("timestamp"), self.sourcetype, self.source, 
       vuln) 
      self._print_stream(entry) 
      count += 1 

was ich getan habe, wie Sie die „Ports“ Daten mit „plugin_output“ Daten, wenn nur sehen können, ersetzen und der Fehler empfangen ist AttributeError: 'Unicode' Objekt hat keinen Attributschlüssel

+0

Das JSON hat manchmal nicht das Feld "plugin_output". – grumpalot23

Antwort

0

Nun nach weiteren Bemühungen konnte ich herausfinden, was ich mit dem Code tun musste. Es war viel einfacher als ich dachte, aber wenn man eine neue Sprache lernt, ist es schwer sich vorzustellen, was gebraucht wird. Code unten veröffentlicht.

def _collect_one_host_scan_info(self, host_id, sid, scan_info): 
    """ 
    The method to collect all the vulnerabilities of one host and generate 
    the event data. 
    """ 
    count = 0 
    host_uri = self.endpoint + '/' + str(sid) + '/hosts/' + str(host_id) 
    result = self.client.request(host_uri).get("content") 
    # if there is exception in request, return None 
    if result is None: 
     _LOGGER.info("There is exception in request, return None") 
     return None 
    else: 
     host_info = result.get("info", {}) 
     host_end_time = host_info.get("host_end", "") 
     if self.ckpt.is_new_host_scan(host_end_time, 
             self.config.get("start_date")): 
      self.source = self.url + self.endpoint + '/' + str(
       sid) + '/hosts/' + str(host_id) 
      for vuln in result.get("vulnerabilities", []): 
       vuln["sid"] = sid 
       vuln["host_id"] = host_id 
       plugin_id = vuln.get("plugin_id", "") 

       # get plugin_output data 
       plugin_output_info = [] 
       if plugin_id: 
        plugin_uri = "{}/plugins/{}".format(host_uri, 
                 plugin_id) 
        plugin_outputs = self.client.request(plugin_uri).get(
         "content", {}).get("outputs", []) 
        data_output = [] 
        for output in plugin_outputs: 
         items = output.get("plugin_output", 'no value') 
         item = str(items) 
         #clean = re.sub('[^a-zA-Z0-9-()_*.(:\\)]', ' ', item) 
         plugin_output_info.append(item) 

       # get the port info   
       port_info = [] 
       if plugin_id: 
        plugin_uri = "{}/plugins/{}".format(host_uri, 
                 plugin_id) 
        plugin_outputs = self.client.request(plugin_uri).get(
         "content", {}).get("outputs", []) 
        ports = [] 
        for output in plugin_outputs: 
         ports.extend(output.get("ports", {}).keys()) 
        for port in ports: 
         port_elem = {} 
         port_items = re.split(r"\s*/\s*", port) 
         port_elem["port"] = int(port_items[0]) 
         if port_items[1]: 
          port_elem["transport"] = port_items[1] 
         if port_items[2]: 
          port_elem["protocol"] = port_items[2] 
         port_info.append(port_elem) 

       vuln = dict(vuln, **scan_info) 
       vuln = dict(vuln, **host_info) 
       if port_info: 
        vuln["ports"] = port_info 
       if plugin_output_info: 
        vuln["plugin_output"] = plugin_output_info 
       entry = NessusObject(
        vuln.get("timestamp"), self.sourcetype, self.source, 
        vuln) 
       self._print_stream(entry) 
       count += 1 
    return count 
Verwandte Themen