def _parse_xml_host(cls, scanhost_data): """ Protected method parsing a portion of a nmap scan result. Receives a <host> XML tag representing a scanned host with its services. :param scaninfo_data: <host> XML tag from a nmap scan :type scaninfo_data: xml.ElementTree.Element or a string :return: NmapHost object """ xelement = cls.__format_element(scanhost_data) _host_header = cls.__format_attributes(xelement) _hostnames = [] _services = [] _status = {} _addresses = [] _host_extras = {} _traceroute = {} extra_tags = [ 'uptime', 'distance', 'tcpsequence', 'ipidsequence', 'tcptssequence', 'times' ] for xh in xelement: if xh.tag == 'hostnames': for hostname in cls.__parse_hostnames(xh): _hostnames.append(hostname) elif xh.tag == 'ports': ports_dict = cls._parse_xml_ports(xh) for port in ports_dict['ports']: _services.append(port) _host_extras['extraports'] = ports_dict['extraports'] elif xh.tag == 'status': _status = cls.__format_attributes(xh) elif xh.tag == 'address': _addresses.append(cls.__format_attributes(xh)) elif xh.tag == 'os': _os_extra = cls.__parse_os_fingerprint(xh) _host_extras.update({'os': _os_extra}) elif xh.tag == 'hostscript': _host_scripts = cls.__parse_host_scripts(xh) _host_extras.update({'hostscript': _host_scripts}) elif xh.tag in extra_tags: _host_extras[xh.tag] = cls.__format_attributes(xh) elif xh.tag == 'trace': _traceroute = cls.__parse_traceroute(xh) # else: # print "struct host unknown attr: %s value: %s" % # (h.tag, h.get(h.tag)) _stime = '' _etime = '' if 'starttime' in _host_header: _stime = _host_header['starttime'] if 'endtime' in _host_header: _etime = _host_header['endtime'] nhost = NmapHost(_stime, _etime, _addresses, _status, _hostnames, _services, _traceroute, _host_extras) return nhost
def __parse_host(self, host: NmapHost): data = [] status_ports_map = { "open": [(p.port, p.protocol) for p in host.services if p.state == 'open'], "closed": [(p.port, p.protocol) for p in host.services if p.state == 'closed'], "filtered": [(p.port, p.protocol) for p in host.services if p.state == 'filtered'] } for status, ports in status_ports_map.items(): if self._pack_ports_separator: ports_tcp = [ str(port_spec[0]) for port_spec in ports if port_spec[1] == "tcp" ] if ports_tcp: data.append( np.array([ host.address, self._pack_ports_separator.join(ports_tcp), "tcp", status ])) ports_udp = [ str(port_spec[0]) for port_spec in ports if port_spec[1] == "udp" ] if ports_udp: data.append( np.array([ host.address, self._pack_ports_separator.join(ports_udp), "udp", status ])) else: for port_spec in ports: port = str(port_spec[0]) protocol = port_spec[1] if port and protocol: service = host.get_service(int(port), protocol=protocol) service_name = service.banner or service.service or "" data.append( np.array([ host.address, port, protocol, status, service_name ])) return data
def parse_fromdict(cls, rdict): """ Strange method which transforms a python dict \ representation of a NmapReport and turns it into an \ NmapReport object. \ Needs to be reviewed and possibly removed. :param rdict: python dict representation of an NmapReport :type rdict: dict :return: NmapReport """ nreport = {} if list(rdict.keys())[0] == "__NmapReport__": r = rdict["__NmapReport__"] nreport["_runstats"] = r["_runstats"] nreport["_scaninfo"] = r["_scaninfo"] nreport["_nmaprun"] = r["_nmaprun"] hlist = [] for h in r["_hosts"]: slist = [] for s in h["__NmapHost__"]["_services"]: cname = "__NmapService__" slist.append( NmapService( portid=s[cname]["_portid"], protocol=s[cname]["_protocol"], state=s[cname]["_state"], owner=s[cname]["_owner"], service=s[cname]["_service"], ) ) nh = NmapHost( starttime=h["__NmapHost__"]["_starttime"], endtime=h["__NmapHost__"]["_endtime"], address=h["__NmapHost__"]["_address"], status=h["__NmapHost__"]["_status"], hostnames=h["__NmapHost__"]["_hostnames"], extras=h["__NmapHost__"]["_extras"], services=slist, ) hlist.append(nh) nreport["_hosts"] = hlist nmapobj = NmapReport(nreport) return nmapobj
def parse_fromdict(cls, rdict): """ Strange method which transforms a python dict \ representation of a NmapReport and turns it into an \ NmapReport object. \ Needs to be reviewed and possibly removed. :param rdict: python dict representation of an NmapReport :type rdict: dict :return: NmapReport """ nreport = {} if list(rdict.keys())[0] == '__NmapReport__': r = rdict['__NmapReport__'] nreport['_runstats'] = r['_runstats'] nreport['_scaninfo'] = r['_scaninfo'] nreport['_nmaprun'] = r['_nmaprun'] hlist = [] for h in r['_hosts']: slist = [] for s in h['__NmapHost__']['_services']: cname = '__NmapService__' slist.append(NmapService(portid=s[cname]['_portid'], protocol=s[cname]['_protocol'], state=s[cname]['_state'], owner=s[cname]['_owner'], service=s[cname]['_service'], service_extras=s[cname]['_service_extras'])) nh = NmapHost(starttime=h['__NmapHost__']['_starttime'], endtime=h['__NmapHost__']['_endtime'], address=h['__NmapHost__']['_address'], status=h['__NmapHost__']['_status'], hostnames=h['__NmapHost__']['_hostnames'], extras=h['__NmapHost__']['_extras'], services=slist) hlist.append(nh) nreport['_hosts'] = hlist nmapobj = NmapReport(nreport) return nmapobj
def _parse_xml_host(cls, scanhost_data): """ Protected method parsing a portion of a nmap scan result. Receives a <host> XML tag representing a scanned host with its services. :param scaninfo_data: <host> XML tag from a nmap scan :type scaninfo_data: xml.ElementTree.Element or a string :return: NmapHost object """ xelement = cls.__format_element(scanhost_data) _host_header = cls.__format_attributes(xelement) _hostnames = [] _services = [] _status = {} _addresses = [] _host_extras = {} extra_tags = [ "uptime", "distance", "tcpsequence", "ipidsequence", "tcptssequence", "times", ] for xh in xelement: if xh.tag == "hostnames": for hostname in cls.__parse_hostnames(xh): _hostnames.append(hostname) elif xh.tag == "ports": ports_dict = cls._parse_xml_ports(xh) for port in ports_dict["ports"]: _services.append(port) _host_extras["extraports"] = ports_dict["extraports"] elif xh.tag == "status": _status = cls.__format_attributes(xh) elif xh.tag == "address": _addresses.append(cls.__format_attributes(xh)) elif xh.tag == "os": _os_extra = cls.__parse_os_fingerprint(xh) _host_extras.update({"os": _os_extra}) elif xh.tag == "hostscript": _host_scripts = cls.__parse_host_scripts(xh) _host_extras.update({"hostscript": _host_scripts}) elif xh.tag in extra_tags: _host_extras[xh.tag] = cls.__format_attributes(xh) # else: # print "struct host unknown attr: %s value: %s" % # (h.tag, h.get(h.tag)) _stime = _host_header.get("starttime", "") _etime = _host_header.get("endtime", "") nhost = NmapHost( _stime, _etime, _addresses, _status, _hostnames, _services, _host_extras, ) return nhost