pwn 0.4.431 → 0.4.434

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: 48072b8179bfac8c54e8c436a40414dc482092f73ef06fb3f6f318fde1f27ca7
4
- data.tar.gz: 1760f70d5a5e81fb0c5e82606a3019b4de3e374a2a596a1ffd344dba62d2d865
3
+ metadata.gz: 7c57efc5654de9b5ffcab0dcd7221626c765fd018c92a602762e5a60f2e66b7c
4
+ data.tar.gz: ec004b5c260189b9040d1ac52361e544f70ab59fc337f0cb26b6c07ba703fbb1
5
5
  SHA512:
6
- metadata.gz: 48b319c619e24c40ec69a45c4ab2470972480400157443470752d0915e93761f3ad0e0a74b33f6d5389034e091d054efa4455ea8943957620d4e98130cb0c598
7
- data.tar.gz: d93a09ed3585490878ca297da4be21bcce0a28f80732838eb2ddb436bab7383293aead3628a851bd7fc78f03b4af0a231f01145434132292f6d3ed6e69f088f1
6
+ metadata.gz: 8aceb5eb4c2a8cd6b63a2ef47767736aa662fec32967a667438dc88c8e56dae7c3c2e5ff3dd129c16dc889d67ad75d85067da05735e03d362c9048c0fdccc223
7
+ data.tar.gz: d2b86e170fd102fa82c5d0c10c8fbc94e0e8d79ac037ba7c1ecaac2ad6a9af1f813285c4cb970588c79378c7544889ff1d6876595bd0c4da1641bf249e832ef9
data/Gemfile CHANGED
@@ -18,8 +18,8 @@ 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'
22
- gem 'bundler-audit', '0.9.0.1'
21
+ gem 'bundler', '>=2.3.14'
22
+ gem 'bundler-audit', '0.9.1'
23
23
  gem 'bunny', '2.19.0'
24
24
  gem 'colorize', '0.8.1'
25
25
  gem 'credit_card_validations', '5.0.0'
@@ -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.431]:001 >>> PWN.help
40
+ pwn[v0.4.434]: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.431]:001 >>> PWN.help
55
+ pwn[v0.4.434]:001 >>> PWN.help
56
56
  ```
57
57
 
58
58
 
@@ -11,7 +11,7 @@ OptionParser.new do |options|
11
11
  #{$PROGRAM_NAME} [opts]
12
12
  "
13
13
 
14
- options.on('-cYPATH', '--yaml-config=YPATH', '<Required - YAML Config Containing Access & Secret Keys for Authentication>') do |c|
14
+ options.on('-cYPATH', '--yaml-config=YPATH', '<Required - YAML Config Containing Access & Secret Keys for Authentication, Including Credential Information for Scan Creation (https://developer.tenable.com/docs/determine-settings-for-credential-type)>') do |c|
15
15
  opts[:yaml_config] = c
16
16
  end
17
17
 
@@ -19,15 +19,23 @@ 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
+
26
+ options.on('-dDESC', '--scan-description=DESC', '<Optional - Scan Description (Defaults to nil)>') do |d|
27
+ opts[:scan_desc] = d
28
+ end
29
+
22
30
  options.on('-tVALUE', '--scan-template=VALUE', '<Optional - Canned Scan Template to Use for Scan Creation (Defaults to "Basic Network Scan">') do |t|
23
31
  opts[:scan_template] = t
24
32
  end
25
33
 
26
- options.on('-pPOLICY', '--policy-name=POLICY', '<Optional - Policy to Use to Create the Scan (Defaults to "")>') do |p|
34
+ options.on('-pPOLICY', '--policy-name=POLICY', '<Optional - Policy to Use to Create the Scan>') do |p|
27
35
  opts[:policy_name] = p
28
36
  end
29
37
 
30
- options.on('-fFOLDER', '--folder-name=FOLDER', '<Optional - Where to Store the Scan (Defaults to "main")>') do |f|
38
+ options.on('-fFOLDER', '--folder-name=FOLDER', '<Optional - Where to Store the Scan (Defaults to "My Scans")>') do |f|
31
39
  opts[:folder_name] = f
32
40
  end
33
41
 
@@ -35,17 +43,33 @@ OptionParser.new do |options|
35
43
  opts[:scanner_name] = s
36
44
  end
37
45
 
38
- options.on('-TTARGET', '--target-network-name=TARGET', '<Optional if --scanner other than AUTO-ROUTED, Otherwise Required - Network to Scan (Defaults to "Default")>') do |t|
39
- opts[:target_network_name] = t
46
+ options.on('-D', '--disable-scan', '<Optional - If true, the schedule for the scan is disabled (Defaults to false)>') do |d|
47
+ opts[:disabled] = d
40
48
  end
41
49
 
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
50
+ options.on('-NTARGET', '--target-network-name=TARGET', '<Optional - If --scanner other than AUTO-ROUTED, Otherwise Required - Network to Scan (Defaults to "Default")>') do |n|
51
+ opts[:target_network_name] = n
44
52
  end
45
53
 
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|
54
+ options.on('-lWHEN', '--launch=WHEN', '<Optional - When to Launch Scan - ON_DEMAND || DAILY || WEEKLY || MONTHLY || YEARLY (Defaults to "ON_DEMAND")>') do |l|
47
55
  opts[:launch] = l
48
56
  end
57
+
58
+ options.on('-wTIMEWINDOW', '--scan-time-window=TIMEWINDOW', '<Optional - Scan Time Window in Minutes - (Defaults to 0)>') do |t|
59
+ opts[:scan_time_window] = t
60
+ end
61
+
62
+ 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|
63
+ opts[:starttime] = t
64
+ end
65
+
66
+ 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|
67
+ opts[:rrules] = r
68
+ end
69
+
70
+ options.on('-zTIMEZONE', '--timezone=TIMEZONE', '<Optional - Timezone of the scheduled start time for the scan - (Defaults to "UTC")>') do |t|
71
+ opts[:timezone] = t
72
+ end
49
73
  end.parse!
50
74
 
51
75
  if opts.empty?
@@ -54,6 +78,7 @@ if opts.empty?
54
78
  end
55
79
 
56
80
  begin
81
+ # Get Options Passed to pwn_nessus_cloud_create_scan
57
82
  yaml_config = opts[:yaml_config]
58
83
 
59
84
  raise "YAML Config Not Found: #{yaml_config}" unless File.exist?(yaml_config)
@@ -67,6 +92,7 @@ begin
67
92
  secret_key = yaml[:secret_key]
68
93
 
69
94
  scan_name = opts[:scan_name]
95
+ scan_desc = opts[:scan_desc]
70
96
 
71
97
  scan_template = opts[:scan_template]
72
98
  scan_template ||= 'Basic Network Scan'
@@ -75,7 +101,7 @@ begin
75
101
  policy_name ||= ''
76
102
 
77
103
  folder_name = opts[:folder_name]
78
- folder_name ||= 'main'
104
+ folder_name ||= 'My Scans'
79
105
 
80
106
  scanner_name = opts[:scanner_name]
81
107
  scanner_name ||= 'AUTO-ROUTED'
@@ -83,49 +109,167 @@ begin
83
109
  target_network_name = opts[:target_network_name]
84
110
  target_network_name ||= 'Default'
85
111
 
112
+ disabled = true if opts[:disabled]
113
+ disabled ||= false
114
+
115
+ enabled = true
116
+ enabled = false if disabled
117
+
86
118
  launch = opts[:launch]
87
119
  launch ||= 'ON_DEMAND'
88
120
 
89
- scan_time_window = opts[:scan_time_window]
121
+ scan_time_window = opts[:scan_time_window].to_i
122
+ scan_time_window ||= 0
123
+
124
+ starttime = opts[:starttime]
125
+ starttime ||= Time.now.strftime('%Y%m%dT%H%M%S')
126
+
127
+ rrules = opts[:rrules]
128
+ rrules ||= 'FREQ=ONETIME;INTERVAL=0;BYDAY=null'
129
+
130
+ timezone = opts[:timezone]
131
+ timezone ||= 'UTC'
132
+
133
+ text_targets = opts[:text_targets]
134
+ raise 'ERROR: --text-targets (i.e. List of targets to scan) is required.' unless text_targets
135
+
136
+ target_groups = opts[:target_groups]
137
+
138
+ file_targets = opts[:file_targets]
139
+
140
+ tag_targets = opts[:tag_targets]
141
+ tag_targets_arr = tag_targets.split(',')
142
+
143
+ agent_group_name = opts[:agent_group_name]
144
+ agent_group_id_arr = []
145
+
146
+ agent_scan_launch_type = opts[:agent_scan_launch_type]
147
+ agent_scan_launch_type ||= 'triggered'
148
+
149
+ triggers_arr = []
150
+ triggers = {}
151
+ triggers[:type] = agent_scan_launch_type
152
+ triggers[:type] ||= 'periodic'
153
+
154
+ triggers[:options] = {}
155
+ case agent_scan_launch_type
156
+ when 'periodic'
157
+ triggers[:options][:periodic_hourly_interval] = opts[:periodic_hourly_interval]
158
+ triggers[:options][:periodic_hourly_interval] ||= 0
159
+ when 'file-exists'
160
+ triggers[:options][:filename] = opts[:filename]
161
+ end
162
+
163
+ triggers_arr.push(triggers)
164
+
165
+ emails = opts[:emails]
166
+
167
+ acls = {}
168
+ acls[:permissions] = opts[:acl_permissions]
169
+ acls[:owner] = opts[:acl_owner]
170
+ acls[:display_name] = opts[:acl_display_name]
171
+ acls[:name] = opts[:acl_name]
172
+ acls[:id] = opts[:acl_id]
173
+ acls[:type] = opts[:acl_type]
174
+
175
+ credential_category = opts[:credential_category]
176
+ credential_type = opts[:credential_type]
90
177
 
178
+ # Begin Here
91
179
  nessus_obj = PWN::Plugins::NessusCloud.login(
92
180
  access_key: access_key,
93
181
  secret_key: secret_key
94
182
  )
95
183
 
184
+ # Requirements to create a scan:
185
+ # Part 1: Populate uuid
186
+ # Part 2: Populate settings object from options passed to driver
187
+ # Part 3: Populate credentials object from YAML config (optional)
188
+ # Part 4: Populate plugins object from YAML config (optional)
189
+
190
+ # Part 1: Populate uuid
191
+ # TODO: add --list-canned-scan-templates option
96
192
  scan_template = PWN::Plugins::NessusCloud.get_canned_scan_templates(
97
193
  nessus_obj: nessus_obj,
98
- title: scan_template
194
+ name: scan_template
99
195
  )
100
- scan_template_id = scan_template[:uuid]
101
- puts scan_template_id
196
+ scan_template_uuid = scan_template[:uuid]
197
+ puts scan_template_uuid
198
+
199
+ # Part 2: Populate settings object from options passed to driver
200
+ settings = {}
201
+ settings[:name] = scan_name
202
+ settings[:description] = scan_desc
102
203
 
103
204
  policy = PWN::Plugins::NessusCloud.get_policies(
104
205
  nessus_obj: nessus_obj,
105
206
  name: policy_name
106
207
  )
107
- policy_id = policy[:id]
108
- puts policy_id
208
+ settings[:policy_id] = policy[:id]
109
209
 
110
210
  folder = PWN::Plugins::NessusCloud.get_folders(
111
211
  nessus_obj: nessus_obj,
112
212
  name: folder_name
113
213
  )
114
- folder_id = folder[:id]
115
- puts folder_id
214
+ settings[:folder_id] = folder[:id]
116
215
 
117
216
  scanner = PWN::Plugins::NessusCloud.get_scanners(
118
217
  nessus_obj: nessus_obj,
119
218
  name: scanner_name
120
219
  )
121
- scanner_id = scanner[:id]
122
- puts scanner_id
220
+ settings[:scanner_id] = scanner[:id]
123
221
 
124
222
  target_network = PWN::Plugins::NessusCloud.get_target_networks(
125
223
  nessus_obj: nessus_obj,
126
224
  name: target_network_name
127
225
  )
128
- target_network_id = target_network[:uuid]
226
+ settings[:target_network_uuid] = target_network[:uuid]
227
+
228
+ settings[:enabled] = enabled
229
+
230
+ settings[:launch] = launch
231
+
232
+ settings[:scan_time_window] = scan_time_window
233
+
234
+ settings[:starttime] = starttime
235
+
236
+ settings[:rrules] = rrules
237
+
238
+ settings[:timezone] = timezone
239
+
240
+ settings[:text_targets] = text_targets
241
+
242
+ settings[:target_groups] = target_groups
243
+
244
+ settings[:file_targets] = file_targets
245
+
246
+ settings[:tag_targets] = tag_targets_arr
247
+
248
+ settings[:agent_group_id] = agent_group_id_arr
249
+
250
+ settings[:agent_scan_launch_type] = agent_scan_launch_type
251
+
252
+ settings[:triggers] = triggers_arr
253
+
254
+ settings[:emails] = emails
255
+
256
+ settings[:acls] = acls
257
+
258
+ # Part 3: Populate credentials object from YAML config (optional)
259
+ credentials = yaml[:credentials]
260
+
261
+ # Part 4: Populate plugins object from YAML config (optional)
262
+ plugins = yaml[:plugins]
263
+
264
+ create_scan_resp = PWN::Plugins::NessusCloud.create_scan(
265
+ nessus_obj: nessus_obj,
266
+ scan_template_uuid: scan_template_uuid,
267
+ settings: settings,
268
+ credentials: credentials,
269
+ plugins: plugins
270
+ )
271
+
272
+ puts create_scan_resp.inspect
129
273
  rescue Interrupt
130
274
  puts 'CTRL+C detected...goodbye.'
131
275
  rescue StandardError => e
@@ -1,2 +1,15 @@
1
1
  access_key: 'ACCESS_KEY'
2
2
  secret_key: 'SECRET_KEY'
3
+ credentials:
4
+ add:
5
+ Host:
6
+ Windows:
7
+ - domain: 'dc.local'
8
+ username: 'USERNAME'
9
+ auth_method: 'Password'
10
+ password: 'PASSWORD'
11
+ plugins:
12
+ Web Servers:
13
+ individual:
14
+ '11213': enabled
15
+ '18261': enabled
@@ -1,2 +1,15 @@
1
1
  access_key: 'ACCESS_KEY'
2
2
  secret_key: 'SECRET_KEY'
3
+ credentials:
4
+ add:
5
+ Host:
6
+ Windows:
7
+ - domain: 'dc.local'
8
+ username: 'USERNAME'
9
+ auth_method: 'Password'
10
+ password: 'PASSWORD'
11
+ plugins:
12
+ Web Servers:
13
+ individual:
14
+ '11213': enabled
15
+ '18261': enabled
@@ -1,2 +1,15 @@
1
1
  access_key: 'ACCESS_KEY'
2
2
  secret_key: 'SECRET_KEY'
3
+ credentials:
4
+ add:
5
+ Host:
6
+ Windows:
7
+ - domain: 'dc.local'
8
+ username: 'USERNAME'
9
+ auth_method: 'Password'
10
+ password: 'PASSWORD'
11
+ plugins:
12
+ Web Servers:
13
+ individual:
14
+ '11213': enabled
15
+ '18261': enabled
@@ -1,2 +1,15 @@
1
1
  access_key: 'ACCESS_KEY'
2
2
  secret_key: 'SECRET_KEY'
3
+ credentials:
4
+ add:
5
+ Host:
6
+ Windows:
7
+ - domain: 'dc.local'
8
+ username: 'USERNAME'
9
+ auth_method: 'Password'
10
+ password: 'PASSWORD'
11
+ plugins:
12
+ Web Servers:
13
+ individual:
14
+ '11213': enabled
15
+ '18261': enabled
@@ -1,2 +1,15 @@
1
1
  access_key: 'ACCESS_KEY'
2
2
  secret_key: 'SECRET_KEY'
3
+ credentials:
4
+ add:
5
+ Host:
6
+ Windows:
7
+ - domain: 'dc.local'
8
+ username: 'USERNAME'
9
+ auth_method: 'Password'
10
+ password: 'PASSWORD'
11
+ plugins:
12
+ Web Servers:
13
+ individual:
14
+ '11213': enabled
15
+ '18261': enabled
@@ -1,2 +1,15 @@
1
1
  access_key: 'ACCESS_KEY'
2
2
  secret_key: 'SECRET_KEY'
3
+ credentials:
4
+ add:
5
+ Host:
6
+ Windows:
7
+ - domain: 'dc.local'
8
+ username: 'USERNAME'
9
+ auth_method: 'Password'
10
+ password: 'PASSWORD'
11
+ plugins:
12
+ Web Servers:
13
+ individual:
14
+ '11213': enabled
15
+ '18261': enabled
@@ -94,12 +94,13 @@ 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]
102
- title = opts[:title]
103
+ name = opts[:name]
103
104
 
104
105
  scan_templates_resp = nessus_cloud_rest_call(
105
106
  nessus_obj: nessus_obj,
@@ -108,9 +109,9 @@ module PWN
108
109
 
109
110
  scan_templates = JSON.parse(scan_templates_resp, symbolize_names: true)
110
111
 
111
- if title
112
+ if name
112
113
  selected_scan_template = scan_templates[:templates].select do |sc|
113
- sc[:title] == title
114
+ sc[:title] == name
114
115
  end
115
116
  scan_templates = selected_scan_template.first if selected_scan_template.any?
116
117
  scan_templates ||= {}
@@ -123,19 +124,20 @@ module PWN
123
124
 
124
125
  # Supported Method Parameters::
125
126
  # PWN::Plugins::NessusCloud.get_policies(
126
- # 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)'
127
129
  # )
128
130
 
129
131
  public_class_method def self.get_policies(opts = {})
130
132
  nessus_obj = opts[:nessus_obj]
131
133
  name = opts[:name]
132
134
 
133
- scan_templates_resp = nessus_cloud_rest_call(
135
+ policies_resp = nessus_cloud_rest_call(
134
136
  nessus_obj: nessus_obj,
135
137
  rest_call: 'policies'
136
138
  ).body
137
139
 
138
- policies = JSON.parse(scan_templates_resp, symbolize_names: true)
140
+ policies = JSON.parse(policies_resp, symbolize_names: true)
139
141
 
140
142
  if name
141
143
  selected_policy = policies[:policies].select do |p|
@@ -152,19 +154,20 @@ module PWN
152
154
 
153
155
  # Supported Method Parameters::
154
156
  # PWN::Plugins::NessusCloud.get_folders(
155
- # 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'
156
159
  # )
157
160
 
158
161
  public_class_method def self.get_folders(opts = {})
159
162
  nessus_obj = opts[:nessus_obj]
160
163
  name = opts[:name]
161
164
 
162
- scan_templates_resp = nessus_cloud_rest_call(
165
+ folders_resp = nessus_cloud_rest_call(
163
166
  nessus_obj: nessus_obj,
164
167
  rest_call: 'folders'
165
168
  ).body
166
169
 
167
- folders = JSON.parse(scan_templates_resp, symbolize_names: true)
170
+ folders = JSON.parse(folders_resp, symbolize_names: true)
168
171
 
169
172
  if name
170
173
  selected_folder = folders[:folders].select do |f|
@@ -181,19 +184,20 @@ module PWN
181
184
 
182
185
  # Supported Method Parameters::
183
186
  # PWN::Plugins::NessusCloud.get_scanners(
184
- # 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'
185
189
  # )
186
190
 
187
191
  public_class_method def self.get_scanners(opts = {})
188
192
  nessus_obj = opts[:nessus_obj]
189
193
  name = opts[:name]
190
194
 
191
- scan_templates_resp = nessus_cloud_rest_call(
195
+ scanners_resp = nessus_cloud_rest_call(
192
196
  nessus_obj: nessus_obj,
193
197
  rest_call: 'scanners'
194
198
  ).body
195
199
 
196
- scanners = JSON.parse(scan_templates_resp, symbolize_names: true)
200
+ scanners = JSON.parse(scanners_resp, symbolize_names: true)
197
201
 
198
202
  if name
199
203
  selected_scanner = scanners[:scanners].select do |s|
@@ -210,19 +214,20 @@ module PWN
210
214
 
211
215
  # Supported Method Parameters::
212
216
  # PWN::Plugins::NessusCloud.get_target_networks(
213
- # 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'
214
219
  # )
215
220
 
216
221
  public_class_method def self.get_target_networks(opts = {})
217
222
  nessus_obj = opts[:nessus_obj]
218
223
  name = opts[:name]
219
224
 
220
- scan_templates_resp = nessus_cloud_rest_call(
225
+ target_networks_resp = nessus_cloud_rest_call(
221
226
  nessus_obj: nessus_obj,
222
227
  rest_call: 'networks'
223
228
  ).body
224
229
 
225
- target_networks = JSON.parse(scan_templates_resp, symbolize_names: true)
230
+ target_networks = JSON.parse(target_networks_resp, symbolize_names: true)
226
231
 
227
232
  if name
228
233
  selected_network = target_networks[:networks].select do |tn|
@@ -237,6 +242,141 @@ module PWN
237
242
  raise e
238
243
  end
239
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
+ # category: 'optional - category of credential type (Defaults to "Host")',
310
+ # name: 'optional - name of credential type (Defaults to "SSH")'
311
+ # )
312
+ # )
313
+
314
+ public_class_method def self.get_credential_types(opts = {})
315
+ nessus_obj = opts[:nessus_obj]
316
+ category = opts[:category].to_s.downcase
317
+ name = opts[:name].to_s.downcase
318
+
319
+ raise 'ERROR: name parameter requires category parameter.' if category.empty? && !name.empty?
320
+
321
+ credential_types_resp = nessus_cloud_rest_call(
322
+ nessus_obj: nessus_obj,
323
+ rest_call: 'credentials/types'
324
+ ).body
325
+
326
+ credential_types = JSON.parse(credential_types_resp, symbolize_names: true)
327
+
328
+ if category
329
+ selected_credential_category = credential_types[:credentials].select do |cc|
330
+ cc[:category].downcase == category
331
+ end
332
+ credential_types = selected_credential_category.first if selected_credential_category.any?
333
+ credential_types ||= {}
334
+
335
+ if name
336
+ selected_credential_type = credential_types[:types].select do |ct|
337
+ ct[:name].downcase == name
338
+ end
339
+ credential_types = selected_credential_type.first if selected_credential_type.any?
340
+ credential_types ||= {}
341
+ end
342
+
343
+ end
344
+
345
+ credential_types
346
+ rescue StandardError, SystemExit, Interrupt => e
347
+ raise e
348
+ end
349
+
350
+ # Supported Method Parameters::
351
+ # PWN::Plugins::NessusCloud.create_scan(
352
+ # nessus_obj: 'required - nessus_obj returned from #login method',
353
+ # scan_template_uuid: 'required - the UUID for the Tenable-provided scan template to use. Run #get_canned_scan_templates for a list of UUIDs',
354
+ # settings: 'required - settings object as defined by https://developer.tenable.com/reference/scans-create',
355
+ # credentials: 'required - credentials object as defined by https://developer.tenable.com/reference/scans-create',
356
+ # plugins: 'optional - plugins object as defined by https://developer.tenable.com/reference/scans-create (Defaults to {})'
357
+ # )
358
+
359
+ public_class_method def self.create_scan(opts = {})
360
+ nessus_obj = opts[:nessus_obj]
361
+
362
+ http_body = {}
363
+ http_body[:uuid] = opts[:scan_template_uuid]
364
+ http_body[:settings] = opts[:settings]
365
+ http_body[:credentials] = opts[:credentials]
366
+ http_body[:plugins] = opts[:plugins]
367
+
368
+ create_scan_resp = nessus_cloud_rest_call(
369
+ http_method: :post,
370
+ nessus_obj: nessus_obj,
371
+ rest_call: 'scans',
372
+ http_body: http_body
373
+ ).body
374
+
375
+ JSON.parse(create_scan_resp, symbolize_names: true)
376
+ rescue StandardError, SystemExit, Interrupt => e
377
+ raise e
378
+ end
379
+
240
380
  # Supported Method Parameters::
241
381
  # PWN::Plugins::NessusCloud.get_scans(
242
382
  # nessus_obj: 'required - nessus_obj returned from #login method'
@@ -440,23 +580,33 @@ module PWN
440
580
  )
441
581
 
442
582
  #{self}.get_canned_scan_templates(
443
- nessus_obj: 'required - nessus_obj returned from #login method'
583
+ nessus_obj: 'required - nessus_obj returned from #login method',
584
+ name: 'optional - name of scan template'
444
585
  )
445
586
 
446
587
  #{self}.get_policies(
447
- nessus_obj: 'required - nessus_obj returned from #login method'
588
+ nessus_obj: 'required - nessus_obj returned from #login method',
589
+ name: 'optional - name of policy (i.e. user-defined template)'
448
590
  )
449
591
 
450
592
  #{self}.get_folders(
451
- nessus_obj: 'required - nessus_obj returned from #login method'
593
+ nessus_obj: 'required - nessus_obj returned from #login method',
594
+ name: 'optional - name of folder'
452
595
  )
453
596
 
454
597
  #{self}.get_scanners(
455
- nessus_obj: 'required - nessus_obj returned from #login method'
598
+ nessus_obj: 'required - nessus_obj returned from #login method',
599
+ name: 'optional - name of scanner'
456
600
  )
457
601
 
458
602
  #{self}.get_target_networks(
459
- nessus_obj: 'required - nessus_obj returned from #login method'
603
+ nessus_obj: 'required - nessus_obj returned from #login method',
604
+ name: 'optional - name of target network'
605
+ )
606
+
607
+ #{self}.get_timezones(
608
+ nessus_obj: 'required - nessus_obj returned from #login method',
609
+ name: 'optional - name of timezone'
460
610
  )
461
611
 
462
612
  #{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.431'
4
+ VERSION = '0.4.434'
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.431
4
+ version: 0.4.434
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-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -114,28 +114,28 @@ 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
128
128
  requirements:
129
129
  - - '='
130
130
  - !ruby/object:Gem::Version
131
- version: 0.9.0.1
131
+ version: 0.9.1
132
132
  type: :runtime
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - '='
137
137
  - !ruby/object:Gem::Version
138
- version: 0.9.0.1
138
+ version: 0.9.1
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: bunny
141
141
  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
@@ -1968,7 +1968,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1968
1968
  - !ruby/object:Gem::Version
1969
1969
  version: '0'
1970
1970
  requirements: []
1971
- rubygems_version: 3.3.13
1971
+ rubygems_version: 3.3.14
1972
1972
  signing_key:
1973
1973
  specification_version: 4
1974
1974
  summary: Automated Security Testing for CI/CD Pipelines & Beyond