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 +4 -4
- data/Gemfile +6 -6
- data/lib/pwn/ai/agent/extrospection/osint/social.rb +1 -1
- data/lib/pwn/plugins/hacker_one.rb +633 -81
- data/lib/pwn/version.rb +1 -1
- data/packer/provisioners/apache2.sh +1 -0
- data/third_party/pwn_rdoc.jsonl +27 -3
- metadata +13 -13
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 6e41d71c8fc29542a4190d697603d8626138e2d2a10fba03d39637efb9103a1f
|
|
4
|
+
data.tar.gz: 3dc38eeb6c27e6e8899b5fb619f0b4d3afe9e31b3bf37ea7460197b48eac290e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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.
|
|
49
|
+
gem 'libusb', '0.8.0'
|
|
50
50
|
gem 'luhn', '3.0.0'
|
|
51
51
|
gem 'mail', '2.9.1'
|
|
52
|
-
gem 'mcp', '1.
|
|
53
|
-
gem 'meshtastic', '0.0.
|
|
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
|
|
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.
|
|
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) } ||
|
|
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
|
-
#
|
|
15
|
-
#
|
|
16
|
-
#
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
30
|
-
auth_payload[:username] = username
|
|
31
|
-
auth_payload[:token] = token
|
|
73
|
+
basic_auth_header = "Basic #{Base64.strict_encode64("#{username}:#{api_key}")}"
|
|
32
74
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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:
|
|
42
|
-
url:
|
|
43
|
-
headers:
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
}
|
|
88
|
+
method: http_method,
|
|
89
|
+
url: url,
|
|
90
|
+
headers: headers,
|
|
91
|
+
payload: http_body,
|
|
92
|
+
verify_ssl: false
|
|
47
93
|
)
|
|
48
94
|
|
|
49
|
-
|
|
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
|
-
|
|
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
|
-
#
|
|
65
|
-
#
|
|
66
|
-
#
|
|
67
|
-
#
|
|
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
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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
|
-
|
|
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
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
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
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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
|
-
|
|
109
|
-
|
|
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('
|
|
123
|
-
h1_obj
|
|
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: '
|
|
142
|
-
|
|
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
|
-
|
|
146
|
-
|
|
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
|
@@ -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}"
|
data/third_party/pwn_rdoc.jsonl
CHANGED
|
@@ -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.
|
|
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: '
|
|
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)
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
963
|
+
version: 1.89.0
|
|
964
964
|
- !ruby/object:Gem::Dependency
|
|
965
965
|
name: rubocop-rake
|
|
966
966
|
requirement: !ruby/object:Gem::Requirement
|