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
@@ -48,6 +48,8 @@ module Ronin
|
|
48
48
|
# @option options [String] :password
|
49
49
|
# The password to authenticate with.
|
50
50
|
#
|
51
|
+
# @api public
|
52
|
+
#
|
51
53
|
def initialize(options={})
|
52
54
|
super(
|
53
55
|
options[:host],
|
@@ -75,6 +77,8 @@ module Ronin
|
|
75
77
|
# @example
|
76
78
|
# Proxy.parse('http://201.26.192.61:8080')
|
77
79
|
#
|
80
|
+
# @api public
|
81
|
+
#
|
78
82
|
def self.parse(proxy)
|
79
83
|
proxy = proxy.to_s.gsub(/^http(s)?:\/*/,'')
|
80
84
|
|
@@ -110,6 +114,8 @@ module Ronin
|
|
110
114
|
# The given proxy information was not a {Proxy}, `URI::HTTP`,
|
111
115
|
# `Hash` or {String}.
|
112
116
|
#
|
117
|
+
# @api public
|
118
|
+
#
|
113
119
|
def self.create(proxy)
|
114
120
|
case proxy
|
115
121
|
when Proxy
|
@@ -138,6 +144,8 @@ module Ronin
|
|
138
144
|
# @return [Boolean]
|
139
145
|
# Specifies if the proxy can proxy requests.
|
140
146
|
#
|
147
|
+
# @api public
|
148
|
+
#
|
141
149
|
def valid?
|
142
150
|
begin
|
143
151
|
Net.http_get_body(
|
@@ -156,6 +164,8 @@ module Ronin
|
|
156
164
|
# The extra number of seconds it takes the proxy to process the
|
157
165
|
# request, compared to sending the request directly.
|
158
166
|
#
|
167
|
+
# @api public
|
168
|
+
#
|
159
169
|
def latency
|
160
170
|
time = lambda { |proxy|
|
161
171
|
t1 = Time.now
|
@@ -183,6 +193,8 @@ module Ronin
|
|
183
193
|
# @return [String]
|
184
194
|
# The IP address the proxy uses for our requests.
|
185
195
|
#
|
196
|
+
# @api public
|
197
|
+
#
|
186
198
|
def proxied_ip
|
187
199
|
IPAddr.extract(Net.http_get_body(
|
188
200
|
:url => Network::IP_URL,
|
@@ -196,6 +208,8 @@ module Ronin
|
|
196
208
|
# @return [Boolean]
|
197
209
|
# Specifies whether the proxy will forward our IP address.
|
198
210
|
#
|
211
|
+
# @api public
|
212
|
+
#
|
199
213
|
def transparent?
|
200
214
|
Network.ip == proxied_ip
|
201
215
|
end
|
@@ -206,6 +220,8 @@ module Ronin
|
|
206
220
|
# @return [Boolean]
|
207
221
|
# Specifies whether the proxy will hide our IP address.
|
208
222
|
#
|
223
|
+
# @api public
|
224
|
+
#
|
209
225
|
def anonymous?
|
210
226
|
!(transparent?)
|
211
227
|
end
|
@@ -213,6 +229,8 @@ module Ronin
|
|
213
229
|
#
|
214
230
|
# Disables the Proxy object.
|
215
231
|
#
|
232
|
+
# @api public
|
233
|
+
#
|
216
234
|
def disable!
|
217
235
|
self.host = nil
|
218
236
|
self.port = nil
|
@@ -229,6 +247,8 @@ module Ronin
|
|
229
247
|
# Specifies whether the proxy object is usable by
|
230
248
|
# Net::HTTP::Proxy.
|
231
249
|
#
|
250
|
+
# @api public
|
251
|
+
#
|
232
252
|
def enabled?
|
233
253
|
!(self.host.nil?)
|
234
254
|
end
|
@@ -240,6 +260,8 @@ module Ronin
|
|
240
260
|
# The HTTP URI representing the proxy. If the proxy is disabled,
|
241
261
|
# then `nil` will be returned.
|
242
262
|
#
|
263
|
+
# @api public
|
264
|
+
#
|
243
265
|
def url
|
244
266
|
return nil unless enabled?
|
245
267
|
|
@@ -264,6 +286,8 @@ module Ronin
|
|
264
286
|
# @return [String]
|
265
287
|
# The host-name of the proxy.
|
266
288
|
#
|
289
|
+
# @api public
|
290
|
+
#
|
267
291
|
def to_s
|
268
292
|
self.host.to_s
|
269
293
|
end
|
@@ -274,6 +298,8 @@ module Ronin
|
|
274
298
|
# @return [String]
|
275
299
|
# The inspection of the proxy object.
|
276
300
|
#
|
301
|
+
# @api public
|
302
|
+
#
|
277
303
|
def inspect
|
278
304
|
unless self.host
|
279
305
|
str = 'disabled'
|
data/lib/ronin/network/imap.rb
CHANGED
@@ -32,6 +32,8 @@ module Ronin
|
|
32
32
|
# @return [Integer]
|
33
33
|
# The default Ronin IMAP port.
|
34
34
|
#
|
35
|
+
# @api public
|
36
|
+
#
|
35
37
|
def IMAP.default_port
|
36
38
|
@default_port ||= DEFAULT_PORT
|
37
39
|
end
|
@@ -42,6 +44,8 @@ module Ronin
|
|
42
44
|
# @param [Integer] port
|
43
45
|
# The new default Ronin IMAP port.
|
44
46
|
#
|
47
|
+
# @api public
|
48
|
+
#
|
45
49
|
def IMAP.default_port=(port)
|
46
50
|
@default_port = port
|
47
51
|
end
|
data/lib/ronin/network/pop3.rb
CHANGED
@@ -32,6 +32,8 @@ module Ronin
|
|
32
32
|
# @return [Integer]
|
33
33
|
# The default Ronin POP3 port.
|
34
34
|
#
|
35
|
+
# @api public
|
36
|
+
#
|
35
37
|
def POP3.default_port
|
36
38
|
@default_port ||= DEFAULT_PORT
|
37
39
|
end
|
@@ -42,6 +44,8 @@ module Ronin
|
|
42
44
|
# @param [Integer] port
|
43
45
|
# The new default Ronin POP3 port.
|
44
46
|
#
|
47
|
+
# @api public
|
48
|
+
#
|
45
49
|
def POP3.default_port=(port)
|
46
50
|
@default_port = port
|
47
51
|
end
|
@@ -25,6 +25,8 @@ module Ronin
|
|
25
25
|
#
|
26
26
|
class Email
|
27
27
|
|
28
|
+
CRLF = "\n\r"
|
29
|
+
|
28
30
|
# Sender of the email
|
29
31
|
attr_accessor :from
|
30
32
|
|
@@ -40,6 +42,9 @@ module Ronin
|
|
40
42
|
# Unique message-id string
|
41
43
|
attr_accessor :message_id
|
42
44
|
|
45
|
+
# Additional headers
|
46
|
+
attr_reader :headers
|
47
|
+
|
43
48
|
# Body of the email
|
44
49
|
attr_accessor :body
|
45
50
|
|
@@ -52,7 +57,7 @@ module Ronin
|
|
52
57
|
# @option options [String] :from
|
53
58
|
# The address the email is from.
|
54
59
|
#
|
55
|
-
# @option options [String] :to
|
60
|
+
# @option options [Array, String] :to
|
56
61
|
# The address that the email should be sent to.
|
57
62
|
#
|
58
63
|
# @option options [String] :subject
|
@@ -64,6 +69,9 @@ module Ronin
|
|
64
69
|
# @option options [String, Time] :date (Time.now)
|
65
70
|
# The date the email was sent on.
|
66
71
|
#
|
72
|
+
# @option options [Hash<String => String}] :headers
|
73
|
+
# Additional headers.
|
74
|
+
#
|
67
75
|
# @option options [String, Array<String>] :body
|
68
76
|
# The body of the email.
|
69
77
|
#
|
@@ -74,18 +82,29 @@ module Ronin
|
|
74
82
|
# @yieldparam [Email] email
|
75
83
|
# The newly created email object.
|
76
84
|
#
|
85
|
+
# @api public
|
86
|
+
#
|
77
87
|
def initialize(options={})
|
78
88
|
@from = options[:from]
|
79
89
|
@to = options[:to]
|
80
90
|
@subject = options[:subject]
|
81
|
-
@date = options
|
91
|
+
@date = options.fetch(:date,Time.now)
|
82
92
|
@message_id = options[:message_id]
|
93
|
+
@headers = {}
|
94
|
+
|
95
|
+
if options[:headers]
|
96
|
+
@headers.merge!(options[:headers])
|
97
|
+
end
|
98
|
+
|
83
99
|
@body = []
|
84
100
|
|
85
|
-
if options[:body]
|
86
|
-
|
87
|
-
|
88
|
-
|
101
|
+
if options[:body]
|
102
|
+
case options[:body]
|
103
|
+
when Array
|
104
|
+
@body += options[:body]
|
105
|
+
else
|
106
|
+
@body << options[:body]
|
107
|
+
end
|
89
108
|
end
|
90
109
|
|
91
110
|
yield self if block_given?
|
@@ -99,25 +118,31 @@ module Ronin
|
|
99
118
|
#
|
100
119
|
# @see http://www.ruby-doc.org/stdlib/libdoc/net/smtp/rdoc/classes/Net/SMTP.html
|
101
120
|
#
|
121
|
+
# @api public
|
122
|
+
#
|
102
123
|
def to_s
|
103
124
|
address = lambda { |info|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
return "#{info[:name]} <#{info[:email]}>"
|
125
|
+
case info
|
126
|
+
when Array
|
127
|
+
"#{info[0]} <#{info[1]}>"
|
108
128
|
else
|
109
|
-
|
129
|
+
info
|
110
130
|
end
|
111
131
|
}
|
112
132
|
|
113
133
|
message = []
|
114
134
|
|
115
135
|
if @from
|
116
|
-
message << "From: #{
|
136
|
+
message << "From: #{@from}"
|
117
137
|
end
|
118
138
|
|
119
139
|
if @to
|
120
|
-
message <<
|
140
|
+
message << case @to
|
141
|
+
when Array
|
142
|
+
"To: #{@to.join(', ')}"
|
143
|
+
else
|
144
|
+
"To: #{@to}"
|
145
|
+
end
|
121
146
|
end
|
122
147
|
|
123
148
|
if @subject
|
@@ -132,10 +157,14 @@ module Ronin
|
|
132
157
|
message << "Message-Id: <#{@message_id}>"
|
133
158
|
end
|
134
159
|
|
160
|
+
@headers.each do |name,value|
|
161
|
+
message << "#{name}: #{value}"
|
162
|
+
end
|
163
|
+
|
135
164
|
message << ''
|
136
165
|
message += @body
|
137
166
|
|
138
|
-
return message.join(
|
167
|
+
return message.join(CRLF)
|
139
168
|
end
|
140
169
|
|
141
170
|
end
|
@@ -32,6 +32,8 @@ module Ronin
|
|
32
32
|
# @return [Integer]
|
33
33
|
# The default Ronin SMTP port.
|
34
34
|
#
|
35
|
+
# @api public
|
36
|
+
#
|
35
37
|
def SMTP.default_port
|
36
38
|
@default_port ||= DEFAULT_PORT
|
37
39
|
end
|
@@ -42,6 +44,8 @@ module Ronin
|
|
42
44
|
# @param [Integer] port
|
43
45
|
# The new default Ronin SMTP port.
|
44
46
|
#
|
47
|
+
# @api public
|
48
|
+
#
|
45
49
|
def SMTP.default_port=(port)
|
46
50
|
@default_port = port
|
47
51
|
end
|
@@ -61,6 +65,8 @@ module Ronin
|
|
61
65
|
#
|
62
66
|
# @see Ronin::Network::SMTP::Email
|
63
67
|
#
|
68
|
+
# @api public
|
69
|
+
#
|
64
70
|
def SMTP.message(options={},&block)
|
65
71
|
Email.new(options,&block).to_s
|
66
72
|
end
|
data/lib/ronin/network/ssl.rb
CHANGED
data/lib/ronin/network/telnet.rb
CHANGED
@@ -38,6 +38,8 @@ module Ronin
|
|
38
38
|
# @return [Integer]
|
39
39
|
# The default Ronin Telnet port.
|
40
40
|
#
|
41
|
+
# @api public
|
42
|
+
#
|
41
43
|
def Telnet.default_port
|
42
44
|
@default_port ||= DEFAULT_PORT
|
43
45
|
end
|
@@ -48,6 +50,8 @@ module Ronin
|
|
48
50
|
# @param [Integer] port
|
49
51
|
# The new default Ronin Telnet port.
|
50
52
|
#
|
53
|
+
# @api public
|
54
|
+
#
|
51
55
|
def Telnet.default_port=(port)
|
52
56
|
@default_port = port
|
53
57
|
end
|
@@ -56,6 +60,8 @@ module Ronin
|
|
56
60
|
# @return [Regexp]
|
57
61
|
# The default Ronin Telnet prompt pattern.
|
58
62
|
#
|
63
|
+
# @api public
|
64
|
+
#
|
59
65
|
def Telnet.default_prompt
|
60
66
|
@default_prompt ||= DEFAULT_PROMPT
|
61
67
|
end
|
@@ -66,6 +72,8 @@ module Ronin
|
|
66
72
|
# @param [Regexp] prompt
|
67
73
|
# The new default Ronin Telnet prompt pattern.
|
68
74
|
#
|
75
|
+
# @api public
|
76
|
+
#
|
69
77
|
def Telnet.default_prompt=(prompt)
|
70
78
|
@default_prompt = prompt
|
71
79
|
end
|
@@ -74,6 +82,8 @@ module Ronin
|
|
74
82
|
# @return [Integer]
|
75
83
|
# The default Ronin Telnet timeout.
|
76
84
|
#
|
85
|
+
# @api public
|
86
|
+
#
|
77
87
|
def Telnet.default_timeout
|
78
88
|
@default_timeout ||= DEFAULT_TIMEOUT
|
79
89
|
end
|
@@ -84,6 +94,8 @@ module Ronin
|
|
84
94
|
# @param [Integer] timeout
|
85
95
|
# The new default Ronin Telnet timeout.
|
86
96
|
#
|
97
|
+
# @api public
|
98
|
+
#
|
87
99
|
def Telnet.default_timeout=(timeout)
|
88
100
|
@default_timeout = timeout
|
89
101
|
end
|
@@ -92,6 +104,8 @@ module Ronin
|
|
92
104
|
# @return [Telnet, IO, nil]
|
93
105
|
# The Ronin Telnet proxy.
|
94
106
|
#
|
107
|
+
# @api public
|
108
|
+
#
|
95
109
|
def Telnet.proxy
|
96
110
|
@proxy ||= nil
|
97
111
|
end
|
@@ -102,6 +116,8 @@ module Ronin
|
|
102
116
|
# @param [Telnet, IO, nil] new_proxy
|
103
117
|
# The new Ronin Telnet proxy.
|
104
118
|
#
|
119
|
+
# @api public
|
120
|
+
#
|
105
121
|
def Telnet.proxy=(new_proxy)
|
106
122
|
@proxy = new_proxy
|
107
123
|
end
|
data/lib/ronin/path.rb
CHANGED
@@ -41,6 +41,8 @@ module Ronin
|
|
41
41
|
# @return [Path]
|
42
42
|
# The root path.
|
43
43
|
#
|
44
|
+
# @api public
|
45
|
+
#
|
44
46
|
def Path.root
|
45
47
|
Path.new('/')
|
46
48
|
end
|
@@ -69,6 +71,8 @@ module Ronin
|
|
69
71
|
# # => [#<Ronin::Path:..>, #<Ronin::Path:../..>,
|
70
72
|
# #<Ronin::Path:../../..>]
|
71
73
|
#
|
74
|
+
# @api public
|
75
|
+
#
|
72
76
|
def self.up(n,separator=File::SEPARATOR)
|
73
77
|
case n
|
74
78
|
when Integer
|
@@ -105,6 +109,8 @@ module Ronin
|
|
105
109
|
# Path.up(7).join('etc/passwd')
|
106
110
|
# # => #<Ronin::Path:../../../../../../../etc/passwd>
|
107
111
|
#
|
112
|
+
# @api public
|
113
|
+
#
|
108
114
|
def join(*names)
|
109
115
|
names.map! { |name| name.to_s }
|
110
116
|
|
@@ -22,7 +22,7 @@ module Ronin
|
|
22
22
|
# The Inflectors supported by ronin-support
|
23
23
|
INFLECTORS = {
|
24
24
|
:datamapper => {
|
25
|
-
:path => 'dm-core
|
25
|
+
:path => 'dm-core',
|
26
26
|
:const => 'DataMapper::Inflector'
|
27
27
|
},
|
28
28
|
:active_support => {
|
@@ -55,6 +55,8 @@ module Ronin
|
|
55
55
|
# @raise [NameError]
|
56
56
|
# The constant could not be found.
|
57
57
|
#
|
58
|
+
# @api private
|
59
|
+
#
|
58
60
|
def Support.load_inflector!(name)
|
59
61
|
name = name.to_sym
|
60
62
|
|
data/lib/ronin/templates/erb.rb
CHANGED
@@ -47,6 +47,8 @@ module Ronin
|
|
47
47
|
# }
|
48
48
|
# # => "\nUSER: lolcats\nPASSWORD: staclol\n"
|
49
49
|
#
|
50
|
+
# @api public
|
51
|
+
#
|
50
52
|
def erb(template)
|
51
53
|
ERB.new(template).result(binding)
|
52
54
|
end
|
@@ -63,6 +65,8 @@ module Ronin
|
|
63
65
|
# @example
|
64
66
|
# erb_file 'path/to/template.erb'
|
65
67
|
#
|
68
|
+
# @api public
|
69
|
+
#
|
66
70
|
def erb_file(template_path)
|
67
71
|
read_template(template_path) do |template|
|
68
72
|
erb(template)
|