Class: Arachni::Module::Manager
Overview
Holds and manages the modules and their results.
Constant Summary
collapse
- NAMESPACE =
::Arachni::Modules
Component::Manager::EXCLUDE, Component::Manager::WILDCARD
Instance Attribute Summary
#lib, #namespace
Class Method Summary
collapse
Instance Method Summary
collapse
Methods included from Utilities
cookie_encode, cookies_from_document, cookies_from_file, cookies_from_response, exception_jail, exclude_path?, extract_domain, form_decode, form_encode, form_parse_request_body, forms_from_document, forms_from_response, get_path, hash_keys_to_str, html_decode, html_encode, include_path?, links_from_document, links_from_response, normalize_url, page_from_response, page_from_url, parse_query, parse_set_cookie, parse_url_vars, path_in_domain?, path_too_deep?, remove_constants, seed, skip_path?, to_absolute, uri_decode, uri_encode, uri_parse, uri_parser, url_sanitize
Methods included from Utilities
#read_file
#[], #available, #clear, #delete, #include?, #load, #load_all, #load_by_tags, #loaded, #name_to_path, #parse, #path_to_name, #paths, #prep_opts
Methods included from UI::Output
#debug?, #debug_off, #debug_on, #disable_only_positives, #flush_buffer, #mute, #muted?, old_reset_output_options, #only_positives, #only_positives?, #print_bad, #print_debug, #print_debug_backtrace, #print_debug_pp, #print_error, #print_error_backtrace, #print_info, #print_line, #print_ok, #print_status, #print_verbose, #reroute_to_file, #reroute_to_file?, reset_output_options, #set_buffer_cap, #uncap_buffer, #unmute, #verbose, #verbose?
Constructor Details
#initialize(framework) ⇒ Manager
Returns a new instance of Manager.
45
46
47
48
49
|
# File 'lib/arachni/module/manager.rb', line 45
def initialize( framework )
@framework = framework
@opts = @framework.opts
super( @opts.dir['modules'], NAMESPACE )
end
|
Class Method Details
.dedup(issues) ⇒ Object
247
248
249
|
# File 'lib/arachni/module/manager.rb', line 247
def self.dedup( issues )
issues.uniq.reject { |issue| issue_set.include?( issue.unique_id ) }
end
|
.do_not_store ⇒ Object
170
171
172
|
# File 'lib/arachni/module/manager.rb', line 170
def self.do_not_store
@@do_not_store = true
end
|
.issue_set ⇒ Object
209
210
211
|
# File 'lib/arachni/module/manager.rb', line 209
def self.issue_set
@@issue_set
end
|
231
232
233
|
# File 'lib/arachni/module/manager.rb', line 231
def self.issues
results
end
|
.on_register_results(&block) ⇒ Object
135
136
137
|
# File 'lib/arachni/module/manager.rb', line 135
def self.on_register_results( &block )
on_register_results_blocks << block
end
|
.on_register_results_blocks ⇒ Object
142
143
144
|
# File 'lib/arachni/module/manager.rb', line 142
def self.on_register_results_blocks
@@on_register_results_blocks
end
|
.on_register_results_blocks_raw ⇒ Object
156
157
158
|
# File 'lib/arachni/module/manager.rb', line 156
def self.on_register_results_blocks_raw
@@on_register_results_blocks_raw
end
|
.on_register_results_raw(&block) ⇒ Object
149
150
151
|
# File 'lib/arachni/module/manager.rb', line 149
def self.on_register_results_raw( &block )
on_register_results_blocks_raw << block
end
|
.register_results(results) ⇒ Integer
De-duplicates and registers module results (issues).
191
192
193
194
195
196
197
198
199
200
201
202
203
204
|
# File 'lib/arachni/module/manager.rb', line 191
def self.register_results( results )
on_register_results_blocks_raw.each { |block| block.call( results ) }
unique = dedup( results )
return 0 if unique.empty?
unique.each { |issue| issue_set << issue.unique_id if issue.var }
on_register_results_blocks.each { |block| block.call( unique ) }
return 0 if !store?
unique.each { |issue| self.results << issue }
unique.size
end
|
235
236
237
238
239
240
241
242
|
# File 'lib/arachni/module/manager.rb', line 235
def self.reset
store
on_register_results_blocks.clear
on_register_results_blocks_raw.clear
issue_set.clear
results.clear
remove_constants( NAMESPACE )
end
|
Class method
Gets module results
223
224
225
|
# File 'lib/arachni/module/manager.rb', line 223
def self.results
@@results ||= []
end
|
177
178
179
|
# File 'lib/arachni/module/manager.rb', line 177
def self.store
@@do_not_store = false
end
|
.store? ⇒ Boolean
163
164
165
|
# File 'lib/arachni/module/manager.rb', line 163
def self.store?
!@@do_not_store
end
|
Instance Method Details
#dedup(issues) ⇒ Object
250
251
252
|
# File 'lib/arachni/module/manager.rb', line 250
def dedup( issues )
self.class.dedup( issues )
end
|
#do_not_store ⇒ Object
173
174
175
|
# File 'lib/arachni/module/manager.rb', line 173
def do_not_store
self.class.do_not_store
end
|
#issue_set ⇒ Object
212
213
214
|
# File 'lib/arachni/module/manager.rb', line 212
def issue_set
self.class.issue_set
end
|
#on_register_results(&block) ⇒ Object
138
139
140
|
# File 'lib/arachni/module/manager.rb', line 138
def on_register_results( &block )
self.class.on_register_results( &block )
end
|
#on_register_results_blocks ⇒ Object
145
146
147
|
# File 'lib/arachni/module/manager.rb', line 145
def on_register_results_blocks
self.class.on_register_results_blocks
end
|
#on_register_results_blocks_raw ⇒ Object
159
160
161
|
# File 'lib/arachni/module/manager.rb', line 159
def on_register_results_blocks_raw
self.class.on_register_results_blocks_raw
end
|
#on_register_results_raw(&block) ⇒ Object
152
153
154
|
# File 'lib/arachni/module/manager.rb', line 152
def on_register_results_raw( &block )
self.class.on_register_results_raw( &block )
end
|
#register_results(results) ⇒ Object
205
206
207
|
# File 'lib/arachni/module/manager.rb', line 205
def register_results( results )
self.class.register_results( results )
end
|
243
244
245
|
# File 'lib/arachni/module/manager.rb', line 243
def reset
self.class.reset
end
|
#results ⇒ Object
Also known as:
issues
226
227
228
|
# File 'lib/arachni/module/manager.rb', line 226
def results
self.class.results
end
|
#run(page) ⇒ Object
Runs all modules against ‘page’.
56
57
58
|
# File 'lib/arachni/module/manager.rb', line 56
def run( page )
schedule.each { |mod| exception_jail( false ){ run_one( mod, page ) } }
end
|
#run_module?(mod, page) ⇒ Bool
Determines whether or not to run the module against the given page depending on which elements exist in the page, which elements the module is configured to audit and user options.
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
# File 'lib/arachni/module/manager.rb', line 117
def run_module?( mod, page )
elements = mod.info[:elements]
return true if !elements || elements.empty?
elems = {
Element::LINK => page.links && page.links.any? && @opts.audit_links,
Element::FORM => page.forms && page.forms.any? && @opts.audit_forms,
Element::COOKIE => page.cookies && page.cookies.any? && @opts.audit_cookies,
Element::HEADER => page. && page..any? && @opts.,
Element::BODY => page.body && !page.body.empty?,
Element::PATH => true,
Element::SERVER => true
}
elems.each_pair { |elem, expr| return true if elements.include?( elem ) && expr }
false
end
|
#run_one(mod, page) ⇒ Object
Runs a single module against ‘page’.
98
99
100
101
102
103
104
105
|
# File 'lib/arachni/module/manager.rb', line 98
def run_one( mod, page )
return false if !run_module?( mod, page )
mod_new = mod.new( page, @framework )
mod_new.prepare
mod_new.run
mod_new.clean_up
end
|
#schedule ⇒ Array
Returns the modules in proper running order.
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
# File 'lib/arachni/module/manager.rb', line 65
def schedule
schedule = Set.new
preferred_over = Hash.new([])
preferred = self.reject do |name, klass|
preferred_over[name] = klass.preferred if klass.preferred.any?
end
return self.values if preferred_over.empty? || preferred.empty?
preferred_over.size.times do
update = {}
preferred.each do |name, klass|
schedule << klass
preferred_over.select { |_, v| v.include?( name ) }.each do |k, v|
schedule << (update[k] = self[k])
end
end
preferred.merge!( update )
end
schedule |= preferred_over.keys.map { |n| self[n] }
schedule.to_a
end
|
180
181
182
|
# File 'lib/arachni/module/manager.rb', line 180
def store
self.class.store
end
|
#store? ⇒ Boolean
166
167
168
|
# File 'lib/arachni/module/manager.rb', line 166
def store?
self.class.store
end
|