pwn 0.4.431 → 0.4.434

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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