nmap-get.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. #!/usr/bin/python
  2. import sys
  3. import json
  4. from rich.console import Console
  5. from rich.table import Table
  6. import argparse
  7. import re
  8. # Setup Table
  9. console = Console()
  10. table = Table(show_header=True, header_style="bold blue")
  11. table.add_column("IP", style="dim")
  12. table.add_column("Host")
  13. table.add_column("Port")
  14. table.add_column("Service")
  15. table.add_column("Version", justify="left")
  16. def pprint_table(hostlist, iponly):
  17. global table
  18. for host in hostlist:
  19. for port in host["ports"]:
  20. if iponly:
  21. print(host["ip"])
  22. else:
  23. table.add_row(
  24. host["ip"],
  25. host["hostname"],
  26. str(port["port_number"]),
  27. port["service"],
  28. port["version"]
  29. )
  30. if not iponly and table.row_count > 0:
  31. console.print(table)
  32. def filter_by_port(port):
  33. global hosts
  34. out = []
  35. ports = []
  36. for host in hosts:
  37. for p in host["ports"]:
  38. if port == str(p["port_number"]) and p["state"] == "open":
  39. ports.append(p)
  40. host["ports"] = ports
  41. ports = []
  42. out.append(host)
  43. return out
  44. def filter_by_service(service):
  45. global hosts
  46. out = []
  47. ports = []
  48. for host in hosts:
  49. for p in host["ports"]:
  50. if service.lower() in p["service"].lower():
  51. ports.append(p)
  52. host["ports"] = ports
  53. ports = []
  54. out.append(host)
  55. return out
  56. def filter_by_version(version):
  57. global hosts
  58. # Support regular expressions for version matching
  59. recomp = re.compile(version)
  60. out = []
  61. ports = []
  62. for host in hosts:
  63. for p in host["ports"]:
  64. if len(recomp.findall(p["version"])) > 0:
  65. ports.append(p)
  66. host["ports"] = ports
  67. ports = []
  68. out.append(host)
  69. return out
  70. # Setup Argument Parser
  71. parser = argparse.ArgumentParser(description='Filtering nmap')
  72. parser.add_argument('file', action='store', nargs='?',
  73. help='Input File')
  74. parser.add_argument('--port', dest='port', action='store',
  75. help='Filter by port number')
  76. parser.add_argument('--version', dest='version', action='store',
  77. help='Filter by version string')
  78. parser.add_argument('--service', dest='service', action='store',
  79. help='Filter by service')
  80. parser.add_argument('--ip-only', '-i', dest='ip', action='store_true',
  81. help='Only print the ips')
  82. args = parser.parse_args()
  83. if args.file:
  84. with open(args.file, "r") as inp_file:
  85. hosts = json.loads(inp_file.read())
  86. else:
  87. hosts = json.loads(sys.stdin.read())
  88. if args.port:
  89. pprint_table(filter_by_port(args.port), args.ip)
  90. elif args.version:
  91. pprint_table(filter_by_version(args.version), args.ip)
  92. elif args.service:
  93. pprint_table(filter_by_service(args.service), args.ip)
  94. else:
  95. pprint_table(hosts, args.ip)