ronin-support 0.3.0 → 0.4.0.rc1

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.
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: