ronin-support 0.3.0 → 0.4.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. data/ChangeLog.md +77 -7
  2. data/README.md +19 -3
  3. data/gemspec.yml +2 -2
  4. data/lib/ronin/extensions/regexp.rb +50 -2
  5. data/lib/ronin/extensions/string.rb +1 -0
  6. data/lib/ronin/formatting.rb +1 -0
  7. data/lib/ronin/formatting/extensions.rb +1 -0
  8. data/lib/ronin/formatting/extensions/binary/string.rb +56 -5
  9. data/lib/ronin/formatting/extensions/html/string.rb +6 -7
  10. data/lib/ronin/formatting/extensions/sql/string.rb +34 -0
  11. data/lib/ronin/formatting/extensions/text/string.rb +0 -180
  12. data/lib/ronin/fuzzing.rb +21 -0
  13. data/lib/ronin/fuzzing/extensions.rb +20 -0
  14. data/lib/ronin/fuzzing/extensions/string.rb +380 -0
  15. data/lib/ronin/fuzzing/fuzzing.rb +191 -0
  16. data/lib/ronin/network/esmtp.rb +94 -1
  17. data/lib/ronin/network/extensions/esmtp/net.rb +2 -82
  18. data/lib/ronin/network/extensions/http/net.rb +1 -736
  19. data/lib/ronin/network/extensions/imap/net.rb +1 -103
  20. data/lib/ronin/network/extensions/pop3/net.rb +1 -71
  21. data/lib/ronin/network/extensions/smtp/net.rb +2 -157
  22. data/lib/ronin/network/extensions/ssl/net.rb +1 -132
  23. data/lib/ronin/network/extensions/tcp/net.rb +2 -296
  24. data/lib/ronin/network/extensions/telnet/net.rb +1 -135
  25. data/lib/ronin/network/extensions/udp/net.rb +2 -214
  26. data/lib/ronin/network/http/http.rb +750 -5
  27. data/lib/ronin/network/imap.rb +105 -2
  28. data/lib/ronin/network/mixins.rb +1 -1
  29. data/lib/ronin/network/mixins/esmtp.rb +49 -52
  30. data/lib/ronin/network/mixins/http.rb +49 -53
  31. data/lib/ronin/network/mixins/imap.rb +47 -44
  32. data/lib/ronin/network/mixins/mixin.rb +58 -0
  33. data/lib/ronin/network/mixins/pop3.rb +44 -38
  34. data/lib/ronin/network/mixins/smtp.rb +49 -51
  35. data/lib/ronin/network/mixins/tcp.rb +56 -69
  36. data/lib/ronin/network/mixins/telnet.rb +57 -50
  37. data/lib/ronin/network/mixins/udp.rb +48 -52
  38. data/lib/ronin/network/network.rb +1 -0
  39. data/lib/ronin/network/pop3.rb +72 -2
  40. data/lib/ronin/network/smtp/email.rb +1 -0
  41. data/lib/ronin/network/smtp/smtp.rb +159 -3
  42. data/lib/ronin/network/ssl.rb +131 -2
  43. data/lib/ronin/network/tcp.rb +306 -1
  44. data/lib/ronin/network/telnet.rb +136 -2
  45. data/lib/ronin/network/udp.rb +229 -1
  46. data/lib/ronin/support.rb +2 -3
  47. data/lib/ronin/support/support.rb +38 -0
  48. data/lib/ronin/support/version.rb +1 -1
  49. data/lib/ronin/templates/erb.rb +2 -1
  50. data/lib/ronin/ui/output/helpers.rb +35 -1
  51. data/lib/ronin/ui/shell.rb +12 -2
  52. data/lib/ronin/wordlist.rb +157 -0
  53. data/spec/extensions/regexp_spec.rb +38 -0
  54. data/spec/formatting/html/string_spec.rb +1 -1
  55. data/spec/formatting/sql/string_spec.rb +23 -3
  56. data/spec/formatting/text/string_spec.rb +0 -110
  57. data/spec/fuzzing/string_spec.rb +158 -0
  58. data/spec/wordlist_spec.rb +65 -0
  59. metadata +35 -27
@@ -0,0 +1,158 @@
1
+ require 'spec_helper'
2
+ require 'ronin/fuzzing/extensions/string'
3
+
4
+ describe String do
5
+ it "should provide String.generate" do
6
+ described_class.should respond_to(:generate)
7
+ end
8
+
9
+ it "should provide String#repeating" do
10
+ subject.should respond_to(:repeating)
11
+ end
12
+
13
+ it "should provide String#fuzz" do
14
+ subject.should respond_to(:fuzz)
15
+ end
16
+
17
+ it "should provide String#mutate" do
18
+ subject.should respond_to(:mutate)
19
+ end
20
+
21
+ describe "generate" do
22
+ subject { described_class }
23
+
24
+ it "should generate Strings from CharSets" do
25
+ strings = subject.generate(:lowercase_hexadecimal, :numeric).to_a
26
+
27
+ strings.grep(/^[0-9a-f][0-9]$/).should == strings
28
+ end
29
+
30
+ it "should generate Strings from lengths of CharSets" do
31
+ strings = subject.generate([:numeric, 2]).to_a
32
+
33
+ strings.grep(/^[0-9]{2}$/).should == strings
34
+ end
35
+
36
+ it "should generate Strings from varying lengths of CharSets" do
37
+ strings = subject.generate([:numeric, 1..2]).to_a
38
+
39
+ strings.grep(/^[0-9]{1,2}$/).should == strings
40
+ end
41
+
42
+ it "should generate Strings from custom CharSets" do
43
+ strings = subject.generate([%w[a b c], 2]).to_a
44
+
45
+ strings.grep(/^[abc]{2}$/).should == strings
46
+ end
47
+
48
+ it "should generate Strings containing known Strings" do
49
+ strings = subject.generate('foo', [%w[a b c], 2]).to_a
50
+
51
+ strings.grep(/^foo[abc]{2}$/).should == strings
52
+ end
53
+
54
+ it "should raise a TypeError for non String, Symbol, Enumerable CharSets" do
55
+ lambda {
56
+ subject.generate([Object.new, 2]).to_a
57
+ }.should raise_error(TypeError)
58
+ end
59
+
60
+ it "should raise an ArgumentError for unknown CharSets" do
61
+ lambda {
62
+ subject.generate([:foo_bar, 2]).to_a
63
+ }.should raise_error(ArgumentError)
64
+ end
65
+
66
+ it "should raise a TypeError for non Integer,Array,Range lengths" do
67
+ lambda {
68
+ subject.generate([:numeric, 'foo']).to_a
69
+ }.should raise_error(TypeError)
70
+ end
71
+ end
72
+
73
+ describe "#repeating" do
74
+ subject { 'A' }
75
+
76
+ context "when n is an Integer" do
77
+ let(:n) { 100 }
78
+
79
+ it "should multiply the String by n" do
80
+ subject.repeating(n).should == (subject * n)
81
+ end
82
+ end
83
+
84
+ context "when n is Enumerable" do
85
+ let(:n) { [128, 512, 1024] }
86
+
87
+ it "should repeat the String by each length" do
88
+ strings = subject.repeating(n).to_a
89
+
90
+ strings.should == n.map { |length| subject * length }
91
+ end
92
+ end
93
+ end
94
+
95
+ describe "#fuzz" do
96
+ subject { 'GET /one/two/three' }
97
+
98
+ context "matching" do
99
+ it "should allow Regexps" do
100
+ fuzzed = subject.fuzz(/GET/ => ['get']).to_a
101
+
102
+ fuzzed.should == ['get /one/two/three']
103
+ end
104
+
105
+ it "should allow Strings" do
106
+ fuzzed = subject.fuzz('GET' => ['get']).to_a
107
+
108
+ fuzzed.should == ['get /one/two/three']
109
+ end
110
+
111
+ it "should match Symbols to Regexp constants" do
112
+ fuzzed = subject.fuzz(:absolute_path => ['../../../..']).to_a
113
+
114
+ fuzzed.should == ['GET ../../../..']
115
+ end
116
+ end
117
+
118
+ context "substitution" do
119
+ it "should allow Procs" do
120
+ fuzzed = subject.fuzz('GET' => [lambda { |s| s.downcase }]).to_a
121
+
122
+ fuzzed.should == ['get /one/two/three']
123
+ end
124
+
125
+ it "should allow Integers" do
126
+ fuzzed = subject.fuzz(' ' => [0x09]).to_a
127
+
128
+ fuzzed.should == ["GET\t/one/two/three"]
129
+ end
130
+
131
+ it "should map Symbols to Fuzzing methods" do
132
+ fuzzed = subject.fuzz(/\/.*/ => :format_strings).to_a
133
+
134
+ fuzzed.should_not == [subject]
135
+ end
136
+
137
+ it "should incrementally replace each occurrence" do
138
+ fuzzed = subject.fuzz('/' => ["\n\r"]).to_a
139
+
140
+ fuzzed.should == [
141
+ "GET \n\rone/two/three",
142
+ "GET /one\n\rtwo/three",
143
+ "GET /one/two\n\rthree"
144
+ ]
145
+ end
146
+
147
+ it "should replace each occurrence with each substitution" do
148
+ fuzzed = subject.fuzz('GET' => ["\n\rGET", "G\n\rET", "GET\n\r"]).to_a
149
+
150
+ fuzzed.should == [
151
+ "\n\rGET /one/two/three",
152
+ "G\n\rET /one/two/three",
153
+ "GET\n\r /one/two/three"
154
+ ]
155
+ end
156
+ end
157
+ end
158
+ end
@@ -0,0 +1,65 @@
1
+ require 'spec_helper'
2
+ require 'ronin/wordlist'
3
+
4
+ require 'tempfile'
5
+
6
+ describe Wordlist do
7
+ let(:words) { %w[foo bar baz] }
8
+
9
+ before(:all) do
10
+ Tempfile.open('ronin-support-wordlist') do |file|
11
+ words.each { |word| file.puts word }
12
+
13
+ @path = file.path
14
+ end
15
+ end
16
+
17
+ subject { described_class.new(words) }
18
+
19
+ describe "#initialize" do
20
+ it "should accept a list of words" do
21
+ subject.to_a.should == words
22
+ end
23
+
24
+ it "should accept a path to a wordlist file" do
25
+ file = described_class.new(@path)
26
+
27
+ file.to_a.should == words
28
+ end
29
+ end
30
+
31
+ describe "#each_word" do
32
+ it "should raise a TypeError for non-String / non-Enumerable objects" do
33
+ wordlist = described_class.new(Object.new)
34
+
35
+ lambda {
36
+ wordlist.each_word { |word| }
37
+ }.should raise_error(TypeError)
38
+ end
39
+ end
40
+
41
+ describe "#each" do
42
+ it "should rewind file lists" do
43
+ subject.each { |word| }
44
+
45
+ subject.to_a.should == words
46
+ end
47
+
48
+ it "should apply additional mutation rules" do
49
+ wordlist = described_class.new(words)
50
+ wordlist.mutations['o'] = ['0']
51
+
52
+ wordlist.to_a.should == %w[foo f0o fo0 f00 bar baz]
53
+ end
54
+ end
55
+
56
+ describe "#each_n_words" do
57
+ it "should enumerate over every combination of N words" do
58
+ subject.each_n_words(2).to_a.should == %w[
59
+ foofoo foobar foobaz
60
+ barfoo barbar barbaz
61
+ bazfoo bazbar bazbaz
62
+ ]
63
+ end
64
+ end
65
+ end
metadata CHANGED
@@ -1,19 +1,19 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ronin-support
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
5
- prerelease:
4
+ version: 0.4.0.rc1
5
+ prerelease: 6
6
6
  platform: ruby
7
7
  authors:
8
8
  - Postmodern
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-10-17 00:00:00.000000000Z
12
+ date: 2011-12-31 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: chars
16
- requirement: &13653760 !ruby/object:Gem::Requirement
16
+ requirement: &11794840 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0.2'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *13653760
24
+ version_requirements: *11794840
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: hexdump
27
- requirement: &13615160 !ruby/object:Gem::Requirement
27
+ requirement: &11792620 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0.1'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *13615160
35
+ version_requirements: *11792620
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: combinatorics
38
- requirement: &13608820 !ruby/object:Gem::Requirement
38
+ requirement: &11791900 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,24 +43,21 @@ dependencies:
43
43
  version: '0.4'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *13608820
46
+ version_requirements: *11791900
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: uri-query_params
49
- requirement: &13381960 !ruby/object:Gem::Requirement
49
+ requirement: &11791120 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
53
53
  - !ruby/object:Gem::Version
54
- version: '0.5'
55
- - - ! '>='
56
- - !ruby/object:Gem::Version
57
- version: 0.5.2
54
+ version: '0.6'
58
55
  type: :runtime
59
56
  prerelease: false
60
- version_requirements: *13381960
57
+ version_requirements: *11791120
61
58
  - !ruby/object:Gem::Dependency
62
59
  name: data_paths
63
- requirement: &12320000 !ruby/object:Gem::Requirement
60
+ requirement: &11789140 !ruby/object:Gem::Requirement
64
61
  none: false
65
62
  requirements:
66
63
  - - ~>
@@ -68,24 +65,21 @@ dependencies:
68
65
  version: '0.3'
69
66
  type: :runtime
70
67
  prerelease: false
71
- version_requirements: *12320000
68
+ version_requirements: *11789140
72
69
  - !ruby/object:Gem::Dependency
73
70
  name: parameters
74
- requirement: &12317320 !ruby/object:Gem::Requirement
71
+ requirement: &11788500 !ruby/object:Gem::Requirement
75
72
  none: false
76
73
  requirements:
77
74
  - - ~>
78
75
  - !ruby/object:Gem::Version
79
- version: '0.2'
80
- - - ! '>='
81
- - !ruby/object:Gem::Version
82
- version: 0.2.3
76
+ version: '0.4'
83
77
  type: :runtime
84
78
  prerelease: false
85
- version_requirements: *12317320
79
+ version_requirements: *11788500
86
80
  - !ruby/object:Gem::Dependency
87
81
  name: bundler
88
- requirement: &15940760 !ruby/object:Gem::Requirement
82
+ requirement: &11787520 !ruby/object:Gem::Requirement
89
83
  none: false
90
84
  requirements:
91
85
  - - ~>
@@ -93,10 +87,10 @@ dependencies:
93
87
  version: 1.0.10
94
88
  type: :development
95
89
  prerelease: false
96
- version_requirements: *15940760
90
+ version_requirements: *11787520
97
91
  - !ruby/object:Gem::Dependency
98
92
  name: yard
99
- requirement: &15973540 !ruby/object:Gem::Requirement
93
+ requirement: &11787040 !ruby/object:Gem::Requirement
100
94
  none: false
101
95
  requirements:
102
96
  - - ~>
@@ -104,7 +98,7 @@ dependencies:
104
98
  version: 0.7.0
105
99
  type: :development
106
100
  prerelease: false
107
- version_requirements: *15973540
101
+ version_requirements: *11787040
108
102
  description: Ronin Support is a support library for Ronin. Ronin Support contains
109
103
  many of the convenience methods used by Ronin and additional libraries.
110
104
  email: postmodern.mod3@gmail.com
@@ -159,6 +153,10 @@ files:
159
153
  - lib/ronin/formatting/http.rb
160
154
  - lib/ronin/formatting/sql.rb
161
155
  - lib/ronin/formatting/text.rb
156
+ - lib/ronin/fuzzing.rb
157
+ - lib/ronin/fuzzing/extensions.rb
158
+ - lib/ronin/fuzzing/extensions/string.rb
159
+ - lib/ronin/fuzzing/fuzzing.rb
162
160
  - lib/ronin/mixin.rb
163
161
  - lib/ronin/network.rb
164
162
  - lib/ronin/network/esmtp.rb
@@ -192,6 +190,7 @@ files:
192
190
  - lib/ronin/network/mixins/esmtp.rb
193
191
  - lib/ronin/network/mixins/http.rb
194
192
  - lib/ronin/network/mixins/imap.rb
193
+ - lib/ronin/network/mixins/mixin.rb
195
194
  - lib/ronin/network/mixins/pop3.rb
196
195
  - lib/ronin/network/mixins/smtp.rb
197
196
  - lib/ronin/network/mixins/tcp.rb
@@ -210,6 +209,7 @@ files:
210
209
  - lib/ronin/spec/ui/output.rb
211
210
  - lib/ronin/support.rb
212
211
  - lib/ronin/support/inflector.rb
212
+ - lib/ronin/support/support.rb
213
213
  - lib/ronin/support/version.rb
214
214
  - lib/ronin/templates.rb
215
215
  - lib/ronin/templates/erb.rb
@@ -221,11 +221,13 @@ files:
221
221
  - lib/ronin/ui/output/terminal/color.rb
222
222
  - lib/ronin/ui/output/terminal/raw.rb
223
223
  - lib/ronin/ui/shell.rb
224
+ - lib/ronin/wordlist.rb
224
225
  - ronin-support.gemspec
225
226
  - spec/extensions/enumerable_spec.rb
226
227
  - spec/extensions/file_spec.rb
227
228
  - spec/extensions/ip_addr_spec.rb
228
229
  - spec/extensions/kernel_spec.rb
230
+ - spec/extensions/regexp_spec.rb
229
231
  - spec/extensions/resolv_spec.rb
230
232
  - spec/extensions/string_spec.rb
231
233
  - spec/formatting/binary/helpers/hexdumps.rb
@@ -260,6 +262,7 @@ files:
260
262
  - spec/formatting/sql/string_spec.rb
261
263
  - spec/formatting/text/array_spec.rb
262
264
  - spec/formatting/text/string_spec.rb
265
+ - spec/fuzzing/string_spec.rb
263
266
  - spec/mixin_spec.rb
264
267
  - spec/network/http/http_spec.rb
265
268
  - spec/network/http/proxy_spec.rb
@@ -280,6 +283,7 @@ files:
280
283
  - spec/ui/classes/test_shell.rb
281
284
  - spec/ui/output_spec.rb
282
285
  - spec/ui/shell_spec.rb
286
+ - spec/wordlist_spec.rb
283
287
  homepage: http://github.com/ronin-ruby/ronin-support
284
288
  licenses:
285
289
  - LGPL-3
@@ -310,6 +314,7 @@ test_files:
310
314
  - spec/extensions/file_spec.rb
311
315
  - spec/extensions/ip_addr_spec.rb
312
316
  - spec/extensions/kernel_spec.rb
317
+ - spec/extensions/regexp_spec.rb
313
318
  - spec/extensions/resolv_spec.rb
314
319
  - spec/extensions/string_spec.rb
315
320
  - spec/formatting/binary/integer_spec.rb
@@ -322,6 +327,7 @@ test_files:
322
327
  - spec/formatting/sql/string_spec.rb
323
328
  - spec/formatting/text/array_spec.rb
324
329
  - spec/formatting/text/string_spec.rb
330
+ - spec/fuzzing/string_spec.rb
325
331
  - spec/mixin_spec.rb
326
332
  - spec/network/http/http_spec.rb
327
333
  - spec/network/http/proxy_spec.rb
@@ -335,3 +341,5 @@ test_files:
335
341
  - spec/templates/template_spec.rb
336
342
  - spec/ui/output_spec.rb
337
343
  - spec/ui/shell_spec.rb
344
+ - spec/wordlist_spec.rb
345
+ has_rdoc: