pwn 0.4.429 → 0.4.432

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 101c2b7768232bb1ffc67b7304cd58d8d1968fd2549958dadd8d1fbfc79b9ac1
4
- data.tar.gz: 3a56e33451f7bf6868a2dbe124ae1c6cb9a03389a5af7dea8e1c567d46081fb2
3
+ metadata.gz: b53a054a6de64ad97760f3d1fe8e6dedbac6fd173d66600dcf08301635d88990
4
+ data.tar.gz: 459e0d3b96d8e297f0f48827202912f49e9e275c6f88bf242095c6bfbf3b33c7
5
5
  SHA512:
6
- metadata.gz: 54c49f48521be56ba68642530ed280253a6835acbab991ee6bf9560e9912e103f34d17127be3dc4a27dcbddc03c426118705d2e4428d6753760a58d449f9f3ac
7
- data.tar.gz: 5f05900cb509d463f888852ea36a3c40a36d360912009c4c476a1deae04049e35e825aa5d75fc6c2afa22f9887a54a320f5108df5e424e3de84267c8acd6cb17
6
+ metadata.gz: 2094fcfe3d226dd7cea5dd8a9be4593ba853b968be90c657cfae828b74aebde36f3fe654aaf693782320a882fcfc2e18cf937998aff1dcf11cc04c4c655a79ec
7
+ data.tar.gz: 3b6dcdb9d2fc4fc65028485aa87418e5a1f0858c4475ab120d4f8e53b183f9c8d62d73ed3134a2648547a8e21fd41271b1a58e4f2785e13258b19a00406b9789
data/Gemfile CHANGED
@@ -18,7 +18,7 @@ gem 'aws-sdk', '3.1.0'
18
18
  gem 'bettercap', '1.6.2'
19
19
  gem 'brakeman', '5.2.3'
20
20
  gem 'bson', '4.15.0'
21
- gem 'bundler', '>=2.3.13'
21
+ gem 'bundler', '>=2.3.14'
22
22
  gem 'bundler-audit', '0.9.0.1'
23
23
  gem 'bunny', '2.19.0'
24
24
  gem 'colorize', '0.8.1'
@@ -61,7 +61,7 @@ gem 'rspec', '3.11.0'
61
61
  gem 'rtesseract', '3.1.2'
62
62
  gem 'rubocop', '1.29.1'
63
63
  gem 'rubocop-rake', '0.6.0'
64
- gem 'rubocop-rspec', '2.11.0'
64
+ gem 'rubocop-rspec', '2.11.1'
65
65
  gem 'ruby-audio', '1.6.1'
66
66
  gem 'ruby-nmap', '0.10.0'
67
67
  gem 'ruby-saml', '1.14.0'
@@ -79,5 +79,5 @@ gem 'tty-prompt', '0.23.1'
79
79
  gem 'watir', '7.1.0'
80
80
  gem 'waveform', '0.1.2'
81
81
  gem 'webrick', '1.7.0'
82
- gem 'wicked_pdf', '2.6.2'
82
+ gem 'wicked_pdf', '2.6.3'
83
83
  gem 'yard', '0.9.27'
data/README.md CHANGED
@@ -37,7 +37,7 @@ $ rvm use ruby-3.1.2@pwn
37
37
  $ rvm list gemsets
38
38
  $ gem install --verbose pwn
39
39
  $ pwn
40
- pwn[v0.4.429]:001 >>> PWN.help
40
+ pwn[v0.4.432]:001 >>> PWN.help
41
41
  ```
42
42
 
43
43
  [![Installing the pwn Security Automation Framework](https://raw.githubusercontent.com/0dayInc/pwn/master/documentation/pwn_install.png)](https://youtu.be/G7iLUY4FzsI)
@@ -52,7 +52,7 @@ $ rvm use ruby-3.1.2@pwn
52
52
  $ gem uninstall --all --executables pwn
53
53
  $ gem install --verbose pwn
54
54
  $ pwn
55
- pwn[v0.4.429]:001 >>> PWN.help
55
+ pwn[v0.4.432]:001 >>> PWN.help
56
56
  ```
57
57
 
58
58
 
@@ -19,33 +19,53 @@ OptionParser.new do |options|
19
19
  opts[:scan_name] = n
20
20
  end
21
21
 
22
+ options.on('-TTARGETS', '--text-targets=TARGETS', '<Required - Comma-delimited list of targets to scan>') do |t|
23
+ opts[:text_targets] = t
24
+ end
25
+
22
26
  options.on('-tVALUE', '--scan-template=VALUE', '<Optional - Canned Scan Template to Use for Scan Creation (Defaults to "Basic Network Scan">') do |t|
23
27
  opts[:scan_template] = t
24
28
  end
25
29
 
26
- options.on('-pPOLICY', '--policy-name=POLICY', '<Optional - Policy to Use to Create the Scan (Defaults to "")>') do |p|
30
+ options.on('-pPOLICY', '--policy-name=POLICY', '<Optional - Policy to Use to Create the Scan>') do |p|
27
31
  opts[:policy_name] = p
28
32
  end
29
33
 
30
- options.on('-fFOLDER', '--folder-name=FOLDER', '<Optional - Where to Store the Scan (Defaults to "main")>') do |f|
34
+ options.on('-fFOLDER', '--folder-name=FOLDER', '<Optional - Where to Store the Scan (Defaults to "My Scans")>') do |f|
31
35
  opts[:folder_name] = f
32
36
  end
33
37
 
34
- options.on('-sSCANNER', '--scanner=SCANNER', '<Optional - Scanner to Use (Defaults to "AUTO-ROUTED")>') do |s|
35
- opts[:scanner] = s
38
+ options.on('-sSCANNER', '--scanner-name=SCANNER', '<Optional - Scanner to Use (Defaults to "AUTO-ROUTED")>') do |s|
39
+ opts[:scanner_name] = s
36
40
  end
37
41
 
38
- options.on('-nTARGET', '--target-network=TARGET', '<Optional if --scanner other than AUTO-ROUTED, Otherwise Required - Network to Scan (Defaults to "default-network")>') do |n|
39
- opts[:target_network] = n
42
+ options.on('-D', '--disable-scan', '<Optional - If true, the schedule for the scan is disabled (Defaults to false)>') do |d|
43
+ opts[:disabled] = d
40
44
  end
41
45
 
42
- options.on('-lWHEN', '--launch=WHEN', '<Optional When to Launch Scan - ON_DEMAND || DAILY || WEEKLY || MONTHLY || YEARLY (Defaults to "ON_DEMAND")>') do |l|
43
- opts[:launch] = l
46
+ options.on('-NTARGET', '--target-network-name=TARGET', '<Optional - If --scanner other than AUTO-ROUTED, Otherwise Required - Network to Scan (Defaults to "Default")>') do |n|
47
+ opts[:target_network_name] = n
44
48
  end
45
49
 
46
- options.on('-wTIME', '--scan-time-window=TIME', '<Optional Scan Time Window in Minutes - (Defaults to 0 if nessus scanner scan || 180 if nessus agent scan)>') do |l|
50
+ options.on('-lWHEN', '--launch=WHEN', '<Optional - When to Launch Scan - ON_DEMAND || DAILY || WEEKLY || MONTHLY || YEARLY (Defaults to "ON_DEMAND")>') do |l|
47
51
  opts[:launch] = l
48
52
  end
53
+
54
+ options.on('-wTIME', '--scan-time-window=TIME', '<Optional - Scan Time Window in Minutes - (Defaults to 0 if nessus scanner scan || 180 if nessus agent scan)>') do |t|
55
+ opts[:scan_time_window] = t
56
+ end
57
+
58
+ options.on('-STIME', '--start-time=TIME', '<Optional - For One-Time Scans, the Starting Time and Date for the Scan - (Defaults to Time.now.strftime("%Y%m%dT%H%M%S")>') do |t|
59
+ opts[:starttime] = t
60
+ end
61
+
62
+ options.on('-rRRULES', '--rrules=RRULES', '<Optional - For One-Time Scans, the Starting Time and Date for the Scan - (Defaults to "FREQ=ONETIME;INTERVAL=0;BYDAY=null")>') do |r|
63
+ opts[:rrules] = r
64
+ end
65
+
66
+ options.on('-zTIMEZONE', '--timezone=TIMEZONE', '<Optional - Timezone of the scheduled start time for the scan - (Defaults to "UTC")>') do |t|
67
+ opts[:timezone] = t
68
+ end
49
69
  end.parse!
50
70
 
51
71
  if opts.empty?
@@ -54,6 +74,7 @@ if opts.empty?
54
74
  end
55
75
 
56
76
  begin
77
+ # Get Options Passed to pwn_nessus_cloud_create_scan
57
78
  yaml_config = opts[:yaml_config]
58
79
 
59
80
  raise "YAML Config Not Found: #{yaml_config}" unless File.exist?(yaml_config)
@@ -75,54 +96,167 @@ begin
75
96
  policy_name ||= ''
76
97
 
77
98
  folder_name = opts[:folder_name]
78
- folder_name ||= 'main'
99
+ folder_name ||= 'My Scans'
100
+
101
+ scanner_name = opts[:scanner_name]
102
+ scanner_name ||= 'AUTO-ROUTED'
79
103
 
80
- scanner = opts[:scanner]
81
- scanner ||= 'AUTO-ROUTED'
104
+ target_network_name = opts[:target_network_name]
105
+ target_network_name ||= 'Default'
82
106
 
83
- target_network = opts[:target_network]
84
- target_network ||= '00000000-0000-0000-0000-000000000000'
85
- target_network = '00000000-0000-0000-0000-000000000000' if target_network == 'default-network'
107
+ disabled = true if opts[:disabled]
108
+ disabled ||= false
109
+
110
+ enabled = true
111
+ enabled = false if disabled
86
112
 
87
113
  launch = opts[:launch]
88
114
  launch ||= 'ON_DEMAND'
89
115
 
90
116
  scan_time_window = opts[:scan_time_window]
91
117
 
118
+ starttime = opts[:starttime]
119
+ starttime ||= Time.now.strftime('%Y%m%dT%H%M%S')
120
+
121
+ rrules = opts[:rrules]
122
+ rrules ||= 'FREQ=ONETIME;INTERVAL=0;BYDAY=null'
123
+ # if opts[:rrules].nil?
124
+ # # SU, MO, TU, WE, TH, FR, SA
125
+ # byday_today = Time.now.strftime('%A').upcase[0..1]
126
+ # rrules = "FREQ=ONETIME;INTERVAL=0;BYDAY=#{byday_today}"
127
+ # end
128
+
129
+ timezone = opts[:timezone]
130
+ timezone ||= 'UTC'
131
+
132
+ text_targets = opts[:text_targets]
133
+ raise 'ERROR: --text-targets (i.e. List of targets to scan) is required.' unless text_targets
134
+
135
+ text_targets_arr = text_targets.split(',')
136
+
137
+ target_groups = opts[:target_groups]
138
+
139
+ file_targets = opts[:file_targets]
140
+
141
+ tag_targets = opts[:tag_targets]
142
+
143
+ agent_group_name = opts[:agent_group_name]
144
+ agent_group_id = ''
145
+
146
+ agent_scan_launch_type = opts[:agent_scan_launch_type]
147
+ agent_scan_launch_type ||= 'triggered'
148
+
149
+ triggers = {}
150
+ triggers[:trigger_type] = agent_scan_launch_type
151
+ triggers[:trigger_type] ||= 'periodic'
152
+
153
+ triggers[:options] = {}
154
+ case agent_scan_launch_type
155
+ when 'periodic'
156
+ triggers[:options][:periodic_hourly_interval] = opts[:periodic_hourly_interval]
157
+ triggers[:options][:periodic_hourly_interval] ||= 0
158
+ when 'file-exists'
159
+ triggers[:options][:filename] = opts[:filename]
160
+ end
161
+
162
+ emails = opts[:emails]
163
+
164
+ acls = {}
165
+ acls[:permissions] = opts[:acl_permissions]
166
+ acls[:owner] = opts[:acl_owner]
167
+ acls[:display_name] = opts[:acl_display_name]
168
+ acls[:name] = opts[:acl_name]
169
+ acls[:id] = opts[:acl_id]
170
+ acls[:type] = opts[:acl_type]
171
+
172
+ # Begin Here
92
173
  nessus_obj = PWN::Plugins::NessusCloud.login(
93
174
  access_key: access_key,
94
175
  secret_key: secret_key
95
176
  )
96
177
 
97
- scan_template_list = PWN::Plugins::NessusCloud.get_canned_scan_templates(
98
- nessus_obj: nessus_obj
178
+ # Requirements to create a scan:
179
+ # Part 1: Populate uuid
180
+ # Part 2: Populate settings object
181
+ # Part 3: Populate credentials object
182
+ # Part 4: Populate plugins object (optional)
183
+
184
+ # Part 1: Populate uuid
185
+ # TODO: add --list-canned-scan-templates option
186
+ scan_template = PWN::Plugins::NessusCloud.get_canned_scan_templates(
187
+ nessus_obj: nessus_obj,
188
+ name: scan_template
99
189
  )
190
+ scan_template_uuid = scan_template[:uuid]
191
+ puts scan_template_uuid
192
+
193
+ # Part 2: Populate settings object
194
+ settings = {}
195
+ policy = PWN::Plugins::NessusCloud.get_policies(
196
+ nessus_obj: nessus_obj,
197
+ name: policy_name
198
+ )
199
+ policy_id = policy[:id]
200
+ puts policy_id
100
201
 
101
- selected_scan_template = scan_template_list[:templates].select do |sc|
102
- sc[:title] == scan_template
103
- end
104
-
105
- scan_template_id = selected_scan_template.first[:uuid]
106
-
107
- policy_list = PWN::Plugins::NessusCloud.get_policies(
108
- nessus_obj: nessus_obj
202
+ folder = PWN::Plugins::NessusCloud.get_folders(
203
+ nessus_obj: nessus_obj,
204
+ name: folder_name
109
205
  )
110
- puts policy_list.inspect
206
+ folder_id = folder[:id]
207
+ puts folder_id
111
208
 
112
- folder_list = PWN::Plugins::NessusCloud.get_folders(
113
- nessus_obj: nessus_obj
209
+ scanner = PWN::Plugins::NessusCloud.get_scanners(
210
+ nessus_obj: nessus_obj,
211
+ name: scanner_name
114
212
  )
115
- puts folder_list.inspect
213
+ scanner_id = scanner[:id]
214
+ puts scanner_id
116
215
 
117
- scanner_list = PWN::Plugins::NessusCloud.get_scanners(
118
- nessus_obj: nessus_obj
216
+ target_network = PWN::Plugins::NessusCloud.get_target_networks(
217
+ nessus_obj: nessus_obj,
218
+ name: target_network_name
119
219
  )
120
- puts scanner_list.inspect
220
+ target_network_id = target_network[:uuid]
221
+ puts target_network_id
121
222
 
122
- target_network_list = PWN::Plugins::NessusCloud.get_target_networks(
223
+ # Part 3: Populate credentials object
224
+ credentials = {}
225
+ credential_types = PWN::Plugins::NessusCloud.get_credential_types(
123
226
  nessus_obj: nessus_obj
124
227
  )
125
- puts target_network_list.inspect
228
+ puts credential_types.inspect
229
+ # TODO: add --list-credential-types option
230
+ # credentials[:add] = {}
231
+
232
+ # case opts[:credential_type]
233
+ # when 'host/ssh'
234
+ # credential_type_parent = opts[:credential_type].split('/').first.to_sym
235
+ # credential_type = opts[:credential_type].split('/').last.to_sym
236
+ # credentials[:add][credential_type_parent] = {}
237
+ # credentials[:add][credential_type_parent][credential_type] = []
238
+ # when 'host/windows'
239
+ # credential_type_parent = opts[:credential_type].split('/').first.to_sym
240
+ # credential_type = opts[:credential_type].split('/').last.to_sym
241
+ # credentials[:add][credential_type_parent] = {}
242
+ # credentials[:add][credential_type_parent][credential_type] = []
243
+ # else
244
+ # raise "ERROR: #{opts[:credential_type]} Not Supported."
245
+ # end
246
+
247
+ # Part 4: Populate plugins object (optional)
248
+ # TODO: Implment Plugins During Scan Creation
249
+ plugins = {}
250
+
251
+ # create_scan_resp = PWN::Plugins::NessusCloud.create_scan(
252
+ # nessus_obj: nessus_obj,
253
+ # scan_template_uuid: scan_template_uuid,
254
+ # settings: settings,
255
+ # credentials: credentials,
256
+ # plugins: plugins
257
+ # )
258
+
259
+ # puts create_scan_resp.inspect
126
260
  rescue Interrupt
127
261
  puts 'CTRL+C detected...goodbye.'
128
262
  rescue StandardError => e
@@ -54,15 +54,11 @@ begin
54
54
  secret_key: secret_key
55
55
  )
56
56
 
57
- scan_list = PWN::Plugins::NessusCloud.get_scans(
58
- nessus_obj: nessus_obj
57
+ scan = PWN::Plugins::NessusCloud.get_scans(
58
+ nessus_obj: nessus_obj,
59
+ name: scan_name
59
60
  )
60
-
61
- selected_scan_to_launch = scan_list[:scans].select do |scan|
62
- scan[:name] == scan_name
63
- end
64
-
65
- scan_id = selected_scan_to_launch.first[:id]
61
+ scan_id = scan[:id]
66
62
 
67
63
  PWN::Plugins::NessusCloud.launch_scan(
68
64
  nessus_obj: nessus_obj,
@@ -94,90 +94,272 @@ module PWN
94
94
 
95
95
  # Supported Method Parameters::
96
96
  # PWN::Plugins::NessusCloud.get_canned_scan_templates(
97
- # nessus_obj: 'required - nessus_obj returned from #login method'
97
+ # nessus_obj: 'required - nessus_obj returned from #login method',
98
+ # name: 'optional - name of scan template'
98
99
  # )
99
100
 
100
101
  public_class_method def self.get_canned_scan_templates(opts = {})
101
102
  nessus_obj = opts[:nessus_obj]
103
+ name = opts[:name]
102
104
 
103
105
  scan_templates_resp = nessus_cloud_rest_call(
104
106
  nessus_obj: nessus_obj,
105
107
  rest_call: 'editor/scan/templates'
106
108
  ).body
107
109
 
108
- JSON.parse(scan_templates_resp, symbolize_names: true)
110
+ scan_templates = JSON.parse(scan_templates_resp, symbolize_names: true)
111
+
112
+ if name
113
+ selected_scan_template = scan_templates[:templates].select do |sc|
114
+ sc[:title] == name
115
+ end
116
+ scan_templates = selected_scan_template.first if selected_scan_template.any?
117
+ scan_templates ||= {}
118
+ end
119
+
120
+ scan_templates
109
121
  rescue StandardError, SystemExit, Interrupt => e
110
122
  raise e
111
123
  end
112
124
 
113
125
  # Supported Method Parameters::
114
126
  # PWN::Plugins::NessusCloud.get_policies(
115
- # nessus_obj: 'required - nessus_obj returned from #login method'
127
+ # nessus_obj: 'required - nessus_obj returned from #login method',
128
+ # name: 'optional - name of policy (i.e. user-defined template)'
116
129
  # )
117
130
 
118
131
  public_class_method def self.get_policies(opts = {})
119
132
  nessus_obj = opts[:nessus_obj]
133
+ name = opts[:name]
120
134
 
121
- scan_templates_resp = nessus_cloud_rest_call(
135
+ policies_resp = nessus_cloud_rest_call(
122
136
  nessus_obj: nessus_obj,
123
137
  rest_call: 'policies'
124
138
  ).body
125
139
 
126
- JSON.parse(scan_templates_resp, symbolize_names: true)
140
+ policies = JSON.parse(policies_resp, symbolize_names: true)
141
+
142
+ if name
143
+ selected_policy = policies[:policies].select do |p|
144
+ p[:name] == name
145
+ end
146
+ policies = selected_policy.first if selected_policy.any?
147
+ policies ||= {}
148
+ end
149
+
150
+ policies
127
151
  rescue StandardError, SystemExit, Interrupt => e
128
152
  raise e
129
153
  end
130
154
 
131
155
  # Supported Method Parameters::
132
156
  # PWN::Plugins::NessusCloud.get_folders(
133
- # nessus_obj: 'required - nessus_obj returned from #login method'
157
+ # nessus_obj: 'required - nessus_obj returned from #login method',
158
+ # name: 'optional - name of folder'
134
159
  # )
135
160
 
136
161
  public_class_method def self.get_folders(opts = {})
137
162
  nessus_obj = opts[:nessus_obj]
163
+ name = opts[:name]
138
164
 
139
- scan_templates_resp = nessus_cloud_rest_call(
165
+ folders_resp = nessus_cloud_rest_call(
140
166
  nessus_obj: nessus_obj,
141
- rest_call: 'policies'
167
+ rest_call: 'folders'
142
168
  ).body
143
169
 
144
- JSON.parse(scan_templates_resp, symbolize_names: true)
170
+ folders = JSON.parse(folders_resp, symbolize_names: true)
171
+
172
+ if name
173
+ selected_folder = folders[:folders].select do |f|
174
+ f[:name] == name
175
+ end
176
+ folders = selected_folder.first if selected_folder.any?
177
+ folders ||= {}
178
+ end
179
+
180
+ folders
145
181
  rescue StandardError, SystemExit, Interrupt => e
146
182
  raise e
147
183
  end
148
184
 
149
185
  # Supported Method Parameters::
150
186
  # PWN::Plugins::NessusCloud.get_scanners(
151
- # nessus_obj: 'required - nessus_obj returned from #login method'
187
+ # nessus_obj: 'required - nessus_obj returned from #login method',
188
+ # name: 'optional - name of scanner'
152
189
  # )
153
190
 
154
191
  public_class_method def self.get_scanners(opts = {})
155
192
  nessus_obj = opts[:nessus_obj]
193
+ name = opts[:name]
156
194
 
157
- scan_templates_resp = nessus_cloud_rest_call(
195
+ scanners_resp = nessus_cloud_rest_call(
158
196
  nessus_obj: nessus_obj,
159
197
  rest_call: 'scanners'
160
198
  ).body
161
199
 
162
- JSON.parse(scan_templates_resp, symbolize_names: true)
200
+ scanners = JSON.parse(scanners_resp, symbolize_names: true)
201
+
202
+ if name
203
+ selected_scanner = scanners[:scanners].select do |s|
204
+ s[:name] == name
205
+ end
206
+ scanners = selected_scanner.first if selected_scanner.any?
207
+ scanners ||= {}
208
+ end
209
+
210
+ scanners
163
211
  rescue StandardError, SystemExit, Interrupt => e
164
212
  raise e
165
213
  end
166
214
 
167
215
  # Supported Method Parameters::
168
216
  # PWN::Plugins::NessusCloud.get_target_networks(
169
- # nessus_obj: 'required - nessus_obj returned from #login method'
217
+ # nessus_obj: 'required - nessus_obj returned from #login method',
218
+ # name: 'optional - name of target network'
170
219
  # )
171
220
 
172
221
  public_class_method def self.get_target_networks(opts = {})
173
222
  nessus_obj = opts[:nessus_obj]
223
+ name = opts[:name]
174
224
 
175
- scan_templates_resp = nessus_cloud_rest_call(
225
+ target_networks_resp = nessus_cloud_rest_call(
176
226
  nessus_obj: nessus_obj,
177
227
  rest_call: 'networks'
178
228
  ).body
179
229
 
180
- JSON.parse(scan_templates_resp, symbolize_names: true)
230
+ target_networks = JSON.parse(target_networks_resp, symbolize_names: true)
231
+
232
+ if name
233
+ selected_network = target_networks[:networks].select do |tn|
234
+ tn[:name] == name
235
+ end
236
+ target_networks = selected_network.first if selected_network.any?
237
+ target_networks ||= {}
238
+ end
239
+
240
+ target_networks
241
+ rescue StandardError, SystemExit, Interrupt => e
242
+ raise e
243
+ end
244
+
245
+ # Supported Method Parameters::
246
+ # PWN::Plugins::NessusCloud.get_timezones(
247
+ # nessus_obj: 'required - nessus_obj returned from #login method',
248
+ # name: 'optional - name of timezone'
249
+ # )
250
+
251
+ public_class_method def self.get_timezones(opts = {})
252
+ nessus_obj = opts[:nessus_obj]
253
+ name = opts[:name]
254
+
255
+ timezones_resp = nessus_cloud_rest_call(
256
+ nessus_obj: nessus_obj,
257
+ rest_call: 'scans/timezones'
258
+ ).body
259
+
260
+ timezones = JSON.parse(timezones_resp, symbolize_names: true)
261
+
262
+ if name
263
+ selected_timezone = timezones[:networks].select do |tz|
264
+ tz[:name] == name
265
+ end
266
+ timezones = selected_timezone.first if selected_timezone.any?
267
+ timezones ||= {}
268
+ end
269
+
270
+ timezones
271
+ rescue StandardError, SystemExit, Interrupt => e
272
+ raise e
273
+ end
274
+
275
+ # Supported Method Parameters::
276
+ # PWN::Plugins::NessusCloud.get_target_groups(
277
+ # nessus_obj: 'required - nessus_obj returned from #login method',
278
+ # name: 'optional - name of timezone'
279
+ # )
280
+ # )
281
+
282
+ public_class_method def self.get_target_groups(opts = {})
283
+ nessus_obj = opts[:nessus_obj]
284
+ name = opts[:name]
285
+
286
+ target_groups_resp = nessus_cloud_rest_call(
287
+ nessus_obj: nessus_obj,
288
+ rest_call: 'target-groups'
289
+ ).body
290
+
291
+ timezones = JSON.parse(target_groups_resp, symbolize_names: true)
292
+
293
+ if name
294
+ selected_timezone = timezones[:networks].select do |tz|
295
+ tz[:name] == name
296
+ end
297
+ timezones = selected_timezone.first if selected_timezone.any?
298
+ timezones ||= {}
299
+ end
300
+
301
+ timezones
302
+ rescue StandardError, SystemExit, Interrupt => e
303
+ raise e
304
+ end
305
+
306
+ # Supported Method Parameters::
307
+ # PWN::Plugins::NessusCloud.get_credential_types(
308
+ # nessus_obj: 'required - nessus_obj returned from #login method',
309
+ # name: 'optional - name of credential type (e.g. SSH, Windows, HTTP, etc.)'
310
+ # )
311
+ # )
312
+
313
+ public_class_method def self.get_credential_types(opts = {})
314
+ nessus_obj = opts[:nessus_obj]
315
+ name = opts[:name]
316
+
317
+ credential_types_resp = nessus_cloud_rest_call(
318
+ nessus_obj: nessus_obj,
319
+ rest_call: 'credentials/types'
320
+ ).body
321
+
322
+ credential_types = JSON.parse(credential_types_resp, symbolize_names: true)
323
+
324
+ if name
325
+ selected_credential_type = credential_types[:networks].select do |tz|
326
+ tz[:name] == name
327
+ end
328
+ credential_types = selected_credential_type.first if selected_credential_type.any?
329
+ credential_types ||= {}
330
+ end
331
+
332
+ credential_types
333
+ rescue StandardError, SystemExit, Interrupt => e
334
+ raise e
335
+ end
336
+
337
+ # Supported Method Parameters::
338
+ # PWN::Plugins::NessusCloud.create_scan(
339
+ # nessus_obj: 'required - nessus_obj returned from #login method',
340
+ # scan_template_uuid: 'required - the UUID for the Tenable-provided scan template to use. Run #get_canned_scan_templates for a list of UUIDs',
341
+ # settings: 'required - settings object as defined by https://developer.tenable.com/reference/scans-create',
342
+ # credentials: 'required - credentials object as defined by https://developer.tenable.com/reference/scans-create',
343
+ # plugins: 'optional - plugins object as defined by https://developer.tenable.com/reference/scans-create (Defaults to {})'
344
+ # )
345
+
346
+ public_class_method def self.create_scan(opts = {})
347
+ nessus_obj = opts[:nessus_obj]
348
+
349
+ http_body = {}
350
+ http_body[:uuid] = opts[:scan_template_uuid]
351
+ http_body[:settings] = opts[:settings]
352
+ http_body[:credentials] = opts[:credentials]
353
+ http_body[:plugins] = opts[:plugins]
354
+
355
+ create_scan_resp = nessus_cloud_rest_call(
356
+ http_method: :post,
357
+ nessus_obj: nessus_obj,
358
+ rest_call: 'scans',
359
+ http_body: http_body
360
+ ).body
361
+
362
+ JSON.parse(create_scan_resp, symbolize_names: true)
181
363
  rescue StandardError, SystemExit, Interrupt => e
182
364
  raise e
183
365
  end
@@ -189,13 +371,24 @@ module PWN
189
371
 
190
372
  public_class_method def self.get_scans(opts = {})
191
373
  nessus_obj = opts[:nessus_obj]
374
+ name = opts[:name]
192
375
 
193
376
  scans_resp = nessus_cloud_rest_call(
194
377
  nessus_obj: nessus_obj,
195
378
  rest_call: 'scans'
196
379
  ).body
197
380
 
198
- JSON.parse(scans_resp, symbolize_names: true)
381
+ scans = JSON.parse(scans_resp, symbolize_names: true)
382
+
383
+ if name
384
+ selected_scan = scans[:scans].select do |s|
385
+ s[:name] == name
386
+ end
387
+ scans = selected_scan.first if selected_scan.any?
388
+ scans ||= {}
389
+ end
390
+
391
+ scans
199
392
  rescue StandardError, SystemExit, Interrupt => e
200
393
  raise e
201
394
  end
@@ -374,23 +567,33 @@ module PWN
374
567
  )
375
568
 
376
569
  #{self}.get_canned_scan_templates(
377
- nessus_obj: 'required - nessus_obj returned from #login method'
570
+ nessus_obj: 'required - nessus_obj returned from #login method',
571
+ name: 'optional - name of scan template'
378
572
  )
379
573
 
380
574
  #{self}.get_policies(
381
- nessus_obj: 'required - nessus_obj returned from #login method'
575
+ nessus_obj: 'required - nessus_obj returned from #login method',
576
+ name: 'optional - name of policy (i.e. user-defined template)'
382
577
  )
383
578
 
384
579
  #{self}.get_folders(
385
- nessus_obj: 'required - nessus_obj returned from #login method'
580
+ nessus_obj: 'required - nessus_obj returned from #login method',
581
+ name: 'optional - name of folder'
386
582
  )
387
583
 
388
584
  #{self}.get_scanners(
389
- nessus_obj: 'required - nessus_obj returned from #login method'
585
+ nessus_obj: 'required - nessus_obj returned from #login method',
586
+ name: 'optional - name of scanner'
390
587
  )
391
588
 
392
589
  #{self}.get_target_networks(
393
- nessus_obj: 'required - nessus_obj returned from #login method'
590
+ nessus_obj: 'required - nessus_obj returned from #login method',
591
+ name: 'optional - name of target network'
592
+ )
593
+
594
+ #{self}.get_timezones(
595
+ nessus_obj: 'required - nessus_obj returned from #login method',
596
+ name: 'optional - name of timezone'
394
597
  )
395
598
 
396
599
  #{self}.get_scans(
data/lib/pwn/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PWN
4
- VERSION = '0.4.429'
4
+ VERSION = '0.4.432'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pwn
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.429
4
+ version: 0.4.432
5
5
  platform: ruby
6
6
  authors:
7
7
  - 0day Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-05-18 00:00:00.000000000 Z
11
+ date: 2022-05-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -114,14 +114,14 @@ dependencies:
114
114
  requirements:
115
115
  - - ">="
116
116
  - !ruby/object:Gem::Version
117
- version: 2.3.13
117
+ version: 2.3.14
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - ">="
123
123
  - !ruby/object:Gem::Version
124
- version: 2.3.13
124
+ version: 2.3.14
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: bundler-audit
127
127
  requirement: !ruby/object:Gem::Requirement
@@ -702,14 +702,14 @@ dependencies:
702
702
  requirements:
703
703
  - - '='
704
704
  - !ruby/object:Gem::Version
705
- version: 2.11.0
705
+ version: 2.11.1
706
706
  type: :runtime
707
707
  prerelease: false
708
708
  version_requirements: !ruby/object:Gem::Requirement
709
709
  requirements:
710
710
  - - '='
711
711
  - !ruby/object:Gem::Version
712
- version: 2.11.0
712
+ version: 2.11.1
713
713
  - !ruby/object:Gem::Dependency
714
714
  name: ruby-audio
715
715
  requirement: !ruby/object:Gem::Requirement
@@ -954,14 +954,14 @@ dependencies:
954
954
  requirements:
955
955
  - - '='
956
956
  - !ruby/object:Gem::Version
957
- version: 2.6.2
957
+ version: 2.6.3
958
958
  type: :runtime
959
959
  prerelease: false
960
960
  version_requirements: !ruby/object:Gem::Requirement
961
961
  requirements:
962
962
  - - '='
963
963
  - !ruby/object:Gem::Version
964
- version: 2.6.2
964
+ version: 2.6.3
965
965
  - !ruby/object:Gem::Dependency
966
966
  name: yard
967
967
  requirement: !ruby/object:Gem::Requirement