ronin-support 0.1.0 → 0.2.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog.md +24 -0
- data/Gemfile +9 -1
- data/README.md +6 -3
- data/gemspec.yml +3 -1
- data/lib/ronin/extensions.rb +2 -1
- data/lib/ronin/extensions/file.rb +4 -0
- data/lib/ronin/extensions/ip_addr.rb +8 -0
- data/lib/ronin/extensions/kernel.rb +2 -0
- data/lib/ronin/extensions/string.rb +50 -11
- data/lib/ronin/formatting/extensions/binary.rb +2 -0
- data/lib/ronin/formatting/extensions/binary/file.rb +12 -1
- data/lib/ronin/formatting/extensions/binary/integer.rb +6 -0
- data/lib/ronin/formatting/extensions/binary/string.rb +20 -0
- data/lib/ronin/formatting/extensions/digest/file.rb +14 -0
- data/lib/ronin/formatting/extensions/digest/string.rb +8 -0
- data/lib/ronin/formatting/extensions/html.rb +21 -0
- data/lib/ronin/formatting/extensions/html/integer.rb +126 -0
- data/lib/ronin/formatting/extensions/html/string.rb +184 -0
- data/lib/ronin/formatting/extensions/http/integer.rb +7 -1
- data/lib/ronin/formatting/extensions/http/string.rb +10 -0
- data/lib/ronin/formatting/extensions/text.rb +2 -0
- data/lib/ronin/formatting/extensions/text/array.rb +10 -0
- data/lib/ronin/formatting/extensions/text/string.rb +44 -12
- data/lib/ronin/formatting/html.rb +20 -0
- data/lib/ronin/mixin.rb +89 -0
- data/lib/ronin/network/extensions/esmtp/net.rb +6 -0
- data/lib/ronin/network/extensions/http/net.rb +124 -51
- data/lib/ronin/network/extensions/imap/net.rb +4 -0
- data/lib/ronin/network/extensions/pop3/net.rb +4 -0
- data/lib/ronin/network/extensions/smtp/net.rb +73 -2
- data/lib/ronin/network/extensions/ssl/net.rb +4 -0
- data/lib/ronin/network/extensions/tcp/net.rb +16 -0
- data/lib/ronin/network/extensions/telnet/net.rb +4 -0
- data/lib/ronin/network/extensions/udp/net.rb +12 -0
- data/lib/ronin/network/http/http.rb +50 -29
- data/lib/ronin/network/http/proxy.rb +26 -0
- data/lib/ronin/network/imap.rb +4 -0
- data/lib/ronin/network/network.rb +2 -0
- data/lib/ronin/network/pop3.rb +4 -0
- data/lib/ronin/network/smtp/email.rb +43 -14
- data/lib/ronin/network/smtp/smtp.rb +6 -0
- data/lib/ronin/network/ssl.rb +2 -0
- data/lib/ronin/network/telnet.rb +16 -0
- data/lib/ronin/path.rb +6 -0
- data/lib/ronin/support/inflector.rb +3 -1
- data/lib/ronin/support/version.rb +1 -1
- data/lib/ronin/templates/erb.rb +4 -0
- data/lib/ronin/templates/template.rb +10 -0
- data/spec/extensions/string_spec.rb +4 -4
- data/spec/formatting/html/integer_spec.rb +66 -0
- data/spec/formatting/html/string_spec.rb +103 -0
- data/spec/formatting/http/string_spec.rb +1 -1
- data/spec/formatting/text/string_spec.rb +18 -66
- data/spec/mixin_spec.rb +53 -0
- data/spec/network/http/http_spec.rb +0 -7
- data/spec/network/http/proxy_spec.rb +2 -2
- data/spec/network/smtp/email_spec.rb +100 -0
- data/spec/path_spec.rb +13 -13
- data/spec/templates/helpers/data.rb +1 -1
- metadata +52 -33
data/ChangeLog.md
CHANGED
@@ -1,3 +1,27 @@
|
|
1
|
+
### 0.2.0 / 2011-05-14
|
2
|
+
|
3
|
+
* Require data_paths ~> 0.3.
|
4
|
+
* Added {Ronin::Mixin}.
|
5
|
+
* Added {Ronin::Network::SMTP::Email#headers}.
|
6
|
+
* Added {Integer#html_escape}.
|
7
|
+
* Added {Integer#js_escape}.
|
8
|
+
* Added {Integer#format_js}.
|
9
|
+
* Added {String#html_escape}.
|
10
|
+
* Added {String#html_unescape}.
|
11
|
+
* Added {String#js_escape}.
|
12
|
+
* Added {String#js_unescape}.
|
13
|
+
* Added {String#format_js}.
|
14
|
+
* Added {Net.smtp_send_message}.
|
15
|
+
* Added {Net.http_status}.
|
16
|
+
* Added YARD `@api` tags to define the public, semi-public and private APIs.
|
17
|
+
* Allow `:method` to be used with {Net.http_ok?}.
|
18
|
+
* Fixed a bug in {Ronin::Network::HTTP.expand_url} where `:host` and `:port`
|
19
|
+
options were being overridden.
|
20
|
+
* Fixed a bug in {String#format_chars}, where it was not using `each_char`
|
21
|
+
for unicode characters.
|
22
|
+
* Deprecated {String#common_postfix}, in favor of {String#common_suffix}.
|
23
|
+
{String#common_postfix} will be removed in ronin-support 1.0.0.
|
24
|
+
|
1
25
|
### 0.1.0 / 2011-03-20
|
2
26
|
|
3
27
|
* Initial release:
|
data/Gemfile
CHANGED
@@ -18,5 +18,13 @@ end
|
|
18
18
|
group :test do
|
19
19
|
gem 'i18n', '~> 0.4'
|
20
20
|
gem 'tzinfo', '~> 0.3.0'
|
21
|
-
|
21
|
+
|
22
|
+
INFLECTORS = {
|
23
|
+
'activesupport' => '~> 3.0.0',
|
24
|
+
'dm-core' => '~> 1.0',
|
25
|
+
'extlib' => '~> 0.9.15'
|
26
|
+
}
|
27
|
+
|
28
|
+
inflector = ENV.fetch('INFLECTOR','dm-core')
|
29
|
+
gem(inflector,INFLECTORS[inflector])
|
22
30
|
end
|
data/README.md
CHANGED
@@ -22,6 +22,7 @@ or payloads over many common Source-Code-Management (SCM) systems.
|
|
22
22
|
* Binary
|
23
23
|
* Text
|
24
24
|
* HTTP
|
25
|
+
* HTML
|
25
26
|
* URIs
|
26
27
|
* Generating random text.
|
27
28
|
* Networking:
|
@@ -41,23 +42,25 @@ or payloads over many common Source-Code-Management (SCM) systems.
|
|
41
42
|
## Examples
|
42
43
|
|
43
44
|
For examples of the convenience methods provided by ronin-support,
|
44
|
-
please see [Everyday Ronin](http://ronin-ruby.github.com/
|
45
|
+
please see [Everyday Ronin](http://ronin-ruby.github.com/guides/everyday_ronin.html).
|
45
46
|
|
46
47
|
## Requirements
|
47
48
|
|
48
49
|
* [Ruby](http://www.ruby-lang.org/) >= 1.8.7
|
49
50
|
* [chars](http://github.com/postmodern/chars#readme)
|
50
51
|
~> 0.2
|
52
|
+
* [hexdump](http://github.com/postmodern/hexdump#readme)
|
53
|
+
~> 0.1
|
51
54
|
* [combinatorics](http://github.com/postmodern/combinatorics#readme)
|
52
55
|
~> 0.3
|
53
56
|
* [uri-query_params](http://github.com/postmodern/uri-query_params#readme)
|
54
57
|
~> 0.5, >= 0.5.2
|
55
58
|
* [data_paths](http://github.com/postmodern/data_paths#readme)
|
56
|
-
~> 0.
|
59
|
+
~> 0.3
|
57
60
|
|
58
61
|
## Install
|
59
62
|
|
60
|
-
$
|
63
|
+
$ gem install ronin-support
|
61
64
|
|
62
65
|
## License
|
63
66
|
|
data/gemspec.yml
CHANGED
@@ -14,9 +14,11 @@ required_ruby_version: ">= 1.8.7"
|
|
14
14
|
|
15
15
|
dependencies:
|
16
16
|
chars: ~> 0.2
|
17
|
+
hexdump: ~> 0.1
|
17
18
|
combinatorics: ~> 0.3
|
18
19
|
uri-query_params: ~> 0.5, >= 0.5.2
|
19
|
-
data_paths: ~> 0.
|
20
|
+
# data_paths: ~> 0.3
|
21
|
+
data_paths: 0.3.0.rc1
|
20
22
|
|
21
23
|
development_dependencies:
|
22
24
|
bundler: ~> 1.0.10
|
data/lib/ronin/extensions.rb
CHANGED
@@ -30,6 +30,8 @@ class File
|
|
30
30
|
#
|
31
31
|
# @return [nil]
|
32
32
|
#
|
33
|
+
# @api public
|
34
|
+
#
|
33
35
|
def File.write(path,data)
|
34
36
|
File.open(path,'w') { |file| file.write(data) }
|
35
37
|
end
|
@@ -43,6 +45,8 @@ class File
|
|
43
45
|
# @return [String]
|
44
46
|
# The escaped path.
|
45
47
|
#
|
48
|
+
# @api public
|
49
|
+
#
|
46
50
|
def File.escape_path(path)
|
47
51
|
path = path.to_s
|
48
52
|
|
@@ -53,6 +53,8 @@ class IPAddr
|
|
53
53
|
# @return [Array<String>]
|
54
54
|
# The IP Addresses found in the text.
|
55
55
|
#
|
56
|
+
# @api public
|
57
|
+
#
|
56
58
|
def IPAddr.extract(text,version=nil,&block)
|
57
59
|
regexp = case version
|
58
60
|
when :ipv4
|
@@ -108,6 +110,8 @@ class IPAddr
|
|
108
110
|
# puts ip
|
109
111
|
# end
|
110
112
|
#
|
113
|
+
# @api public
|
114
|
+
#
|
111
115
|
def IPAddr.each(cidr_or_glob,&block)
|
112
116
|
unless (cidr_or_glob.include?('*') || cidr_or_glob.include?('-'))
|
113
117
|
return IPAddr.new(cidr_or_glob).each(&block)
|
@@ -168,6 +172,8 @@ class IPAddr
|
|
168
172
|
# @return [Array<String>]
|
169
173
|
# The host-names for the IP address.
|
170
174
|
#
|
175
|
+
# @api public
|
176
|
+
#
|
171
177
|
def lookup
|
172
178
|
Resolv.getnames(self.to_s)
|
173
179
|
end
|
@@ -190,6 +196,8 @@ class IPAddr
|
|
190
196
|
# puts ip
|
191
197
|
# end
|
192
198
|
#
|
199
|
+
# @api public
|
200
|
+
#
|
193
201
|
def each
|
194
202
|
return enum_for(:each) unless block_given?
|
195
203
|
|
@@ -39,6 +39,8 @@ class String
|
|
39
39
|
# @return [String]
|
40
40
|
# The original string
|
41
41
|
#
|
42
|
+
# @api public
|
43
|
+
#
|
42
44
|
def each_substring(min=0,&block)
|
43
45
|
return enum_for(:each_substring,min) unless block
|
44
46
|
|
@@ -79,6 +81,8 @@ class String
|
|
79
81
|
#
|
80
82
|
# @see each_substring
|
81
83
|
#
|
84
|
+
# @api public
|
85
|
+
#
|
82
86
|
def each_unique_substring(min=0,&block)
|
83
87
|
return enum_for(:each_unique_substring,min) unless block
|
84
88
|
|
@@ -100,9 +104,15 @@ class String
|
|
100
104
|
end
|
101
105
|
|
102
106
|
#
|
103
|
-
#
|
104
|
-
#
|
105
|
-
#
|
107
|
+
# The common prefix of the string and the specified other string.
|
108
|
+
#
|
109
|
+
# @param [String] other
|
110
|
+
# The other String to compare against.
|
111
|
+
#
|
112
|
+
# @return [String]
|
113
|
+
# The common prefix between the two Strings.
|
114
|
+
#
|
115
|
+
# @api public
|
106
116
|
#
|
107
117
|
def common_prefix(other)
|
108
118
|
min_length = [length, other.length].min
|
@@ -117,11 +127,19 @@ class String
|
|
117
127
|
end
|
118
128
|
|
119
129
|
#
|
120
|
-
#
|
121
|
-
# string. If no common postfix can be found an empty string will be
|
122
|
-
# returned.
|
130
|
+
# Finds the common suffix of the string and the specified other string.
|
123
131
|
#
|
124
|
-
|
132
|
+
# @param [String] pther
|
133
|
+
# The other String to compare against.
|
134
|
+
#
|
135
|
+
# @return [String]
|
136
|
+
# The common suffix of the two Strings.
|
137
|
+
#
|
138
|
+
# @since 0.2.0
|
139
|
+
#
|
140
|
+
# @api public
|
141
|
+
#
|
142
|
+
def common_suffix(other)
|
125
143
|
min_length = [length, other.length].min
|
126
144
|
|
127
145
|
(min_length - 1).times do |i|
|
@@ -137,13 +155,32 @@ class String
|
|
137
155
|
end
|
138
156
|
|
139
157
|
#
|
140
|
-
#
|
141
|
-
#
|
142
|
-
#
|
158
|
+
# @deprecated
|
159
|
+
# Deprecates as of 0.2.0, and will be removed in 1.0.0.
|
160
|
+
# Please use {#common_suffix} instead.
|
161
|
+
#
|
162
|
+
def common_postfix(other)
|
163
|
+
STDERR.puts "DEPRECATED: String#common_postfix was deprecated in 0.2.0."
|
164
|
+
STDERR.puts "DEPRECATED: Please use String#common_suffix instead."
|
165
|
+
|
166
|
+
common_suffix(other)
|
167
|
+
end
|
168
|
+
|
169
|
+
#
|
170
|
+
# Finds the uncommon substring within the specified other string,
|
171
|
+
# which does not occur within the string.
|
172
|
+
#
|
173
|
+
# @param [String] other
|
174
|
+
# The other String to compare against.
|
175
|
+
#
|
176
|
+
# @return [String]
|
177
|
+
# The uncommon substring between the two Strings.
|
178
|
+
#
|
179
|
+
# @api public
|
143
180
|
#
|
144
181
|
def uncommon_substring(other)
|
145
182
|
prefix = common_prefix(other)
|
146
|
-
postfix = self[prefix.length..-1].
|
183
|
+
postfix = self[prefix.length..-1].common_suffix(other[prefix.length..-1])
|
147
184
|
|
148
185
|
return self[prefix.length...(length - postfix.length)]
|
149
186
|
end
|
@@ -158,6 +195,8 @@ class String
|
|
158
195
|
# "hello\x00\073\x90\r\n".dump
|
159
196
|
# # => "hello\0;\x90\r\n"
|
160
197
|
#
|
198
|
+
# @api public
|
199
|
+
#
|
161
200
|
def dump
|
162
201
|
c_string = ''
|
163
202
|
|
@@ -22,10 +22,21 @@ require 'ronin/formatting/extensions/binary/string'
|
|
22
22
|
class File
|
23
23
|
|
24
24
|
#
|
25
|
-
# Converts
|
25
|
+
# Converts a hexdump file to it's original binary data.
|
26
|
+
#
|
27
|
+
# @param [Pathname, String] path
|
28
|
+
# The path of the hexdump file.
|
29
|
+
#
|
30
|
+
# @param [Hash] options
|
31
|
+
# Hexdump options.
|
32
|
+
#
|
33
|
+
# @return [String]
|
34
|
+
# The original binary data.
|
26
35
|
#
|
27
36
|
# @see String#unhexdump.
|
28
37
|
#
|
38
|
+
# @api public
|
39
|
+
#
|
29
40
|
def File.unhexdump(path,options={})
|
30
41
|
File.read(path).unhexdump(options)
|
31
42
|
end
|
@@ -44,6 +44,8 @@ class Integer
|
|
44
44
|
# 0xff41.bytes(4, :big)
|
45
45
|
# # => [0, 0, 255, 65]
|
46
46
|
#
|
47
|
+
# @api public
|
48
|
+
#
|
47
49
|
def bytes(address_length,endian=:little)
|
48
50
|
endian = endian.to_sym
|
49
51
|
buffer = []
|
@@ -107,6 +109,8 @@ class Integer
|
|
107
109
|
#
|
108
110
|
# @see http://ruby-doc.org/core/classes/Array.html#M002222
|
109
111
|
#
|
112
|
+
# @api public
|
113
|
+
#
|
110
114
|
def pack(arch,address_length=nil)
|
111
115
|
if arch.kind_of?(String)
|
112
116
|
return [self].pack(arch)
|
@@ -136,6 +140,8 @@ class Integer
|
|
136
140
|
# 42.hex_escape
|
137
141
|
# # => "\\x2a"
|
138
142
|
#
|
143
|
+
# @api public
|
144
|
+
#
|
139
145
|
def hex_escape
|
140
146
|
"\\x%.2x" % self
|
141
147
|
end
|
@@ -69,6 +69,8 @@ class String
|
|
69
69
|
#
|
70
70
|
# @see http://ruby-doc.org/core/classes/String.html#M000760
|
71
71
|
#
|
72
|
+
# @api public
|
73
|
+
#
|
72
74
|
def depack(arch,address_length=nil)
|
73
75
|
if arch.kind_of?(String)
|
74
76
|
return self.unpack(arch)
|
@@ -118,10 +120,14 @@ class String
|
|
118
120
|
#
|
119
121
|
# @see String#format_bytes
|
120
122
|
#
|
123
|
+
# @api public
|
124
|
+
#
|
121
125
|
def hex_escape(options={})
|
122
126
|
format_bytes(options) { |b| b.hex_escape }
|
123
127
|
end
|
124
128
|
|
129
|
+
#
|
130
|
+
# Unescapes the hex-escaped String.
|
125
131
|
#
|
126
132
|
# @return [String]
|
127
133
|
# The unescaped version of the hex escaped String.
|
@@ -130,6 +136,8 @@ class String
|
|
130
136
|
# "\\x68\\x65\\x6c\\x6c\\x6f".hex_unescape
|
131
137
|
# # => "hello"
|
132
138
|
#
|
139
|
+
# @api public
|
140
|
+
#
|
133
141
|
def hex_unescape
|
134
142
|
buffer = ''
|
135
143
|
hex_index = 0
|
@@ -196,6 +204,8 @@ class String
|
|
196
204
|
# "hello again".xor([0x55, 0x41, 0xe1])
|
197
205
|
# # => "=$\x8d9.\xc14&\x80</"
|
198
206
|
#
|
207
|
+
# @api public
|
208
|
+
#
|
199
209
|
def xor(key)
|
200
210
|
key = if key.kind_of?(Integer)
|
201
211
|
[key]
|
@@ -219,6 +229,8 @@ class String
|
|
219
229
|
# @return [String]
|
220
230
|
# The base64 encoded form of the string.
|
221
231
|
#
|
232
|
+
# @api public
|
233
|
+
#
|
222
234
|
def base64_encode
|
223
235
|
Base64.encode64(self)
|
224
236
|
end
|
@@ -229,6 +241,8 @@ class String
|
|
229
241
|
# @return [String]
|
230
242
|
# The base64 decoded form of the string.
|
231
243
|
#
|
244
|
+
# @api public
|
245
|
+
#
|
232
246
|
def base64_decode
|
233
247
|
Base64.decode64(self)
|
234
248
|
end
|
@@ -239,6 +253,8 @@ class String
|
|
239
253
|
# @return [String]
|
240
254
|
# The Zlib inflated form of the string.
|
241
255
|
#
|
256
|
+
# @api public
|
257
|
+
#
|
242
258
|
def zlib_inflate
|
243
259
|
Zlib::Inflate.inflate(self)
|
244
260
|
end
|
@@ -249,6 +265,8 @@ class String
|
|
249
265
|
# @return [String]
|
250
266
|
# The Zlib deflated form of the string.
|
251
267
|
#
|
268
|
+
# @api public
|
269
|
+
#
|
252
270
|
def zlib_deflate
|
253
271
|
Zlib::Deflate.deflate(self)
|
254
272
|
end
|
@@ -288,6 +306,8 @@ class String
|
|
288
306
|
#
|
289
307
|
# @return [String] The raw-data from the hexdump.
|
290
308
|
#
|
309
|
+
# @api public
|
310
|
+
#
|
291
311
|
def unhexdump(options={})
|
292
312
|
case (format = options[:format])
|
293
313
|
when :od
|
@@ -36,6 +36,8 @@ class File
|
|
36
36
|
# File.md5('data.txt')
|
37
37
|
# # => "5d41402abc4b2a76b9719d911017c592"
|
38
38
|
#
|
39
|
+
# @api public
|
40
|
+
#
|
39
41
|
def File.md5(path)
|
40
42
|
Digest::MD5.file(path).hexdigest
|
41
43
|
end
|
@@ -53,6 +55,8 @@ class File
|
|
53
55
|
# File.sha1('data.txt')
|
54
56
|
# # => "aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d"
|
55
57
|
#
|
58
|
+
# @api public
|
59
|
+
#
|
56
60
|
def File.sha1(path)
|
57
61
|
Digest::SHA1.file(path).hexdigest
|
58
62
|
end
|
@@ -60,6 +64,8 @@ class File
|
|
60
64
|
#
|
61
65
|
# @see File.sha1
|
62
66
|
#
|
67
|
+
# @api public
|
68
|
+
#
|
63
69
|
def File.sha128(path)
|
64
70
|
File.sha1(path)
|
65
71
|
end
|
@@ -77,6 +83,8 @@ class File
|
|
77
83
|
# File.sha256('data.txt')
|
78
84
|
# # => "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824"
|
79
85
|
#
|
86
|
+
# @api public
|
87
|
+
#
|
80
88
|
def File.sha256(path)
|
81
89
|
Digest::SHA256.file(path).hexdigest
|
82
90
|
end
|
@@ -84,6 +92,8 @@ class File
|
|
84
92
|
#
|
85
93
|
# @see File.sha256
|
86
94
|
#
|
95
|
+
# @api public
|
96
|
+
#
|
87
97
|
def File.sha2(path)
|
88
98
|
File.sha256(path)
|
89
99
|
end
|
@@ -101,6 +111,8 @@ class File
|
|
101
111
|
# File.sha512('data.txt')
|
102
112
|
# # => "9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043"
|
103
113
|
#
|
114
|
+
# @api public
|
115
|
+
#
|
104
116
|
def File.sha512(path)
|
105
117
|
Digest::SHA512.file(path).hexdigest
|
106
118
|
end
|
@@ -108,6 +120,8 @@ class File
|
|
108
120
|
#
|
109
121
|
# @see File.sha512
|
110
122
|
#
|
123
|
+
# @api public
|
124
|
+
#
|
111
125
|
def File.sha5(path)
|
112
126
|
File.sha512(path)
|
113
127
|
end
|