Skip to content

Instantly share code, notes, and snippets.

@perfecto25
Last active March 29, 2017 13:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save perfecto25/71c50288150180911ecc6cd7f355969e to your computer and use it in GitHub Desktop.
Save perfecto25/71c50288150180911ecc6cd7f355969e to your computer and use it in GitHub Desktop.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
This script downloads scan reports from Nessus as .csv files
'''
import requests, json, sys, os, csv, time
# disable SSL warnings
requests.packages.urllib3.disable_warnings()
# set params
export_format = 'csv'
scan_name = 'Name of Scan You Want to Download'
url = 'https://your_nessus_scanner:8834'
verify = False
token = ''
username = 'user'
password = 'pw'
def build_url(resource):
return '{0}{1}'.format(url, resource)
def connect(method, resource, data=None):
headers = {'X-Cookie': 'token={0}'.format(token), 'content-type': 'application/json'}
data = json.dumps(data)
if method == 'POST':
r = requests.post(build_url(resource), data=data, headers=headers, verify=False)
elif method == 'PUT':
r = requests.put(build_url(resource), data=data, headers=headers, verify=False)
elif method == 'DELETE':
r = requests.delete(build_url(resource), data=data, headers=headers, verify=False)
return
else:
r = requests.get(build_url(resource), params=data, headers=headers, verify=False)
if r.status_code != 200:
e = r.json()
print e['error']
sys.exit()
if 'download' in resource:
return r.content
else:
return r.json()
def export_status(scan_id, file_id):
data = connect('GET', '/scans/{0}/export/{1}/status'.format(scan_id, file_id))
return data['status'] == 'ready'
# Login to Nessus
# ----------------------------------------------------------------------------
login = {'username': username, 'password': password}
data = connect('POST', '/session', data=login)
token = data['token']
# get Scan ID
# ----------------------------------------------------------------------------
data = connect('GET', '/scans')
for folder in data['folders']:
for scan in data['scans']:
if scan['name'] == scan_name:
scan_id = scan['id']
print scan_id
# get File ID
# ----------------------------------------------------------------------------
format = {'format': export_format}
data = connect('POST', '/scans/{0}/export'.format(scan_id), data=format)
file_id = data['file']
while export_status(scan_id, file_id) is False:
time.sleep(5)
print file_id
# Save scan file
# ----------------------------------------------------------------------------
save_path = os.path.join(os.getcwd()) + '/reports'
if not(os.path.exists(save_path)):
os.mkdir(save_path)
data = connect('GET', '/scans/{0}/export/{1}/download'.format(scan_id, file_id))
# format Scan Name
tmp_name = 'nessus_' + scan_name.replace(' ', '_').lower() + '.csv'
file_name = tmp_name.format(scan_name.encode('utf-8'), file_id, export_format)
print file_name
print('Saving scan results to {0}'.format(file_name))
with open(os.path.join(save_path,file_name), 'w') as f:
f.write(data)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment