nmap-to-json.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #!/usr/bin/python3
  2. import json
  3. import sys
  4. class Port:
  5. port = 0
  6. state = ""
  7. alias = ""
  8. version = ""
  9. protocol = ""
  10. def __str__(self):
  11. return f"Port {self.port} - Version: {self.version}"
  12. def todict(self):
  13. return {
  14. "port":self.port,
  15. "alias":self.alias,
  16. "version":self.version,
  17. "protocol":self.protocol,
  18. }
  19. class Host:
  20. ip = ""
  21. hostname = ""
  22. ports = [] # Array of Port() items
  23. def __str__(self):
  24. return f"{self.ip} [{self.hostname}]"
  25. def todict(self):
  26. return {
  27. "ip":self.ip,
  28. "hostname":self.hostname,
  29. "ports":[port.todict() for port in self.ports]
  30. }
  31. def open_gnmap(filename):
  32. with open(filename, "r") as gnmap:
  33. lines = gnmap.read().strip().split("\n")
  34. lines = [l for l in lines if not l.startswith("#") and l.startswith("Host:")]
  35. return lines
  36. # parse the ports part
  37. def parse_ports(portline):
  38. portlist = portline.split("/,")
  39. outports = []
  40. for p in portlist:
  41. port = Port()
  42. portparts = p.split("/")
  43. port.port = portparts[0]
  44. port.state = portparts[1]
  45. port.protocol = portparts[2]
  46. port.alias = portparts[4]
  47. port.version = portparts[6]
  48. # only add 'open' ports to the list
  49. #if port.state == "open":
  50. outports.append(port)
  51. return outports
  52. # list for all hosts
  53. all_hosts = []
  54. unique = []
  55. def parse_line(line):
  56. host = Host()
  57. line = line.strip().replace(" ", ";").replace("\t", ";").replace(" ", "")
  58. # split line by space for parts
  59. parts = line.split(";")
  60. # remove the line with the status
  61. if parts[3] == "Status:":
  62. return
  63. # dont parse hosts twice
  64. ip = parts[1]
  65. if ip in unique:
  66. return
  67. # get hostname and remove brackets
  68. hostname = parts[2] if parts[2] != "()" else ""
  69. hostname = hostname.replace("(", "").replace(")", "")
  70. ports = "".join(parts[4:])
  71. portlist = parse_ports(ports)
  72. # set needed properties
  73. host.ip = ip
  74. host.hostname = hostname
  75. host.ports = portlist
  76. unique.append(ip)
  77. # return the crafted host
  78. return host
  79. # check usage
  80. if len(sys.argv) == 1:
  81. print(f"usage: {sys.argv[0]} <scan.gnmap>")
  82. exit(1)
  83. # open gnmap file
  84. lines = open_gnmap(sys.argv[1])
  85. # parse file
  86. for line in lines:
  87. outhost = parse_line(line)
  88. if outhost != None:
  89. all_hosts.append(outhost.todict())
  90. # dump as json
  91. print(json.dumps(all_hosts))