· 4 years ago · Mar 04, 2021, 08:32 PM
1import shutil
2import glob
3import os
4import requests
5from requests.packages.urllib3.exceptions import InsecureRequestWarning
6import json
7import time
8
9## warning handle
10requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
11
12scanner_link=''
13api_key=""
14api_secret=""
15with open('api-keys', 'r') as f:
16 lines = f.readlines()
17 scanner_link = lines[2].split("=")[1]
18 api_key = lines[0].split("=")[1]
19 api_secret = lines[1].split("=")[1]
20
21
22
23#For Testing Use
24api_secret="c19947ba7e8c3cef31ec58078b6e78987edd90d4c4668e5117ab5c58e915b0ee"
25api_key="72e37af031f4d79dd25079e3c0752c231ffcb1305ec1c2d419d499193d82e0c9"
26
27class FileScanner:
28 def Api_Get_Connector(uri):
29 #Get Request To Api
30 try:
31
32 headers = {
33 'X-ApiKeys': 'accessKey=' + api_key + '; secretKey=' + api_secret,
34 }
35
36 response = requests.get(scanner_link+uri, headers=headers, verify=False)
37 data=json.loads(response.content)
38 return data
39
40 except Exception as err:
41 return {"Api Error": str(err)}
42
43
44 def Api_Post_Connector(uri, parameters):
45 #Post Request to Api
46 try:
47 headers = {
48 'X-ApiKeys': 'accessKey=' + api_key + '; secretKey=' + api_secret,
49 "content-type": "application/json"
50 }
51
52 response = requests.post(scanner_link+uri, headers=headers, data=json.dumps(parameters), verify=False)
53 data=json.loads(response.content)
54 return data
55
56 except Exception as err:
57 return {"Api Error": str(err)}
58
59
60 def List_Scans(api_key, api_secret):
61 #List Scans
62 data = FileScanner.Api_Get_Connector('/scans')
63 scans = []
64
65 for scan in data['scans']:
66 scans.append({
67 "name": scan['name'],
68 "id": str(scan['id'])
69 })
70 return scans
71
72 def List_Policies(api_key, api_secret):
73 # List policies
74 data= FileScanner.Api_Get_Connector('/policies')
75 policies = []
76 if data['policies']:
77 for policy in data['policies']:
78 policies.append({
79 "name": policy['name'],
80 "id": str(policy['id'])
81 })
82 return policies
83 else:
84 return {"Error": "No Policies"}
85
86 def Create_Scan(scan_name, targets):
87 uuid = '40345bfc-48be-37bc-9bce-526bdce37582e8fee83bcefdc746'
88 data = FileScanner.Api_Get_Connector('/editor/scan/templates')
89
90 # for template in data['templates']:
91 # if template['title'] == "Policy Compliance Auditing":
92 # uuid = template['uuid']
93 # break
94 # Create the scan
95 parameters= {
96 "uuid": str(uuid),
97 "settings":{
98 "name": scan_name,
99 "enabled": "true",
100 "policy_id": 4,
101 "text_targets": targets,
102 },
103 }
104 try:
105 request= FileScanner.Api_Post_Connector('/scans', parameters)
106 return request
107 except Exception as error:
108 return error
109
110
111 def Run_Scan(scan_id):
112 # Run Scan
113 parameters = {
114 "scan_id":scan_id
115 }
116 request= FileScanner.Api_Post_Connector('/scans/'+str(scan_id)+'/launch', parameters)
117 return request
118
119 def DeleteScan(scan_id):
120 headers = {
121 'X-ApiKeys': 'accessKey=' + api_key + ';secretKey=' + api_secret,
122 }
123 response = requests.delete(scanner_link+'/scans/' + str(scan_id), headers=headers, verify=False)
124 return response.status_code
125
126 def ScanStatus(scan_id):
127 request=FileScanner.Api_Get_Connector(f'/scans/{scan_id}')
128 if request['info']['status'] == 'completed':
129 FileScanner.ExportScan(scan_id)
130 return request['info']['status']
131 def ExportScan(scan_id):
132 files = os.listdir("/opt/nessus/var/nessus/users/Administrator/files/")
133 parameters = {
134 "format": "csv"
135 }
136 scans = FileScanner.Api_Get_Connector('/scans/')
137 scan_name = ''
138 for scan in scans['scans']:
139 if str(scan_id) == str(scan['id']):
140 scan_name = scan['name']
141 break
142 scan_name = scan_name.replace(" ", "_")
143 found = [False]
144 if len(files) == 0:
145 files.append(' ')
146 for report in files:
147 reportS = report.split('_')
148 if len(reportS) <= 2:
149 if reportS[0] == scan_name or reportS == None:
150 found = [True, report]
151 break
152 else:
153 if '_'.join(reportS[:-1]) == scan_name:
154 found = [True, report]
155 break
156 print(found)
157 if found[0]:
158 request = FileScanner.Api_Get_Connector(f'/scans/{scan_id}')
159 return request['info']['status']
160 else:
161 FileScanner.Api_Post_Connector('/scans/' + str(scan_id) + '/export', parameters)
162 time.sleep(1)
163 path = "/opt/nessus/var/nessus/users/Administrator/files/"
164 files = os.listdir("/opt/nessus/var/nessus/users/Administrator/files/")
165 for report in files:
166 reportS = report.split('_')
167 if len(reportS) <= 2:
168 if reportS[0] == scan_name or reportS == None and '.csv' in report:
169 path = path + report
170 break
171 elif len(reportS) > 2 and '.csv' in report:
172 if '_'.join(reportS[:-1]) == scan_name:
173 path = path + report
174 break
175 print(path)
176 shutil.copyfile(path, os.getcwd() + '/FileScanResults/' + scan_name + '.csv')
177
178
179try:
180 os.mkdir("FileScanResults")
181except OSError:
182 pass
183
184
185
186# print(FileScanner.ScanStatus(api_key, api_secret, 174))
187#print(FileScanner.List_Scans(api_key, api_secret))
188# Api_Test(api_key, api_secret) [test and listing scans ids if neeeded]
189#List_Policies(api_key, api_secret)
190# print(FileScanner.Create_Scan(api_key, api_secret, "neat as everybody", "192.168.100.26"))
191# Run_Scan(api_key, api_secret, 84)
192# print(FileScanner.DeleteScan(api_key, api_secret, 107))
193# print(FileScanner.List_Policies(api_key, api_secret))
194#FileScanner.ExportScan(47)