ronin-support 0.5.0 → 0.5.1
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.
- data/ChangeLog.md +13 -1
- data/README.md +5 -3
- data/lib/ronin/binary/hexdump/parser.rb +10 -18
- data/lib/ronin/binary/struct.rb +18 -32
- data/lib/ronin/binary/template.rb +29 -19
- data/lib/ronin/extensions/ip_addr.rb +5 -10
- data/lib/ronin/extensions/resolv.rb +2 -4
- data/lib/ronin/formatting/extensions/binary.rb +1 -0
- data/lib/ronin/formatting/extensions/binary/array.rb +5 -7
- data/lib/ronin/formatting/extensions/binary/float.rb +4 -4
- data/lib/ronin/formatting/extensions/binary/integer.rb +14 -11
- data/lib/ronin/formatting/extensions/binary/string.rb +14 -25
- data/lib/ronin/formatting/extensions/html/integer.rb +4 -8
- data/lib/ronin/formatting/extensions/html/string.rb +24 -32
- data/lib/ronin/formatting/extensions/sql/string.rb +9 -13
- data/lib/ronin/formatting/extensions/text/array.rb +8 -6
- data/lib/ronin/formatting/extensions/text/string.rb +4 -8
- data/lib/ronin/fuzzing/fuzzer.rb +8 -16
- data/lib/ronin/network/dns.rb +2 -4
- data/lib/ronin/network/ftp.rb +5 -1
- data/lib/ronin/network/ssl.rb +9 -10
- data/lib/ronin/network/tcp/tcp.rb +8 -0
- data/lib/ronin/network/udp/proxy.rb +2 -2
- data/lib/ronin/network/udp/udp.rb +8 -0
- data/lib/ronin/network/unix.rb +4 -5
- data/lib/ronin/path.rb +2 -2
- data/lib/ronin/support/version.rb +1 -1
- data/lib/ronin/ui/output/helpers.rb +2 -4
- data/lib/ronin/ui/shell.rb +3 -6
- data/spec/binary/template_spec.rb +14 -0
- data/spec/formatting/binary/array_spec.rb +8 -4
- data/spec/formatting/binary/float_spec.rb +8 -4
- data/spec/formatting/binary/integer_spec.rb +16 -4
- data/spec/formatting/binary/string_spec.rb +8 -4
- data/spec/network/ftp_spec.rb +16 -0
- data/spec/network/network_spec.rb +1 -1
- data/spec/network/ssl_spec.rb +50 -0
- metadata +359 -399
data/ChangeLog.md
CHANGED
@@ -1,5 +1,18 @@
|
|
1
|
+
### 0.5.1 / 2012-06-29
|
2
|
+
|
3
|
+
* Added {Ronin::Binary::Template#inspect}.
|
4
|
+
* Added the `:passive` option to {Ronin::Network::FTP#ftp_connect}.
|
5
|
+
* Forgot to require `ronin/formatting/extensions/binary/array`.
|
6
|
+
* Fixed a bug where {Array#pack} would not accept tuples (ex: `[:uint8, 2]`).
|
7
|
+
* Fixed a bug in {String#sql_decode} where `"\\'\\'"` would incorrectly be
|
8
|
+
converted to `'"'`.
|
9
|
+
* Ensure that {Integer#pack} only accepts one argument.
|
10
|
+
* Have {String#hex_unescape} to decode every two characters.
|
11
|
+
* Enable passive-mode by default in {Ronin::Network::FTP#ftp_connect}.
|
12
|
+
|
1
13
|
### 0.5.0 / 2012-06-16
|
2
14
|
|
15
|
+
* Require uri-query_params ~> 0.6.
|
3
16
|
* Added {Float#pack}.
|
4
17
|
* Added {Regexp::WORD}.
|
5
18
|
* Added {Regexp::PHONE_NUMBER}.
|
@@ -51,7 +64,6 @@
|
|
51
64
|
* {Ronin::Fuzzing.[]} now raises a `NoMethodError` for unknown fuzzing methods.
|
52
65
|
* Use `module_function` in {Ronin::Fuzzing}, so the generator methods can be
|
53
66
|
included into other Classes/Modules.
|
54
|
-
* Require uri-query_params ~> 0.6.
|
55
67
|
* Use `$stdout` instead of calling `Kernel.puts` or `STDOUT`.
|
56
68
|
Prevents infinite recursion if another library overrides `Kernel.puts`.
|
57
69
|
* Allow {Ronin::Network::DNS} methods to yield resolved addresses.
|
data/README.md
CHANGED
@@ -3,8 +3,8 @@
|
|
3
3
|
* [Source](https://github.com/ronin-ruby/ronin-support)
|
4
4
|
* [Issues](https://github.com/ronin-ruby/ronin-support/issues)
|
5
5
|
* [Documentation](http://ronin-ruby.github.com/docs/ronin-support/frames)
|
6
|
-
* [Mailing List](
|
7
|
-
* [irc.freenode.net #ronin](http://
|
6
|
+
* [Mailing List](https://groups.google.com/group/ronin-ruby)
|
7
|
+
* [irc.freenode.net #ronin](http://ronin-ruby.github.com/irc/)
|
8
8
|
|
9
9
|
## Description
|
10
10
|
|
@@ -21,17 +21,19 @@ or payloads over many common Source-Code-Management (SCM) systems.
|
|
21
21
|
* Formatting data:
|
22
22
|
* Binary
|
23
23
|
* Text
|
24
|
-
* HTTP
|
25
24
|
* URIs
|
25
|
+
* HTTP
|
26
26
|
* HTML
|
27
27
|
* JavaScript
|
28
28
|
* SQL
|
29
29
|
* Fuzzing
|
30
30
|
* Networking:
|
31
31
|
* DNS
|
32
|
+
* UNIX
|
32
33
|
* TCP
|
33
34
|
* UDP
|
34
35
|
* SSL
|
36
|
+
* FTP
|
35
37
|
* SMTP / ESMTP
|
36
38
|
* POP3
|
37
39
|
* Imap
|
@@ -137,10 +137,8 @@ module Ronin
|
|
137
137
|
@encoding = options[:encoding]
|
138
138
|
|
139
139
|
@type = case @encoding
|
140
|
-
when :floats, :doubles
|
141
|
-
|
142
|
-
else
|
143
|
-
:integer
|
140
|
+
when :floats, :doubles then :float
|
141
|
+
else :integer
|
144
142
|
end
|
145
143
|
@endian = options.fetch(:endian,:little)
|
146
144
|
|
@@ -164,12 +162,10 @@ module Ronin
|
|
164
162
|
@word_size = WORD_SIZES.fetch(options[:encoding])
|
165
163
|
end
|
166
164
|
|
167
|
-
case @encoding
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
@chars = CHARS.merge(NAMED_CHARS)
|
172
|
-
end
|
165
|
+
@chars = case @encoding
|
166
|
+
when :hex_chars then CHARS.merge(ESCAPED_CHARS)
|
167
|
+
when :named_chars then CHARS.merge(NAMED_CHARS)
|
168
|
+
end
|
173
169
|
end
|
174
170
|
|
175
171
|
#
|
@@ -352,10 +348,8 @@ module Ronin
|
|
352
348
|
# @api private
|
353
349
|
#
|
354
350
|
def parse_int(int)
|
355
|
-
if @chars
|
356
|
-
|
357
|
-
else
|
358
|
-
int.to_i(@base)
|
351
|
+
if @chars then parse_char(int)
|
352
|
+
else int.to_i(@base)
|
359
353
|
end
|
360
354
|
end
|
361
355
|
|
@@ -383,10 +377,8 @@ module Ronin
|
|
383
377
|
#
|
384
378
|
def parse_word(word)
|
385
379
|
case @type
|
386
|
-
when :integer
|
387
|
-
|
388
|
-
when :float
|
389
|
-
parse_float(word)
|
380
|
+
when :integer then parse_int(word)
|
381
|
+
when :float then parse_float(word)
|
390
382
|
end
|
391
383
|
end
|
392
384
|
|
data/lib/ronin/binary/struct.rb
CHANGED
@@ -39,7 +39,7 @@ module Ronin
|
|
39
39
|
#
|
40
40
|
# pkt = Packet.new
|
41
41
|
# pkt.length = 5
|
42
|
-
# pkt.data
|
42
|
+
# pkt.data = 'hello'
|
43
43
|
#
|
44
44
|
# buffer = pkt.pack
|
45
45
|
# # => "\x00\x00\x00\x05hello\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
@@ -96,7 +96,7 @@ module Ronin
|
|
96
96
|
# Unpacking options.
|
97
97
|
#
|
98
98
|
# @option options [:little, :big, :network] :endian
|
99
|
-
# The endianness to apply to types.
|
99
|
+
# The endianness to apply to the types.
|
100
100
|
#
|
101
101
|
# @return [Struct]
|
102
102
|
# The newly unpacked structure.
|
@@ -131,10 +131,8 @@ module Ronin
|
|
131
131
|
# The structure does not contain the field.
|
132
132
|
#
|
133
133
|
def [](name)
|
134
|
-
if field?(name)
|
135
|
-
|
136
|
-
else
|
137
|
-
raise(ArgumentError,"no such field '#{name}'")
|
134
|
+
if field?(name) then send(name)
|
135
|
+
else raise(ArgumentError,"no such field '#{name}'")
|
138
136
|
end
|
139
137
|
end
|
140
138
|
|
@@ -154,10 +152,8 @@ module Ronin
|
|
154
152
|
# The structure does not contain the field.
|
155
153
|
#
|
156
154
|
def []=(name,value)
|
157
|
-
if field?(name)
|
158
|
-
|
159
|
-
else
|
160
|
-
raise(ArgumentError,"no such field '#{name}'")
|
155
|
+
if field?(name) then send("#{name}=",value)
|
156
|
+
else raise(ArgumentError,"no such field '#{name}'")
|
161
157
|
end
|
162
158
|
end
|
163
159
|
|
@@ -170,19 +166,15 @@ module Ronin
|
|
170
166
|
def values
|
171
167
|
normalize = lambda { |value|
|
172
168
|
case value
|
173
|
-
when Struct
|
174
|
-
|
175
|
-
else
|
176
|
-
value
|
169
|
+
when Struct then value.values
|
170
|
+
else value
|
177
171
|
end
|
178
172
|
}
|
179
173
|
|
180
174
|
self.class.layout.map do |name|
|
181
175
|
case (value = self[name])
|
182
|
-
when Array
|
183
|
-
value
|
184
|
-
else
|
185
|
-
normalize[value]
|
176
|
+
when Array then value.map(&normalize)
|
177
|
+
else normalize[value]
|
186
178
|
end
|
187
179
|
end
|
188
180
|
end
|
@@ -208,7 +200,7 @@ module Ronin
|
|
208
200
|
# Pack options.
|
209
201
|
#
|
210
202
|
# @option options [:little, :big, :network] :endian
|
211
|
-
# The endianness to apply to types.
|
203
|
+
# The endianness to apply to the types.
|
212
204
|
#
|
213
205
|
# @return [String]
|
214
206
|
# The packed structure.
|
@@ -227,7 +219,7 @@ module Ronin
|
|
227
219
|
# Unpack options.
|
228
220
|
#
|
229
221
|
# @option options [:little, :big, :network] :endian
|
230
|
-
# The endianness to apply to types.
|
222
|
+
# The endianness to apply to the types.
|
231
223
|
#
|
232
224
|
# @return [Struct]
|
233
225
|
# The unpacked structure.
|
@@ -383,10 +375,8 @@ module Ronin
|
|
383
375
|
# The endianness of the structure.
|
384
376
|
#
|
385
377
|
def self.endian(type=nil)
|
386
|
-
if type
|
387
|
-
|
388
|
-
else
|
389
|
-
@endian
|
378
|
+
if type then @endian = type.to_sym
|
379
|
+
else @endian
|
390
380
|
end
|
391
381
|
end
|
392
382
|
|
@@ -484,14 +474,10 @@ module Ronin
|
|
484
474
|
end
|
485
475
|
else
|
486
476
|
if type.kind_of?(Symbol)
|
487
|
-
if
|
488
|
-
|
489
|
-
elsif Template::
|
490
|
-
|
491
|
-
elsif Template::CHAR_TYPES.include?(type)
|
492
|
-
"\0"
|
493
|
-
elsif Template::STRING_TYPES.include?(type)
|
494
|
-
''
|
477
|
+
if Template::INT_TYPES.include?(type) then 0
|
478
|
+
elsif Template::FLOAT_TYPES.include?(type) then 0.0
|
479
|
+
elsif Template::CHAR_TYPES.include?(type) then "\0"
|
480
|
+
elsif Template::STRING_TYPES.include?(type) then ''
|
495
481
|
end
|
496
482
|
elsif type < Struct
|
497
483
|
type.new
|
@@ -22,7 +22,7 @@ require 'set'
|
|
22
22
|
module Ronin
|
23
23
|
module Binary
|
24
24
|
#
|
25
|
-
# Provides a translation layer between C
|
25
|
+
# Provides a translation layer between C-types and Ruby `Array#pack`
|
26
26
|
# codes.
|
27
27
|
#
|
28
28
|
# ## Types
|
@@ -60,7 +60,7 @@ module Ronin
|
|
60
60
|
# * `:byte` (`c`) - signed byte.
|
61
61
|
# * `:string` (`Z*`) - binary String, `\0` terminated.
|
62
62
|
#
|
63
|
-
# ### Ruby 1.9 specific types
|
63
|
+
# ### Ruby 1.9 specific C-types
|
64
64
|
#
|
65
65
|
# * `:uint16_le` (`S<`) - unsigned 16-bit integer, little endian.
|
66
66
|
# * `:uint32_le` (`L<`) - unsigned 32-bit integer, little endian.
|
@@ -99,7 +99,7 @@ module Ronin
|
|
99
99
|
#
|
100
100
|
class Template
|
101
101
|
|
102
|
-
# Supported types and corresponding `Array#pack` codes.
|
102
|
+
# Supported C-types and corresponding `Array#pack` codes.
|
103
103
|
TYPES = {
|
104
104
|
:uint8 => 'C',
|
105
105
|
:uint16 => 'S',
|
@@ -144,7 +144,7 @@ module Ronin
|
|
144
144
|
:string => 'Z*'
|
145
145
|
}
|
146
146
|
|
147
|
-
# Additional types, not available on Ruby 1.8:
|
147
|
+
# Additional C-types, not available on Ruby 1.8:
|
148
148
|
if RUBY_VERSION > '1.9.'
|
149
149
|
TYPES.merge!(
|
150
150
|
:uint16_le => 'S<',
|
@@ -185,7 +185,7 @@ module Ronin
|
|
185
185
|
)
|
186
186
|
end
|
187
187
|
|
188
|
-
# Integer types
|
188
|
+
# Integer C-types
|
189
189
|
INT_TYPES = Set[
|
190
190
|
:uint8,
|
191
191
|
:uint16,
|
@@ -246,17 +246,17 @@ module Ronin
|
|
246
246
|
:long_long_be
|
247
247
|
]
|
248
248
|
|
249
|
-
# Float types
|
249
|
+
# Float C-types
|
250
250
|
FLOAT_TYPES = Set[
|
251
251
|
:float, :double,
|
252
252
|
:float_le, :double_le,
|
253
253
|
:float_be, :double_be
|
254
254
|
]
|
255
255
|
|
256
|
-
# Character types
|
256
|
+
# Character C-types
|
257
257
|
CHAR_TYPES = Set[:uchar, :char]
|
258
258
|
|
259
|
-
# String types
|
259
|
+
# String C-types
|
260
260
|
STRING_TYPES = CHAR_TYPES + Set[:string]
|
261
261
|
|
262
262
|
# Types which have little and big endian forms
|
@@ -275,19 +275,19 @@ module Ronin
|
|
275
275
|
# Creates a new Binary Template.
|
276
276
|
#
|
277
277
|
# @param [Array<type, (type, length)>] fields
|
278
|
-
# The types which the packer will use.
|
278
|
+
# The C-types which the packer will use.
|
279
279
|
#
|
280
280
|
# @param [Hash] options
|
281
281
|
# Template options.
|
282
282
|
#
|
283
283
|
# @option options [:little, :big, :network] :endian
|
284
|
-
# The endianness to apply to types.
|
284
|
+
# The endianness to apply to the C-types.
|
285
285
|
#
|
286
286
|
# @raise [ArgumentError]
|
287
287
|
# A given type is not known.
|
288
288
|
#
|
289
289
|
# @note
|
290
|
-
# The following types are **not supported** on Ruby 1.8:
|
290
|
+
# The following C-types are **not supported** on Ruby 1.8:
|
291
291
|
#
|
292
292
|
# * `:uint16_le`
|
293
293
|
# * `:uint32_le`
|
@@ -343,7 +343,7 @@ module Ronin
|
|
343
343
|
# Translation options.
|
344
344
|
#
|
345
345
|
# @option options [:little, :big, :network] :endian
|
346
|
-
# The endianness to apply to types.
|
346
|
+
# The endianness to apply to the C-types.
|
347
347
|
#
|
348
348
|
# @return [Symbol]
|
349
349
|
# The translated type.
|
@@ -354,10 +354,8 @@ module Ronin
|
|
354
354
|
def self.translate(type,options={})
|
355
355
|
if (options[:endian] && ENDIAN_TYPES.include?(type))
|
356
356
|
type = case options[:endian]
|
357
|
-
when :little
|
358
|
-
|
359
|
-
when :big, :network
|
360
|
-
:"#{type}_be"
|
357
|
+
when :little then :"#{type}_le"
|
358
|
+
when :big, :network then :"#{type}_be"
|
361
359
|
else
|
362
360
|
raise(ArgumentError,"unknown endianness: #{type}")
|
363
361
|
end
|
@@ -367,17 +365,17 @@ module Ronin
|
|
367
365
|
end
|
368
366
|
|
369
367
|
#
|
370
|
-
# Compiles
|
368
|
+
# Compiles C-types into an `Array#pack` / `String#unpack`
|
371
369
|
# template.
|
372
370
|
#
|
373
371
|
# @param [Array<type, (type, length)>] types
|
374
|
-
# The types which the packer will use.
|
372
|
+
# The C-types which the packer will use.
|
375
373
|
#
|
376
374
|
# @param [Hash] options
|
377
375
|
# Type options.
|
378
376
|
#
|
379
377
|
# @option options [:little, :big, :network] :endian
|
380
|
-
# The endianness to apply to types.
|
378
|
+
# The endianness to apply to the C-types.
|
381
379
|
#
|
382
380
|
# @return [String]
|
383
381
|
# The `Array#pack` / `String#unpack` template.
|
@@ -439,6 +437,18 @@ module Ronin
|
|
439
437
|
@template
|
440
438
|
end
|
441
439
|
|
440
|
+
#
|
441
|
+
# Inspects the template.
|
442
|
+
#
|
443
|
+
# @return [String]
|
444
|
+
# The inspected template.
|
445
|
+
#
|
446
|
+
# @since 1.5.1
|
447
|
+
#
|
448
|
+
def inspect
|
449
|
+
"<#{self.class}: #{@fields.inspect}>"
|
450
|
+
end
|
451
|
+
|
442
452
|
end
|
443
453
|
end
|
444
454
|
end
|
@@ -66,12 +66,9 @@ class IPAddr
|
|
66
66
|
return enum_for(__method__,text,version).to_a unless block_given?
|
67
67
|
|
68
68
|
regexp = case version
|
69
|
-
when :ipv4, :v4, 4
|
70
|
-
|
71
|
-
|
72
|
-
Regexp::IPv6
|
73
|
-
else
|
74
|
-
Regexp::IP
|
69
|
+
when :ipv4, :v4, 4 then Regexp::IPv4
|
70
|
+
when :ipv6, :v6, 6 then Regexp::IPv6
|
71
|
+
else Regexp::IP
|
75
72
|
end
|
76
73
|
|
77
74
|
text.scan(regexp) do |match|
|
@@ -128,10 +125,8 @@ class IPAddr
|
|
128
125
|
separator = '::'
|
129
126
|
base = 16
|
130
127
|
|
131
|
-
prefix = if cidr_or_glob.start_with?('::')
|
132
|
-
|
133
|
-
else
|
134
|
-
''
|
128
|
+
prefix = if cidr_or_glob.start_with?('::') then '::'
|
129
|
+
else ''
|
135
130
|
end
|
136
131
|
|
137
132
|
format = lambda { |address|
|
@@ -20,6 +20,7 @@
|
|
20
20
|
require 'ronin/formatting/extensions/binary/integer'
|
21
21
|
require 'ronin/formatting/extensions/binary/float'
|
22
22
|
require 'ronin/formatting/extensions/binary/string'
|
23
|
+
require 'ronin/formatting/extensions/binary/array'
|
23
24
|
require 'ronin/formatting/extensions/binary/file'
|
24
25
|
|
25
26
|
require 'hexdump/extensions'
|
@@ -26,14 +26,14 @@ class Array
|
|
26
26
|
#
|
27
27
|
# Packs the Array into a String.
|
28
28
|
#
|
29
|
-
# @param [String, Array<Symbol>] arguments
|
29
|
+
# @param [String, Array<Symbol, (Symbol, Integer)>] arguments
|
30
30
|
# The `Array#pack` template or a list of {Ronin::Binary::Template} types.
|
31
31
|
#
|
32
32
|
# @return [String]
|
33
33
|
# The packed Array.
|
34
34
|
#
|
35
35
|
# @raise [ArgumentError]
|
36
|
-
#
|
36
|
+
# One of the arguments was not a known {Ronin::Binary::Template} type.
|
37
37
|
#
|
38
38
|
# @example using {Ronin::Binary::Template} types:
|
39
39
|
# [0x1234, "hello"].pack(:uint16_le, :string)
|
@@ -44,19 +44,17 @@ class Array
|
|
44
44
|
# # => "\x34\x12hello\0"
|
45
45
|
#
|
46
46
|
# @see http://rubydoc.info/stdlib/core/Array:pack
|
47
|
+
# @see Ronin::Binary::Template
|
47
48
|
#
|
48
49
|
# @since 0.5.0
|
49
50
|
#
|
50
51
|
# @api public
|
51
52
|
#
|
52
53
|
def pack(*arguments)
|
53
|
-
|
54
|
-
when String
|
54
|
+
if (arguments.length == 1 && arguments.first.kind_of?(String))
|
55
55
|
pack_original(arguments.first)
|
56
|
-
when Symbol
|
57
|
-
pack_original(Ronin::Binary::Template.compile(arguments))
|
58
56
|
else
|
59
|
-
|
57
|
+
pack_original(Ronin::Binary::Template.compile(arguments))
|
60
58
|
end
|
61
59
|
end
|
62
60
|
|