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
@@ -17,7 +17,7 @@
17
17
  # along with Ronin Support. If not, see <http://www.gnu.org/licenses/>.
18
18
  #
19
19
 
20
- require 'ronin/network/extensions/ssl'
20
+ require 'ronin/network/tcp'
21
21
 
22
22
  begin
23
23
  require 'openssl'
@@ -27,9 +27,11 @@ end
27
27
  module Ronin
28
28
  module Network
29
29
  #
30
- # SSL helper methods.
30
+ # Provides helper methods for communicating with SSL-enabled services.
31
31
  #
32
32
  module SSL
33
+ extend TCP
34
+
33
35
  # Maps SSL verify modes to `OpenSSL::SSL::VERIFY_*` constants.
34
36
  #
35
37
  # @return [Hash{Symbol => Integer}]
@@ -52,5 +54,132 @@ module Ronin
52
54
  hash[key] = OpenSSL::SSL.const_get(verify_const)
53
55
  end
54
56
  end
57
+
58
+ #
59
+ # Establishes a SSL connection.
60
+ #
61
+ # @param [String] host
62
+ # The host to connect to.
63
+ #
64
+ # @param [Integer] port
65
+ # The port to connect to.
66
+ #
67
+ # @param [Hash] options
68
+ # Additional options.
69
+ #
70
+ # @option options [String] :local_host
71
+ # The local host to bind to.
72
+ #
73
+ # @option options [Integer] :local_port
74
+ # The local port to bind to.
75
+ #
76
+ # @option options [Symbol] :verify
77
+ # Specifies whether to verify the SSL certificate.
78
+ # May be one of the following:
79
+ #
80
+ # * `:none`
81
+ # * `:peer`
82
+ # * `:client_once`
83
+ # * `:fail_if_no_peer_cert`
84
+ #
85
+ # @option options [String] :cert
86
+ # The path to the SSL certificate.
87
+ #
88
+ # @option options [String] :key
89
+ # The path to the SSL key.
90
+ #
91
+ # @yield [ssl_socket]
92
+ # The given block will be passed the new SSL Socket.
93
+ #
94
+ # @yieldparam [OpenSSL::SSL::SSLSocket] ssl_socket
95
+ # The new SSL Socket.
96
+ #
97
+ # @return [OpenSSL::SSL::SSLSocket]
98
+ # the new SSL Socket.
99
+ #
100
+ # @example
101
+ # socket = ssl_connect('twitter.com',443)
102
+ #
103
+ # @api public
104
+ #
105
+ def ssl_connect(host,port,options={})
106
+ local_host = options[:local_host]
107
+ local_port = options[:local_port]
108
+
109
+ socket = tcp_connect(host,port,local_host,local_port)
110
+
111
+ ssl_context = OpenSSL::SSL::SSLContext.new()
112
+ ssl_context.verify_mode = SSL::VERIFY[options[:verify]]
113
+
114
+ if options[:cert]
115
+ cert_file = File.new(options[:cert])
116
+ ssl_context.cert = OpenSSL::X509::Certificate.new(cert_file)
117
+ end
118
+
119
+ if options[:key]
120
+ key_file = File.new(options[:key])
121
+ ssl_context.key = OpenSSL::PKey::RSA.new(key_file)
122
+ end
123
+
124
+ ssl_socket = OpenSSL::SSL::SSLSocket.new(socket,ssl_context)
125
+ ssl_socket.sync_close = true
126
+ ssl_socket.connect
127
+
128
+ yield ssl_socket if block_given?
129
+ return ssl_socket
130
+ end
131
+
132
+ #
133
+ # Creates a new temporary SSL connection.
134
+ #
135
+ # @param [String] host
136
+ # The host to connect to.
137
+ #
138
+ # @param [Integer] port
139
+ # The port to connect to.
140
+ #
141
+ # @param [Hash] options
142
+ # Additional options.
143
+ #
144
+ # @option options [String] :local_host
145
+ # The local host to bind to.
146
+ #
147
+ # @option options [Integer] :local_port
148
+ # The local port to bind to.
149
+ #
150
+ # @option options [Symbol] :verify
151
+ # Specifies whether to verify the SSL certificate.
152
+ #
153
+ # @option options [String] :cert
154
+ # The path to the SSL certificate.
155
+ #
156
+ # @option options [String] :key
157
+ # The path to the SSL key.
158
+ #
159
+ # @yield [ssl_socket]
160
+ # The given block will be passed the temporary SSL Socket.
161
+ #
162
+ # @yieldparam [OpenSSL::SSL::SSLSocket] ssl_socket
163
+ # The temporary SSL Socket.
164
+ #
165
+ # @return [nil]
166
+ #
167
+ # @example
168
+ # ssl_session('twitter.com',443) do |sock|
169
+ # sock.write("GET /\n\n")
170
+ #
171
+ # sock.each_line { |line| puts line }
172
+ # end
173
+ #
174
+ # @api public
175
+ #
176
+ def ssl_session(host,port)
177
+ ssl_socket = ssl_connect(host,port)
178
+
179
+ yield ssl_socket if block_given?
180
+
181
+ ssl_socket.close
182
+ return nil
183
+ end
55
184
  end
56
185
  end
@@ -17,4 +17,309 @@
17
17
  # along with Ronin Support. If not, see <http://www.gnu.org/licenses/>.
18
18
  #
19
19
 
20
- require 'ronin/network/extensions/tcp'
20
+ require 'socket'
21
+
22
+ module Ronin
23
+ module Network
24
+ #
25
+ # Provides helper methods for using the TCP protocol.
26
+ #
27
+ module TCP
28
+ #
29
+ # Creates a new TCPSocket object connected to a given host and port.
30
+ #
31
+ # @param [String] host
32
+ # The host to connect to.
33
+ #
34
+ # @param [Integer] port
35
+ # The port to connect to.
36
+ #
37
+ # @param [String] local_host (nil)
38
+ # The local host to bind to.
39
+ #
40
+ # @param [Integer] local_port (nil)
41
+ # The local port to bind to.
42
+ #
43
+ # @yield [socket]
44
+ # If a block is given, it will be passed the newly created socket.
45
+ #
46
+ # @yieldparam [TCPsocket] socket
47
+ # The newly created TCPSocket object.
48
+ #
49
+ # @return [TCPSocket]
50
+ # The newly created TCPSocket object.
51
+ #
52
+ # @example
53
+ # tcp_connect('www.hackety.org',80) # => TCPSocket
54
+ #
55
+ # @example
56
+ # tcp_connect('www.wired.com',80) do |sock|
57
+ # sock.write("GET /\n\n")
58
+ # puts sock.readlines
59
+ # sock.close
60
+ # end
61
+ #
62
+ # @api public
63
+ #
64
+ def tcp_connect(host,port,local_host=nil,local_port=nil)
65
+ host = host.to_s
66
+ local_host = if local_host
67
+ local_host.to_s
68
+ end
69
+
70
+ sock = TCPSocket.new(host,port,local_host,local_port)
71
+
72
+ yield sock if block_given?
73
+ return sock
74
+ end
75
+
76
+ #
77
+ # Creates a new TCPSocket object, connected to a given host and port.
78
+ # The given data will then be written to the newly created TCPSocket.
79
+ #
80
+ # @param [String] data
81
+ # The data to send through the connection.
82
+ #
83
+ # @param [String] host
84
+ # The host to connect to.
85
+ #
86
+ # @param [Integer] port
87
+ # The port to connect to.
88
+ #
89
+ # @param [String] local_host (nil)
90
+ # The local host to bind to.
91
+ #
92
+ # @param [Integer] local_port (nil)
93
+ # The local port to bind to.
94
+ #
95
+ # @yield [socket]
96
+ # If a block is given, it will be passed the newly created socket.
97
+ #
98
+ # @yieldparam [TCPsocket] socket
99
+ # The newly created TCPSocket object.
100
+ #
101
+ # @api public
102
+ #
103
+ def tcp_connect_and_send(data,host,port,local_host=nil,local_port=nil)
104
+ sock = tcp_connect(host,port,local_host,local_port)
105
+ sock.write(data)
106
+
107
+ yield sock if block_given?
108
+ return sock
109
+ end
110
+
111
+ #
112
+ # Creates a new temporary TCPSocket object, connected to the given host
113
+ # and port.
114
+ #
115
+ # @param [String] host
116
+ # The host to connect to.
117
+ #
118
+ # @param [Integer] port
119
+ # The port to connect to.
120
+ #
121
+ # @param [String] local_host (nil)
122
+ # The local host to bind to.
123
+ #
124
+ # @param [Integer] local_port (nil)
125
+ # The local port to bind to.
126
+ #
127
+ # @yield [socket]
128
+ # If a block is given, it will be passed the newly created socket.
129
+ # After the block has returned, the socket will then be closed.
130
+ #
131
+ # @yieldparam [TCPsocket] socket
132
+ # The newly created TCPSocket object.
133
+ #
134
+ # @return [nil]
135
+ #
136
+ # @api public
137
+ #
138
+ def tcp_session(host,port,local_host=nil,local_port=nil)
139
+ sock = tcp_connect(host,port,local_host,local_port)
140
+
141
+ yield sock if block_given?
142
+
143
+ sock.close
144
+ return nil
145
+ end
146
+
147
+ #
148
+ # Reads the banner from the service running on the given host and port.
149
+ #
150
+ # @param [String] host
151
+ # The host to connect to.
152
+ #
153
+ # @param [Integer] port
154
+ # The port to connect to.
155
+ #
156
+ # @param [String] local_host (nil)
157
+ # The local host to bind to.
158
+ #
159
+ # @param [Integer] local_port (nil)
160
+ # The local port to bind to.
161
+ #
162
+ # @yield [banner]
163
+ # If a block is given, it will be passed the grabbed banner.
164
+ #
165
+ # @yieldparam [String] banner
166
+ # The grabbed banner.
167
+ #
168
+ # @return [String]
169
+ # The grabbed banner.
170
+ #
171
+ # @example
172
+ # tcp_banner('pop.gmail.com',25)
173
+ # # => "220 mx.google.com ESMTP c20sm3096959rvf.1"
174
+ #
175
+ # @api public
176
+ #
177
+ def tcp_banner(host,port,local_host=nil,local_port=nil)
178
+ banner = nil
179
+
180
+ tcp_session(host,port,local_host,local_port) do |sock|
181
+ banner = sock.readline.strip
182
+ end
183
+
184
+ yield banner if block_given?
185
+ return banner
186
+ end
187
+
188
+ #
189
+ # Connects to a specified host and port, sends the given data and then
190
+ # closes the connection.
191
+ #
192
+ # @param [String] data
193
+ # The data to send through the connection.
194
+ #
195
+ # @param [String] host
196
+ # The host to connect to.
197
+ #
198
+ # @param [Integer] port
199
+ # The port to connect to.
200
+ #
201
+ # @param [String] local_host (nil)
202
+ # The local host to bind to.
203
+ #
204
+ # @param [Integer] local_port (nil)
205
+ # The local port to bind to.
206
+ #
207
+ # @return [true]
208
+ # The data was successfully sent.
209
+ #
210
+ # @example
211
+ # buffer = "GET /" + ('A' * 4096) + "\n\r"
212
+ # tcp_send(buffer,'victim.com',80)
213
+ # # => true
214
+ #
215
+ # @api public
216
+ #
217
+ def tcp_send(data,host,port,local_host=nil,local_port=nil)
218
+ tcp_session(host,port,local_host,local_port) do |sock|
219
+ sock.write(data)
220
+ end
221
+
222
+ return true
223
+ end
224
+
225
+ #
226
+ # Creates a new TCPServer listening on a given host and port.
227
+ #
228
+ # @param [Integer] port
229
+ # The local port to listen on.
230
+ #
231
+ # @param [String] host ('0.0.0.0')
232
+ # The host to bind to.
233
+ #
234
+ # @return [TCPServer]
235
+ # The new TCP server.
236
+ #
237
+ # @example
238
+ # tcp_server(1337)
239
+ #
240
+ # @api public
241
+ #
242
+ def tcp_server(port,host='0.0.0.0')
243
+ host = host.to_s
244
+
245
+ server = TCPServer.new(host,port)
246
+ server.listen(3)
247
+
248
+ yield server if block_given?
249
+ return server
250
+ end
251
+
252
+ #
253
+ # Creates a new temporary TCPServer listening on a host and port.
254
+ #
255
+ # @param [Integer] port
256
+ # The local port to bind to.
257
+ #
258
+ # @param [String] host ('0.0.0.0')
259
+ # The host to bind to.
260
+ #
261
+ # @yield [server]
262
+ # The block which will be called after the server has been created.
263
+ # After the block has finished, the server will be closed.
264
+ #
265
+ # @yieldparam [TCPServer] server
266
+ # The newly created TCP server.
267
+ #
268
+ # @return [nil]
269
+ #
270
+ # @example
271
+ # tcp_server_session(1337) do |server|
272
+ # client1 = server.accept
273
+ # client2 = server.accept
274
+ #
275
+ # client2.write(server.read_line)
276
+ #
277
+ # client1.close
278
+ # client2.close
279
+ # end
280
+ #
281
+ # @api public
282
+ #
283
+ def tcp_server_session(port,host='0.0.0.0',&block)
284
+ server = tcp_server(port,host,&block)
285
+ server.close()
286
+ return nil
287
+ end
288
+
289
+ #
290
+ # Creates a new TCPServer listening on a given host and port,
291
+ # accepts only one client and then stops listening.
292
+ #
293
+ # @param [Integer] port
294
+ # After the block has finished, the client and the server will be
295
+ # closed.
296
+ #
297
+ # @yieldparam [TCPSocket] client
298
+ # The newly connected client.
299
+ #
300
+ # @return [nil]
301
+ #
302
+ # @example
303
+ # tcp_single_server(1337) do |client|
304
+ # client.puts 'lol'
305
+ # end
306
+ #
307
+ # @api public
308
+ #
309
+ def tcp_single_server(port,host='0.0.0.0')
310
+ host = host.to_s
311
+
312
+ server = TCPServer.new(host,port)
313
+ server.listen(1)
314
+
315
+ client = server.accept
316
+
317
+ yield client if block_given?
318
+
319
+ client.close
320
+ server.close
321
+ return nil
322
+ end
323
+ end
324
+ end
325
+ end