ronin-exploits 1.0.0.beta2 → 1.0.0
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/.github/workflows/ruby.yml +1 -0
- data/README.md +29 -13
- data/gemspec.yml +10 -8
- data/lib/ronin/exploits/cli/commands/new.rb +1 -1
- data/lib/ronin/exploits/cli/commands/run.rb +55 -5
- data/lib/ronin/exploits/exploit.rb +7 -5
- data/lib/ronin/exploits/lfi.rb +1 -1
- data/lib/ronin/exploits/metadata/arch.rb +1 -1
- data/lib/ronin/exploits/metadata/default_filename.rb +1 -1
- data/lib/ronin/exploits/metadata/default_port.rb +1 -1
- data/lib/ronin/exploits/mixins/file_builder.rb +2 -2
- data/lib/ronin/exploits/mixins/nops.rb +1 -1
- data/lib/ronin/exploits/params/base_url.rb +1 -1
- data/lib/ronin/exploits/version.rb +1 -1
- data/ronin-exploits.gemspec +2 -1
- metadata +24 -129
- data/spec/advisory_spec.rb +0 -71
- data/spec/cli/exploit_command_spec.rb +0 -68
- data/spec/cli/exploit_methods_spec.rb +0 -208
- data/spec/cli/ruby_shell_spec.rb +0 -14
- data/spec/client_side_web_vuln_spec.rb +0 -117
- data/spec/exploit_spec.rb +0 -538
- data/spec/exploits_spec.rb +0 -8
- data/spec/heap_overflow_spec.rb +0 -14
- data/spec/lfi_spec.rb +0 -162
- data/spec/loot/file_spec.rb +0 -131
- data/spec/loot_spec.rb +0 -138
- data/spec/memory_corruption_spec.rb +0 -22
- data/spec/metadata/arch_spec.rb +0 -82
- data/spec/metadata/cookie_param_spec.rb +0 -67
- data/spec/metadata/default_filename_spec.rb +0 -62
- data/spec/metadata/default_port_spec.rb +0 -62
- data/spec/metadata/header_name_spec.rb +0 -67
- data/spec/metadata/os_spec.rb +0 -164
- data/spec/metadata/shouts_spec.rb +0 -100
- data/spec/metadata/url_path_spec.rb +0 -67
- data/spec/metadata/url_query_param_spec.rb +0 -67
- data/spec/mixins/binary_spec.rb +0 -129
- data/spec/mixins/build_dir.rb +0 -66
- data/spec/mixins/file_builder_spec.rb +0 -67
- data/spec/mixins/format_string_spec.rb +0 -44
- data/spec/mixins/has_payload_spec.rb +0 -333
- data/spec/mixins/has_targets_spec.rb +0 -434
- data/spec/mixins/html_spec.rb +0 -772
- data/spec/mixins/http_spec.rb +0 -1227
- data/spec/mixins/loot_spec.rb +0 -20
- data/spec/mixins/nops_spec.rb +0 -165
- data/spec/mixins/remote_tcp_spec.rb +0 -217
- data/spec/mixins/remote_udp_spec.rb +0 -217
- data/spec/mixins/seh_spec.rb +0 -89
- data/spec/mixins/stack_overflow_spec.rb +0 -87
- data/spec/mixins/text_spec.rb +0 -43
- data/spec/open_redirect_spec.rb +0 -71
- data/spec/params/base_url_spec.rb +0 -71
- data/spec/params/bind_host_spec.rb +0 -34
- data/spec/params/bind_port_spec.rb +0 -35
- data/spec/params/filename_spec.rb +0 -77
- data/spec/params/host_spec.rb +0 -34
- data/spec/params/port_spec.rb +0 -77
- data/spec/rfi_spec.rb +0 -107
- data/spec/seh_overflow_spec.rb +0 -18
- data/spec/spec_helper.rb +0 -8
- data/spec/sqli_spec.rb +0 -306
- data/spec/ssti_spec.rb +0 -121
- data/spec/stack_overflow_spec.rb +0 -18
- data/spec/target_spec.rb +0 -92
- data/spec/test_result_spec.rb +0 -32
- data/spec/use_after_free_spec.rb +0 -14
- data/spec/web_spec.rb +0 -12
- data/spec/web_vuln_spec.rb +0 -854
- data/spec/xss_spec.rb +0 -69
@@ -1,117 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'ronin/exploits/client_side_web_vuln'
|
3
|
-
require 'ronin/vulns/web_vuln'
|
4
|
-
|
5
|
-
describe Ronin::Exploits::ClientSideWebVuln do
|
6
|
-
module TestClientSideWebVuln
|
7
|
-
class TestExploit < Ronin::Exploits::ClientSideWebVuln
|
8
|
-
base_path '/Templatize.asp'
|
9
|
-
query_param 'item'
|
10
|
-
|
11
|
-
def vuln
|
12
|
-
@vuln ||= Ronin::Vulns::WebVuln.new(url, **web_vuln_kwargs)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
let(:exploit_class) { TestClientSideWebVuln::TestExploit }
|
18
|
-
let(:base_url) { 'http://testasp.vulnweb.com/' }
|
19
|
-
let(:query) { 'item=html/about.html' }
|
20
|
-
let(:query_param) { 'item' }
|
21
|
-
let(:payload) { 'test payload' }
|
22
|
-
|
23
|
-
subject do
|
24
|
-
exploit_class.new(
|
25
|
-
payload: payload,
|
26
|
-
params: {
|
27
|
-
base_url: base_url
|
28
|
-
}
|
29
|
-
)
|
30
|
-
end
|
31
|
-
|
32
|
-
it "must define a 'format' param" do
|
33
|
-
expect(described_class.params[:format]).to_not be(nil)
|
34
|
-
expect(described_class.params[:format].type).to be_kind_of(Ronin::Core::Params::Types::Enum)
|
35
|
-
expect(described_class.params[:format].type.values).to eq([:http, :curl])
|
36
|
-
expect(described_class.params[:format].desc).to eq('Output format')
|
37
|
-
end
|
38
|
-
|
39
|
-
describe "#format_exploit" do
|
40
|
-
context "when the 'format' param is :http" do
|
41
|
-
subject do
|
42
|
-
exploit_class.new(
|
43
|
-
payload: payload,
|
44
|
-
params: {
|
45
|
-
base_url: base_url,
|
46
|
-
format: :http
|
47
|
-
}
|
48
|
-
)
|
49
|
-
end
|
50
|
-
|
51
|
-
it "must call #to_http on the #vuln object" do
|
52
|
-
expect(subject.format_exploit).to eq(subject.vuln.to_http(payload))
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
context "when the 'format' param is :curl" do
|
57
|
-
subject do
|
58
|
-
exploit_class.new(
|
59
|
-
payload: payload,
|
60
|
-
params: {
|
61
|
-
base_url: base_url,
|
62
|
-
format: :curl
|
63
|
-
}
|
64
|
-
)
|
65
|
-
end
|
66
|
-
|
67
|
-
it "must call #to_curl on the #vuln object" do
|
68
|
-
expect(subject.format_exploit).to eq(subject.vuln.to_curl(payload))
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
describe "#launch" do
|
74
|
-
context "when the 'format' param is :http" do
|
75
|
-
subject do
|
76
|
-
exploit_class.new(
|
77
|
-
payload: payload,
|
78
|
-
params: {
|
79
|
-
base_url: base_url,
|
80
|
-
format: :http
|
81
|
-
}
|
82
|
-
)
|
83
|
-
end
|
84
|
-
|
85
|
-
it "must print out a message and the exploit formatted as an HTTP request" do
|
86
|
-
expect(subject).to receive(:print_info).with("Copy and paste the following exploit:")
|
87
|
-
expect(subject).to receive(:puts)
|
88
|
-
expect(subject).to receive(:puts).with(subject.vuln.to_http(payload))
|
89
|
-
expect(subject).to receive(:puts)
|
90
|
-
|
91
|
-
subject.launch
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
context "when the 'format' param is :curl" do
|
96
|
-
subject do
|
97
|
-
exploit_class.new(
|
98
|
-
payload: payload,
|
99
|
-
params: {
|
100
|
-
base_url: base_url,
|
101
|
-
format: :curl
|
102
|
-
}
|
103
|
-
)
|
104
|
-
end
|
105
|
-
|
106
|
-
|
107
|
-
it "must print out a message and the exploit formatted as an HTTP request" do
|
108
|
-
expect(subject).to receive(:print_info).with("Copy and paste the following exploit:")
|
109
|
-
expect(subject).to receive(:puts)
|
110
|
-
expect(subject).to receive(:puts).with(subject.vuln.to_curl(payload))
|
111
|
-
expect(subject).to receive(:puts)
|
112
|
-
|
113
|
-
subject.launch
|
114
|
-
end
|
115
|
-
end
|
116
|
-
end
|
117
|
-
end
|
data/spec/exploit_spec.rb
DELETED
@@ -1,538 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'ronin/exploits/exploit'
|
3
|
-
|
4
|
-
describe Ronin::Exploits::Exploit do
|
5
|
-
it "must include Ronin::Core::Metadata::ID" do
|
6
|
-
expect(described_class).to include(Ronin::Core::Metadata::ID)
|
7
|
-
end
|
8
|
-
|
9
|
-
it "must include Ronin::Core::Metadata::Authors" do
|
10
|
-
expect(described_class).to include(Ronin::Core::Metadata::Authors)
|
11
|
-
end
|
12
|
-
|
13
|
-
it "must include Ronin::Core::Metadata::Summary" do
|
14
|
-
expect(described_class).to include(Ronin::Core::Metadata::Summary)
|
15
|
-
end
|
16
|
-
|
17
|
-
it "must include Ronin::Core::Metadata::Description" do
|
18
|
-
expect(described_class).to include(Ronin::Core::Metadata::Description)
|
19
|
-
end
|
20
|
-
|
21
|
-
it "must include Ronin::Core::Metadata::References" do
|
22
|
-
expect(described_class).to include(Ronin::Core::Metadata::References)
|
23
|
-
end
|
24
|
-
|
25
|
-
it "must include Ronin::Core::Params::Mixin" do
|
26
|
-
expect(described_class).to include(Ronin::Core::Params::Mixin)
|
27
|
-
end
|
28
|
-
|
29
|
-
it "must include Ronin::Support::CLI::Printing" do
|
30
|
-
expect(described_class).to include(Ronin::Support::CLI::Printing)
|
31
|
-
end
|
32
|
-
|
33
|
-
describe ".register" do
|
34
|
-
context "when .register is not called in the Exploit class" do
|
35
|
-
module TestExploits
|
36
|
-
class UnregisteredExploit < Ronin::Exploits::Exploit
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
subject { TestExploits::UnregisteredExploit }
|
41
|
-
|
42
|
-
it "must not set .id" do
|
43
|
-
expect(subject.id).to be(nil)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
context "when .register is called in the Exploit class" do
|
48
|
-
module TestExploits
|
49
|
-
class RegisteredExploit < Ronin::Exploits::Exploit
|
50
|
-
register 'registered_exploit'
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
subject { TestExploits::RegisteredExploit }
|
55
|
-
|
56
|
-
it "must set .id" do
|
57
|
-
expect(subject.id).to eq('registered_exploit')
|
58
|
-
end
|
59
|
-
|
60
|
-
it "must add the exploit class to Exploits.registry" do
|
61
|
-
expect(Ronin::Exploits.registry['registered_exploit']).to be(subject)
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
describe ".quality" do
|
67
|
-
context "when the quality is not set in the Exploit class" do
|
68
|
-
module TestExploits
|
69
|
-
class ExploitWithoutQuality < Ronin::Exploits::Exploit
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
subject { TestExploits::ExploitWithoutQuality }
|
74
|
-
|
75
|
-
it "must default to nil" do
|
76
|
-
expect(subject.quality).to be(nil)
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
context "when the quality is set in the Exploit class" do
|
81
|
-
module TestExploits
|
82
|
-
class ExploitWithQuality < Ronin::Exploits::Exploit
|
83
|
-
quality :high
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
subject { TestExploits::ExploitWithQuality }
|
88
|
-
|
89
|
-
it "must return the set quality" do
|
90
|
-
expect(subject.quality).to be(:high)
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
describe ".release_date" do
|
96
|
-
context "when the release_date is not set in the Exploit class" do
|
97
|
-
module TestExploits
|
98
|
-
class ExploitWithoutReleaseDate < Ronin::Exploits::Exploit
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
subject { TestExploits::ExploitWithoutReleaseDate }
|
103
|
-
|
104
|
-
it "must default to nil" do
|
105
|
-
expect(subject.release_date).to be(nil)
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
context "when the release_date is set in the Exploit class" do
|
110
|
-
module TestExploits
|
111
|
-
class ExploitWithReleaseDate < Ronin::Exploits::Exploit
|
112
|
-
release_date '2022-01-02'
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
subject { TestExploits::ExploitWithReleaseDate }
|
117
|
-
|
118
|
-
it "must return the set release_date as a Date object" do
|
119
|
-
expect(subject.release_date).to be_kind_of(Date)
|
120
|
-
expect(subject.release_date.year).to eq(2022)
|
121
|
-
expect(subject.release_date.month).to eq(1)
|
122
|
-
expect(subject.release_date.day).to eq(2)
|
123
|
-
end
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
describe ".released?" do
|
128
|
-
context "when the release_date is not set in the Exploit class" do
|
129
|
-
module TestExploits
|
130
|
-
class ExploitWithoutReleaseDate < Ronin::Exploits::Exploit
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
subject { TestExploits::ExploitWithoutReleaseDate }
|
135
|
-
|
136
|
-
it "must return false" do
|
137
|
-
expect(subject.released?).to be(false)
|
138
|
-
end
|
139
|
-
end
|
140
|
-
|
141
|
-
context "when the release_date is set in the Exploit class" do
|
142
|
-
module TestExploits
|
143
|
-
class ExploitWithReleaseDate < Ronin::Exploits::Exploit
|
144
|
-
release_date '2022-01-02'
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
subject { TestExploits::ExploitWithReleaseDate }
|
149
|
-
|
150
|
-
it "must return true" do
|
151
|
-
expect(subject.released?).to be(true)
|
152
|
-
end
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
describe ".disclosure_date" do
|
157
|
-
context "when the disclosure_date is not set in the Exploit class" do
|
158
|
-
module TestExploits
|
159
|
-
class ExploitWithoutDisclosureDate < Ronin::Exploits::Exploit
|
160
|
-
end
|
161
|
-
end
|
162
|
-
|
163
|
-
subject { TestExploits::ExploitWithoutDisclosureDate }
|
164
|
-
|
165
|
-
it "must default to nil" do
|
166
|
-
expect(subject.disclosure_date).to be(nil)
|
167
|
-
end
|
168
|
-
end
|
169
|
-
|
170
|
-
context "when the disclosure_date is set in the Exploit class" do
|
171
|
-
module TestExploits
|
172
|
-
class ExploitWithDisclosureDate < Ronin::Exploits::Exploit
|
173
|
-
disclosure_date '2022-01-02'
|
174
|
-
end
|
175
|
-
end
|
176
|
-
|
177
|
-
subject { TestExploits::ExploitWithDisclosureDate }
|
178
|
-
|
179
|
-
it "must return the set disclosure_date as a Date object" do
|
180
|
-
expect(subject.disclosure_date).to be_kind_of(Date)
|
181
|
-
expect(subject.disclosure_date.year).to eq(2022)
|
182
|
-
expect(subject.disclosure_date.month).to eq(1)
|
183
|
-
expect(subject.disclosure_date.day).to eq(2)
|
184
|
-
end
|
185
|
-
end
|
186
|
-
end
|
187
|
-
|
188
|
-
describe ".disclosed?" do
|
189
|
-
context "when the disclosure_date is not set in the Exploit class" do
|
190
|
-
module TestExploits
|
191
|
-
class ExploitWithoutDisclosureDate < Ronin::Exploits::Exploit
|
192
|
-
end
|
193
|
-
end
|
194
|
-
|
195
|
-
subject { TestExploits::ExploitWithoutDisclosureDate }
|
196
|
-
|
197
|
-
it "must return false" do
|
198
|
-
expect(subject.disclosed?).to be(false)
|
199
|
-
end
|
200
|
-
end
|
201
|
-
|
202
|
-
context "when the disclosure_date is set in the Exploit class" do
|
203
|
-
module TestExploits
|
204
|
-
class ExploitWithDisclosureDate < Ronin::Exploits::Exploit
|
205
|
-
disclosure_date '2022-01-02'
|
206
|
-
end
|
207
|
-
end
|
208
|
-
|
209
|
-
subject { TestExploits::ExploitWithDisclosureDate }
|
210
|
-
|
211
|
-
it "must return true" do
|
212
|
-
expect(subject.disclosed?).to be(true)
|
213
|
-
end
|
214
|
-
end
|
215
|
-
end
|
216
|
-
|
217
|
-
describe ".advisries" do
|
218
|
-
module TestExploits
|
219
|
-
class ExploitWithEmptyAdvisories < Ronin::Exploits::Exploit
|
220
|
-
end
|
221
|
-
end
|
222
|
-
|
223
|
-
subject { TestExploits::ExploitWithEmptyAdvisories }
|
224
|
-
|
225
|
-
it "must default to an empty Set" do
|
226
|
-
expect(subject.advisories).to eq(Set[])
|
227
|
-
end
|
228
|
-
end
|
229
|
-
|
230
|
-
describe ".advisory" do
|
231
|
-
module TestExploits
|
232
|
-
class ExploitWithAdvisories < Ronin::Exploits::Exploit
|
233
|
-
advisory 'CVE-2022-1234'
|
234
|
-
end
|
235
|
-
end
|
236
|
-
|
237
|
-
subject { TestExploits::ExploitWithAdvisories }
|
238
|
-
|
239
|
-
it "must add an Ronin::Exploits::Advisory object to .advisories" do
|
240
|
-
expect(subject.advisories).to_not be_empty
|
241
|
-
expect(subject.advisories).to all(be_kind_of(Ronin::Exploits::Advisory))
|
242
|
-
end
|
243
|
-
|
244
|
-
context "when no URL is given" do
|
245
|
-
context "and the advisory ID begins with 'CVE-' or 'GHSA-'" do
|
246
|
-
let(:advisory) { subject.advisories.first }
|
247
|
-
|
248
|
-
it "must generate the URL based on the advisory ID" do
|
249
|
-
expect(advisory.url).to eq("https://nvd.nist.gov/vuln/detail/CVE-2022-1234")
|
250
|
-
end
|
251
|
-
end
|
252
|
-
|
253
|
-
context "but the advisory ID does is not from a recognized vendor" do
|
254
|
-
module TestExploits
|
255
|
-
class ExploitWithUnrecognizedAdvisoryID < Ronin::Exploits::Exploit
|
256
|
-
advisory 'FOO-12345'
|
257
|
-
end
|
258
|
-
end
|
259
|
-
|
260
|
-
subject { TestExploits::ExploitWithUnrecognizedAdvisoryID }
|
261
|
-
|
262
|
-
let(:advisory) { subject.advisories.first }
|
263
|
-
|
264
|
-
it "must default the advisory URL to nil" do
|
265
|
-
expect(advisory.url).to be(nil)
|
266
|
-
end
|
267
|
-
end
|
268
|
-
end
|
269
|
-
|
270
|
-
context "when a URL is given with the advisory ID" do
|
271
|
-
module TestExploits
|
272
|
-
class ExploitWithAdvisoryIDAndURL < Ronin::Exploits::Exploit
|
273
|
-
advisory 'FOO-12345', 'https://www.foosec.org/FOO-12345'
|
274
|
-
end
|
275
|
-
end
|
276
|
-
|
277
|
-
subject { TestExploits::ExploitWithAdvisoryIDAndURL }
|
278
|
-
|
279
|
-
let(:advisory) { subject.advisories.first }
|
280
|
-
|
281
|
-
it "must set the URL of the advisory" do
|
282
|
-
expect(advisory.url).to eq("https://www.foosec.org/FOO-12345")
|
283
|
-
end
|
284
|
-
end
|
285
|
-
end
|
286
|
-
|
287
|
-
describe ".software" do
|
288
|
-
module TestExploitSoftware
|
289
|
-
class WithNoSoftwareSet < Ronin::Exploits::Exploit
|
290
|
-
end
|
291
|
-
|
292
|
-
class WithSoftwareSet < Ronin::Exploits::Exploit
|
293
|
-
software 'TestWare'
|
294
|
-
end
|
295
|
-
|
296
|
-
class InheritsItsSoftware < WithSoftwareSet
|
297
|
-
end
|
298
|
-
|
299
|
-
class OverridesItsInheritedSoftware < WithSoftwareSet
|
300
|
-
software 'TestWare Deluxe'
|
301
|
-
end
|
302
|
-
end
|
303
|
-
|
304
|
-
subject { test_class }
|
305
|
-
|
306
|
-
context "and when software is not set in the class" do
|
307
|
-
let(:test_class) { TestExploitSoftware::WithNoSoftwareSet }
|
308
|
-
|
309
|
-
it "must default to nil" do
|
310
|
-
expect(subject.software).to be(nil)
|
311
|
-
end
|
312
|
-
end
|
313
|
-
|
314
|
-
context "and when software is set in the class" do
|
315
|
-
let(:test_class) { TestExploitSoftware::WithSoftwareSet }
|
316
|
-
|
317
|
-
it "must return the set software" do
|
318
|
-
expect(subject.software).to eq('TestWare')
|
319
|
-
end
|
320
|
-
end
|
321
|
-
|
322
|
-
context "but when the software was set in the superclass" do
|
323
|
-
let(:test_class) { TestExploitSoftware::InheritsItsSoftware }
|
324
|
-
|
325
|
-
it "must return the software set in the superclass" do
|
326
|
-
expect(subject.software).to eq('TestWare')
|
327
|
-
end
|
328
|
-
|
329
|
-
context "but the software is overridden in the sub-class" do
|
330
|
-
let(:test_class) { TestExploitSoftware::OverridesItsInheritedSoftware }
|
331
|
-
|
332
|
-
it "must return the software set in the sub-class" do
|
333
|
-
expect(subject.software).to eq('TestWare Deluxe')
|
334
|
-
end
|
335
|
-
end
|
336
|
-
end
|
337
|
-
end
|
338
|
-
|
339
|
-
describe ".software" do
|
340
|
-
module TestExploitSoftwareVersions
|
341
|
-
class WithNoSoftwareVersionsSet < Ronin::Exploits::Exploit
|
342
|
-
end
|
343
|
-
|
344
|
-
class WithSoftwareVersionsSet < Ronin::Exploits::Exploit
|
345
|
-
software_versions %w[
|
346
|
-
0.1.0
|
347
|
-
0.2.0
|
348
|
-
0.3.0
|
349
|
-
]
|
350
|
-
end
|
351
|
-
|
352
|
-
class InheritsItsSoftwareVersions < WithSoftwareVersionsSet
|
353
|
-
end
|
354
|
-
|
355
|
-
class OverridesItsInheritedSoftwareVersions < WithSoftwareVersionsSet
|
356
|
-
software_versions %w[
|
357
|
-
1.0.0
|
358
|
-
1.0.1
|
359
|
-
1.0.2
|
360
|
-
]
|
361
|
-
end
|
362
|
-
end
|
363
|
-
|
364
|
-
subject { test_class }
|
365
|
-
|
366
|
-
context "and when software versions are not set in the class" do
|
367
|
-
let(:test_class) { TestExploitSoftwareVersions::WithNoSoftwareVersionsSet }
|
368
|
-
|
369
|
-
it "must default to nil" do
|
370
|
-
expect(subject.software_versions).to be(nil)
|
371
|
-
end
|
372
|
-
end
|
373
|
-
|
374
|
-
context "and when software versions are set in the class" do
|
375
|
-
let(:test_class) { TestExploitSoftwareVersions::WithSoftwareVersionsSet }
|
376
|
-
|
377
|
-
it "must return the set software" do
|
378
|
-
expect(subject.software_versions).to eq(['0.1.0', '0.2.0', '0.3.0'])
|
379
|
-
end
|
380
|
-
end
|
381
|
-
|
382
|
-
context "but when the software versions was set in the superclass" do
|
383
|
-
let(:test_class) { TestExploitSoftwareVersions::InheritsItsSoftwareVersions }
|
384
|
-
|
385
|
-
it "must return the software versions set in the superclass" do
|
386
|
-
expect(subject.software_versions).to eq(['0.1.0', '0.2.0', '0.3.0'])
|
387
|
-
end
|
388
|
-
|
389
|
-
context "but the software versions are overridden in the sub-class" do
|
390
|
-
let(:test_class) { TestExploitSoftwareVersions::OverridesItsInheritedSoftwareVersions }
|
391
|
-
|
392
|
-
it "must return the software versions set in the sub-class" do
|
393
|
-
expect(subject.software_versions).to eq(['1.0.0', '1.0.1', '1.0.2'])
|
394
|
-
end
|
395
|
-
end
|
396
|
-
end
|
397
|
-
end
|
398
|
-
|
399
|
-
describe ".exploit_type" do
|
400
|
-
subject { described_class }
|
401
|
-
|
402
|
-
it { expect(subject.exploit_type).to eq(:exploit) }
|
403
|
-
end
|
404
|
-
|
405
|
-
describe "#perform_validate" do
|
406
|
-
it "must call #validate_params" do
|
407
|
-
expect(subject).to receive(:validate_params)
|
408
|
-
|
409
|
-
subject.perform_validate
|
410
|
-
end
|
411
|
-
|
412
|
-
it "must also call #validate" do
|
413
|
-
expect(subject).to receive(:validate)
|
414
|
-
|
415
|
-
subject.perform_validate
|
416
|
-
end
|
417
|
-
end
|
418
|
-
|
419
|
-
describe "#perform_test" do
|
420
|
-
subject { described_class.new }
|
421
|
-
|
422
|
-
it "must call #test" do
|
423
|
-
expect(subject).to receive(:test)
|
424
|
-
|
425
|
-
subject.perform_test
|
426
|
-
end
|
427
|
-
end
|
428
|
-
|
429
|
-
describe "#test" do
|
430
|
-
it "must return a Test::Unknown value" do
|
431
|
-
expect(subject.test).to be_kind_of(Ronin::Exploits::TestResult::Unknown)
|
432
|
-
expect(subject.test.message).to eq("no vulnerability testing logic defined")
|
433
|
-
end
|
434
|
-
end
|
435
|
-
|
436
|
-
describe "#build" do
|
437
|
-
subject { described_class.new }
|
438
|
-
|
439
|
-
it "must return nil by default" do
|
440
|
-
expect(subject.build).to be(nil)
|
441
|
-
end
|
442
|
-
|
443
|
-
it "must not set @payload by default" do
|
444
|
-
subject.build
|
445
|
-
|
446
|
-
expect(subject.instance_variable_get('@payload')).to be(nil)
|
447
|
-
end
|
448
|
-
end
|
449
|
-
|
450
|
-
describe "#perform_build" do
|
451
|
-
subject { described_class.new }
|
452
|
-
|
453
|
-
it "must call #build" do
|
454
|
-
expect(subject).to receive(:build)
|
455
|
-
|
456
|
-
subject.perform_build
|
457
|
-
end
|
458
|
-
end
|
459
|
-
|
460
|
-
describe "#launch" do
|
461
|
-
subject { described_class.new }
|
462
|
-
|
463
|
-
it "must return nil by default" do
|
464
|
-
expect(subject.launch).to be(nil)
|
465
|
-
end
|
466
|
-
end
|
467
|
-
|
468
|
-
describe "#perform_launch" do
|
469
|
-
subject { described_class.new }
|
470
|
-
|
471
|
-
it "must call #launch" do
|
472
|
-
expect(subject).to receive(:launch)
|
473
|
-
|
474
|
-
subject.perform_launch
|
475
|
-
end
|
476
|
-
end
|
477
|
-
|
478
|
-
describe "#cleanup" do
|
479
|
-
subject { described_class.new }
|
480
|
-
|
481
|
-
it "must return nil by default" do
|
482
|
-
expect(subject.cleanup).to be(nil)
|
483
|
-
end
|
484
|
-
end
|
485
|
-
|
486
|
-
describe "#perform_cleanup" do
|
487
|
-
subject { described_class.new }
|
488
|
-
|
489
|
-
it "must call #cleanup" do
|
490
|
-
expect(subject).to receive(:cleanup)
|
491
|
-
|
492
|
-
subject.perform_cleanup
|
493
|
-
end
|
494
|
-
end
|
495
|
-
|
496
|
-
describe "#exploit" do
|
497
|
-
it "must call #build and #launch" do
|
498
|
-
expect(subject).to receive(:build)
|
499
|
-
expect(subject).to receive(:launch)
|
500
|
-
|
501
|
-
subject.exploit
|
502
|
-
end
|
503
|
-
|
504
|
-
it "must return self" do
|
505
|
-
expect(subject.exploit).to be(subject)
|
506
|
-
end
|
507
|
-
|
508
|
-
context "when given a block" do
|
509
|
-
it "must call #build, #prelaunch, #launch, yield, then and #cleanup" do
|
510
|
-
expect(subject).to receive(:build)
|
511
|
-
expect(subject).to receive(:launch)
|
512
|
-
expect(subject).to receive(:cleanup)
|
513
|
-
|
514
|
-
expect { |b| subject.exploit(&b) }.to yield_with_args(subject)
|
515
|
-
end
|
516
|
-
end
|
517
|
-
|
518
|
-
context "when given the dry_run: true keyword argument" do
|
519
|
-
it "should not deploy during a dry-run of the exploit" do
|
520
|
-
expect(subject).to receive(:build)
|
521
|
-
expect(subject).to_not receive(:launch)
|
522
|
-
expect(subject).to_not receive(:cleanup)
|
523
|
-
|
524
|
-
subject.exploit(dry_run: true)
|
525
|
-
end
|
526
|
-
end
|
527
|
-
end
|
528
|
-
|
529
|
-
describe "#fail" do
|
530
|
-
let(:message) { "exploit failed" }
|
531
|
-
|
532
|
-
it "must raise an ExploitFailed exception with the given message" do
|
533
|
-
expect {
|
534
|
-
subject.fail(message)
|
535
|
-
}.to raise_error(Ronin::Exploits::ExploitFailed,message)
|
536
|
-
end
|
537
|
-
end
|
538
|
-
end
|
data/spec/exploits_spec.rb
DELETED
data/spec/heap_overflow_spec.rb
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'ronin/exploits/heap_overflow'
|
3
|
-
|
4
|
-
describe Ronin::Exploits::HeapOverflow do
|
5
|
-
it "must inherit from Ronin::Exploits::MemoryCorruption" do
|
6
|
-
expect(described_class).to be < Ronin::Exploits::MemoryCorruption
|
7
|
-
end
|
8
|
-
|
9
|
-
describe ".exploit_type" do
|
10
|
-
subject { described_class }
|
11
|
-
|
12
|
-
it { expect(subject.exploit_type).to eq(:heap_overflow) }
|
13
|
-
end
|
14
|
-
end
|