ronin-support 0.4.1 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (224) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +11 -0
  3. data/.github/workflows/ruby.yml +28 -0
  4. data/.ruby-version +1 -0
  5. data/.yardopts +1 -1
  6. data/ChangeLog.md +121 -33
  7. data/Gemfile +17 -18
  8. data/README.md +57 -33
  9. data/Rakefile +10 -3
  10. data/gemspec.yml +16 -7
  11. data/lib/ronin/binary.rb +21 -0
  12. data/lib/ronin/binary/hexdump.rb +20 -0
  13. data/lib/ronin/binary/hexdump/parser.rb +403 -0
  14. data/lib/ronin/binary/struct.rb +567 -0
  15. data/lib/ronin/binary/template.rb +454 -0
  16. data/lib/ronin/extensions.rb +5 -5
  17. data/lib/ronin/extensions/enumerable.rb +5 -5
  18. data/lib/ronin/extensions/file.rb +39 -33
  19. data/lib/ronin/extensions/ip_addr.rb +29 -31
  20. data/lib/ronin/extensions/kernel.rb +5 -5
  21. data/lib/ronin/extensions/meta.rb +5 -5
  22. data/lib/ronin/extensions/regexp.rb +50 -5
  23. data/lib/ronin/extensions/resolv.rb +7 -9
  24. data/lib/ronin/extensions/string.rb +10 -10
  25. data/lib/ronin/formatting.rb +5 -5
  26. data/lib/ronin/formatting/binary.rb +5 -5
  27. data/lib/ronin/formatting/digest.rb +5 -5
  28. data/lib/ronin/formatting/extensions.rb +5 -5
  29. data/lib/ronin/formatting/extensions/binary.rb +7 -5
  30. data/lib/ronin/formatting/extensions/binary/array.rb +61 -0
  31. data/lib/ronin/formatting/extensions/binary/base64.rb +106 -0
  32. data/lib/ronin/formatting/extensions/binary/file.rb +44 -11
  33. data/lib/ronin/formatting/extensions/binary/float.rb +65 -0
  34. data/lib/ronin/formatting/extensions/binary/integer.rb +66 -50
  35. data/lib/ronin/formatting/extensions/binary/string.rb +81 -205
  36. data/lib/ronin/formatting/extensions/digest.rb +5 -5
  37. data/lib/ronin/formatting/extensions/digest/file.rb +5 -5
  38. data/lib/ronin/formatting/extensions/digest/string.rb +5 -5
  39. data/lib/ronin/formatting/extensions/html.rb +5 -5
  40. data/lib/ronin/formatting/extensions/html/integer.rb +9 -13
  41. data/lib/ronin/formatting/extensions/html/string.rb +31 -39
  42. data/lib/ronin/formatting/extensions/http.rb +5 -5
  43. data/lib/ronin/formatting/extensions/http/integer.rb +6 -6
  44. data/lib/ronin/formatting/extensions/http/string.rb +7 -7
  45. data/lib/ronin/formatting/extensions/sql.rb +5 -5
  46. data/lib/ronin/formatting/extensions/sql/string.rb +22 -24
  47. data/lib/ronin/formatting/extensions/text.rb +5 -5
  48. data/lib/ronin/formatting/extensions/text/array.rb +13 -11
  49. data/lib/ronin/formatting/extensions/text/string.rb +70 -13
  50. data/lib/ronin/formatting/html.rb +5 -5
  51. data/lib/ronin/formatting/http.rb +5 -5
  52. data/lib/ronin/formatting/sql.rb +5 -5
  53. data/lib/ronin/formatting/text.rb +5 -5
  54. data/lib/ronin/fuzzing.rb +5 -5
  55. data/lib/ronin/fuzzing/extensions.rb +5 -5
  56. data/lib/ronin/fuzzing/extensions/string.rb +42 -213
  57. data/lib/ronin/fuzzing/fuzzer.rb +110 -0
  58. data/lib/ronin/fuzzing/fuzzing.rb +33 -26
  59. data/lib/ronin/fuzzing/mutator.rb +161 -0
  60. data/lib/ronin/fuzzing/repeater.rb +81 -0
  61. data/lib/ronin/fuzzing/template.rb +133 -0
  62. data/lib/ronin/mixin.rb +2 -2
  63. data/lib/ronin/network.rb +7 -5
  64. data/lib/ronin/network/dns.rb +64 -24
  65. data/lib/ronin/network/esmtp.rb +5 -5
  66. data/lib/ronin/network/extensions.rb +5 -5
  67. data/lib/ronin/network/extensions/dns.rb +5 -5
  68. data/lib/ronin/network/extensions/dns/net.rb +5 -5
  69. data/lib/ronin/network/extensions/esmtp.rb +5 -5
  70. data/lib/ronin/network/extensions/esmtp/net.rb +5 -5
  71. data/lib/ronin/network/extensions/http.rb +5 -5
  72. data/lib/ronin/network/extensions/http/net.rb +5 -5
  73. data/lib/ronin/network/extensions/http/uri/http.rb +5 -5
  74. data/lib/ronin/network/extensions/imap.rb +5 -5
  75. data/lib/ronin/network/extensions/imap/net.rb +5 -5
  76. data/lib/ronin/network/extensions/pop3.rb +5 -5
  77. data/lib/ronin/network/extensions/pop3/net.rb +5 -5
  78. data/lib/ronin/network/extensions/smtp.rb +5 -5
  79. data/lib/ronin/network/extensions/smtp/net.rb +5 -5
  80. data/lib/ronin/network/extensions/ssl.rb +5 -5
  81. data/lib/ronin/network/extensions/ssl/net.rb +5 -5
  82. data/lib/ronin/network/extensions/tcp.rb +5 -5
  83. data/lib/ronin/network/extensions/tcp/net.rb +5 -5
  84. data/lib/ronin/network/extensions/telnet.rb +5 -5
  85. data/lib/ronin/network/extensions/telnet/net.rb +5 -5
  86. data/lib/ronin/network/extensions/udp.rb +5 -5
  87. data/lib/ronin/network/extensions/udp/net.rb +5 -5
  88. data/lib/ronin/network/ftp.rb +149 -0
  89. data/lib/ronin/network/http.rb +5 -5
  90. data/lib/ronin/network/http/exceptions.rb +5 -5
  91. data/lib/ronin/network/http/exceptions/unknown_request.rb +5 -5
  92. data/lib/ronin/network/http/http.rb +65 -70
  93. data/lib/ronin/network/http/proxy.rb +5 -5
  94. data/lib/ronin/network/imap.rb +16 -15
  95. data/lib/ronin/network/mixins.rb +6 -5
  96. data/lib/ronin/network/mixins/dns.rb +5 -5
  97. data/lib/ronin/network/mixins/esmtp.rb +5 -5
  98. data/lib/ronin/network/mixins/ftp.rb +155 -0
  99. data/lib/ronin/network/mixins/http.rb +58 -587
  100. data/lib/ronin/network/mixins/imap.rb +5 -5
  101. data/lib/ronin/network/mixins/mixin.rb +5 -5
  102. data/lib/ronin/network/mixins/pop3.rb +5 -5
  103. data/lib/ronin/network/mixins/smtp.rb +5 -5
  104. data/lib/ronin/network/mixins/ssl.rb +5 -5
  105. data/lib/ronin/network/mixins/tcp.rb +43 -10
  106. data/lib/ronin/network/mixins/telnet.rb +5 -5
  107. data/lib/ronin/network/mixins/udp.rb +126 -6
  108. data/lib/ronin/network/mixins/unix.rb +279 -0
  109. data/lib/ronin/network/network.rb +5 -5
  110. data/lib/ronin/network/pop3.rb +10 -10
  111. data/lib/ronin/network/proxy.rb +578 -0
  112. data/lib/ronin/network/smtp.rb +5 -5
  113. data/lib/ronin/network/smtp/email.rb +6 -6
  114. data/lib/ronin/network/smtp/smtp.rb +12 -13
  115. data/lib/ronin/network/ssl.rb +16 -17
  116. data/lib/ronin/network/tcp.rb +7 -310
  117. data/lib/ronin/network/tcp/proxy.rb +417 -0
  118. data/lib/ronin/network/tcp/tcp.rb +452 -0
  119. data/lib/ronin/network/telnet.rb +34 -28
  120. data/lib/ronin/network/udp.rb +7 -271
  121. data/lib/ronin/network/udp/proxy.rb +191 -0
  122. data/lib/ronin/network/udp/udp.rb +452 -0
  123. data/lib/ronin/network/unix.rb +286 -0
  124. data/lib/ronin/path.rb +35 -39
  125. data/lib/ronin/spec/ui/output.rb +6 -12
  126. data/lib/ronin/support.rb +6 -5
  127. data/lib/ronin/support/inflector.rb +8 -12
  128. data/lib/ronin/support/support.rb +7 -5
  129. data/lib/ronin/support/version.rb +6 -6
  130. data/lib/ronin/templates.rb +5 -5
  131. data/lib/ronin/templates/erb.rb +5 -5
  132. data/lib/ronin/templates/template.rb +5 -5
  133. data/lib/ronin/ui/output.rb +5 -5
  134. data/lib/ronin/ui/output/helpers.rb +42 -28
  135. data/lib/ronin/ui/output/output.rb +17 -21
  136. data/lib/ronin/ui/output/terminal.rb +5 -5
  137. data/lib/ronin/ui/output/terminal/color.rb +15 -9
  138. data/lib/ronin/ui/output/terminal/raw.rb +5 -5
  139. data/lib/ronin/ui/shell.rb +8 -11
  140. data/lib/ronin/wordlist.rb +110 -30
  141. data/ronin-support.gemspec +39 -109
  142. data/spec/binary/hexdump/helpers/hexdumps.rb +13 -0
  143. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/ascii.bin +0 -0
  144. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/hexdump_decimal_shorts.txt +0 -0
  145. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/hexdump_hex_bytes.txt +0 -0
  146. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/hexdump_hex_shorts.txt +0 -0
  147. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/hexdump_octal_bytes.txt +0 -0
  148. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/hexdump_octal_shorts.txt +0 -0
  149. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/hexdump_repeated.txt +0 -0
  150. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_decimal_bytes.txt +0 -0
  151. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_decimal_ints.txt +0 -0
  152. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_decimal_quads.txt +0 -0
  153. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_decimal_shorts.txt +0 -0
  154. data/spec/binary/hexdump/helpers/hexdumps/od_doubles.txt +17 -0
  155. data/spec/binary/hexdump/helpers/hexdumps/od_floats.txt +17 -0
  156. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_hex_bytes.txt +0 -0
  157. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_hex_ints.txt +0 -0
  158. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_hex_quads.txt +0 -0
  159. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_hex_shorts.txt +0 -0
  160. data/spec/binary/hexdump/helpers/hexdumps/od_named_chars.txt +17 -0
  161. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_octal_bytes.txt +0 -0
  162. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_octal_ints.txt +0 -0
  163. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_octal_quads.txt +0 -0
  164. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_octal_shorts.txt +0 -0
  165. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/od_repeated.txt +0 -0
  166. data/spec/{formatting/binary → binary/hexdump}/helpers/hexdumps/repeated.bin +0 -0
  167. data/spec/binary/hexdump/parser_spec.rb +302 -0
  168. data/spec/binary/struct_spec.rb +496 -0
  169. data/spec/binary/template_spec.rb +416 -0
  170. data/spec/extensions/enumerable_spec.rb +4 -4
  171. data/spec/extensions/file_spec.rb +12 -14
  172. data/spec/extensions/ip_addr_spec.rb +76 -50
  173. data/spec/extensions/kernel_spec.rb +7 -7
  174. data/spec/extensions/regexp_spec.rb +119 -59
  175. data/spec/extensions/resolv_spec.rb +2 -2
  176. data/spec/extensions/string_spec.rb +31 -30
  177. data/spec/formatting/binary/array_spec.rb +26 -0
  178. data/spec/formatting/binary/base64_spec.rb +50 -0
  179. data/spec/formatting/binary/float_spec.rb +36 -0
  180. data/spec/formatting/binary/integer_spec.rb +76 -50
  181. data/spec/formatting/binary/string_spec.rb +91 -198
  182. data/spec/formatting/digest/string_spec.rb +5 -5
  183. data/spec/formatting/html/integer_spec.rb +6 -6
  184. data/spec/formatting/html/string_spec.rb +10 -10
  185. data/spec/formatting/http/integer_spec.rb +3 -3
  186. data/spec/formatting/http/string_spec.rb +5 -5
  187. data/spec/formatting/sql/string_spec.rb +21 -19
  188. data/spec/formatting/text/array_spec.rb +15 -15
  189. data/spec/formatting/text/string_spec.rb +58 -28
  190. data/spec/fuzzing/extensions/string_spec.rb +87 -0
  191. data/spec/fuzzing/fuzzer_spec.rb +109 -0
  192. data/spec/fuzzing/fuzzing_spec.rb +24 -0
  193. data/spec/fuzzing/mutator_spec.rb +112 -0
  194. data/spec/fuzzing/repeater_spec.rb +57 -0
  195. data/spec/fuzzing/template_spec.rb +54 -0
  196. data/spec/mixin_spec.rb +10 -12
  197. data/spec/network/dns_spec.rb +89 -23
  198. data/spec/network/ftp_spec.rb +81 -0
  199. data/spec/network/http/http_spec.rb +237 -144
  200. data/spec/network/http/proxy_spec.rb +37 -37
  201. data/spec/network/network_spec.rb +2 -2
  202. data/spec/network/proxy_spec.rb +121 -0
  203. data/spec/network/shared/unix_server.rb +31 -0
  204. data/spec/network/smtp/email_spec.rb +14 -14
  205. data/spec/network/ssl_spec.rb +53 -3
  206. data/spec/network/tcp/proxy_spec.rb +118 -0
  207. data/spec/network/tcp/tcp_spec.rb +316 -0
  208. data/spec/network/telnet_spec.rb +67 -0
  209. data/spec/network/udp/udp_spec.rb +298 -0
  210. data/spec/network/unix_spec.rb +182 -0
  211. data/spec/path_spec.rb +43 -18
  212. data/spec/spec_helper.rb +2 -3
  213. data/spec/support/inflector_spec.rb +4 -4
  214. data/spec/support_spec.rb +1 -1
  215. data/spec/templates/erb_spec.rb +3 -3
  216. data/spec/templates/template_spec.rb +10 -10
  217. data/spec/ui/shell_spec.rb +15 -15
  218. data/spec/wordlist_spec.rb +80 -19
  219. metadata +176 -121
  220. data/.gemtest +0 -0
  221. data/spec/formatting/binary/helpers/hexdumps.rb +0 -16
  222. data/spec/fuzzing/string_spec.rb +0 -158
  223. data/spec/network/tcp_spec.rb +0 -247
  224. data/spec/network/udp_spec.rb +0 -248
data/.gemtest DELETED
File without changes
@@ -1,16 +0,0 @@
1
- module Helpers
2
- def load_binary_data(name)
3
- path = File.join(File.dirname(__FILE__),'hexdumps',"#{name}.bin")
4
- buffer = []
5
-
6
- File.open(path) do |file|
7
- file.each_byte { |b| buffer << b }
8
- end
9
-
10
- return buffer
11
- end
12
-
13
- def load_hexdump(name)
14
- File.read(File.join(File.dirname(__FILE__),'hexdumps',"#{name}.txt"))
15
- end
16
- end
@@ -1,158 +0,0 @@
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
@@ -1,247 +0,0 @@
1
- require 'spec_helper'
2
- require 'ronin/network/tcp'
3
-
4
- require 'resolv'
5
-
6
- describe Network::TCP do
7
- describe "helper methods", :network do
8
- let(:host) { 'smtp.gmail.com' }
9
- let(:port) { 25 }
10
-
11
- let(:server_host) { 'localhost' }
12
- let(:server_ip) { Resolv.getaddress(server_host) }
13
-
14
- subject do
15
- obj = Object.new
16
- obj.extend described_class
17
- obj
18
- end
19
-
20
- describe "#tcp_connect" do
21
- let(:local_port) { 1024 + rand(65535 - 1024) }
22
-
23
- it "should open a TCPSocket" do
24
- socket = subject.tcp_connect(host,port)
25
-
26
- socket.should be_kind_of(TCPSocket)
27
- socket.should_not be_closed
28
-
29
- socket.close
30
- end
31
-
32
- it "should bind to a local host and port" do
33
- socket = subject.tcp_connect(host,port,nil,local_port)
34
- bound_port = socket.addr[1]
35
-
36
- bound_port.should == local_port
37
-
38
- socket.close
39
- end
40
-
41
- it "should yield the new TCPSocket" do
42
- socket = nil
43
-
44
- subject.tcp_connect(host,port) do |yielded_socket|
45
- socket = yielded_socket
46
- end
47
-
48
- socket.should_not be_closed
49
- socket.close
50
- end
51
- end
52
-
53
- describe "#tcp_connect_and_send" do
54
- let(:data) { "HELO ronin\n" }
55
- let(:local_port) { 1024 + rand(65535 - 1024) }
56
-
57
- it "should connect and then send data" do
58
- socket = subject.tcp_connect_and_send(data,host,port)
59
- banner = socket.readline
60
- response = socket.readline
61
-
62
- response.start_with?('250').should be_true
63
-
64
- socket.close
65
- end
66
-
67
- it "should bind to a local host and port" do
68
- socket = subject.tcp_connect_and_send(data,host,port,nil,local_port)
69
- bound_port = socket.addr[1]
70
-
71
- bound_port.should == local_port
72
-
73
- socket.close
74
- end
75
-
76
- it "should yield the TCPSocket" do
77
- response = nil
78
-
79
- socket = subject.tcp_connect_and_send(data,host,port) do |socket|
80
- banner = socket.readline
81
- response = socket.readline
82
- end
83
-
84
- response.start_with?('250').should be_true
85
-
86
- socket.close
87
- end
88
- end
89
-
90
- describe "#tcp_session" do
91
- let(:local_port) { 1024 + rand(65535 - 1024) }
92
-
93
- it "should open then close a TCPSocket" do
94
- socket = nil
95
-
96
- subject.tcp_session(host,port) do |yielded_socket|
97
- socket = yielded_socket
98
- end
99
-
100
- socket.should be_kind_of(TCPSocket)
101
- socket.should be_closed
102
- end
103
-
104
- it "should bind to a local host and port" do
105
- bound_port = nil
106
-
107
- subject.tcp_session(host,port,nil,local_port) do |socket|
108
- bound_port = socket.addr[1]
109
- end
110
-
111
- bound_port.should == local_port
112
- end
113
- end
114
-
115
- describe "#tcp_banner" do
116
- let(:host) { 'smtp.gmail.com' }
117
- let(:port) { 25 }
118
-
119
- let(:local_port) { 1024 + rand(65535 - 1024) }
120
-
121
- it "should read the service banner" do
122
- banner = subject.tcp_banner(host,port)
123
-
124
- banner.start_with?('220').should be_true
125
- end
126
-
127
- it "should bind to a local host and port" do
128
- banner = subject.tcp_banner(host,port,nil,local_port)
129
-
130
- banner.start_with?('220').should be_true
131
- end
132
-
133
- it "should yield the banner" do
134
- banner = nil
135
-
136
- subject.tcp_banner(host,port) do |yielded_banner|
137
- banner = yielded_banner
138
- end
139
-
140
- banner.start_with?('220').should be_true
141
- end
142
- end
143
-
144
- describe "#tcp_send" do
145
- let(:server) { TCPServer.new(server_host,0) }
146
- let(:server_port) { server.addr[1] }
147
-
148
- let(:data) { "hello\n" }
149
- let(:local_port) { 1024 + rand(65535 - 1024) }
150
-
151
- after(:all) { server.close }
152
-
153
- it "should send data to a service" do
154
- subject.tcp_send(data,server_host,server_port)
155
-
156
- client = server.accept
157
- sent = client.readline
158
-
159
- client.close
160
-
161
- sent.should == data
162
- end
163
-
164
- it "should bind to a local host and port" do
165
- subject.tcp_send(data,server_host,server_port,nil,local_port)
166
-
167
- client = server.accept
168
- client_port = client.peeraddr[1]
169
-
170
- client_port.should == local_port
171
-
172
- client.close
173
- end
174
- end
175
-
176
- describe "#tcp_server" do
177
- let(:server_port) { 1024 + rand(65535 - 1024) }
178
-
179
- it "should create a new TCPServer" do
180
- server = subject.tcp_server
181
-
182
- server.should be_kind_of(TCPServer)
183
- server.should_not be_closed
184
-
185
- server.close
186
- end
187
-
188
- it "should bind to a specific port and host" do
189
- server = subject.tcp_server(server_port,server_host)
190
- bound_host = server.addr[3]
191
- bound_port = server.addr[1]
192
-
193
- bound_host.should == server_ip
194
- bound_port.should == server_port
195
-
196
- server.close
197
- end
198
-
199
- it "should yield the new TCPServer" do
200
- server = nil
201
-
202
- subject.tcp_server do |yielded_server|
203
- server = yielded_server
204
- end
205
-
206
- server.should be_kind_of(TCPServer)
207
- server.should_not be_closed
208
-
209
- server.close
210
- end
211
- end
212
-
213
- describe "#tcp_server_session" do
214
- let(:server_port) { 1024 + rand(65535 - 1024) }
215
-
216
- it "should create a temporary TCPServer" do
217
- server = nil
218
-
219
- subject.tcp_server_session do |yielded_server|
220
- server = yielded_server
221
- end
222
-
223
- server.should be_kind_of(TCPServer)
224
- server.should be_closed
225
- end
226
-
227
- it "should bind to a specific port and host" do
228
- bound_host = nil
229
- bound_port = nil
230
-
231
- subject.tcp_server_session(server_port,server_host) do |yielded_server|
232
- bound_host = yielded_server.addr[3]
233
- bound_port = yielded_server.addr[1]
234
- end
235
-
236
- bound_host.should == server_ip
237
- bound_port.should == server_port
238
- end
239
- end
240
-
241
- describe "#tcp_single_server" do
242
- let(:server_port) { 1024 + rand(65535 - 1024) }
243
-
244
- pending "need to automate connecting to the TCPServer"
245
- end
246
- end
247
- end
@@ -1,248 +0,0 @@
1
- require 'spec_helper'
2
- require 'ronin/network/udp'
3
-
4
- require 'resolv'
5
-
6
- describe Network::UDP do
7
- describe "helper methods", :network do
8
- let(:host) { 'scanme.nmap.org' }
9
- let(:port) { 123 }
10
-
11
- let(:server_host) { 'localhost' }
12
- let(:server_ip) { Resolv.getaddress(server_host) }
13
-
14
- subject do
15
- obj = Object.new
16
- obj.extend described_class
17
- obj
18
- end
19
-
20
- describe "#udp_connect" do
21
- let(:local_port) { 1024 + rand(65535 - 1024) }
22
-
23
- it "should open a UDPSocket" do
24
- socket = subject.udp_connect(host,port)
25
-
26
- socket.should be_kind_of(UDPSocket)
27
- socket.should_not be_closed
28
-
29
- socket.close
30
- end
31
-
32
- it "should bind to a local port" do
33
- socket = subject.udp_connect(host,port,nil,local_port)
34
- bound_port = socket.addr[1]
35
-
36
- bound_port.should == local_port
37
-
38
- socket.close
39
- end
40
-
41
- it "should yield the new UDPSocket" do
42
- socket = nil
43
-
44
- subject.udp_connect(host,port) do |yielded_socket|
45
- socket = yielded_socket
46
- end
47
-
48
- socket.should_not be_closed
49
- socket.close
50
- end
51
- end
52
-
53
- describe "#udp_connect_and_send" do
54
- pending "need to find a UDP Service for these specs" do
55
- let(:data) { "HELO ronin\n" }
56
- let(:local_port) { 1024 + rand(65535 - 1024) }
57
-
58
- it "should connect and then send data" do
59
- socket = subject.udp_connect_and_send(data,host,port)
60
- banner = socket.readline
61
- response = socket.readline
62
-
63
- response.start_with?('250').should be_true
64
-
65
- socket.close
66
- end
67
-
68
- it "should bind to a local port" do
69
- socket = subject.udp_connect_and_send(data,host,port,nil,local_port)
70
- bound_port = socket.addr[1]
71
-
72
- bound_port.should == local_port
73
-
74
- socket.close
75
- end
76
-
77
- it "should yield the UDPSocket" do
78
- response = nil
79
-
80
- socket = subject.udp_connect_and_send(data,host,port) do |socket|
81
- banner = socket.readline
82
- response = socket.readline
83
- end
84
-
85
- response.start_with?('250').should be_true
86
-
87
- socket.close
88
- end
89
- end
90
- end
91
-
92
- describe "#udp_session" do
93
- let(:local_port) { 1024 + rand(65535 - 1024) }
94
-
95
- it "should open then close a UDPSocket" do
96
- socket = nil
97
-
98
- subject.udp_session(host,port) do |yielded_socket|
99
- socket = yielded_socket
100
- end
101
-
102
- socket.should be_kind_of(UDPSocket)
103
- socket.should be_closed
104
- end
105
-
106
- it "should bind to a local host and port" do
107
- bound_port = nil
108
-
109
- subject.udp_session(host,port,nil,local_port) do |socket|
110
- bound_port = socket.addr[1]
111
- end
112
-
113
- bound_port.should == local_port
114
- end
115
- end
116
-
117
- describe "#udp_banner" do
118
- pending "need to find a UDP service that sends a banner" do
119
- let(:host) { 'smtp.gmail.com' }
120
- let(:port) { 25 }
121
-
122
- let(:local_port) { 1024 + rand(65535 - 1024) }
123
-
124
- it "should read the service banner" do
125
- banner = subject.udp_banner(host,port)
126
-
127
- banner.start_with?('220').should be_true
128
- end
129
-
130
- it "should bind to a local host and port" do
131
- banner = subject.udp_banner(host,port,nil,local_port)
132
-
133
- banner.start_with?('220').should be_true
134
- end
135
-
136
- it "should yield the banner" do
137
- banner = nil
138
-
139
- subject.udp_banner(host,port) do |yielded_banner|
140
- banner = yielded_banner
141
- end
142
-
143
- banner.start_with?('220').should be_true
144
- end
145
- end
146
- end
147
-
148
- describe "#udp_send" do
149
- let(:server) do
150
- socket = UDPSocket.new
151
- socket.bind(server_host,0)
152
- socket
153
- end
154
- let(:server_port) { server.addr[1] }
155
-
156
- let(:data) { "hello\n" }
157
- let(:local_port) { 1024 + rand(65535 - 1024) }
158
-
159
- after(:all) { server.close }
160
-
161
- it "should send data to a service" do
162
- subject.udp_send(data,server_host,server_port)
163
-
164
- mesg = server.recvfrom(data.length)
165
-
166
- mesg[0].should == data
167
- end
168
-
169
- it "should bind to a local host and port" do
170
- subject.udp_send(data,server_host,server_port,nil,local_port)
171
-
172
- mesg = server.recvfrom(data.length)
173
-
174
- client_address = mesg[1]
175
- client_address[1].should == local_port
176
- end
177
- end
178
-
179
- describe "#udp_server" do
180
- let(:server_port) { 1024 + rand(65535 - 1024) }
181
-
182
- it "should create a new UDPSocket" do
183
- server = subject.udp_server
184
-
185
- server.should be_kind_of(UDPSocket)
186
- server.should_not be_closed
187
-
188
- server.close
189
- end
190
-
191
- it "should bind to a specific port and host" do
192
- server = subject.udp_server(server_port,server_host)
193
- bound_host = server.addr[3]
194
- bound_port = server.addr[1]
195
-
196
- bound_host.should == server_ip
197
- bound_port.should == server_port
198
-
199
- server.close
200
- end
201
-
202
- it "should yield the new UDPSocket" do
203
- server = nil
204
-
205
- subject.udp_server do |yielded_server|
206
- server = yielded_server
207
- end
208
-
209
- server.should be_kind_of(UDPSocket)
210
- server.should_not be_closed
211
-
212
- server.close
213
- end
214
- end
215
-
216
- describe "#udp_server_session" do
217
- let(:server_port) { 1024 + rand(65535 - 1024) }
218
-
219
- it "should create a temporary UDPSocket" do
220
- server = nil
221
-
222
- subject.udp_server_session do |yielded_server|
223
- server = yielded_server
224
- end
225
-
226
- server.should be_kind_of(UDPSocket)
227
- server.should be_closed
228
- end
229
-
230
- it "should bind to a specific port and host" do
231
- bound_host = nil
232
- bound_port = nil
233
-
234
- subject.udp_server_session(server_port,server_host) do |yielded_server|
235
- bound_host = yielded_server.addr[3]
236
- bound_port = yielded_server.addr[1]
237
- end
238
-
239
- bound_host.should == server_ip
240
- bound_port.should == server_port
241
- end
242
- end
243
-
244
- describe "#udp_single_server" do
245
- let(:server_port) { 1024 + rand(65535 - 1024) }
246
- end
247
- end
248
- end