ronin-support 0.4.0.rc2 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog.md +6 -4
- data/README.md +1 -0
- data/lib/ronin/extensions/regexp.rb +31 -12
- data/lib/ronin/fuzzing/fuzzing.rb +164 -2
- data/lib/ronin/network.rb +1 -0
- data/lib/ronin/network/dns.rb +161 -0
- data/lib/ronin/network/http/http.rb +35 -0
- data/lib/ronin/network/mixins.rb +1 -0
- data/lib/ronin/network/mixins/dns.rb +55 -0
- data/lib/ronin/network/mixins/http.rb +35 -0
- data/lib/ronin/support/support.rb +1 -0
- data/lib/ronin/support/version.rb +1 -1
- data/spec/extensions/ip_addr_spec.rb +3 -3
- data/spec/extensions/regexp_spec.rb +385 -1
- data/spec/network/dns_spec.rb +137 -0
- data/spec/wordlist_spec.rb +1 -1
- metadata +26 -22
@@ -970,6 +970,41 @@ module Ronin
|
|
970
970
|
http_post(options).body
|
971
971
|
end
|
972
972
|
|
973
|
+
#
|
974
|
+
# Performs an HTTP PUT request.
|
975
|
+
#
|
976
|
+
# @param [Hash] options
|
977
|
+
# Additional options.
|
978
|
+
#
|
979
|
+
# @option options [String] :body
|
980
|
+
# The body for the request.
|
981
|
+
#
|
982
|
+
# @option options [Hash, String] :form_data
|
983
|
+
# The form data to send with the HTTP PUT request.
|
984
|
+
#
|
985
|
+
# @yield [response]
|
986
|
+
# If a block is given, it will be passed the response received from
|
987
|
+
# the request.
|
988
|
+
#
|
989
|
+
# @yieldparam [Net::HTTP::Response] response
|
990
|
+
# The HTTP response object.
|
991
|
+
#
|
992
|
+
# @return [Net::HTTP::Response]
|
993
|
+
# The response of the HTTP request.
|
994
|
+
#
|
995
|
+
# @see http_request
|
996
|
+
#
|
997
|
+
# @since 0.4.0
|
998
|
+
#
|
999
|
+
# @api public
|
1000
|
+
#
|
1001
|
+
def http_put(options={})
|
1002
|
+
response = http_request(options.merge(:method => :put))
|
1003
|
+
|
1004
|
+
yield response if block_given?
|
1005
|
+
return response
|
1006
|
+
end
|
1007
|
+
|
973
1008
|
#
|
974
1009
|
# Performs an HTTP Propfind request.
|
975
1010
|
#
|
data/lib/ronin/network/mixins.rb
CHANGED
@@ -0,0 +1,55 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2006-2012 Hal Brodigan (postmodern.mod3 at gmail.com)
|
3
|
+
#
|
4
|
+
# This file is part of Ronin Support.
|
5
|
+
#
|
6
|
+
# Ronin Support is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Lesser General Public License as published
|
8
|
+
# by the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# Ronin Support is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Lesser General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Lesser General Public License
|
17
|
+
# along with Ronin Support. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
#
|
19
|
+
|
20
|
+
require 'ronin/network/mixins/mixin'
|
21
|
+
require 'ronin/network/dns'
|
22
|
+
|
23
|
+
module Ronin
|
24
|
+
module Network
|
25
|
+
module Mixins
|
26
|
+
#
|
27
|
+
# Adds DNS convenience methods and parameters to a class.
|
28
|
+
#
|
29
|
+
# Defines the following parameters:
|
30
|
+
#
|
31
|
+
# * `nameserver` (`String`) - DNS nameserver to query.
|
32
|
+
#
|
33
|
+
# @since 0.4.0
|
34
|
+
#
|
35
|
+
module DNS
|
36
|
+
include Mixin, Network::DNS
|
37
|
+
|
38
|
+
parameter :nameserver, :type => String,
|
39
|
+
:description => 'DNS nameserver'
|
40
|
+
|
41
|
+
protected
|
42
|
+
|
43
|
+
#
|
44
|
+
# The DNS Resolver to use.
|
45
|
+
#
|
46
|
+
# @see DNS#dns_resolver
|
47
|
+
#
|
48
|
+
def dns_resolver(nameserver=self.nameserver)
|
49
|
+
super(nameserver)
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -549,6 +549,41 @@ module Ronin
|
|
549
549
|
return super(options,&block)
|
550
550
|
end
|
551
551
|
|
552
|
+
#
|
553
|
+
# Performs an HTTP PUT request.
|
554
|
+
#
|
555
|
+
# @param [Hash] options
|
556
|
+
# Additional options.
|
557
|
+
#
|
558
|
+
# @option options [String] :body
|
559
|
+
# The body for the request.
|
560
|
+
#
|
561
|
+
# @option options [String] :post_data
|
562
|
+
# The `POSTDATA` to send with the HTTP PUT request.
|
563
|
+
#
|
564
|
+
# @yield [response]
|
565
|
+
# If a block is given, it will be passed the response received
|
566
|
+
# from the request.
|
567
|
+
#
|
568
|
+
# @yieldparam [Net::HTTP::Response] response
|
569
|
+
# The HTTP response object.
|
570
|
+
#
|
571
|
+
# @return [Net::HTTP::Response]
|
572
|
+
# The response of the HTTP request.
|
573
|
+
#
|
574
|
+
# @see #http_request
|
575
|
+
#
|
576
|
+
# @since 0.4.0
|
577
|
+
#
|
578
|
+
# @api public
|
579
|
+
#
|
580
|
+
def http_put(options={},&block)
|
581
|
+
options = http_merge_options(options)
|
582
|
+
print_info "HTTP PUT #{http_options_to_s(options)}"
|
583
|
+
|
584
|
+
return super(options,&block)
|
585
|
+
end
|
586
|
+
|
552
587
|
#
|
553
588
|
# Performs an HTTP Propfind request.
|
554
589
|
#
|
@@ -67,7 +67,7 @@ describe IPAddr do
|
|
67
67
|
|
68
68
|
it "should extract collapsed IPv6 addresses" do
|
69
69
|
addr = 'fe80::0204:61ff:fe9d:f156'
|
70
|
-
text = "
|
70
|
+
text = "ipv6: #{addr}"
|
71
71
|
|
72
72
|
IPAddr.extract(text,:ipv6).should == [addr]
|
73
73
|
end
|
@@ -80,7 +80,7 @@ describe IPAddr do
|
|
80
80
|
end
|
81
81
|
|
82
82
|
it "should extract trailing IPv4 suffixes" do
|
83
|
-
addr = '
|
83
|
+
addr = '::ffff:192.0.2.128'
|
84
84
|
text = "#{addr} 1.1.1.1"
|
85
85
|
|
86
86
|
IPAddr.extract(text,:ipv6).should == [addr]
|
@@ -103,7 +103,7 @@ describe IPAddr do
|
|
103
103
|
end
|
104
104
|
|
105
105
|
it "should ignore non-IP addresses" do
|
106
|
-
text = 'one
|
106
|
+
text = 'one: two.three.'
|
107
107
|
|
108
108
|
IPAddr.extract(text).should be_empty
|
109
109
|
end
|
@@ -2,7 +2,31 @@ require 'spec_helper'
|
|
2
2
|
require 'ronin/extensions/regexp'
|
3
3
|
|
4
4
|
describe Regexp do
|
5
|
-
describe
|
5
|
+
describe "OCTET" do
|
6
|
+
subject { Regexp::OCTET }
|
7
|
+
|
8
|
+
it "should match 0 - 255" do
|
9
|
+
(0..255).all? { |n|
|
10
|
+
subject.match(n.to_s)[0] == n.to_s
|
11
|
+
}.should be_true
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should not match numbers greater than 255" do
|
15
|
+
subject.match('256')[0].should == '25'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "MAC" do
|
20
|
+
subject { Regexp::MAC }
|
21
|
+
|
22
|
+
it "should match six hexadecimal bytes" do
|
23
|
+
mac = '12:34:56:78:9a:bc'
|
24
|
+
|
25
|
+
subject.match(mac)[0].should == mac
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "IPv4" do
|
6
30
|
subject { Regexp::IPv4 }
|
7
31
|
|
8
32
|
it "should match valid addresses" do
|
@@ -23,6 +47,12 @@ describe Regexp do
|
|
23
47
|
subject.match(ip)[0].should == ip
|
24
48
|
end
|
25
49
|
|
50
|
+
it "should match addresses with netmasks" do
|
51
|
+
ip = '10.1.1.1/24'
|
52
|
+
|
53
|
+
subject.match(ip)[0].should == ip
|
54
|
+
end
|
55
|
+
|
26
56
|
it "should not match addresses with octets > 255" do
|
27
57
|
ip = '10.1.256.1'
|
28
58
|
|
@@ -35,4 +65,358 @@ describe Regexp do
|
|
35
65
|
subject.match(ip).should be_nil
|
36
66
|
end
|
37
67
|
end
|
68
|
+
|
69
|
+
describe "IPv6" do
|
70
|
+
subject { Regexp::IPv6 }
|
71
|
+
|
72
|
+
it "should match valid IPv6 addresses" do
|
73
|
+
ip = '2001:db8:85a3:0:0:8a2e:370:7334'
|
74
|
+
|
75
|
+
subject.match(ip)[0].should == ip
|
76
|
+
end
|
77
|
+
|
78
|
+
it "should match IPv6 addresses with netmasks" do
|
79
|
+
ip = '2001:db8:1234::/48'
|
80
|
+
|
81
|
+
subject.match(ip)[0].should == ip
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should match truncated IPv6 addresses" do
|
85
|
+
ip = '2001:db8:85a3::8a2e:370:7334'
|
86
|
+
|
87
|
+
subject.match(ip)[0].should == ip
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should match IPv4-mapped IPv6 addresses" do
|
91
|
+
ip = '::ffff:192.0.2.128'
|
92
|
+
|
93
|
+
subject.match(ip)[0].should == ip
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
describe "IP" do
|
98
|
+
subject { Regexp::IP }
|
99
|
+
|
100
|
+
it "should match IPv4 addresses" do
|
101
|
+
ip = '10.1.1.1'
|
102
|
+
|
103
|
+
subject.match(ip)[0].should == ip
|
104
|
+
end
|
105
|
+
|
106
|
+
it "should match IPv6 addresses" do
|
107
|
+
ip = '2001:db8:85a3:0:0:8a2e:370:7334'
|
108
|
+
|
109
|
+
subject.match(ip)[0].should == ip
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
describe "HOST_NAME" do
|
114
|
+
subject { Regexp::HOST_NAME }
|
115
|
+
|
116
|
+
it "should match valid hostnames" do
|
117
|
+
hostname = 'www.google.com'
|
118
|
+
|
119
|
+
subject.match(hostname)[0].should == hostname
|
120
|
+
end
|
121
|
+
|
122
|
+
it "should not match hostnames without a TLD" do
|
123
|
+
subject.match('foo').should be_nil
|
124
|
+
end
|
125
|
+
|
126
|
+
it "should not match hostnames with unknown TLDs" do
|
127
|
+
subject.match('foo.zzz').should be_nil
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
describe "USER_NAME" do
|
132
|
+
subject { Regexp::USER_NAME }
|
133
|
+
|
134
|
+
it "should match valid user-names" do
|
135
|
+
username = 'alice1234'
|
136
|
+
|
137
|
+
subject.match(username)[0].should == username
|
138
|
+
end
|
139
|
+
|
140
|
+
it "should match user-names containing '_' characters" do
|
141
|
+
username = 'alice_1234'
|
142
|
+
|
143
|
+
subject.match(username)[0].should == username
|
144
|
+
end
|
145
|
+
|
146
|
+
it "should match user-names containing '.' characters" do
|
147
|
+
username = 'alice.1234'
|
148
|
+
|
149
|
+
subject.match(username)[0].should == username
|
150
|
+
end
|
151
|
+
|
152
|
+
it "should not match user-names beginning with numbers" do
|
153
|
+
subject.match('1234bob')[0].should == 'bob'
|
154
|
+
end
|
155
|
+
|
156
|
+
it "should not match user-names containing spaces" do
|
157
|
+
subject.match('alice eve')[0].should == 'alice'
|
158
|
+
end
|
159
|
+
|
160
|
+
it "should not match user-names containing other symbols" do
|
161
|
+
subject.match('alice^eve')[0].should == 'alice'
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
describe "EMAIL_ADDR" do
|
166
|
+
subject { Regexp::EMAIL_ADDR }
|
167
|
+
|
168
|
+
it "should match valid email addresses" do
|
169
|
+
email = 'alice@example.com'
|
170
|
+
|
171
|
+
subject.match(email)[0].should == email
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
describe "IDENTIFIER" do
|
176
|
+
subject { Regexp::IDENTIFIER }
|
177
|
+
|
178
|
+
it "should match Strings beginning with a '_' character" do
|
179
|
+
identifier = '_foo'
|
180
|
+
|
181
|
+
subject.match(identifier)[0].should == identifier
|
182
|
+
end
|
183
|
+
|
184
|
+
it "should match Strings ending with a '_' character" do
|
185
|
+
identifier = 'foo_'
|
186
|
+
|
187
|
+
subject.match(identifier)[0].should == identifier
|
188
|
+
end
|
189
|
+
|
190
|
+
it "should not match Strings beginning with numberic characters" do
|
191
|
+
subject.match('1234foo')[0].should == 'foo'
|
192
|
+
end
|
193
|
+
|
194
|
+
it "should not match Strings not containing any alpha characters" do
|
195
|
+
identifier = '_1234_'
|
196
|
+
|
197
|
+
subject.match(identifier).should be_nil
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
describe "FILE_EXT" do
|
202
|
+
subject { Regexp::FILE_EXT }
|
203
|
+
|
204
|
+
it "should match the '.' separator character" do
|
205
|
+
ext = '.txt'
|
206
|
+
|
207
|
+
subject.match(ext)[0].should == ext
|
208
|
+
end
|
209
|
+
|
210
|
+
it "should not allow '_' characters" do
|
211
|
+
subject.match('.foo_bar')[0].should == '.foo'
|
212
|
+
end
|
213
|
+
|
214
|
+
it "should not allow '-' characters" do
|
215
|
+
subject.match('.foo-bar')[0].should == '.foo'
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
describe "FILE_NAME" do
|
220
|
+
subject { Regexp::FILE_NAME }
|
221
|
+
|
222
|
+
it "should match file names" do
|
223
|
+
filename = 'foo_bar'
|
224
|
+
|
225
|
+
subject.match(filename)[0].should == filename
|
226
|
+
end
|
227
|
+
|
228
|
+
it "should match '\\' escapped characters" do
|
229
|
+
filename = 'foo\\ bar'
|
230
|
+
|
231
|
+
subject.match(filename)[0].should == filename
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
describe "FILE" do
|
236
|
+
subject { Regexp::FILE }
|
237
|
+
|
238
|
+
it "should match the filename and extension" do
|
239
|
+
filename = 'foo_bar.txt'
|
240
|
+
|
241
|
+
subject.match(filename)[0].should == filename
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
describe "DIRECTORY" do
|
246
|
+
subject { Regexp::DIRECTORY }
|
247
|
+
|
248
|
+
it "should match directory names" do
|
249
|
+
dir = 'foo_bar'
|
250
|
+
|
251
|
+
subject.match(dir)[0].should == dir
|
252
|
+
end
|
253
|
+
|
254
|
+
it "should match '.'" do
|
255
|
+
dir = '.'
|
256
|
+
|
257
|
+
subject.match(dir)[0].should == dir
|
258
|
+
end
|
259
|
+
|
260
|
+
it "should match '..'" do
|
261
|
+
dir = '..'
|
262
|
+
|
263
|
+
subject.match(dir)[0].should == dir
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
267
|
+
describe "RELATIVE_UNIX_PATH" do
|
268
|
+
subject { Regexp::RELATIVE_UNIX_PATH }
|
269
|
+
|
270
|
+
it "should match multiple directories" do
|
271
|
+
path = 'foo/./bar/../baz'
|
272
|
+
|
273
|
+
subject.match(path)[0].should == path
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
describe "ABSOLUTE_UNIX_PATH" do
|
278
|
+
subject { Regexp::ABSOLUTE_UNIX_PATH }
|
279
|
+
|
280
|
+
it "should match absolute paths" do
|
281
|
+
path = '/foo/bar/baz'
|
282
|
+
|
283
|
+
subject.match(path)[0].should == path
|
284
|
+
end
|
285
|
+
|
286
|
+
it "should match trailing '/' characters" do
|
287
|
+
path = '/foo/bar/baz/'
|
288
|
+
|
289
|
+
subject.match(path)[0].should == path
|
290
|
+
end
|
291
|
+
|
292
|
+
it "should not match relative directories" do
|
293
|
+
path = '/foo/./bar/../baz'
|
294
|
+
|
295
|
+
subject.match(path)[0].should == '/foo/'
|
296
|
+
end
|
297
|
+
end
|
298
|
+
|
299
|
+
describe "UNIX_PATH" do
|
300
|
+
subject { Regexp::UNIX_PATH }
|
301
|
+
|
302
|
+
it "should match relative paths" do
|
303
|
+
path = 'foo/./bar/../baz'
|
304
|
+
|
305
|
+
subject.match(path)[0].should == path
|
306
|
+
end
|
307
|
+
|
308
|
+
it "should match absolute paths" do
|
309
|
+
path = '/foo/bar/baz'
|
310
|
+
|
311
|
+
subject.match(path)[0].should == path
|
312
|
+
end
|
313
|
+
end
|
314
|
+
|
315
|
+
describe "RELATIVE_WINDOWS_PATH" do
|
316
|
+
subject { Regexp::RELATIVE_WINDOWS_PATH }
|
317
|
+
|
318
|
+
it "should match multiple directories" do
|
319
|
+
path = 'foo\\.\\bar\\..\\baz'
|
320
|
+
|
321
|
+
subject.match(path)[0].should == path
|
322
|
+
end
|
323
|
+
end
|
324
|
+
|
325
|
+
describe "ABSOLUTE_WINDOWS_PATH" do
|
326
|
+
subject { Regexp::ABSOLUTE_WINDOWS_PATH }
|
327
|
+
|
328
|
+
it "should match absolute paths" do
|
329
|
+
path = 'C:\\foo\\bar\\baz'
|
330
|
+
|
331
|
+
subject.match(path)[0].should == path
|
332
|
+
end
|
333
|
+
|
334
|
+
it "should match trailing '/' characters" do
|
335
|
+
path = 'C:\\foo\\bar\\baz\\'
|
336
|
+
|
337
|
+
subject.match(path)[0].should == path
|
338
|
+
end
|
339
|
+
|
340
|
+
it "should not match relative directories" do
|
341
|
+
path = 'C:\\foo\\.\\bar\\..\\baz'
|
342
|
+
|
343
|
+
subject.match(path)[0].should == 'C:\\foo\\'
|
344
|
+
end
|
345
|
+
end
|
346
|
+
|
347
|
+
describe "WINDOWS_PATH" do
|
348
|
+
subject { Regexp::WINDOWS_PATH }
|
349
|
+
|
350
|
+
it "should match relative paths" do
|
351
|
+
path = 'foo\\.\\bar\\..\\baz'
|
352
|
+
|
353
|
+
subject.match(path)[0].should == path
|
354
|
+
end
|
355
|
+
|
356
|
+
it "should match absolute paths" do
|
357
|
+
path = 'C:\\foo\\bar\\baz'
|
358
|
+
|
359
|
+
subject.match(path)[0].should == path
|
360
|
+
end
|
361
|
+
end
|
362
|
+
|
363
|
+
describe "RELATIVE_PATH" do
|
364
|
+
subject { Regexp::RELATIVE_PATH }
|
365
|
+
|
366
|
+
it "should match relative UNIX paths" do
|
367
|
+
path = 'foo/./bar/../baz'
|
368
|
+
|
369
|
+
subject.match(path)[0].should == path
|
370
|
+
end
|
371
|
+
|
372
|
+
it "should match relative Windows paths" do
|
373
|
+
path = 'foo\\.\\bar\\..\\baz'
|
374
|
+
|
375
|
+
subject.match(path)[0].should == path
|
376
|
+
end
|
377
|
+
end
|
378
|
+
|
379
|
+
describe "ABSOLUTE_PATH" do
|
380
|
+
subject { Regexp::ABSOLUTE_PATH }
|
381
|
+
|
382
|
+
it "should match absolute UNIX paths" do
|
383
|
+
path = '/foo/bar/baz'
|
384
|
+
|
385
|
+
subject.match(path)[0].should == path
|
386
|
+
end
|
387
|
+
|
388
|
+
it "should match absolute Windows paths" do
|
389
|
+
path = 'C:\\foo\\bar\\baz'
|
390
|
+
|
391
|
+
subject.match(path)[0].should == path
|
392
|
+
end
|
393
|
+
end
|
394
|
+
|
395
|
+
describe "PATH" do
|
396
|
+
subject { Regexp::PATH }
|
397
|
+
|
398
|
+
it "should match relative UNIX paths" do
|
399
|
+
path = 'foo/./bar/../baz'
|
400
|
+
|
401
|
+
subject.match(path)[0].should == path
|
402
|
+
end
|
403
|
+
|
404
|
+
it "should match absolute UNIX paths" do
|
405
|
+
path = '/foo/bar/baz'
|
406
|
+
|
407
|
+
subject.match(path)[0].should == path
|
408
|
+
end
|
409
|
+
|
410
|
+
it "should match relative Windows paths" do
|
411
|
+
path = 'foo\\.\\bar\\..\\baz'
|
412
|
+
|
413
|
+
subject.match(path)[0].should == path
|
414
|
+
end
|
415
|
+
|
416
|
+
it "should match absolute Windows paths" do
|
417
|
+
path = 'C:\\foo\\bar\\baz'
|
418
|
+
|
419
|
+
subject.match(path)[0].should == path
|
420
|
+
end
|
421
|
+
end
|
38
422
|
end
|