123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- import json
- import sys
- class Port:
- port = 0
- state = ""
- alias = ""
- version = ""
- protocol = ""
- def __str__(self):
- return f"Port {self.port} - Version: {self.version}"
- def todict(self):
- return {
- "port":self.port,
- "alias":self.alias,
- "version":self.version,
- "protocol":self.protocol,
- }
- class Host:
- ip = ""
- hostname = ""
- ports = []
- def __str__(self):
- return f"{self.ip} [{self.hostname}]"
- def todict(self):
- return {
- "ip":self.ip,
- "hostname":self.hostname,
- "ports":[port.todict() for port in self.ports]
- }
- def open_gnmap(filename):
- with open(filename, "r") as gnmap:
- lines = gnmap.read().strip().split("\n")
- lines = [l for l in lines if not l.startswith("#") and l.startswith("Host:")]
- return lines
- def parse_ports(portline):
- portlist = portline.split("/,")
- outports = []
- for p in portlist:
- port = Port()
- portparts = p.split("/")
- port.port = portparts[0]
- port.state = portparts[1]
- port.protocol = portparts[2]
- port.alias = portparts[4]
- port.version = portparts[6]
-
-
- outports.append(port)
- return outports
- all_hosts = []
- unique = []
- def parse_line(line):
- host = Host()
- line = line.strip().replace(" ", ";").replace("\t", ";").replace(" ", "")
-
- parts = line.split(";")
-
- if parts[3] == "Status:":
- return
-
- ip = parts[1]
- if ip in unique:
- return
-
- hostname = parts[2] if parts[2] != "()" else ""
- hostname = hostname.replace("(", "").replace(")", "")
- ports = "".join(parts[4:])
- portlist = parse_ports(ports)
-
- host.ip = ip
- host.hostname = hostname
- host.ports = portlist
- unique.append(ip)
-
- return host
- if len(sys.argv) == 1:
- print(f"usage: {sys.argv[0]} <scan.gnmap>")
- exit(1)
- lines = open_gnmap(sys.argv[1])
- for line in lines:
- outhost = parse_line(line)
- if outhost != None:
- all_hosts.append(outhost.todict())
- print(json.dumps(all_hosts))
|