pwn 0.5.652 → 0.5.655

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: 6fd0197b1fa729406ea99bbe598d3730d27e3c6881251c374af0f894ea541729
4
- data.tar.gz: 492617f851780cf17c04fcdecdd4eb491e54b2bcf115b04997f3972507528d3a
3
+ metadata.gz: 6e41d71c8fc29542a4190d697603d8626138e2d2a10fba03d39637efb9103a1f
4
+ data.tar.gz: 3dc38eeb6c27e6e8899b5fb619f0b4d3afe9e31b3bf37ea7460197b48eac290e
5
5
  SHA512:
6
- metadata.gz: ad8894f7551643e63ec4819d7a2513e3114d0f2649eb21ea8b9554e150319a7df0d62e6c46d9979d5c0462c5617f054f93f2140c81704b74fa3d8f763c428d90
7
- data.tar.gz: f84e73f55040588558281b2941a41b602b2f3a6471c5cbbacdd7afc42a9b2dbf91c8c9c01e68079dcaedee03a25aad25eb17558d3ffec62f0ce8539f5e6ef1a5
6
+ metadata.gz: 8f7ca9fa6a7f7784da54fd956eefd976d136c1226f48d5d7ecfe2911220b5b706b54d15b478c7cd69e0a751190ff876dc2f642068a9cc13320ffa3254929687d
7
+ data.tar.gz: c00d46ffc0b34013288c32ba279805ea9a617bc79eaa81e8b9e4ada48ecb5e5d6ab8d7b0926b4d2f0277e1cce3bd704407e85759f7a5196826ca96eb71db2e31
data/Gemfile CHANGED
@@ -11,7 +11,7 @@ gemspec
11
11
  # In some circumstances custom flags are passed to gems in order
12
12
  # to build appropriately. Defer to ./reinstall_pwn_gemset.sh
13
13
  # to review these custom flags (e.g. pg, serialport, etc).
14
- gem 'activesupport', '<8.1.3'
14
+ gem 'activesupport', '<8.1.3.1'
15
15
  gem 'anemone', '0.7.2'
16
16
  gem 'authy', '3.0.1'
17
17
  gem 'aws-sdk', '3.3.0'
@@ -46,11 +46,11 @@ gem 'json', '>=2.13.2'
46
46
  gem 'jsonpath', '1.1.5'
47
47
  gem 'json_schemer', '2.5.0'
48
48
  gem 'jwt', '3.2.0'
49
- gem 'libusb', '0.7.2'
49
+ gem 'libusb', '0.8.0'
50
50
  gem 'luhn', '3.0.0'
51
51
  gem 'mail', '2.9.1'
52
- gem 'mcp', '1.0.0'
53
- gem 'meshtastic', '0.0.172'
52
+ gem 'mcp', '1.1.0'
53
+ gem 'meshtastic', '0.0.173'
54
54
  gem 'metasm', '1.0.6'
55
55
  gem 'mongo', '2.25.0'
56
56
  gem 'msfrpc-client', '1.1.2'
@@ -77,11 +77,11 @@ gem 'rbvmomi2', '3.10.0'
77
77
  gem 'rdoc', '7.0.4'
78
78
  gem 'rest-client', '2.1.0'
79
79
  gem 'rex', '2.0.13'
80
- gem 'rmagick', '7.0.5'
80
+ gem 'rmagick', '7.1.0'
81
81
  gem 'rqrcode', '3.2.0'
82
82
  gem 'rspec', '3.13.2'
83
83
  gem 'rtesseract', '3.1.4'
84
- gem 'rubocop', '1.88.2'
84
+ gem 'rubocop', '1.89.0'
85
85
  gem 'rubocop-rake', '0.7.1'
86
86
  gem 'rubocop-rspec', '3.10.2'
87
87
  gem 'ruby-audio', '1.6.1'
@@ -327,7 +327,7 @@ module PWN
327
327
  body = r[:body].to_s
328
328
  absent = site[:absent_status].include?(code) ||
329
329
  # substring match against page body — NOT a set intersection despite the cop name.
330
- site[:absent_body].any? { |s| body.include?(s) } || # rubocop:disable Style/ArrayIntersect
330
+ site[:absent_body].any? { |s| body.include?(s) } ||
331
331
  !code.between?(200, 399)
332
332
  absent ? :absent : :present
333
333
  end
@@ -1,113 +1,631 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'json'
4
3
  require 'base64'
4
+ require 'json'
5
5
 
6
6
  module PWN
7
7
  module Plugins
8
- # This plugin is used for interacting w/ HackerOne's REST API using
8
+ # This plugin is used for interacting w/ HackerOne's Hacker REST API using
9
9
  # the 'rest' browser type of PWN::Plugins::TransparentBrowser.
10
+ #
11
+ # Spec: https://api.hackerone.com/getting-started-hacker-api/#getting-started-hacker-api
12
+ #
13
+ # Auth: HTTP Basic on every request (username + API token).
14
+ # Base: https://api.hackerone.com/v1/hackers/
15
+ #
16
+ # Credentials are sourced from PWN::Env[:plugins][:hackerone]:
17
+ # plugins:
18
+ # hackerone:
19
+ # username: your-h1-username
20
+ # api_key: your-h1-api-token
10
21
  module HackerOne
11
22
  @@logger = PWN::Plugins::PWNLogger.create
12
23
 
24
+ BASE_H1_API_URI = 'https://api.hackerone.com/v1/hackers'
25
+
26
+ # Resolve username: explicit opt -> PWN::Env -> ENV
27
+ private_class_method def self.resolve_username(opts = {})
28
+ opts[:username] ||
29
+ PWN::Env.dig(:plugins, :hackerone, :username) ||
30
+ ENV.fetch('HACKERONE_USERNAME', nil)
31
+ end
32
+
33
+ # Resolve API token: explicit opt -> PWN::Env -> ENV
34
+ # Accepts :api_key, :token, or :api_token aliases.
35
+ private_class_method def self.resolve_api_key(opts = {})
36
+ opts[:api_key] ||
37
+ opts[:token] ||
38
+ opts[:api_token] ||
39
+ PWN::Env.dig(:plugins, :hackerone, :api_key) ||
40
+ PWN::Env.dig(:plugins, :hackerone, :token) ||
41
+ ENV.fetch('HACKERONE_API_KEY', nil) ||
42
+ ENV.fetch('HACKERONE_TOKEN', nil)
43
+ end
44
+
13
45
  # Supported Method Parameters::
14
- # h1_obj = PWN::Plugins::HackerOne.login(
15
- # username: 'required - username',
16
- # token: 'optional - api token (will prompt if nil)'
46
+ # h1_rest_call(
47
+ # http_method: 'optional HTTP method (defaults to GET)',
48
+ # rest_call: 'required rest path relative to /v1/hackers (e.g. "me/reports")',
49
+ # params: 'optional query params Hash',
50
+ # http_body: 'optional HTTP body (Hash/Array auto-JSONified; String passed through)',
51
+ # username: 'optional - HackerOne username (default PWN::Env)',
52
+ # api_key: 'optional - HackerOne API token (default PWN::Env)',
53
+ # raw: 'optional - return raw RestClient::Response (default false)'
17
54
  # )
18
55
 
19
- public_class_method def self.login(opts = {})
20
- username = opts[:username].to_s.scrub
21
- base_h1_api_uri = 'https://api.hackerone.com/v1/'.to_s.scrub
56
+ private_class_method def self.h1_rest_call(opts = {})
57
+ http_method = if opts[:http_method].nil?
58
+ :get
59
+ else
60
+ opts[:http_method].to_s.scrub.to_sym
61
+ end
62
+ rest_call = opts[:rest_call].to_s.scrub.sub(%r{\A/}, '')
63
+ params = opts[:params]
64
+ http_body = opts[:http_body]
65
+ http_body = http_body.to_json if http_body.is_a?(Hash) || http_body.is_a?(Array)
66
+ raw = opts[:raw]
22
67
 
23
- token = if opts[:token].nil?
24
- PWN::Plugins::AuthenticationHelper.mask_password
25
- else
26
- opts[:token].to_s.scrub
27
- end
68
+ username = resolve_username(opts).to_s.scrub
69
+ api_key = resolve_api_key(opts).to_s.scrub
70
+ raise 'ERROR: HackerOne username missing - set plugins.hackerone.username in ~/.pwn/pwn.yaml' if username.empty?
71
+ raise 'ERROR: HackerOne api_key missing - set plugins.hackerone.api_key in ~/.pwn/pwn.yaml' if api_key.empty?
28
72
 
29
- auth_payload = {}
30
- auth_payload[:username] = username
31
- auth_payload[:token] = token
73
+ basic_auth_header = "Basic #{Base64.strict_encode64("#{username}:#{api_key}")}"
32
74
 
33
- base64_str = "#{username}:#{token}"
34
- base64_encoded_auth = Base64.strict_encode64(base64_str).to_s.chomp
35
- basic_auth_header = "Basic #{base64_encoded_auth}"
75
+ headers = {
76
+ authorization: basic_auth_header,
77
+ accept: 'application/json',
78
+ content_type: 'application/json; charset=UTF-8'
79
+ }
80
+ headers[:params] = params if params
36
81
 
37
- @@logger.info("Logging into HackerOne REST API: #{base_h1_api_uri}")
38
82
  browser_obj = PWN::Plugins::TransparentBrowser.open(browser_type: :rest)
39
83
  rest_client = browser_obj[:browser]::Request
84
+
85
+ url = rest_call.empty? ? BASE_H1_API_URI : "#{BASE_H1_API_URI}/#{rest_call}"
86
+
40
87
  response = rest_client.execute(
41
- method: :get,
42
- url: base_h1_api_uri,
43
- headers: {
44
- authorization: basic_auth_header,
45
- content_type: 'application/json; charset=UTF-8'
46
- }
88
+ method: http_method,
89
+ url: url,
90
+ headers: headers,
91
+ payload: http_body,
92
+ verify_ssl: false
47
93
  )
48
94
 
49
- # Return array containing the post-authenticated HackerOne REST API token
50
- json_response = JSON.parse(response, symbolize_names: true)
51
- h1_success = json_response['success']
52
- api_token = json_response['token']
53
- h1_obj = {}
54
- h1_obj[:h1_success] = h1_success
55
- h1_obj[:api_token] = api_token
56
- h1_obj[:raw_response] = response
95
+ return response if raw
57
96
 
58
- h1_obj
97
+ JSON.parse(response.body, symbolize_names: true)
98
+ rescue RestClient::TooManyRequests
99
+ @@logger.warn('HackerOne rate limit (429). Sleeping 10s then retrying...')
100
+ sleep 10
101
+ retry
102
+ rescue RestClient::Unauthorized, RestClient::Forbidden,
103
+ RestClient::BadRequest, RestClient::NotFound,
104
+ RestClient::UnprocessableEntity => e
105
+ @@logger.error("HackerOne #{e.class}: #{e.response&.body}")
106
+ raise e
59
107
  rescue StandardError => e
60
108
  raise e
61
109
  end
62
110
 
63
111
  # Supported Method Parameters::
64
- # h1_rest_call(
65
- # h1_obj: 'required h1_obj returned from #login method',
66
- # http_method: 'optional HTTP method (defaults to GET)
67
- # rest_call: 'required rest call to make per the schema',
68
- # http_body: 'optional HTTP body sent in HTTP methods that support it e.g. POST'
112
+ # h1_obj = PWN::Plugins::HackerOne.login(
113
+ # username: 'optional - username (default PWN::Env[:plugins][:hackerone][:username])',
114
+ # api_key: 'optional - api token (default PWN::Env; will prompt if still nil)',
115
+ # token: 'optional - alias for api_key'
69
116
  # )
117
+ # Backward-compatible session object. Auth is HTTP Basic on every subsequent
118
+ # call; login simply resolves + validates credentials against me/reports.
70
119
 
71
- private_class_method def self.h1_rest_call(opts = {})
72
- h1_obj = opts[:h1_obj]
73
- http_method = if opts[:http_method].nil?
74
- :get
75
- else
76
- opts[:http_method].to_s.scrub.to_sym
77
- end
78
- rest_call = opts[:rest_call].to_s.scrub
79
- http_body = opts[:http_body].to_s.scrub
80
- h1_success = h1_obj[:h1_success].to_s.scrub
81
- base_h1_api_uri = 'https://api.hackerone.com/v1/'.to_s.scrub
82
- api_token = h1_obj[:api_token]
120
+ public_class_method def self.login(opts = {})
121
+ username = resolve_username(opts)
122
+ api_key = resolve_api_key(opts)
83
123
 
84
- browser_obj = PWN::Plugins::TransparentBrowser.open(browser_type: :rest)::Request
85
- rest_client = browser_obj[:browser]::Request
124
+ api_key = PWN::Plugins::AuthenticationHelper.mask_password if api_key.nil? || api_key.to_s.empty?
86
125
 
87
- case http_method
88
- when :get
89
- response = rest_client.execute(
90
- method: :get,
91
- url: "#{base_h1_api_uri}/#{rest_call}",
92
- headers: {
93
- content_type: 'application/json; charset=UTF-8',
94
- params: { token: api_token }
95
- }
96
- )
126
+ username = username.to_s.scrub
127
+ api_key = api_key.to_s.scrub
128
+ raise 'ERROR: HackerOne username required' if username.empty?
129
+ raise 'ERROR: HackerOne api_key required' if api_key.empty?
97
130
 
98
- when :post
99
- response = rest_client.execute(
100
- method: :post,
101
- url: "#{base_h1_api_uri}/#{rest_call}",
102
- headers: {
103
- content_type: 'application/json; charset=UTF-8'
104
- },
105
- payload: http_body
106
- )
131
+ @@logger.info("Validating HackerOne Hacker API credentials for #{username}")
132
+ # Prefer a cheap authenticated endpoint (balance is small; me/reports is list)
133
+ h1_rest_call(
134
+ rest_call: 'payments/balance',
135
+ username: username,
136
+ api_key: api_key
137
+ )
138
+
139
+ {
140
+ username: username,
141
+ api_key: api_key,
142
+ base_h1_api_uri: BASE_H1_API_URI
143
+ }
144
+ rescue StandardError => e
145
+ raise e
146
+ end
147
+
148
+ # Supported Method Parameters::
149
+ # response = PWN::Plugins::HackerOne.api(
150
+ # path: 'required - path relative to /v1/hackers (e.g. "me/reports")',
151
+ # method: 'optional - :get|:post|:put|:patch|:delete (default :get)',
152
+ # params: 'optional - query params Hash',
153
+ # body: 'optional - request body Hash/Array/String',
154
+ # username: 'optional',
155
+ # api_key: 'optional',
156
+ # h1_obj: 'optional - session from #login (supplies username/api_key)',
157
+ # raw: 'optional - return raw response (default false)'
158
+ # )
159
+
160
+ public_class_method def self.api(opts = {})
161
+ creds = creds_from(opts)
162
+ h1_rest_call(
163
+ http_method: opts[:method] || opts[:http_method] || :get,
164
+ rest_call: opts[:path].to_s.delete_prefix('/'),
165
+ params: opts[:params],
166
+ http_body: opts[:body] || opts[:http_body],
167
+ username: creds[:username],
168
+ api_key: creds[:api_key],
169
+ raw: opts[:raw]
170
+ )
171
+ rescue StandardError => e
172
+ raise e
173
+ end
174
+
175
+ # Pull username/api_key from opts or h1_obj session.
176
+ private_class_method def self.creds_from(opts = {})
177
+ h1_obj = opts[:h1_obj] || {}
178
+ {
179
+ username: opts[:username] || h1_obj[:username],
180
+ api_key: opts[:api_key] || opts[:token] || opts[:api_token] || h1_obj[:api_key] || h1_obj[:token]
181
+ }
182
+ end
183
+
184
+ # ---- Reports -------------------------------------------------------
185
+
186
+ # Supported Method Parameters::
187
+ # reports = PWN::Plugins::HackerOne.get_me_reports(
188
+ # params: 'optional - query params Hash (e.g. page/filter)',
189
+ # username: 'optional', api_key: 'optional', h1_obj: 'optional'
190
+ # )
191
+
192
+ public_class_method def self.get_me_reports(opts = {})
193
+ creds = creds_from(opts)
194
+ h1_rest_call(
195
+ rest_call: 'me/reports',
196
+ params: opts[:params],
197
+ username: creds[:username],
198
+ api_key: creds[:api_key]
199
+ )
200
+ rescue StandardError => e
201
+ raise e
202
+ end
107
203
 
108
- else
109
- raise @@logger.error("Unsupported HTTP Method #{http_method} for #{self} Plugin")
204
+ # Supported Method Parameters::
205
+ # report = PWN::Plugins::HackerOne.get_report(
206
+ # id: 'required - report id',
207
+ # username: 'optional', api_key: 'optional', h1_obj: 'optional'
208
+ # )
209
+
210
+ public_class_method def self.get_report(opts = {})
211
+ id = opts[:id]
212
+ raise 'ERROR: report id required' if id.nil? || id.to_s.empty?
213
+
214
+ creds = creds_from(opts)
215
+ h1_rest_call(
216
+ rest_call: "reports/#{id}",
217
+ params: opts[:params],
218
+ username: creds[:username],
219
+ api_key: creds[:api_key]
220
+ )
221
+ rescue StandardError => e
222
+ raise e
223
+ end
224
+
225
+ # Supported Method Parameters::
226
+ # report = PWN::Plugins::HackerOne.create_report(
227
+ # team_handle: 'required - program handle',
228
+ # title: 'required - report title',
229
+ # vulnerability_information: 'required - detailed description',
230
+ # impact: 'optional - impact text',
231
+ # severity_rating: 'optional - none|low|medium|high|critical',
232
+ # weakness_id: 'optional - weakness id integer',
233
+ # structured_scope_id: 'optional - structured scope id',
234
+ # body: 'optional - full JSON:API body Hash (overrides attribute kwargs)',
235
+ # username: 'optional', api_key: 'optional', h1_obj: 'optional'
236
+ # )
237
+
238
+ public_class_method def self.create_report(opts = {})
239
+ creds = creds_from(opts)
240
+ http_body = opts[:body]
241
+ if http_body.nil?
242
+ attrs = {
243
+ team_handle: opts[:team_handle],
244
+ title: opts[:title],
245
+ vulnerability_information: opts[:vulnerability_information]
246
+ }
247
+ attrs[:impact] = opts[:impact] if opts.key?(:impact)
248
+ attrs[:severity_rating] = opts[:severity_rating] if opts.key?(:severity_rating)
249
+ attrs[:weakness_id] = opts[:weakness_id] if opts.key?(:weakness_id)
250
+ attrs[:structured_scope_id] = opts[:structured_scope_id] if opts.key?(:structured_scope_id)
251
+
252
+ raise 'ERROR: team_handle required' if attrs[:team_handle].to_s.empty?
253
+ raise 'ERROR: title required' if attrs[:title].to_s.empty?
254
+ raise 'ERROR: vulnerability_information required' if attrs[:vulnerability_information].to_s.empty?
255
+
256
+ http_body = {
257
+ data: {
258
+ type: 'report',
259
+ attributes: attrs
260
+ }
261
+ }
110
262
  end
263
+
264
+ h1_rest_call(
265
+ http_method: :post,
266
+ rest_call: 'reports',
267
+ http_body: http_body,
268
+ username: creds[:username],
269
+ api_key: creds[:api_key]
270
+ )
271
+ rescue StandardError => e
272
+ raise e
273
+ end
274
+
275
+ # ---- Payments ------------------------------------------------------
276
+
277
+ # Supported Method Parameters::
278
+ # balance = PWN::Plugins::HackerOne.get_balance(
279
+ # username: 'optional', api_key: 'optional', h1_obj: 'optional'
280
+ # )
281
+
282
+ public_class_method def self.get_balance(opts = {})
283
+ creds = creds_from(opts)
284
+ h1_rest_call(
285
+ rest_call: 'payments/balance',
286
+ username: creds[:username],
287
+ api_key: creds[:api_key]
288
+ )
289
+ rescue StandardError => e
290
+ raise e
291
+ end
292
+
293
+ # Supported Method Parameters::
294
+ # earnings = PWN::Plugins::HackerOne.get_earnings(
295
+ # params: 'optional - query params Hash',
296
+ # username: 'optional', api_key: 'optional', h1_obj: 'optional'
297
+ # )
298
+
299
+ public_class_method def self.get_earnings(opts = {})
300
+ creds = creds_from(opts)
301
+ h1_rest_call(
302
+ rest_call: 'payments/earnings',
303
+ params: opts[:params],
304
+ username: creds[:username],
305
+ api_key: creds[:api_key]
306
+ )
307
+ rescue StandardError => e
308
+ raise e
309
+ end
310
+
311
+ # Supported Method Parameters::
312
+ # payouts = PWN::Plugins::HackerOne.get_payouts(
313
+ # params: 'optional - query params Hash',
314
+ # username: 'optional', api_key: 'optional', h1_obj: 'optional'
315
+ # )
316
+
317
+ public_class_method def self.get_payouts(opts = {})
318
+ creds = creds_from(opts)
319
+ h1_rest_call(
320
+ rest_call: 'payments/payouts',
321
+ params: opts[:params],
322
+ username: creds[:username],
323
+ api_key: creds[:api_key]
324
+ )
325
+ rescue StandardError => e
326
+ raise e
327
+ end
328
+
329
+ # ---- Programs -------------------------------------------------------
330
+
331
+ # Supported Method Parameters::
332
+ # programs = PWN::Plugins::HackerOne.get_programs(
333
+ # params: 'optional - query params Hash',
334
+ # username: 'optional', api_key: 'optional', h1_obj: 'optional'
335
+ # )
336
+
337
+ public_class_method def self.get_programs(opts = {})
338
+ creds = creds_from(opts)
339
+ h1_rest_call(
340
+ rest_call: 'programs',
341
+ params: opts[:params],
342
+ username: creds[:username],
343
+ api_key: creds[:api_key]
344
+ )
345
+ rescue StandardError => e
346
+ raise e
347
+ end
348
+
349
+ # Supported Method Parameters::
350
+ # program = PWN::Plugins::HackerOne.get_program(
351
+ # handle: 'required - program handle',
352
+ # username: 'optional', api_key: 'optional', h1_obj: 'optional'
353
+ # )
354
+
355
+ public_class_method def self.get_program(opts = {})
356
+ handle = opts[:handle].to_s.scrub
357
+ raise 'ERROR: program handle required' if handle.empty?
358
+
359
+ creds = creds_from(opts)
360
+ h1_rest_call(
361
+ rest_call: "programs/#{handle}",
362
+ params: opts[:params],
363
+ username: creds[:username],
364
+ api_key: creds[:api_key]
365
+ )
366
+ rescue StandardError => e
367
+ raise e
368
+ end
369
+
370
+ # Supported Method Parameters::
371
+ # scopes = PWN::Plugins::HackerOne.get_structured_scopes(
372
+ # handle: 'required - program handle',
373
+ # params: 'optional',
374
+ # username: 'optional', api_key: 'optional', h1_obj: 'optional'
375
+ # )
376
+
377
+ public_class_method def self.get_structured_scopes(opts = {})
378
+ handle = opts[:handle].to_s.scrub
379
+ raise 'ERROR: program handle required' if handle.empty?
380
+
381
+ creds = creds_from(opts)
382
+ h1_rest_call(
383
+ rest_call: "programs/#{handle}/structured_scopes",
384
+ params: opts[:params],
385
+ username: creds[:username],
386
+ api_key: creds[:api_key]
387
+ )
388
+ rescue StandardError => e
389
+ raise e
390
+ end
391
+
392
+ # Supported Method Parameters::
393
+ # exclusions = PWN::Plugins::HackerOne.get_scope_exclusions(
394
+ # handle: 'required - program handle',
395
+ # params: 'optional',
396
+ # username: 'optional', api_key: 'optional', h1_obj: 'optional'
397
+ # )
398
+
399
+ public_class_method def self.get_scope_exclusions(opts = {})
400
+ handle = opts[:handle].to_s.scrub
401
+ raise 'ERROR: program handle required' if handle.empty?
402
+
403
+ creds = creds_from(opts)
404
+ h1_rest_call(
405
+ rest_call: "programs/#{handle}/scope_exclusions",
406
+ params: opts[:params],
407
+ username: creds[:username],
408
+ api_key: creds[:api_key]
409
+ )
410
+ rescue StandardError => e
411
+ raise e
412
+ end
413
+
414
+ # Supported Method Parameters::
415
+ # weaknesses = PWN::Plugins::HackerOne.get_weaknesses(
416
+ # handle: 'required - program handle',
417
+ # params: 'optional',
418
+ # username: 'optional', api_key: 'optional', h1_obj: 'optional'
419
+ # )
420
+
421
+ public_class_method def self.get_weaknesses(opts = {})
422
+ handle = opts[:handle].to_s.scrub
423
+ raise 'ERROR: program handle required' if handle.empty?
424
+
425
+ creds = creds_from(opts)
426
+ h1_rest_call(
427
+ rest_call: "programs/#{handle}/weaknesses",
428
+ params: opts[:params],
429
+ username: creds[:username],
430
+ api_key: creds[:api_key]
431
+ )
432
+ rescue StandardError => e
433
+ raise e
434
+ end
435
+
436
+ # ---- Hacktivity -----------------------------------------------------
437
+
438
+ # Supported Method Parameters::
439
+ # items = PWN::Plugins::HackerOne.get_hacktivity(
440
+ # params: 'optional - query params Hash',
441
+ # username: 'optional', api_key: 'optional', h1_obj: 'optional'
442
+ # )
443
+
444
+ public_class_method def self.get_hacktivity(opts = {})
445
+ creds = creds_from(opts)
446
+ h1_rest_call(
447
+ rest_call: 'hacktivity',
448
+ params: opts[:params],
449
+ username: creds[:username],
450
+ api_key: creds[:api_key]
451
+ )
452
+ rescue StandardError => e
453
+ raise e
454
+ end
455
+
456
+ # ---- Report Intents ------------------------------------------------
457
+
458
+ # Supported Method Parameters::
459
+ # intents = PWN::Plugins::HackerOne.get_report_intents(
460
+ # params: 'optional',
461
+ # username: 'optional', api_key: 'optional', h1_obj: 'optional'
462
+ # )
463
+
464
+ public_class_method def self.get_report_intents(opts = {})
465
+ creds = creds_from(opts)
466
+ h1_rest_call(
467
+ rest_call: 'report_intents',
468
+ params: opts[:params],
469
+ username: creds[:username],
470
+ api_key: creds[:api_key]
471
+ )
472
+ rescue StandardError => e
473
+ raise e
474
+ end
475
+
476
+ # Supported Method Parameters::
477
+ # intent = PWN::Plugins::HackerOne.get_report_intent(
478
+ # id: 'required - report intent id',
479
+ # username: 'optional', api_key: 'optional', h1_obj: 'optional'
480
+ # )
481
+
482
+ public_class_method def self.get_report_intent(opts = {})
483
+ id = opts[:id]
484
+ raise 'ERROR: report intent id required' if id.nil? || id.to_s.empty?
485
+
486
+ creds = creds_from(opts)
487
+ h1_rest_call(
488
+ rest_call: "report_intents/#{id}",
489
+ params: opts[:params],
490
+ username: creds[:username],
491
+ api_key: creds[:api_key]
492
+ )
493
+ rescue StandardError => e
494
+ raise e
495
+ end
496
+
497
+ # Supported Method Parameters::
498
+ # intent = PWN::Plugins::HackerOne.create_report_intent(
499
+ # body: 'required - full JSON:API body Hash',
500
+ # username: 'optional', api_key: 'optional', h1_obj: 'optional'
501
+ # )
502
+
503
+ public_class_method def self.create_report_intent(opts = {})
504
+ body = opts[:body]
505
+ raise 'ERROR: body required for create_report_intent' if body.nil?
506
+
507
+ creds = creds_from(opts)
508
+ h1_rest_call(
509
+ http_method: :post,
510
+ rest_call: 'report_intents',
511
+ http_body: body,
512
+ username: creds[:username],
513
+ api_key: creds[:api_key]
514
+ )
515
+ rescue StandardError => e
516
+ raise e
517
+ end
518
+
519
+ # Supported Method Parameters::
520
+ # intent = PWN::Plugins::HackerOne.update_report_intent(
521
+ # id: 'required - report intent id',
522
+ # body: 'required - full JSON:API body Hash',
523
+ # username: 'optional', api_key: 'optional', h1_obj: 'optional'
524
+ # )
525
+
526
+ public_class_method def self.update_report_intent(opts = {})
527
+ id = opts[:id]
528
+ body = opts[:body]
529
+ raise 'ERROR: report intent id required' if id.nil? || id.to_s.empty?
530
+ raise 'ERROR: body required for update_report_intent' if body.nil?
531
+
532
+ creds = creds_from(opts)
533
+ h1_rest_call(
534
+ http_method: :put,
535
+ rest_call: "report_intents/#{id}",
536
+ http_body: body,
537
+ username: creds[:username],
538
+ api_key: creds[:api_key]
539
+ )
540
+ rescue StandardError => e
541
+ raise e
542
+ end
543
+
544
+ # Supported Method Parameters::
545
+ # result = PWN::Plugins::HackerOne.delete_report_intent(
546
+ # id: 'required - report intent id',
547
+ # username: 'optional', api_key: 'optional', h1_obj: 'optional'
548
+ # )
549
+
550
+ public_class_method def self.delete_report_intent(opts = {})
551
+ id = opts[:id]
552
+ raise 'ERROR: report intent id required' if id.nil? || id.to_s.empty?
553
+
554
+ creds = creds_from(opts)
555
+ h1_rest_call(
556
+ http_method: :delete,
557
+ rest_call: "report_intents/#{id}",
558
+ username: creds[:username],
559
+ api_key: creds[:api_key]
560
+ )
561
+ rescue StandardError => e
562
+ raise e
563
+ end
564
+
565
+ # Supported Method Parameters::
566
+ # result = PWN::Plugins::HackerOne.submit_report_intent(
567
+ # id: 'required - report intent id',
568
+ # body: 'optional - JSON:API body Hash',
569
+ # username: 'optional', api_key: 'optional', h1_obj: 'optional'
570
+ # )
571
+
572
+ public_class_method def self.submit_report_intent(opts = {})
573
+ id = opts[:id]
574
+ raise 'ERROR: report intent id required' if id.nil? || id.to_s.empty?
575
+
576
+ creds = creds_from(opts)
577
+ h1_rest_call(
578
+ http_method: :post,
579
+ rest_call: "report_intents/#{id}/submit",
580
+ http_body: opts[:body],
581
+ username: creds[:username],
582
+ api_key: creds[:api_key]
583
+ )
584
+ rescue StandardError => e
585
+ raise e
586
+ end
587
+
588
+ # Supported Method Parameters::
589
+ # attachments = PWN::Plugins::HackerOne.get_report_intent_attachments(
590
+ # report_intent_id: 'required - report intent id',
591
+ # username: 'optional', api_key: 'optional', h1_obj: 'optional'
592
+ # )
593
+
594
+ public_class_method def self.get_report_intent_attachments(opts = {})
595
+ rid = opts[:report_intent_id] || opts[:id]
596
+ raise 'ERROR: report_intent_id required' if rid.nil? || rid.to_s.empty?
597
+
598
+ creds = creds_from(opts)
599
+ h1_rest_call(
600
+ rest_call: "report_intents/#{rid}/attachments",
601
+ params: opts[:params],
602
+ username: creds[:username],
603
+ api_key: creds[:api_key]
604
+ )
605
+ rescue StandardError => e
606
+ raise e
607
+ end
608
+
609
+ # Supported Method Parameters::
610
+ # result = PWN::Plugins::HackerOne.delete_report_intent_attachment(
611
+ # report_intent_id: 'required - report intent id',
612
+ # id: 'required - attachment id',
613
+ # username: 'optional', api_key: 'optional', h1_obj: 'optional'
614
+ # )
615
+
616
+ public_class_method def self.delete_report_intent_attachment(opts = {})
617
+ rid = opts[:report_intent_id]
618
+ id = opts[:id]
619
+ raise 'ERROR: report_intent_id required' if rid.nil? || rid.to_s.empty?
620
+ raise 'ERROR: attachment id required' if id.nil? || id.to_s.empty?
621
+
622
+ creds = creds_from(opts)
623
+ h1_rest_call(
624
+ http_method: :delete,
625
+ rest_call: "report_intents/#{rid}/attachments/#{id}",
626
+ username: creds[:username],
627
+ api_key: creds[:api_key]
628
+ )
111
629
  rescue StandardError => e
112
630
  raise e
113
631
  end
@@ -116,11 +634,13 @@ module PWN
116
634
  # PWN::Plugins::HackerOne.logout(
117
635
  # h1_obj: 'required h1_obj returned from #login method'
118
636
  # )
637
+ # Clears the session hash in-place (no server-side session to destroy).
119
638
 
120
639
  public_class_method def self.logout(opts = {})
121
640
  h1_obj = opts[:h1_obj]
122
- @@logger.info('Logging out...')
123
- h1_obj = nil
641
+ @@logger.info('Clearing HackerOne session object...')
642
+ h1_obj.clear if h1_obj.respond_to?(:clear)
643
+ nil
124
644
  rescue StandardError => e
125
645
  raise e
126
646
  end
@@ -138,14 +658,46 @@ module PWN
138
658
  public_class_method def self.help
139
659
  puts "USAGE:
140
660
  h1_obj = #{self}.login(
141
- username: 'required username',
142
- token: 'optional api token (will prompt if nil)'
661
+ username: 'optional - default PWN::Env[:plugins][:hackerone][:username]',
662
+ api_key: 'optional - default PWN::Env[:plugins][:hackerone][:api_key]'
143
663
  )
144
664
 
145
- h1_obj = #{self}.logout(
146
- h1_obj: 'required h1_obj returned from #login method'
665
+ reports = #{self}.get_me_reports(h1_obj: h1_obj)
666
+ report = #{self}.get_report(id: 12345)
667
+ report = #{self}.create_report(
668
+ team_handle: 'security',
669
+ title: 'Example',
670
+ vulnerability_information: 'Details...'
671
+ )
672
+
673
+ balance = #{self}.get_balance
674
+ earnings = #{self}.get_earnings
675
+ payouts = #{self}.get_payouts
676
+
677
+ programs = #{self}.get_programs
678
+ program = #{self}.get_program(handle: 'security')
679
+ scopes = #{self}.get_structured_scopes(handle: 'security')
680
+ excl = #{self}.get_scope_exclusions(handle: 'security')
681
+ weak = #{self}.get_weaknesses(handle: 'security')
682
+
683
+ items = #{self}.get_hacktivity
684
+
685
+ intents = #{self}.get_report_intents
686
+ intent = #{self}.get_report_intent(id: 1)
687
+ intent = #{self}.create_report_intent(body: { data: { type: 'report-intent', attributes: {} } })
688
+ intent = #{self}.update_report_intent(id: 1, body: { data: { type: 'report-intent', attributes: {} } })
689
+ #{self}.submit_report_intent(id: 1)
690
+ #{self}.delete_report_intent(id: 1)
691
+ atts = #{self}.get_report_intent_attachments(report_intent_id: 1)
692
+ #{self}.delete_report_intent_attachment(report_intent_id: 1, id: 2)
693
+
694
+ json = #{self}.api(
695
+ path: 'me/reports',
696
+ method: :get,
697
+ params: { page: { number: 1 } }
147
698
  )
148
699
 
700
+ #{self}.logout(h1_obj: h1_obj)
149
701
  #{self}.authors
150
702
  "
151
703
  end
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.5.652'
4
+ VERSION = '0.5.655'
5
5
  end
@@ -16,6 +16,7 @@ pwn_provider=`echo $PWN_PROVIDER`
16
16
  $screen_cmd "${apt} install -y apache2 ${assess_update_errors}"
17
17
  $screen_cmd "a2enmod proxy ${assess_update_errors}"
18
18
  $screen_cmd "a2enmod proxy_http ${assess_update_errors}"
19
+ $screen_cmd "a2enmod proxy_wstunnel ${assess_update_errors}"
19
20
  $screen_cmd "a2enmod rewrite ${assess_update_errors}"
20
21
  $screen_cmd "a2enmod ssl ${assess_update_errors}"
21
22
  $screen_cmd "a2enmod headers ${assess_update_errors}"
@@ -1422,11 +1422,35 @@
1422
1422
  {"messages":[{"role":"user","content":"PWN::Plugins::Github.resolve_username Usage"},{"role":"assistant","content":"`PWN::Plugins::Github.resolve_username`: "}]}
1423
1423
  {"messages":[{"role":"user","content":"PWN::Plugins::Github.workflow_run_jobs Usage"},{"role":"assistant","content":"`PWN::Plugins::Github.workflow_run_jobs`: Supported Method Parameters\n\njobs = PWN::Plugins::Github.workflow_run_jobs(\n\nowner: 'required - repo owner (default PWN::Env[:plugins][:github][:username])',\nrepo: 'required - repo name',\nrun_id: 'required - workflow run id'\n\n)\n"}]}
1424
1424
  {"messages":[{"role":"user","content":"PWN::Plugins::Github.workflow_runs Usage"},{"role":"assistant","content":"`PWN::Plugins::Github.workflow_runs`: Supported Method Parameters\n\nruns = PWN::Plugins::Github.workflow_runs(\n\nowner: 'required - repo owner (default PWN::Env[:plugins][:github][:username])',\nrepo: 'required - repo name',\nworkflow: 'optional - workflow file name or id (e.g. install-matrix.yml). Omit for all runs.',\nparams: 'optional - {branch:, status:, per_page:, page:}'\n\n)\n"}]}
1425
+ {"messages":[{"role":"user","content":"PWN::Plugins::HackerOne.api Usage"},{"role":"assistant","content":"`PWN::Plugins::HackerOne.api`: Supported Method Parameters\n\nresponse = PWN::Plugins::HackerOne.api(\n\npath: 'required - path relative to /v1/hackers (e.g. \"me/reports\")',\nmethod: 'optional - :get|:post|:put|:patch|:delete (default :get)',\nparams: 'optional - query params Hash',\nbody: 'optional - request body Hash/Array/String',\nusername: 'optional',\napi_key: 'optional',\nh1_obj: 'optional - session from #login (supplies username/api_key)',\nraw: 'optional - return raw response (default false)'\n\n)\n"}]}
1425
1426
  {"messages":[{"role":"user","content":"PWN::Plugins::HackerOne.authors Usage"},{"role":"assistant","content":"`PWN::Plugins::HackerOne.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
1426
- {"messages":[{"role":"user","content":"PWN::Plugins::HackerOne.h1_rest_call Usage"},{"role":"assistant","content":"`PWN::Plugins::HackerOne.h1_rest_call`: Supported Method Parameters\n\nh1_rest_call(\n\nh1_obj: 'required h1_obj returned from #login method',\nhttp_method: 'optional HTTP method (defaults to GET)\nrest_call: 'required rest call to make per the schema',\nhttp_body: 'optional HTTP body sent in HTTP methods that support it e.g. POST'\n\n)\n"}]}
1427
+ {"messages":[{"role":"user","content":"PWN::Plugins::HackerOne.create_report Usage"},{"role":"assistant","content":"`PWN::Plugins::HackerOne.create_report`: Supported Method Parameters\n\nreport = PWN::Plugins::HackerOne.create_report(\n\nteam_handle: 'required - program handle',\ntitle: 'required - report title',\nvulnerability_information: 'required - detailed description',\nimpact: 'optional - impact text',\nseverity_rating: 'optional - none|low|medium|high|critical',\nweakness_id: 'optional - weakness id integer',\nstructured_scope_id: 'optional - structured scope id',\nbody: 'optional - full JSON:API body Hash (overrides attribute kwargs)',\nusername: 'optional', api_key: 'optional', h1_obj: 'optional'\n\n)\n"}]}
1428
+ {"messages":[{"role":"user","content":"PWN::Plugins::HackerOne.create_report_intent Usage"},{"role":"assistant","content":"`PWN::Plugins::HackerOne.create_report_intent`: Supported Method Parameters\n\nintent = PWN::Plugins::HackerOne.create_report_intent(\n\nbody: 'required - full JSON:API body Hash',\nusername: 'optional', api_key: 'optional', h1_obj: 'optional'\n\n)\n"}]}
1429
+ {"messages":[{"role":"user","content":"PWN::Plugins::HackerOne.creds_from Usage"},{"role":"assistant","content":"`PWN::Plugins::HackerOne.creds_from`: "}]}
1430
+ {"messages":[{"role":"user","content":"PWN::Plugins::HackerOne.delete_report_intent Usage"},{"role":"assistant","content":"`PWN::Plugins::HackerOne.delete_report_intent`: Supported Method Parameters\n\nresult = PWN::Plugins::HackerOne.delete_report_intent(\n\nid: 'required - report intent id',\nusername: 'optional', api_key: 'optional', h1_obj: 'optional'\n\n)\n"}]}
1431
+ {"messages":[{"role":"user","content":"PWN::Plugins::HackerOne.delete_report_intent_attachment Usage"},{"role":"assistant","content":"`PWN::Plugins::HackerOne.delete_report_intent_attachment`: Supported Method Parameters\n\nresult = PWN::Plugins::HackerOne.delete_report_intent_attachment(\n\nreport_intent_id: 'required - report intent id',\nid: 'required - attachment id',\nusername: 'optional', api_key: 'optional', h1_obj: 'optional'\n\n)\n"}]}
1432
+ {"messages":[{"role":"user","content":"PWN::Plugins::HackerOne.get_balance Usage"},{"role":"assistant","content":"`PWN::Plugins::HackerOne.get_balance`: Supported Method Parameters\n\nbalance = PWN::Plugins::HackerOne.get_balance(\n\nusername: 'optional', api_key: 'optional', h1_obj: 'optional'\n\n)\n"}]}
1433
+ {"messages":[{"role":"user","content":"PWN::Plugins::HackerOne.get_earnings Usage"},{"role":"assistant","content":"`PWN::Plugins::HackerOne.get_earnings`: Supported Method Parameters\n\nearnings = PWN::Plugins::HackerOne.get_earnings(\n\nparams: 'optional - query params Hash',\nusername: 'optional', api_key: 'optional', h1_obj: 'optional'\n\n)\n"}]}
1434
+ {"messages":[{"role":"user","content":"PWN::Plugins::HackerOne.get_hacktivity Usage"},{"role":"assistant","content":"`PWN::Plugins::HackerOne.get_hacktivity`: Supported Method Parameters\n\nitems = PWN::Plugins::HackerOne.get_hacktivity(\n\nparams: 'optional - query params Hash',\nusername: 'optional', api_key: 'optional', h1_obj: 'optional'\n\n)\n"}]}
1435
+ {"messages":[{"role":"user","content":"PWN::Plugins::HackerOne.get_me_reports Usage"},{"role":"assistant","content":"`PWN::Plugins::HackerOne.get_me_reports`: Supported Method Parameters\n\nreports = PWN::Plugins::HackerOne.get_me_reports(\n\nparams: 'optional - query params Hash (e.g. page/filter)',\nusername: 'optional', api_key: 'optional', h1_obj: 'optional'\n\n)\n"}]}
1436
+ {"messages":[{"role":"user","content":"PWN::Plugins::HackerOne.get_payouts Usage"},{"role":"assistant","content":"`PWN::Plugins::HackerOne.get_payouts`: Supported Method Parameters\n\npayouts = PWN::Plugins::HackerOne.get_payouts(\n\nparams: 'optional - query params Hash',\nusername: 'optional', api_key: 'optional', h1_obj: 'optional'\n\n)\n"}]}
1437
+ {"messages":[{"role":"user","content":"PWN::Plugins::HackerOne.get_program Usage"},{"role":"assistant","content":"`PWN::Plugins::HackerOne.get_program`: Supported Method Parameters\n\nprogram = PWN::Plugins::HackerOne.get_program(\n\nhandle: 'required - program handle',\nusername: 'optional', api_key: 'optional', h1_obj: 'optional'\n\n)\n"}]}
1438
+ {"messages":[{"role":"user","content":"PWN::Plugins::HackerOne.get_programs Usage"},{"role":"assistant","content":"`PWN::Plugins::HackerOne.get_programs`: Supported Method Parameters\n\nprograms = PWN::Plugins::HackerOne.get_programs(\n\nparams: 'optional - query params Hash',\nusername: 'optional', api_key: 'optional', h1_obj: 'optional'\n\n)\n"}]}
1439
+ {"messages":[{"role":"user","content":"PWN::Plugins::HackerOne.get_report Usage"},{"role":"assistant","content":"`PWN::Plugins::HackerOne.get_report`: Supported Method Parameters\n\nreport = PWN::Plugins::HackerOne.get_report(\n\nid: 'required - report id',\nusername: 'optional', api_key: 'optional', h1_obj: 'optional'\n\n)\n"}]}
1440
+ {"messages":[{"role":"user","content":"PWN::Plugins::HackerOne.get_report_intent Usage"},{"role":"assistant","content":"`PWN::Plugins::HackerOne.get_report_intent`: Supported Method Parameters\n\nintent = PWN::Plugins::HackerOne.get_report_intent(\n\nid: 'required - report intent id',\nusername: 'optional', api_key: 'optional', h1_obj: 'optional'\n\n)\n"}]}
1441
+ {"messages":[{"role":"user","content":"PWN::Plugins::HackerOne.get_report_intent_attachments Usage"},{"role":"assistant","content":"`PWN::Plugins::HackerOne.get_report_intent_attachments`: Supported Method Parameters\n\nattachments = PWN::Plugins::HackerOne.get_report_intent_attachments(\n\nreport_intent_id: 'required - report intent id',\nusername: 'optional', api_key: 'optional', h1_obj: 'optional'\n\n)\n"}]}
1442
+ {"messages":[{"role":"user","content":"PWN::Plugins::HackerOne.get_report_intents Usage"},{"role":"assistant","content":"`PWN::Plugins::HackerOne.get_report_intents`: Supported Method Parameters\n\nintents = PWN::Plugins::HackerOne.get_report_intents(\n\nparams: 'optional',\nusername: 'optional', api_key: 'optional', h1_obj: 'optional'\n\n)\n"}]}
1443
+ {"messages":[{"role":"user","content":"PWN::Plugins::HackerOne.get_scope_exclusions Usage"},{"role":"assistant","content":"`PWN::Plugins::HackerOne.get_scope_exclusions`: Supported Method Parameters\n\nexclusions = PWN::Plugins::HackerOne.get_scope_exclusions(\n\nhandle: 'required - program handle',\nparams: 'optional',\nusername: 'optional', api_key: 'optional', h1_obj: 'optional'\n\n)\n"}]}
1444
+ {"messages":[{"role":"user","content":"PWN::Plugins::HackerOne.get_structured_scopes Usage"},{"role":"assistant","content":"`PWN::Plugins::HackerOne.get_structured_scopes`: Supported Method Parameters\n\nscopes = PWN::Plugins::HackerOne.get_structured_scopes(\n\nhandle: 'required - program handle',\nparams: 'optional',\nusername: 'optional', api_key: 'optional', h1_obj: 'optional'\n\n)\n"}]}
1445
+ {"messages":[{"role":"user","content":"PWN::Plugins::HackerOne.get_weaknesses Usage"},{"role":"assistant","content":"`PWN::Plugins::HackerOne.get_weaknesses`: Supported Method Parameters\n\nweaknesses = PWN::Plugins::HackerOne.get_weaknesses(\n\nhandle: 'required - program handle',\nparams: 'optional',\nusername: 'optional', api_key: 'optional', h1_obj: 'optional'\n\n)\n"}]}
1446
+ {"messages":[{"role":"user","content":"PWN::Plugins::HackerOne.h1_rest_call Usage"},{"role":"assistant","content":"`PWN::Plugins::HackerOne.h1_rest_call`: Supported Method Parameters\n\nh1_rest_call(\n\nhttp_method: 'optional HTTP method (defaults to GET)',\nrest_call: 'required rest path relative to /v1/hackers (e.g. \"me/reports\")',\nparams: 'optional query params Hash',\nhttp_body: 'optional HTTP body (Hash/Array auto-JSONified; String passed through)',\nusername: 'optional - HackerOne username (default PWN::Env)',\napi_key: 'optional - HackerOne API token (default PWN::Env)',\nraw: 'optional - return raw RestClient::Response (default false)'\n\n)\n"}]}
1427
1447
  {"messages":[{"role":"user","content":"PWN::Plugins::HackerOne.help Usage"},{"role":"assistant","content":"`PWN::Plugins::HackerOne.help`: "}]}
1428
- {"messages":[{"role":"user","content":"PWN::Plugins::HackerOne.login Usage"},{"role":"assistant","content":"`PWN::Plugins::HackerOne.login`: Supported Method Parameters\n\nh1_obj = PWN::Plugins::HackerOne.login(\n\nusername: 'required - username',\ntoken: 'optional - api token (will prompt if nil)'\n\n)\n"}]}
1429
- {"messages":[{"role":"user","content":"PWN::Plugins::HackerOne.logout Usage"},{"role":"assistant","content":"`PWN::Plugins::HackerOne.logout`: Supported Method Parameters\n\nPWN::Plugins::HackerOne.logout(\n\nh1_obj: 'required h1_obj returned from #login method'\n\n)\n"}]}
1448
+ {"messages":[{"role":"user","content":"PWN::Plugins::HackerOne.login Usage"},{"role":"assistant","content":"`PWN::Plugins::HackerOne.login`: Supported Method Parameters\n\nh1_obj = PWN::Plugins::HackerOne.login(\n\nusername: 'optional - username (default PWN::Env[:plugins][:hackerone][:username])',\napi_key: 'optional - api token (default PWN::Env; will prompt if still nil)',\ntoken: 'optional - alias for api_key'\n\n) Backward-compatible session object. Auth is HTTP Basic on every subsequent call; login simply resolves + validates credentials against me/reports.\n"}]}
1449
+ {"messages":[{"role":"user","content":"PWN::Plugins::HackerOne.logout Usage"},{"role":"assistant","content":"`PWN::Plugins::HackerOne.logout`: Supported Method Parameters\n\nPWN::Plugins::HackerOne.logout(\n\nh1_obj: 'required h1_obj returned from #login method'\n\n) Clears the session hash in-place (no server-side session to destroy).\n"}]}
1450
+ {"messages":[{"role":"user","content":"PWN::Plugins::HackerOne.resolve_api_key Usage"},{"role":"assistant","content":"`PWN::Plugins::HackerOne.resolve_api_key`: "}]}
1451
+ {"messages":[{"role":"user","content":"PWN::Plugins::HackerOne.resolve_username Usage"},{"role":"assistant","content":"`PWN::Plugins::HackerOne.resolve_username`: "}]}
1452
+ {"messages":[{"role":"user","content":"PWN::Plugins::HackerOne.submit_report_intent Usage"},{"role":"assistant","content":"`PWN::Plugins::HackerOne.submit_report_intent`: Supported Method Parameters\n\nresult = PWN::Plugins::HackerOne.submit_report_intent(\n\nid: 'required - report intent id',\nbody: 'optional - JSON:API body Hash',\nusername: 'optional', api_key: 'optional', h1_obj: 'optional'\n\n)\n"}]}
1453
+ {"messages":[{"role":"user","content":"PWN::Plugins::HackerOne.update_report_intent Usage"},{"role":"assistant","content":"`PWN::Plugins::HackerOne.update_report_intent`: Supported Method Parameters\n\nintent = PWN::Plugins::HackerOne.update_report_intent(\n\nid: 'required - report intent id',\nbody: 'required - full JSON:API body Hash',\nusername: 'optional', api_key: 'optional', h1_obj: 'optional'\n\n)\n"}]}
1430
1454
  {"messages":[{"role":"user","content":"PWN::Plugins::Hunter.authors Usage"},{"role":"assistant","content":"`PWN::Plugins::Hunter.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
1431
1455
  {"messages":[{"role":"user","content":"PWN::Plugins::Hunter.help Usage"},{"role":"assistant","content":"`PWN::Plugins::Hunter.help`: "}]}
1432
1456
  {"messages":[{"role":"user","content":"PWN::Plugins::Hunter.hunter_rest_call Usage"},{"role":"assistant","content":"`PWN::Plugins::Hunter.hunter_rest_call`: Supported Method Parameters\n\nhunter_rest_call(\n\nhttp_method: 'optional HTTP method (defaults to GET)\nrest_call: 'required rest call to make per the schema',\nparams: 'optional params passed in the URI or HTTP Headers',\nhttp_body: 'optional HTTP body sent in HTTP methods that support it e.g. POST'\n\n)\n"}]}
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pwn
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.652
4
+ version: 0.5.655
5
5
  platform: ruby
6
6
  authors:
7
7
  - 0day Inc.
@@ -15,14 +15,14 @@ dependencies:
15
15
  requirements:
16
16
  - - "<"
17
17
  - !ruby/object:Gem::Version
18
- version: 8.1.3
18
+ version: 8.1.3.1
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - "<"
24
24
  - !ruby/object:Gem::Version
25
- version: 8.1.3
25
+ version: 8.1.3.1
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: anemone
28
28
  requirement: !ruby/object:Gem::Requirement
@@ -463,14 +463,14 @@ dependencies:
463
463
  requirements:
464
464
  - - '='
465
465
  - !ruby/object:Gem::Version
466
- version: 0.7.2
466
+ version: 0.8.0
467
467
  type: :development
468
468
  prerelease: false
469
469
  version_requirements: !ruby/object:Gem::Requirement
470
470
  requirements:
471
471
  - - '='
472
472
  - !ruby/object:Gem::Version
473
- version: 0.7.2
473
+ version: 0.8.0
474
474
  - !ruby/object:Gem::Dependency
475
475
  name: luhn
476
476
  requirement: !ruby/object:Gem::Requirement
@@ -505,28 +505,28 @@ dependencies:
505
505
  requirements:
506
506
  - - '='
507
507
  - !ruby/object:Gem::Version
508
- version: 1.0.0
508
+ version: 1.1.0
509
509
  type: :runtime
510
510
  prerelease: false
511
511
  version_requirements: !ruby/object:Gem::Requirement
512
512
  requirements:
513
513
  - - '='
514
514
  - !ruby/object:Gem::Version
515
- version: 1.0.0
515
+ version: 1.1.0
516
516
  - !ruby/object:Gem::Dependency
517
517
  name: meshtastic
518
518
  requirement: !ruby/object:Gem::Requirement
519
519
  requirements:
520
520
  - - '='
521
521
  - !ruby/object:Gem::Version
522
- version: 0.0.172
522
+ version: 0.0.173
523
523
  type: :development
524
524
  prerelease: false
525
525
  version_requirements: !ruby/object:Gem::Requirement
526
526
  requirements:
527
527
  - - '='
528
528
  - !ruby/object:Gem::Version
529
- version: 0.0.172
529
+ version: 0.0.173
530
530
  - !ruby/object:Gem::Dependency
531
531
  name: metasm
532
532
  requirement: !ruby/object:Gem::Requirement
@@ -897,14 +897,14 @@ dependencies:
897
897
  requirements:
898
898
  - - '='
899
899
  - !ruby/object:Gem::Version
900
- version: 7.0.5
900
+ version: 7.1.0
901
901
  type: :development
902
902
  prerelease: false
903
903
  version_requirements: !ruby/object:Gem::Requirement
904
904
  requirements:
905
905
  - - '='
906
906
  - !ruby/object:Gem::Version
907
- version: 7.0.5
907
+ version: 7.1.0
908
908
  - !ruby/object:Gem::Dependency
909
909
  name: rqrcode
910
910
  requirement: !ruby/object:Gem::Requirement
@@ -953,14 +953,14 @@ dependencies:
953
953
  requirements:
954
954
  - - '='
955
955
  - !ruby/object:Gem::Version
956
- version: 1.88.2
956
+ version: 1.89.0
957
957
  type: :runtime
958
958
  prerelease: false
959
959
  version_requirements: !ruby/object:Gem::Requirement
960
960
  requirements:
961
961
  - - '='
962
962
  - !ruby/object:Gem::Version
963
- version: 1.88.2
963
+ version: 1.89.0
964
964
  - !ruby/object:Gem::Dependency
965
965
  name: rubocop-rake
966
966
  requirement: !ruby/object:Gem::Requirement