ronin 1.1.0 → 1.2.0
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 +23 -0
- data/README.md +19 -13
- data/Rakefile +2 -1
- data/gemspec.yml +18 -17
- data/lib/bond/completions/ronin.rb +147 -0
- data/lib/ronin/auto_load.rb +30 -28
- data/lib/ronin/database/migrations/1.0.0.rb +1 -0
- data/lib/ronin/model/has_authors.rb +92 -2
- data/lib/ronin/model/has_description.rb +54 -2
- data/lib/ronin/model/has_license.rb +101 -2
- data/lib/ronin/model/has_name.rb +72 -2
- data/lib/ronin/model/has_title.rb +52 -2
- data/lib/ronin/model/has_unique_name.rb +93 -2
- data/lib/ronin/model/has_version.rb +58 -2
- data/lib/ronin/model/model.rb +91 -52
- data/lib/ronin/os.rb +30 -15
- data/lib/ronin/repository.rb +1 -1
- data/lib/ronin/ronin.rb +0 -15
- data/lib/ronin/script/script.rb +257 -2
- data/lib/ronin/ui/console.rb +2 -199
- data/lib/ronin/ui/console/commands.rb +164 -0
- data/lib/ronin/ui/console/console.rb +215 -0
- data/lib/ronin/ui/console/context.rb +95 -0
- data/lib/ronin/version.rb +1 -1
- data/spec/os_spec.rb +18 -13
- metadata +206 -239
- data/lib/ronin/class_methods.rb +0 -49
- data/lib/ronin/model/class_methods.rb +0 -58
- data/lib/ronin/model/has_authors/class_methods.rb +0 -60
- data/lib/ronin/model/has_authors/has_authors.rb +0 -70
- data/lib/ronin/model/has_description/class_methods.rb +0 -49
- data/lib/ronin/model/has_description/has_description.rb +0 -49
- data/lib/ronin/model/has_license/class_methods.rb +0 -68
- data/lib/ronin/model/has_license/has_license.rb +0 -71
- data/lib/ronin/model/has_name/class_methods.rb +0 -48
- data/lib/ronin/model/has_name/has_name.rb +0 -62
- data/lib/ronin/model/has_title/class_methods.rb +0 -48
- data/lib/ronin/model/has_title/has_title.rb +0 -48
- data/lib/ronin/model/has_unique_name/class_methods.rb +0 -51
- data/lib/ronin/model/has_unique_name/has_unique_name.rb +0 -78
- data/lib/ronin/model/has_version/class_methods.rb +0 -54
- data/lib/ronin/model/has_version/has_version.rb +0 -48
- data/lib/ronin/script/class_methods.rb +0 -84
- data/lib/ronin/script/instance_methods.rb +0 -217
data/lib/ronin/model/model.rb
CHANGED
@@ -17,7 +17,6 @@
|
|
17
17
|
# along with Ronin. If not, see <http://www.gnu.org/licenses/>.
|
18
18
|
#
|
19
19
|
|
20
|
-
require 'ronin/model/class_methods'
|
21
20
|
require 'ronin/model/types'
|
22
21
|
require 'ronin/support/inflector'
|
23
22
|
|
@@ -51,74 +50,114 @@ module Ronin
|
|
51
50
|
base.send :include, DataMapper,
|
52
51
|
DataMapper::Migrations,
|
53
52
|
DataMapper::Serialize,
|
54
|
-
Model::Types
|
55
|
-
|
53
|
+
Model::Types,
|
54
|
+
InstanceMethods
|
55
|
+
base.send :extend, ClassMethods
|
56
56
|
end
|
57
57
|
|
58
58
|
#
|
59
|
-
#
|
60
|
-
# and values.
|
59
|
+
# Class methods that are added when {Model} is included into a class.
|
61
60
|
#
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
61
|
+
module ClassMethods
|
62
|
+
#
|
63
|
+
# The default name to use when defining relationships with the
|
64
|
+
# model.
|
65
|
+
#
|
66
|
+
# @return [Symbol]
|
67
|
+
# The name to use in relationships.
|
68
|
+
#
|
69
|
+
# @since 1.0.0
|
70
|
+
#
|
71
|
+
# @api semipublic
|
72
|
+
#
|
73
|
+
def relationship_name
|
74
|
+
name = Support::Inflector.underscore(self.name.split('::').last)
|
75
|
+
|
76
|
+
return Support::Inflector.pluralize(name).to_sym
|
77
|
+
end
|
78
|
+
|
79
|
+
#
|
80
|
+
# Loads and initialize the resources.
|
81
|
+
#
|
82
|
+
# @api private
|
83
|
+
#
|
84
|
+
def load(records,query)
|
85
|
+
resources = super(records,query)
|
86
|
+
resources.each { |resource| resource.send :initialize }
|
85
87
|
|
86
|
-
|
87
|
-
exclude += options[:exclude]
|
88
|
+
return resources
|
88
89
|
end
|
90
|
+
end
|
89
91
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
92
|
+
#
|
93
|
+
# Instance methods that are added when {Model} is included into a class.
|
94
|
+
#
|
95
|
+
module InstanceMethods
|
96
|
+
#
|
97
|
+
# Formats the attributes of the model into human readable names
|
98
|
+
# and values.
|
99
|
+
#
|
100
|
+
# @param [Hash] options
|
101
|
+
# Additional options.
|
102
|
+
#
|
103
|
+
# @option options [Array<Symbol>] :exclude ([])
|
104
|
+
# A list of attribute names to exclude.
|
105
|
+
#
|
106
|
+
# @yield [name, value]
|
107
|
+
# If a block is given, it will be passed the name and humanized
|
108
|
+
# value of each attribute.
|
109
|
+
#
|
110
|
+
# @yieldparam [String] name
|
111
|
+
# The humanized name of the attribute.
|
112
|
+
#
|
113
|
+
# @yieldparam [String] value
|
114
|
+
# The human readable value of the attribute.
|
115
|
+
#
|
116
|
+
# @return [Hash{String => String}]
|
117
|
+
# A hash of the humanly readable names and values of the attributes.
|
118
|
+
#
|
119
|
+
# @api semipublic
|
120
|
+
#
|
121
|
+
def humanize_attributes(options={})
|
122
|
+
exclude = [:id, :type]
|
123
|
+
|
124
|
+
if options[:exclude]
|
125
|
+
exclude += options[:exclude]
|
97
126
|
end
|
98
|
-
}
|
99
127
|
|
100
|
-
|
128
|
+
formatter = lambda { |value|
|
129
|
+
if value.kind_of?(Array)
|
130
|
+
value.map(&formatter).join(', ')
|
131
|
+
elsif value.kind_of?(Symbol)
|
132
|
+
Support::Inflector.humanize(value)
|
133
|
+
else
|
134
|
+
value.to_s
|
135
|
+
end
|
136
|
+
}
|
137
|
+
|
138
|
+
formatted = {}
|
101
139
|
|
102
|
-
|
103
|
-
|
140
|
+
self.attributes.each do |name,value|
|
141
|
+
next if (value.nil? || (value.respond_to?(:empty?) && value.empty?))
|
104
142
|
|
105
|
-
|
106
|
-
|
143
|
+
unless (exclude.include?(name) || value.nil?)
|
144
|
+
name = name.to_s
|
107
145
|
|
108
|
-
|
109
|
-
|
110
|
-
|
146
|
+
unless name[-3..-1] == '_id'
|
147
|
+
name = Support::Inflector.humanize(name)
|
148
|
+
value = formatter.call(value)
|
111
149
|
|
112
|
-
|
113
|
-
|
114
|
-
|
150
|
+
if block_given?
|
151
|
+
yield name, value
|
152
|
+
end
|
115
153
|
|
116
|
-
|
154
|
+
formatted[name] = value
|
155
|
+
end
|
117
156
|
end
|
118
157
|
end
|
119
|
-
end
|
120
158
|
|
121
|
-
|
159
|
+
return formatted
|
160
|
+
end
|
122
161
|
end
|
123
162
|
end
|
124
163
|
end
|
data/lib/ronin/os.rb
CHANGED
@@ -23,6 +23,8 @@ require 'ronin/os_guess'
|
|
23
23
|
require 'ronin/ip_address'
|
24
24
|
require 'ronin/extensions/meta'
|
25
25
|
|
26
|
+
require 'dm-is-predefined'
|
27
|
+
|
26
28
|
module Ronin
|
27
29
|
#
|
28
30
|
# Represents an Operating System and pre-defines other common ones
|
@@ -34,6 +36,8 @@ module Ronin
|
|
34
36
|
include Model
|
35
37
|
include Model::HasName
|
36
38
|
|
39
|
+
is :predefined
|
40
|
+
|
37
41
|
# Primary key
|
38
42
|
property :id, Serial
|
39
43
|
|
@@ -127,14 +131,25 @@ module Ronin
|
|
127
131
|
#
|
128
132
|
# @api private
|
129
133
|
#
|
130
|
-
def OS.predefine(name,
|
131
|
-
|
134
|
+
def OS.predefine(name,attributes)
|
135
|
+
unless attributes[:name]
|
136
|
+
raise(ArgumentError,"must specify the :name attribute")
|
137
|
+
end
|
138
|
+
|
139
|
+
super(name,attributes)
|
140
|
+
|
141
|
+
# if no version was predefined, allow the predefined helper-methods
|
142
|
+
# to accept a version argument
|
143
|
+
unless attributes[:version]
|
144
|
+
os_name = attributes[:name]
|
145
|
+
|
146
|
+
meta_def(name) do |*arguments|
|
147
|
+
attributes = predefined_attributes[name]
|
148
|
+
version = if arguments.first
|
149
|
+
arguments.first.to_s
|
150
|
+
end
|
132
151
|
|
133
|
-
|
134
|
-
if (version = arguments.first)
|
135
|
-
OS.first_or_create(:name => os_name, :version => version.to_s)
|
136
|
-
else
|
137
|
-
OS.new(:name => os_name)
|
152
|
+
OS.first_or_create(attributes.merge(:version => version))
|
138
153
|
end
|
139
154
|
end
|
140
155
|
|
@@ -142,28 +157,28 @@ module Ronin
|
|
142
157
|
end
|
143
158
|
|
144
159
|
# The Linux OS
|
145
|
-
predefine :linux, 'Linux'
|
160
|
+
predefine :linux, :name => 'Linux'
|
146
161
|
|
147
162
|
# The FreeBSD OS
|
148
|
-
predefine :freebsd, 'FreeBSD'
|
163
|
+
predefine :freebsd, :name => 'FreeBSD'
|
149
164
|
|
150
165
|
# The OpenBSD OS
|
151
|
-
predefine :openbsd, 'OpenBSD'
|
166
|
+
predefine :openbsd, :name => 'OpenBSD'
|
152
167
|
|
153
168
|
# The NetBSD OS
|
154
|
-
predefine :netbsd, 'NetBSD'
|
169
|
+
predefine :netbsd, :name => 'NetBSD'
|
155
170
|
|
156
171
|
# OSX
|
157
|
-
predefine :osx, 'OSX'
|
172
|
+
predefine :osx, :name => 'OSX'
|
158
173
|
|
159
174
|
# The Solaris OS
|
160
|
-
predefine :solaris, 'Solaris'
|
175
|
+
predefine :solaris, :name => 'Solaris'
|
161
176
|
|
162
177
|
# The Windows OS
|
163
|
-
predefine :windows, 'Windows'
|
178
|
+
predefine :windows, :name => 'Windows'
|
164
179
|
|
165
180
|
# The family UNIX OSes
|
166
|
-
predefine :unix, 'UNIX'
|
181
|
+
predefine :unix, :name => 'UNIX'
|
167
182
|
|
168
183
|
end
|
169
184
|
end
|
data/lib/ronin/repository.rb
CHANGED
data/lib/ronin/ronin.rb
CHANGED
@@ -17,26 +17,11 @@
|
|
17
17
|
# along with Ronin. If not, see <http://www.gnu.org/licenses/>.
|
18
18
|
#
|
19
19
|
|
20
|
-
require 'ronin/class_methods'
|
21
20
|
require 'ronin/auto_load'
|
22
21
|
|
23
22
|
module Ronin
|
24
23
|
include AutoLoad
|
25
24
|
|
26
|
-
#
|
27
|
-
# Includes {ClassMethods} when {Ronin} is included.
|
28
|
-
#
|
29
|
-
# @param [Class, Module] base
|
30
|
-
# The class or module that {Ronin} is being included into.
|
31
|
-
#
|
32
|
-
# @since 1.0.0
|
33
|
-
#
|
34
|
-
# @api private
|
35
|
-
#
|
36
|
-
def self.included(base)
|
37
|
-
base.send :extend, ClassMethods
|
38
|
-
end
|
39
|
-
|
40
25
|
#
|
41
26
|
# Convenience method for loading Ronin {Script}s.
|
42
27
|
#
|
data/lib/ronin/script/script.rb
CHANGED
@@ -17,8 +17,6 @@
|
|
17
17
|
# along with Ronin. If not, see <http://www.gnu.org/licenses/>.
|
18
18
|
#
|
19
19
|
|
20
|
-
require 'ronin/script/instance_methods'
|
21
|
-
require 'ronin/script/class_methods'
|
22
20
|
require 'ronin/script/path'
|
23
21
|
require 'ronin/model/model'
|
24
22
|
require 'ronin/model/has_name'
|
@@ -90,6 +88,263 @@ module Ronin
|
|
90
88
|
Path.has 1, base.relationship_name, base, :child_key => [:script_path_id]
|
91
89
|
end
|
92
90
|
|
91
|
+
#
|
92
|
+
# @since 1.1.0
|
93
|
+
#
|
94
|
+
module ClassMethods
|
95
|
+
#
|
96
|
+
# Loads the {Script} of the same class.
|
97
|
+
#
|
98
|
+
# @param [String] path
|
99
|
+
# The path to load the script from.
|
100
|
+
#
|
101
|
+
# @return [Script]
|
102
|
+
# The loaded script.
|
103
|
+
#
|
104
|
+
# @example
|
105
|
+
# Exploits::HTTP.load_from('mod_php_exploit.rb')
|
106
|
+
# # => #<Ronin::Exploits::HTTP: ...>
|
107
|
+
#
|
108
|
+
# @since 1.1.0
|
109
|
+
#
|
110
|
+
def load_from(path)
|
111
|
+
load_object(path)
|
112
|
+
end
|
113
|
+
|
114
|
+
#
|
115
|
+
# Loads all objects with the matching attributes.
|
116
|
+
#
|
117
|
+
# @param [Hash] attributes
|
118
|
+
# Attributes to search for.
|
119
|
+
#
|
120
|
+
# @since 1.1.0
|
121
|
+
#
|
122
|
+
# @api public
|
123
|
+
#
|
124
|
+
def load_all(attributes={})
|
125
|
+
resources = all(attributes)
|
126
|
+
resources.each { |resource| resource.load_script! }
|
127
|
+
|
128
|
+
return resources
|
129
|
+
end
|
130
|
+
|
131
|
+
#
|
132
|
+
# Loads the first object with matching attributes.
|
133
|
+
#
|
134
|
+
# @param [Hash] attributes
|
135
|
+
# Attributes to search for.
|
136
|
+
#
|
137
|
+
# @return [Cacheable]
|
138
|
+
# The loaded cached objects.
|
139
|
+
#
|
140
|
+
# @since 1.1.0
|
141
|
+
#
|
142
|
+
# @api public
|
143
|
+
#
|
144
|
+
def load_first(attributes={})
|
145
|
+
if (resource = first(attributes))
|
146
|
+
resource.load_script!
|
147
|
+
end
|
148
|
+
|
149
|
+
return resource
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
#
|
154
|
+
# Instance methods for an {Script}.
|
155
|
+
#
|
156
|
+
# @since 1.1.0
|
157
|
+
#
|
158
|
+
module InstanceMethods
|
159
|
+
#
|
160
|
+
# Initializes the Ronin Script.
|
161
|
+
#
|
162
|
+
# @param [Array] arguments
|
163
|
+
# Arguments for initializing the Script.
|
164
|
+
#
|
165
|
+
# @since 1.1.0
|
166
|
+
#
|
167
|
+
# @api semipublic
|
168
|
+
#
|
169
|
+
def initialize(*arguments,&block)
|
170
|
+
@script_loaded = false
|
171
|
+
@cache_prepared = false
|
172
|
+
|
173
|
+
if arguments.first.kind_of?(Hash)
|
174
|
+
initialize_params(arguments.first)
|
175
|
+
end
|
176
|
+
|
177
|
+
super(*arguments,&block)
|
178
|
+
end
|
179
|
+
|
180
|
+
#
|
181
|
+
# The script type.
|
182
|
+
#
|
183
|
+
# @return [String]
|
184
|
+
# The name of the script class.
|
185
|
+
#
|
186
|
+
# @since 1.1.0
|
187
|
+
#
|
188
|
+
# @api semipublic
|
189
|
+
#
|
190
|
+
def script_type
|
191
|
+
@script_type ||= self.class.base_model.name.split('::').last
|
192
|
+
end
|
193
|
+
|
194
|
+
#
|
195
|
+
# Determines if the original code, from the cache file, has been
|
196
|
+
# loaded into the object.
|
197
|
+
#
|
198
|
+
# @return [Boolean]
|
199
|
+
# Specifies whether the original code has been loaded into the
|
200
|
+
# object.
|
201
|
+
#
|
202
|
+
# @since 1.1.0
|
203
|
+
#
|
204
|
+
# @api private
|
205
|
+
#
|
206
|
+
def script_loaded?
|
207
|
+
@script_loaded == true
|
208
|
+
end
|
209
|
+
|
210
|
+
#
|
211
|
+
# Loads the code from the cached file for the object, and instance
|
212
|
+
# evaluates it into the object.
|
213
|
+
#
|
214
|
+
# @return [Boolean]
|
215
|
+
# Indicates the original code was successfully loaded.
|
216
|
+
#
|
217
|
+
# @since 1.1.0
|
218
|
+
#
|
219
|
+
# @api private
|
220
|
+
#
|
221
|
+
def load_script!
|
222
|
+
if (cached? && !script_loaded?)
|
223
|
+
block = self.class.load_object_block(self.script_path.path)
|
224
|
+
|
225
|
+
@script_loaded = true
|
226
|
+
instance_eval(&block) if block
|
227
|
+
return true
|
228
|
+
end
|
229
|
+
|
230
|
+
return false
|
231
|
+
end
|
232
|
+
|
233
|
+
#
|
234
|
+
# @return [Boolean]
|
235
|
+
# Specifies whether the object has been prepared to be cached,
|
236
|
+
#
|
237
|
+
# @since 1.1.0
|
238
|
+
#
|
239
|
+
# @api private
|
240
|
+
#
|
241
|
+
def prepared_for_cache?
|
242
|
+
@cache_prepared == true
|
243
|
+
end
|
244
|
+
|
245
|
+
#
|
246
|
+
# Indicates whether the object has been cached.
|
247
|
+
#
|
248
|
+
# @return [Boolean]
|
249
|
+
# Specifies whether the object has been previously cached.
|
250
|
+
#
|
251
|
+
# @since 1.1.0
|
252
|
+
#
|
253
|
+
# @api private
|
254
|
+
#
|
255
|
+
def cached?
|
256
|
+
(saved? && self.script_path)
|
257
|
+
end
|
258
|
+
|
259
|
+
#
|
260
|
+
# Default method which invokes the script.
|
261
|
+
#
|
262
|
+
# @param [Array] arguments
|
263
|
+
# Optional arguments.
|
264
|
+
#
|
265
|
+
# @since 1.1.0
|
266
|
+
#
|
267
|
+
def run(*arguments)
|
268
|
+
end
|
269
|
+
|
270
|
+
#
|
271
|
+
# Converts the script to a String.
|
272
|
+
#
|
273
|
+
# @return [String]
|
274
|
+
# The name and version of the script.
|
275
|
+
#
|
276
|
+
# @since 1.1.0
|
277
|
+
#
|
278
|
+
# @api public
|
279
|
+
#
|
280
|
+
def to_s
|
281
|
+
if (self.name && self.version)
|
282
|
+
"#{self.name} #{self.version}"
|
283
|
+
elsif self.name
|
284
|
+
super
|
285
|
+
elsif self.version
|
286
|
+
self.version.to_s
|
287
|
+
end
|
288
|
+
end
|
289
|
+
|
290
|
+
#
|
291
|
+
# Inspects both the properties and parameters of the Ronin Script.
|
292
|
+
#
|
293
|
+
# @return [String]
|
294
|
+
# The inspected Ronin Script.
|
295
|
+
#
|
296
|
+
# @since 1.1.0
|
297
|
+
#
|
298
|
+
# @api public
|
299
|
+
#
|
300
|
+
def inspect
|
301
|
+
body = []
|
302
|
+
|
303
|
+
self.attributes.each do |name,value|
|
304
|
+
body << "#{name}: #{value.inspect}"
|
305
|
+
end
|
306
|
+
|
307
|
+
param_pairs = []
|
308
|
+
|
309
|
+
self.params.each do |name,param|
|
310
|
+
param_pairs << "#{name}: #{param.value.inspect}"
|
311
|
+
end
|
312
|
+
|
313
|
+
body << "params: {#{param_pairs.join(', ')}}"
|
314
|
+
|
315
|
+
return "#<#{self.class}: #{body.join(', ')}>"
|
316
|
+
end
|
317
|
+
|
318
|
+
protected
|
319
|
+
|
320
|
+
#
|
321
|
+
# Will call the given block only once, in order to prepare the
|
322
|
+
# object for caching.
|
323
|
+
#
|
324
|
+
# @yield []
|
325
|
+
# The block will be ran inside the object when the object is to be
|
326
|
+
# prepared for caching.
|
327
|
+
#
|
328
|
+
# @return [Boolean]
|
329
|
+
# Specifies whether the object was successfully prepared for
|
330
|
+
# caching.
|
331
|
+
#
|
332
|
+
# @since 1.1.0
|
333
|
+
#
|
334
|
+
# @api public
|
335
|
+
#
|
336
|
+
def cache
|
337
|
+
if (block_given? && !(cached? || prepared_for_cache?))
|
338
|
+
@cache_prepared = true
|
339
|
+
|
340
|
+
yield
|
341
|
+
return true
|
342
|
+
end
|
343
|
+
|
344
|
+
return false
|
345
|
+
end
|
346
|
+
end
|
347
|
+
|
93
348
|
#
|
94
349
|
# Loads a script from a file.
|
95
350
|
#
|