42 lines
1.4 KiB
Python
42 lines
1.4 KiB
Python
import xmltodict
|
|
|
|
# Ideally i'd like to be able to pull this info out dynamically from each protocol object but i'm a lazy bastard
|
|
protocol_dict = {
|
|
'smb': {'ports': [445, 139], 'services': ['smb', 'cifs']},
|
|
'mssql': {'ports': [1433], 'services': ['mssql']},
|
|
'ssh': {'ports': [22], 'services': ['ssh']},
|
|
'winrm': {'ports': [5986, 5985], 'services': ['www', 'https?']},
|
|
'http': {'ports': [80, 443, 8443, 8008, 8080, 8081], 'services': ['www', 'https?']}
|
|
}
|
|
|
|
|
|
def parse_nessus_file(nessus_file, protocol):
|
|
targets = []
|
|
|
|
def handle_nessus_file(path, item):
|
|
# Must return True otherwise xmltodict will throw a ParsingIterrupted() exception
|
|
# https://github.com/martinblech/xmltodict/blob/master/xmltodict.py#L219
|
|
|
|
if any('ReportHost' and 'ReportItem' in values for values in path):
|
|
item = dict(path)
|
|
ip = item['ReportHost']['name']
|
|
if ip in targets:
|
|
return True
|
|
|
|
port = item['ReportItem']['port']
|
|
svc_name = item['ReportItem']['svc_name']
|
|
|
|
if port in protocol_dict[protocol]['ports']:
|
|
targets.append(ip)
|
|
if svc_name in protocol_dict[protocol]['services']:
|
|
targets.append(ip)
|
|
|
|
return True
|
|
else:
|
|
return True
|
|
|
|
with open(nessus_file, 'r') as file_handle:
|
|
xmltodict.parse(file_handle, item_depth=4, item_callback=handle_nessus_file)
|
|
|
|
return targets
|