ronin-support 1.0.0 → 1.0.2
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.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +14 -0
- data/.rubocop.yml +109 -0
- data/ChangeLog.md +33 -1
- data/Gemfile +8 -4
- data/README.md +1 -1
- data/Rakefile +2 -2
- data/examples/ssl_proxy.rb +2 -1
- data/examples/tcp_proxy.rb +6 -4
- data/lib/ronin/support/archive/core_ext/file.rb +43 -0
- data/lib/ronin/support/archive/core_ext.rb +1 -1
- data/lib/ronin/support/archive/tar/writer.rb +2 -2
- data/lib/ronin/support/archive/tar.rb +4 -4
- data/lib/ronin/support/archive/zip/reader.rb +2 -2
- data/lib/ronin/support/binary/array.rb +5 -8
- data/lib/ronin/support/binary/bit_flip.rb +7 -1
- data/lib/ronin/support/binary/buffer.rb +25 -25
- data/lib/ronin/support/binary/byte_slice.rb +17 -17
- data/lib/ronin/support/binary/core_ext.rb +2 -0
- data/lib/ronin/support/binary/cstring.rb +50 -4
- data/lib/ronin/support/binary/ctypes/arch/arm/big_endian.rb +4 -0
- data/lib/ronin/support/binary/ctypes/arch/arm.rb +3 -0
- data/lib/ronin/support/binary/ctypes/arch/arm64/big_endian.rb +4 -0
- data/lib/ronin/support/binary/ctypes/arch/arm64.rb +3 -0
- data/lib/ronin/support/binary/ctypes/arch/mips/little_endian.rb +4 -0
- data/lib/ronin/support/binary/ctypes/arch/mips.rb +3 -0
- data/lib/ronin/support/binary/ctypes/arch/mips64/little_endian.rb +4 -0
- data/lib/ronin/support/binary/ctypes/arch/mips64.rb +3 -0
- data/lib/ronin/support/binary/ctypes/arch/ppc.rb +3 -0
- data/lib/ronin/support/binary/ctypes/arch/ppc64.rb +3 -0
- data/lib/ronin/support/binary/ctypes/arch/x86.rb +3 -0
- data/lib/ronin/support/binary/ctypes/arch/x86_64.rb +3 -0
- data/lib/ronin/support/binary/ctypes/array_type.rb +2 -2
- data/lib/ronin/support/binary/ctypes/big_endian.rb +3 -0
- data/lib/ronin/support/binary/ctypes/enum_type.rb +2 -2
- data/lib/ronin/support/binary/ctypes/little_endian.rb +3 -0
- data/lib/ronin/support/binary/ctypes/native.rb +3 -0
- data/lib/ronin/support/binary/ctypes/os/bsd.rb +1 -1
- data/lib/ronin/support/binary/ctypes/scalar_type.rb +2 -2
- data/lib/ronin/support/binary/ctypes/struct_type.rb +3 -3
- data/lib/ronin/support/binary/ctypes/type_resolver.rb +7 -8
- data/lib/ronin/support/binary/ctypes/unbounded_array_type.rb +2 -2
- data/lib/ronin/support/binary/ctypes/union_type.rb +3 -3
- data/lib/ronin/support/binary/ctypes.rb +3 -3
- data/lib/ronin/support/binary/memory.rb +2 -2
- data/lib/ronin/support/binary/packet.rb +80 -0
- data/lib/ronin/support/binary/stack.rb +6 -7
- data/lib/ronin/support/binary/struct/member.rb +5 -3
- data/lib/ronin/support/binary/struct.rb +81 -79
- data/lib/ronin/support/binary/template.rb +2 -5
- data/lib/ronin/support/binary/unhexdump/parser.rb +11 -11
- data/lib/ronin/support/binary/union.rb +22 -22
- data/lib/ronin/support/binary.rb +1 -0
- data/lib/ronin/support/cli/ansi.rb +0 -1
- data/lib/ronin/support/cli/io_shell/core_ext/io.rb +1 -1
- data/lib/ronin/support/cli/io_shell.rb +4 -4
- data/lib/ronin/support/cli/printing.rb +3 -3
- data/lib/ronin/support/compression/core_ext/file.rb +16 -0
- data/lib/ronin/support/compression/zlib.rb +1 -1
- data/lib/ronin/support/core_ext/enumerable.rb +0 -2
- data/lib/ronin/support/core_ext/file.rb +1 -1
- data/lib/ronin/support/core_ext/kernel.rb +6 -9
- data/lib/ronin/support/core_ext/string.rb +2 -2
- data/lib/ronin/support/crypto/cert.rb +11 -15
- data/lib/ronin/support/crypto/cert_chain.rb +1 -1
- data/lib/ronin/support/crypto/cipher/aes.rb +3 -0
- data/lib/ronin/support/crypto/cipher/aes128.rb +4 -1
- data/lib/ronin/support/crypto/cipher/aes256.rb +4 -1
- data/lib/ronin/support/crypto/cipher.rb +1 -1
- data/lib/ronin/support/crypto/core_ext/file.rb +33 -1
- data/lib/ronin/support/crypto/core_ext/string.rb +34 -2
- data/lib/ronin/support/crypto/key/methods.rb +4 -1
- data/lib/ronin/support/crypto/key.rb +5 -2
- data/lib/ronin/support/crypto/openssl.rb +1 -1
- data/lib/ronin/support/crypto.rb +0 -1
- data/lib/ronin/support/encoding/base16.rb +2 -2
- data/lib/ronin/support/encoding/base32.rb +29 -18
- data/lib/ronin/support/encoding/c/core_ext/integer.rb +1 -1
- data/lib/ronin/support/encoding/c/core_ext/string.rb +1 -1
- data/lib/ronin/support/encoding/c.rb +6 -6
- data/lib/ronin/support/encoding/core_ext/string.rb +2 -2
- data/lib/ronin/support/encoding/hex/core_ext/string.rb +1 -1
- data/lib/ronin/support/encoding/hex.rb +4 -4
- data/lib/ronin/support/encoding/js/core_ext/integer.rb +1 -1
- data/lib/ronin/support/encoding/js.rb +5 -5
- data/lib/ronin/support/encoding/powershell/core_ext/integer.rb +2 -2
- data/lib/ronin/support/encoding/powershell.rb +5 -6
- data/lib/ronin/support/encoding/quoted_printable.rb +3 -1
- data/lib/ronin/support/encoding/ruby.rb +5 -5
- data/lib/ronin/support/encoding/shell/core_ext/integer.rb +2 -2
- data/lib/ronin/support/encoding/shell.rb +3 -3
- data/lib/ronin/support/encoding/sql.rb +1 -1
- data/lib/ronin/support/encoding/uuencoding.rb +3 -1
- data/lib/ronin/support/encoding/xml.rb +3 -3
- data/lib/ronin/support/encoding.rb +95 -0
- data/lib/ronin/support/network/asn/list.rb +6 -1
- data/lib/ronin/support/network/asn/record.rb +3 -0
- data/lib/ronin/support/network/asn/record_set.rb +3 -0
- data/lib/ronin/support/network/asn.rb +167 -6
- data/lib/ronin/support/network/dns/mixin.rb +2 -10
- data/lib/ronin/support/network/dns/resolver.rb +3 -0
- data/lib/ronin/support/network/domain.rb +21 -21
- data/lib/ronin/support/network/email_address.rb +1 -5
- data/lib/ronin/support/network/esmtp/mixin.rb +1 -0
- data/lib/ronin/support/network/ftp/mixin.rb +1 -1
- data/lib/ronin/support/network/host.rb +75 -47
- data/lib/ronin/support/network/http/core_ext/uri/http.rb +8 -0
- data/lib/ronin/support/network/http/core_ext.rb +1 -1
- data/lib/ronin/support/network/http.rb +317 -80
- data/lib/ronin/support/network/ip.rb +49 -23
- data/lib/ronin/support/network/ip_range/cidr.rb +1 -5
- data/lib/ronin/support/network/ip_range/glob.rb +1 -0
- data/lib/ronin/support/network/ip_range/range.rb +1 -1
- data/lib/ronin/support/network/ip_range.rb +5 -7
- data/lib/ronin/support/network/proxy.rb +4 -4
- data/lib/ronin/support/network/public_suffix/list.rb +10 -8
- data/lib/ronin/support/network/public_suffix/suffix_set.rb +3 -0
- data/lib/ronin/support/network/public_suffix.rb +9 -4
- data/lib/ronin/support/network/smtp/email.rb +0 -9
- data/lib/ronin/support/network/smtp/mixin.rb +2 -2
- data/lib/ronin/support/network/ssl/local_cert.rb +1 -3
- data/lib/ronin/support/network/ssl/mixin.rb +13 -13
- data/lib/ronin/support/network/ssl/openssl.rb +1 -1
- data/lib/ronin/support/network/ssl/proxy.rb +14 -16
- data/lib/ronin/support/network/ssl.rb +4 -2
- data/lib/ronin/support/network/tcp/proxy.rb +3 -3
- data/lib/ronin/support/network/tcp.rb +10 -12
- data/lib/ronin/support/network/telnet/mixin.rb +14 -14
- data/lib/ronin/support/network/tld/list.rb +2 -1
- data/lib/ronin/support/network/tld.rb +7 -4
- data/lib/ronin/support/network/tls/proxy.rb +1 -1
- data/lib/ronin/support/network/tls.rb +0 -2
- data/lib/ronin/support/network/udp/proxy.rb +5 -5
- data/lib/ronin/support/network/udp.rb +14 -16
- data/lib/ronin/support/path.rb +4 -4
- data/lib/ronin/support/text/erb/mixin.rb +3 -0
- data/lib/ronin/support/text/homoglyph/core_ext/string.rb +33 -0
- data/lib/ronin/support/text/homoglyph/table.rb +3 -3
- data/lib/ronin/support/text/patterns/credentials.rb +2 -2
- data/lib/ronin/support/text/patterns/crypto.rb +1 -1
- data/lib/ronin/support/text/patterns/file_system.rb +3 -4
- data/lib/ronin/support/text/patterns/network.rb +21 -21
- data/lib/ronin/support/text/patterns/numeric.rb +1 -1
- data/lib/ronin/support/text/patterns/source_code.rb +2 -2
- data/lib/ronin/support/text/random/mixin.rb +17 -17
- data/lib/ronin/support/text/random.rb +25 -25
- data/lib/ronin/support/text/typo/core_ext/string.rb +24 -0
- data/lib/ronin/support/text/typo/generator.rb +2 -2
- data/lib/ronin/support/version.rb +1 -1
- data/ronin-support.gemspec +6 -5
- metadata +3 -2
@@ -24,6 +24,9 @@ require 'ronin/support/crypto/key/rsa'
|
|
24
24
|
module Ronin
|
25
25
|
module Support
|
26
26
|
module Crypto
|
27
|
+
#
|
28
|
+
# Top-level methods for working with public/private keys.
|
29
|
+
#
|
27
30
|
module Key
|
28
31
|
#
|
29
32
|
# Parses an PEM encoded key.
|
@@ -42,7 +45,7 @@ module Ronin
|
|
42
45
|
#
|
43
46
|
# @raise [ArgumentError]
|
44
47
|
# The key type could not be determined from the key file.
|
45
|
-
#
|
48
|
+
#
|
46
49
|
# @api public
|
47
50
|
#
|
48
51
|
def self.parse(key, password: nil)
|
@@ -93,7 +96,7 @@ module Ronin
|
|
93
96
|
#
|
94
97
|
# @raise [ArgumentError]
|
95
98
|
# The key type could not be determined from the key file.
|
96
|
-
#
|
99
|
+
#
|
97
100
|
# @api public
|
98
101
|
#
|
99
102
|
def self.load_file(path)
|
data/lib/ronin/support/crypto.rb
CHANGED
@@ -656,7 +656,6 @@ module Ronin
|
|
656
656
|
when Key::RSA then key
|
657
657
|
when OpenSSL::PKey::RSA then Key::RSA.new(key)
|
658
658
|
when String then Key::RSA.load(key, password: password)
|
659
|
-
else
|
660
659
|
end
|
661
660
|
else
|
662
661
|
raise(ArgumentError,"either key: or key_file: keyword arguments must be given")
|
@@ -51,7 +51,7 @@ module Ronin
|
|
51
51
|
encoded = String.new
|
52
52
|
|
53
53
|
data.each_byte do |byte|
|
54
|
-
encoded << "%.2x" % byte
|
54
|
+
encoded << ("%.2x" % byte)
|
55
55
|
end
|
56
56
|
|
57
57
|
return encoded
|
@@ -71,7 +71,7 @@ module Ronin
|
|
71
71
|
# # => "hello"
|
72
72
|
#
|
73
73
|
def self.decode(data)
|
74
|
-
decoded = String.new
|
74
|
+
decoded = String.new(encoding: Encoding::ASCII_8BIT)
|
75
75
|
|
76
76
|
data.scan(/../).each do |hex_char|
|
77
77
|
decoded << hex_char.to_i(16).chr
|
@@ -63,7 +63,7 @@ module Ronin
|
|
63
63
|
# The Base32 decoded String.
|
64
64
|
#
|
65
65
|
def self.decode(data)
|
66
|
-
decoded = String.new
|
66
|
+
decoded = String.new(encoding: Encoding::UTF_8)
|
67
67
|
|
68
68
|
each_chunk(data,8) do |chunk|
|
69
69
|
chunk.decode(decoded)
|
@@ -72,14 +72,16 @@ module Ronin
|
|
72
72
|
return decoded
|
73
73
|
end
|
74
74
|
|
75
|
-
private
|
76
|
-
|
77
75
|
# Base32 alphabet
|
76
|
+
#
|
77
|
+
# @api private
|
78
78
|
TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'
|
79
79
|
|
80
80
|
#
|
81
81
|
# Represents a chunk of data.
|
82
82
|
#
|
83
|
+
# @api private
|
84
|
+
#
|
83
85
|
class Chunk
|
84
86
|
|
85
87
|
#
|
@@ -103,8 +105,13 @@ module Ronin
|
|
103
105
|
#
|
104
106
|
def decode(output=String.new)
|
105
107
|
bytes = @bytes.take_while { |b| b != 61 } # strip padding
|
106
|
-
|
107
|
-
|
108
|
+
|
109
|
+
n = ((bytes.length * 5.0) / 8.0).floor
|
110
|
+
p = if bytes.length < 8
|
111
|
+
5 - ((n * 8) % 5)
|
112
|
+
else
|
113
|
+
0
|
114
|
+
end
|
108
115
|
c = bytes.reduce(0) { |m,o|
|
109
116
|
unless (i = Base32::TABLE.index(o.chr))
|
110
117
|
raise ArgumentError, "invalid character '#{o.chr}'"
|
@@ -113,8 +120,8 @@ module Ronin
|
|
113
120
|
(m << 5) + i
|
114
121
|
} >> p
|
115
122
|
|
116
|
-
(0..n-1).reverse_each
|
117
|
-
output << ((c >> i * 8) & 0xff).chr
|
123
|
+
(0..(n - 1)).reverse_each do |i|
|
124
|
+
output << ((c >> (i * 8)) & 0xff).chr
|
118
125
|
end
|
119
126
|
|
120
127
|
return output
|
@@ -130,15 +137,19 @@ module Ronin
|
|
130
137
|
# The Base32 encoded chunk.
|
131
138
|
#
|
132
139
|
def encode(output=String.new)
|
133
|
-
n = (@bytes.length * 8.0 / 5.0).ceil
|
134
|
-
p = n < 8
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
140
|
+
n = ((@bytes.length * 8.0) / 5.0).ceil
|
141
|
+
p = if n < 8
|
142
|
+
5 - ((@bytes.length * 8) % 5)
|
143
|
+
else
|
144
|
+
0
|
145
|
+
end
|
146
|
+
c = @bytes.inject(0) { |m,o| (m << 8) + o } << p
|
147
|
+
|
148
|
+
(0..(n - 1)).reverse_each do |i|
|
149
|
+
output << Base32::TABLE[(c >> (i * 5)) & 0x1f].chr
|
139
150
|
end
|
140
151
|
|
141
|
-
return output << ("=" * (8-n))
|
152
|
+
return output << ("=" * (8 - n))
|
142
153
|
end
|
143
154
|
|
144
155
|
end
|
@@ -154,11 +165,11 @@ module Ronin
|
|
154
165
|
#
|
155
166
|
# @yieldparam [Chunk] chunk
|
156
167
|
#
|
168
|
+
# @api private
|
169
|
+
#
|
157
170
|
def self.each_chunk(data,size)
|
158
|
-
|
159
|
-
|
160
|
-
data.bytes.each_slice(size) do |bytes|
|
161
|
-
yield Chunk.new(bytes)
|
171
|
+
data.bytes.each_slice(size) do |byte_slice|
|
172
|
+
yield Chunk.new(byte_slice)
|
162
173
|
end
|
163
174
|
end
|
164
175
|
end
|
@@ -47,7 +47,7 @@ class String
|
|
47
47
|
# The unescaped C String.
|
48
48
|
#
|
49
49
|
# @example
|
50
|
-
# "
|
50
|
+
# "\\x68\\x65\\x6c\\x6c\\x6f\\x20\\x77\\x6f\\x72\\x6c\\x64".c_unescape
|
51
51
|
# # => "hello world"
|
52
52
|
#
|
53
53
|
# @see Ronin::Support::Encoding::C.unescape
|
@@ -93,7 +93,7 @@ module Ronin
|
|
93
93
|
# @raise [RangeError]
|
94
94
|
# The integer value is negative.
|
95
95
|
#
|
96
|
-
# @example
|
96
|
+
# @example
|
97
97
|
# Encoding::C.escape_byte(0x41)
|
98
98
|
# # => "A"
|
99
99
|
# Encoding::C.escape_byte(0x22)
|
@@ -213,21 +213,21 @@ module Ronin
|
|
213
213
|
# The unescaped C String.
|
214
214
|
#
|
215
215
|
# @example
|
216
|
-
# Encoding::C.unescape("
|
216
|
+
# Encoding::C.unescape("\\x68\\x65\\x6c\\x6c\\x6f\\x20\\x77\\x6f\\x72\\x6c\\x64")
|
217
217
|
# # => "hello world"
|
218
218
|
#
|
219
219
|
def self.unescape(data)
|
220
|
-
unescaped = String.new
|
220
|
+
unescaped = String.new(encoding: Encoding::UTF_8)
|
221
221
|
scanner = StringScanner.new(data)
|
222
222
|
|
223
223
|
until scanner.eos?
|
224
224
|
unescaped << case (char = scanner.getch)
|
225
225
|
when "\\" # backslash
|
226
|
-
if (hex_char
|
226
|
+
if (hex_char = scanner.scan(/x[0-9a-fA-F]{1,2}/)) # \xXX
|
227
227
|
hex_char[1..].to_i(16).chr
|
228
|
-
elsif (hex_char
|
228
|
+
elsif (hex_char = scanner.scan(/u[0-9a-fA-F]{4,8}/)) # \u..
|
229
229
|
hex_char[1..].to_i(16).chr(Encoding::UTF_8)
|
230
|
-
elsif (octal_char
|
230
|
+
elsif (octal_char = scanner.scan(/[0-7]{1,3}/)) # \N, \NN, or \NNN
|
231
231
|
octal_char.to_i(8).chr
|
232
232
|
elsif (special_char = scanner.getch) # \[A-Za-z]
|
233
233
|
BACKSLASHED_CHARS.fetch(special_char,special_char)
|
@@ -48,7 +48,7 @@ class String
|
|
48
48
|
def encode_bytes(include: nil, exclude: nil)
|
49
49
|
included = (Chars::CharSet.new(*include) if include)
|
50
50
|
excluded = (Chars::CharSet.new(*exclude) if exclude)
|
51
|
-
formatted = String.new
|
51
|
+
formatted = String.new(encoding: ::Encoding::UTF_8)
|
52
52
|
|
53
53
|
each_byte do |b|
|
54
54
|
formatted << if (included.nil? || included.include_byte?(b)) &&
|
@@ -90,7 +90,7 @@ class String
|
|
90
90
|
def encode_chars(include: nil, exclude: nil)
|
91
91
|
included = (Chars::CharSet.new(*include) if include)
|
92
92
|
excluded = (Chars::CharSet.new(*exclude) if exclude)
|
93
|
-
formatted = String.new
|
93
|
+
formatted = String.new(encoding: ::Encoding::UTF_8)
|
94
94
|
|
95
95
|
each_char do |c|
|
96
96
|
formatted << if (included.nil? || included.include_char?(c)) &&
|
@@ -188,21 +188,21 @@ module Ronin
|
|
188
188
|
# the same String if it is not quoted.
|
189
189
|
#
|
190
190
|
# @example
|
191
|
-
# Encoding::Hex.unescape("
|
191
|
+
# Encoding::Hex.unescape("hello\\nworld")
|
192
192
|
# # => "hello\nworld"
|
193
193
|
#
|
194
194
|
def self.unescape(data)
|
195
|
-
buffer = String.new
|
195
|
+
buffer = String.new(encoding: Encoding::UTF_8)
|
196
196
|
scanner = StringScanner.new(data)
|
197
197
|
|
198
198
|
until scanner.eos?
|
199
199
|
buffer << case (char = scanner.getch)
|
200
200
|
when '\\'
|
201
|
-
if (hex_escape
|
201
|
+
if (hex_escape = scanner.scan(/x[0-9a-fA-F]{4,8}/))
|
202
202
|
hex_escape[1..].to_i(16).chr(Encoding::UTF_8)
|
203
203
|
elsif (hex_escape = scanner.scan(/x[0-9a-fA-F]{1,2}/))
|
204
204
|
hex_escape[1..].to_i(16).chr
|
205
|
-
elsif (char
|
205
|
+
elsif (char = scanner.getch)
|
206
206
|
BACKSLASHED_CHARS.fetch(char,char)
|
207
207
|
end
|
208
208
|
else
|
@@ -86,7 +86,7 @@ module Ronin
|
|
86
86
|
# @return [String]
|
87
87
|
# The escaped JavaScript character.
|
88
88
|
#
|
89
|
-
# @example
|
89
|
+
# @example
|
90
90
|
# Encoding::JS.escape_byte(0x41)
|
91
91
|
# # => "A"
|
92
92
|
# Encoding::JS.escape_byte(0x22)
|
@@ -135,7 +135,7 @@ module Ronin
|
|
135
135
|
"\\f" => "\f",
|
136
136
|
"\\r" => "\r",
|
137
137
|
"\\\"" => "\"",
|
138
|
-
"
|
138
|
+
"\\'" => "'",
|
139
139
|
"\\\\" => "\\"
|
140
140
|
}
|
141
141
|
|
@@ -182,14 +182,14 @@ module Ronin
|
|
182
182
|
# # => "hello world"
|
183
183
|
#
|
184
184
|
def self.unescape(data)
|
185
|
-
unescaped = String.new
|
185
|
+
unescaped = String.new(encoding: Encoding::UTF_8)
|
186
186
|
|
187
187
|
data.scan(/[\\%]u[0-9a-fA-F]{1,4}|[\\%][0-9a-fA-F]{1,2}|\\[btnfr\'\"\\]|./) do |c|
|
188
188
|
unescaped << BACKSLASHED_CHARS.fetch(c) do
|
189
189
|
if (c.start_with?("\\u") || c.start_with?("%u"))
|
190
|
-
c[2
|
190
|
+
c[2..].to_i(16)
|
191
191
|
elsif (c.start_with?("\\") || c.start_with?("%"))
|
192
|
-
c[1
|
192
|
+
c[1..].to_i(16)
|
193
193
|
else
|
194
194
|
c
|
195
195
|
end
|
@@ -29,7 +29,7 @@ class Integer
|
|
29
29
|
# @raise [RangeError]
|
30
30
|
# The integer value is negative.
|
31
31
|
#
|
32
|
-
# @example
|
32
|
+
# @example
|
33
33
|
# 0x41.powershell_encode
|
34
34
|
# # => "[char]0x41"
|
35
35
|
# 0x0a.powershell_encode
|
@@ -60,7 +60,7 @@ class Integer
|
|
60
60
|
# @raise [RangeError]
|
61
61
|
# The integer value is negative.
|
62
62
|
#
|
63
|
-
# @example
|
63
|
+
# @example
|
64
64
|
# 0x41.powershell_escape
|
65
65
|
# # => "A"
|
66
66
|
# 0x08.powershell_escape
|
@@ -68,7 +68,7 @@ module Ronin
|
|
68
68
|
# @raise [RangeError]
|
69
69
|
# The integer value is negative.
|
70
70
|
#
|
71
|
-
# @example
|
71
|
+
# @example
|
72
72
|
# Encoding::PowerShell.encode_byte(0x41)
|
73
73
|
# # => "[char]0x41"
|
74
74
|
# Encoding::PowerShell.encode_byte(0x0a)
|
@@ -100,7 +100,7 @@ module Ronin
|
|
100
100
|
# @raise [RangeError]
|
101
101
|
# The integer value is negative.
|
102
102
|
#
|
103
|
-
# @example
|
103
|
+
# @example
|
104
104
|
# Encoding::PowerShell.escape_byte(0x41)
|
105
105
|
# # => "A"
|
106
106
|
# Encoding::PowerShell.escape_byte(0x08)
|
@@ -191,15 +191,15 @@ module Ronin
|
|
191
191
|
# # => "hello\nworld"
|
192
192
|
#
|
193
193
|
def self.unescape(data)
|
194
|
-
unescaped = String.new
|
194
|
+
unescaped = String.new(encoding: Encoding::UTF_8)
|
195
195
|
scanner = StringScanner.new(data)
|
196
196
|
|
197
197
|
until scanner.eos?
|
198
198
|
unescaped << if (backslash_char = scanner.scan(/`[0abetnvfr]/)) # `c
|
199
199
|
BACKSLASHED_CHARS[backslash_char[1,1]]
|
200
|
-
elsif (hex_char
|
200
|
+
elsif (hex_char = scanner.scan(/\$\(\[char\]0x[0-9a-fA-F]{1,2}\)/)) # [char]0xXX
|
201
201
|
hex_char[10..-2].to_i(16).chr
|
202
|
-
elsif (hex_char
|
202
|
+
elsif (hex_char = scanner.scan(/\$\(\[char\]0x[0-9a-fA-F]{3,}\)/)) # [char]0xXX
|
203
203
|
hex_char[10..-2].to_i(16).chr(Encoding::UTF_8)
|
204
204
|
elsif (unicode_char = scanner.scan(/`u\{[0-9a-fA-F]+\}/)) # `u{XXXX}'
|
205
205
|
unicode_char[3..-2].to_i(16).chr(Encoding::UTF_8)
|
@@ -299,7 +299,6 @@ module Ronin
|
|
299
299
|
data
|
300
300
|
end
|
301
301
|
end
|
302
|
-
|
303
302
|
end
|
304
303
|
end
|
305
304
|
end
|
@@ -22,7 +22,9 @@ module Ronin
|
|
22
22
|
module Support
|
23
23
|
class Encoding < ::Encoding
|
24
24
|
#
|
25
|
-
# Contains methods for encoding/decoding Quoted Printable data.
|
25
|
+
# Contains methods for encoding/decoding [Quoted Printable] data.
|
26
|
+
#
|
27
|
+
# [Quoted-Printable]: https://en.wikipedia.org/wiki/Quoted-printable
|
26
28
|
#
|
27
29
|
# ## Core-Ext Methods
|
28
30
|
#
|
@@ -150,6 +150,7 @@ module Ronin
|
|
150
150
|
else char
|
151
151
|
end
|
152
152
|
end
|
153
|
+
|
153
154
|
UNESCAPE_CHARS['\0'] = "\0"
|
154
155
|
UNESCAPE_CHARS['\a'] = "\a"
|
155
156
|
UNESCAPE_CHARS['\b'] = "\b"
|
@@ -173,17 +174,17 @@ module Ronin
|
|
173
174
|
# # => "hello"
|
174
175
|
#
|
175
176
|
def self.unescape(data)
|
176
|
-
unescaped = String.new
|
177
|
+
unescaped = String.new(encoding: Encoding::UTF_8)
|
177
178
|
scanner = StringScanner.new(data)
|
178
179
|
|
179
180
|
until scanner.eos?
|
180
181
|
unescaped << if (unicode_escape = scanner.scan(/\\(?:[0-7]{1,3}|[0-7])/))
|
181
182
|
unicode_escape[1,3].to_i(8).chr
|
182
183
|
elsif (hex_escape = scanner.scan(/\\u[0-9a-fA-F]{4,8}/))
|
183
|
-
hex_escape[2
|
184
|
+
hex_escape[2..].to_i(16).chr(Encoding::UTF_8)
|
184
185
|
elsif (hex_escape = scanner.scan(/\\x[0-9a-fA-F]{1,2}/))
|
185
|
-
hex_escape[2
|
186
|
-
elsif (escape
|
186
|
+
hex_escape[2..].to_i(16).chr
|
187
|
+
elsif (escape = scanner.scan(/\\./))
|
187
188
|
UNESCAPE_CHARS[escape]
|
188
189
|
else
|
189
190
|
scanner.getch
|
@@ -235,7 +236,6 @@ module Ronin
|
|
235
236
|
data
|
236
237
|
end
|
237
238
|
end
|
238
|
-
|
239
239
|
end
|
240
240
|
end
|
241
241
|
end
|
@@ -29,7 +29,7 @@ class Integer
|
|
29
29
|
# @raise [RangeError]
|
30
30
|
# The integer value is negative.
|
31
31
|
#
|
32
|
-
# @example
|
32
|
+
# @example
|
33
33
|
# 0x41.shell_encode
|
34
34
|
# # => "\\x41"
|
35
35
|
# 0x0a.shell_encode
|
@@ -61,7 +61,7 @@ class Integer
|
|
61
61
|
# @raise [RangeError]
|
62
62
|
# The integer value is negative.
|
63
63
|
#
|
64
|
-
# @example
|
64
|
+
# @example
|
65
65
|
# 0x41.shell_escape
|
66
66
|
# # => "A"
|
67
67
|
# 0x08.shell_escape
|
@@ -66,7 +66,7 @@ module Ronin
|
|
66
66
|
# @raise [RangeError]
|
67
67
|
# The byte value is negative.
|
68
68
|
#
|
69
|
-
# @example
|
69
|
+
# @example
|
70
70
|
# Encoding::Shell.encode_byte(0x41)
|
71
71
|
# # => "\\x41"
|
72
72
|
# Encoding::Shell.encode_byte(0x0a)
|
@@ -98,7 +98,7 @@ module Ronin
|
|
98
98
|
# @raise [RangeError]
|
99
99
|
# The integer value is negative.
|
100
100
|
#
|
101
|
-
# @example
|
101
|
+
# @example
|
102
102
|
# Encoding::Shell.escape(0x41)
|
103
103
|
# # => "A"
|
104
104
|
# Encoding::Shell.escape(0x08)
|
@@ -188,7 +188,7 @@ module Ronin
|
|
188
188
|
until scanner.eos?
|
189
189
|
unescaped << if (backslash_char = scanner.scan(/\\[0abetnvfr\'\"]/)) # \n
|
190
190
|
BACKSLASHED_CHARS[backslash_char[1..]]
|
191
|
-
elsif (hex_char
|
191
|
+
elsif (hex_char = scanner.scan(/\\x[0-9a-fA-F]+/)) # \XX
|
192
192
|
hex_char[2..].to_i(16).chr
|
193
193
|
elsif (unicode_char = scanner.scan(/\\u[0-9a-fA-F]+/)) # \uXXXX
|
194
194
|
unicode_char[2..].to_i(16).chr(Encoding::UTF_8)
|
@@ -20,7 +20,9 @@ module Ronin
|
|
20
20
|
module Support
|
21
21
|
class Encoding < ::Encoding
|
22
22
|
#
|
23
|
-
# Contains methods for encoding/decoding UUEncoded data.
|
23
|
+
# Contains methods for encoding/decoding [UUEncoded][uuencoding] data.
|
24
|
+
#
|
25
|
+
# [uuencoding]: https://en.wikipedia.org/wiki/Uuencoding
|
24
26
|
#
|
25
27
|
# ## Core-Ext Methods
|
26
28
|
#
|
@@ -163,7 +163,7 @@ module Ronin
|
|
163
163
|
if zero_pad then "&#x%.7x;" % byte
|
164
164
|
else "&#x%.2x;" % byte
|
165
165
|
end
|
166
|
-
|
166
|
+
else
|
167
167
|
raise(ArgumentError,"case (#{kwargs[:case].inspect}) keyword argument must be either :lower, :upper, or nil")
|
168
168
|
end
|
169
169
|
else
|
@@ -312,7 +312,7 @@ module Ronin
|
|
312
312
|
# @see http://rubydoc.info/stdlib/cgi/CGI.unescapeHash
|
313
313
|
#
|
314
314
|
def self.unescape(data)
|
315
|
-
unescaped = String.new
|
315
|
+
unescaped = String.new(encoding: Encoding::UTF_8)
|
316
316
|
scanner = StringScanner.new(data)
|
317
317
|
|
318
318
|
until scanner.eos?
|
@@ -320,7 +320,7 @@ module Ronin
|
|
320
320
|
ESCAPED_CHARS.fetch(named_char.downcase)
|
321
321
|
elsif (decimal_char = scanner.scan(/&#\d+;/))
|
322
322
|
decimal_char[2..-2].to_i.chr(Encoding::UTF_8)
|
323
|
-
elsif (hex_char
|
323
|
+
elsif (hex_char = scanner.scan(/&#x[a-f0-9]+;/i))
|
324
324
|
hex_char[3..-2].to_i(16).chr(Encoding::UTF_8)
|
325
325
|
else
|
326
326
|
scanner.getch
|
@@ -38,6 +38,101 @@ module Ronin
|
|
38
38
|
#
|
39
39
|
# Contains additional encoding/decoding modules.
|
40
40
|
#
|
41
|
+
# ## Core-Ext Methods
|
42
|
+
#
|
43
|
+
# * {Integer#c_encode}
|
44
|
+
# * {Integer#c_escape}
|
45
|
+
# * {Integer#hex_encode}
|
46
|
+
# * {Integer#hex_escape}
|
47
|
+
# * {Integer#hex_int}
|
48
|
+
# * {Integer#html_encode}
|
49
|
+
# * {Integer#html_escape}
|
50
|
+
# * {Integer#http_encode}
|
51
|
+
# * {Integer#http_escape}
|
52
|
+
# * {Integer#js_encode}
|
53
|
+
# * {Integer#js_escape}
|
54
|
+
# * {Integer#powershell_encode}
|
55
|
+
# * {Integer#powershell_escape}
|
56
|
+
# * {Integer#shell_encode}
|
57
|
+
# * {Integer#shell_escape}
|
58
|
+
# * {Integer#uri_encode}
|
59
|
+
# * {Integer#uri_escape}
|
60
|
+
# * {Integer#uri_form_encode}
|
61
|
+
# * {Integer#uri_form_escape}
|
62
|
+
# * {Integer#xml_encode}
|
63
|
+
# * {Integer#xml_escape}
|
64
|
+
# * {String#base16_decode}
|
65
|
+
# * {String#base16_encode}
|
66
|
+
# * {String#base32_decode}
|
67
|
+
# * {String#base32_encode}
|
68
|
+
# * {String#base64_decode}
|
69
|
+
# * {String#base64_encode}
|
70
|
+
# * {String#c_encode}
|
71
|
+
# * {String#c_escape}
|
72
|
+
# * {String#c_string}
|
73
|
+
# * {String#c_unescape}
|
74
|
+
# * {String#c_unquote}
|
75
|
+
# * {String#hex_decode}
|
76
|
+
# * {String#hex_encode}
|
77
|
+
# * {String#hex_escape}
|
78
|
+
# * {String#hex_string}
|
79
|
+
# * {String#hex_unescape}
|
80
|
+
# * {String#hex_unquote}
|
81
|
+
# * {String#html_decode}
|
82
|
+
# * {String#html_encode}
|
83
|
+
# * {String#html_escape}
|
84
|
+
# * {String#html_unescape}
|
85
|
+
# * {String#http_decode}
|
86
|
+
# * {String#http_encode}
|
87
|
+
# * {String#http_escape}
|
88
|
+
# * {String#http_unescape}
|
89
|
+
# * {String#js_decode}
|
90
|
+
# * {String#js_encode}
|
91
|
+
# * {String#js_escape}
|
92
|
+
# * {String#js_string}
|
93
|
+
# * {String#js_unescape}
|
94
|
+
# * {String#js_unquote}
|
95
|
+
# * {String#powershell_decode}
|
96
|
+
# * {String#powershell_encode}
|
97
|
+
# * {String#powershell_escape}
|
98
|
+
# * {String#powershell_string}
|
99
|
+
# * {String#powershell_unescape}
|
100
|
+
# * {String#powershell_unquote}
|
101
|
+
# * {String#punycode_decode}
|
102
|
+
# * {String#punycode_encode}
|
103
|
+
# * {String#quoted_printable_escape}
|
104
|
+
# * {String#quoted_printable_unescape}
|
105
|
+
# * {String#ruby_decode}
|
106
|
+
# * {String#ruby_encode}
|
107
|
+
# * {String#ruby_escape}
|
108
|
+
# * {String#ruby_string}
|
109
|
+
# * {String#ruby_unescape}
|
110
|
+
# * {String#ruby_unquote}
|
111
|
+
# * {String#shell_decode}
|
112
|
+
# * {String#shell_encode}
|
113
|
+
# * {String#shell_escape}
|
114
|
+
# * {String#shell_string}
|
115
|
+
# * {String#shell_unescape}
|
116
|
+
# * {String#shell_unquote}
|
117
|
+
# * {String#sql_decode}
|
118
|
+
# * {String#sql_encode}
|
119
|
+
# * {String#sql_escape}
|
120
|
+
# * {String#sql_unescape}
|
121
|
+
# * {String#uri_decode}
|
122
|
+
# * {String#uri_encode}
|
123
|
+
# * {String#uri_escape}
|
124
|
+
# * {String#uri_form_decode}
|
125
|
+
# * {String#uri_form_encode}
|
126
|
+
# * {String#uri_form_escape}
|
127
|
+
# * {String#uri_form_unescape}
|
128
|
+
# * {String#uri_unescape}
|
129
|
+
# * {String#uu_decode}
|
130
|
+
# * {String#uu_encode}
|
131
|
+
# * {String#xml_decode}
|
132
|
+
# * {String#xml_encode}
|
133
|
+
# * {String#xml_escape}
|
134
|
+
# * {String#xml_unescape}
|
135
|
+
#
|
41
136
|
# @since 1.0.0
|
42
137
|
#
|
43
138
|
class Encoding < ::Encoding
|
@@ -145,6 +145,7 @@ module Ronin
|
|
145
145
|
begin
|
146
146
|
download(url: url, path: path)
|
147
147
|
rescue
|
148
|
+
# ignore any network failures
|
148
149
|
end
|
149
150
|
end
|
150
151
|
end
|
@@ -176,8 +177,10 @@ module Ronin
|
|
176
177
|
line.chomp!
|
177
178
|
|
178
179
|
first, last, number, country_code, name = line.split("\t",5)
|
180
|
+
|
179
181
|
range = IPRange::Range.new(first,last)
|
180
182
|
number = number.to_i
|
183
|
+
|
181
184
|
country_code = nil if country_code == 'None'
|
182
185
|
name = nil if name == 'Not routed'
|
183
186
|
|
@@ -219,7 +222,9 @@ module Ronin
|
|
219
222
|
prefixes = if record.range.ipv6? then @ipv6_prefixes
|
220
223
|
else @ipv4_prefixes
|
221
224
|
end
|
222
|
-
|
225
|
+
|
226
|
+
records = (prefixes[record.range.prefix] ||= [])
|
227
|
+
records << record
|
223
228
|
return self
|
224
229
|
end
|
225
230
|
|