Created
July 8, 2019 17:52
-
-
Save todmephis/5733f4b69159cf23bd5245096e1f1111 to your computer and use it in GitHub Desktop.
Script para obtener una lista de IP a partir del XML resultante de un escaneo con nmap. (-oX)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/local/bin/python | |
import xml.etree.ElementTree as etree | |
import sys | |
#Usage: getipfromxml.py <filename.xml> | |
def parse_xml(filename): | |
"""Given an XML filename, reads and parses the XML file and passes the | |
the root node of type xml.etree.ElementTree.Element to the get_host_data | |
function, which will futher parse the data and return a list of lists | |
containing the scan data for a host or hosts.""" | |
try: | |
tree = etree.parse(filename) | |
except Exception as error: | |
print("[-] A an error occurred. The XML may not be well formed. " | |
"Please review the error and try again: {}".format(error)) | |
exit() | |
root = tree.getroot() | |
scan_data = get_host_data(root) | |
return scan_data | |
def get_host_data(root): | |
"""Traverses the xml tree and build lists of scan information | |
and returns a list of lists. | |
""" | |
host_data = [] | |
hosts = root.findall('host') | |
for host in hosts: | |
addr_info = [] | |
# Ignore hosts that are not 'up' | |
if not host.findall('status')[0].attrib['state'] == 'up': | |
continue | |
# Get IP address and host info. If no hostname, then '' | |
ip_address = host.findall('address')[0].attrib['addr'] | |
host_name_element = host.findall('hostnames') | |
try: | |
host_name = host_name_element[0].findall('hostname')[0].attrib['name'] | |
except IndexError: | |
host_name = '' | |
# If we only want the IP addresses from the scan, stop here | |
if True: | |
addr_info.extend((ip_address, host_name)) | |
host_data.append(addr_info) | |
continue | |
# Get the OS information if available, else '' | |
try: | |
os_element = host.findall('os') | |
os_name = os_element[0].findall('osmatch')[0].attrib['name'] | |
except IndexError: | |
os_name = '' | |
return host_data | |
def list_ip_addresses(data): | |
"""Parses the input data to return only the IP address information""" | |
ip_list = [item[0] for item in data] | |
sorted_set = sorted(set(ip_list)) | |
addr_list = [ip for ip in sorted_set] | |
return addr_list | |
try: | |
file = open(sys.argv[1],"r") | |
except Exception as e: | |
print(e) | |
exit(-1 ) | |
data = parse_xml(file) | |
addrs = list_ip_addresses(data) | |
outfile = "{}.iplist".format(sys.argv[1]) | |
with open(outfile, "w") as f: | |
for addr in addrs: | |
f.write(addr) | |
f.write("\n") | |
print("[+]IP {} encontrada en {}".format(addr, sys.argv[1])) | |
f.close |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment