|
@@ -0,0 +1,116 @@
|
|
|
+
|
|
|
+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))
|