Class: Arachni::Platform::Manager
- Extended by:
- UI::Output, Utilities
- Includes:
- UI::Output, Utilities, Enumerable
- Defined in:
- lib/arachni/platform/manager.rb
Overview
Represents a collection of platform lists.
It also holds a DB of all fingerprints per URI as a class variable and provides helper method for accessing and manipulating it.
Constant Summary collapse
- TYPES =
{ os: 'Operating systems', db: 'Databases', servers: 'Web servers', languages: 'Programming languages', frameworks: 'Frameworks' }
- OS =
{ # Generic *nix, flavor couldn't be identified. unix: { linux: {}, # Generic BSD, flavor couldn't be identified. bsd: {}, aix: {}, solaris: {} }, windows: {} }
- DB =
[ :mysql, :pgsql, :mssql, :oracle, :sqlite, :emc, :db2, :coldfusion, :interbase, :informix, :firebird, :maxdb, :sybase, :frontbase, :ingres, :hsqldb, :access, :mongodb ]
- SERVERS =
[ :apache, :nginx, :tomcat, :iis, :jetty ]
- LANGUAGES =
[ :php, :jsp, :python, :ruby, :asp, :aspx, :perl ]
- FRAMEWORKS =
WebApp frameworks.
[ :rack ]
- PLATFORM_NAMES =
{ # Operating systems unix: 'Generic Unix family', linux: 'Linux', bsd: 'Generic BSD family', aix: 'IBM AIX', solaris: 'Solaris', windows: 'MS Windows', # Databases mysql: 'MySQL', pgsql: 'Postgresql', mssql: 'MSSQL', oracle: 'Oracle', sqlite: 'SQLite', emc: 'EMC', db2: 'DB2', coldfusion: 'ColdFusion', interbase: 'InterBase', informix: 'Informix', firebird: 'Firebird', maxdb: 'SaP Max DB', sybase: 'Sybase', frontbase: 'Frontbase', ingres: 'IngresDB', hsqldb: 'HSQLDB', access: 'MS Access', mongodb: 'MongoDB', # Web servers apache: 'Apache', nginx: 'Nginx', tomcat: 'TomCat', iis: 'IIS', jetty: 'Jetty', # Programming languages php: 'PHP', jsp: 'JSP', python: 'Python', ruby: 'Ruby', asp: 'ASP', aspx: 'ASP.NET', perl: 'Perl', # Web frameworks rack: 'Rack' }
- PLATFORM_CACHE_SIZE =
Amount of
1000
Class Method Summary collapse
-
.[](uri) ⇒ Manager
Platform for the given ‘uri`.
-
.[]=(uri, platforms) ⇒ Manager
Sets platform manager for the given ‘uri`.
-
.any? ⇒ Boolean
‘true` if there are platforms fingerprints, `false` otherwise.
-
.clear ⇒ Object
Clears global platforms DB.
-
.empty? ⇒ Boolean
‘true` if there are no platforms fingerprints, `false` otherwise.
- .find_type(platform) ⇒ Object
-
.fingerprint(page) ⇒ Manager
Runs all fingerprinters against the given ‘page`.
-
.fingerprint?(resource) ⇒ Bool
‘true` if the resource should be fingerprinted, `false` otherwise.
- .fingerprinters ⇒ Object
- .include?(uri) ⇒ Boolean
- .make_key(uri) ⇒ Object
-
.reset ⇒ Object
Empties the global platform fingerprints.
-
.set(platforms) ⇒ Object
Sets global platforms fingerprints.
- .size ⇒ Object
- .synchronize(&block) ⇒ Object
-
.update(uri, platforms) ⇒ Manager
Updates the ‘platforms` for the given `uri`.
- .valid ⇒ Object
- .valid?(platforms) ⇒ Boolean
Instance Method Summary collapse
-
#<<(platform) ⇒ Manager
‘self`.
-
#any? ⇒ Boolean
‘true` if there are applicable platforms, `false` otherwise.
- #clear ⇒ Object
-
#db ⇒ List
Platform list for databases.
-
#each(&block) ⇒ Enumerator, Manager
‘Enumerator` if no `block` is given, `self` otherwise.
-
#empty? ⇒ Boolean
‘true` if there are no applicable platforms, `false` otherwise.
-
#find_list(platform) ⇒ List
Platform list.
-
#find_type(platform) ⇒ Symbol
Platform type.
-
#frameworks ⇒ List
Platform list for frameworks.
-
#fullname(platform) ⇒ String
Converts a platform shortname to a full name.
-
#include?(platform) ⇒ Boolean
‘true` if one of the lists contains the `platform`, `false` otherwise.
-
#initialize(platforms = []) ⇒ Manager
constructor
A new instance of Manager.
-
#invalid?(platform) ⇒ Boolean
‘true` if platform is invalid (i.e. not in #valid), `false` otherwise.
-
#languages ⇒ List
Platform list for languages.
-
#os ⇒ List
Platform list for operating systems.
-
#pick(data_per_platform) ⇒ Hash
Selects appropriate data, depending on the applicable platforms, from ‘data_per_platform`.
-
#servers ⇒ List
Platform list for web servers.
-
#update(enum) ⇒ Manager
Updated ‘self`.
-
#valid ⇒ Set<Symbol>
List of valid platforms.
-
#valid?(platform) ⇒ Boolean
‘true` if platform is valid (i.e. in #valid), `false` otherwise.
Methods included from Utilities
available_port, caller_name, caller_path, cookie_decode, cookie_encode, cookies_from_document, cookies_from_file, cookies_from_response, exception_jail, exclude_path?, follow_protocol?, form_decode, form_encode, forms_from_document, forms_from_response, generate_token, get_path, hms_to_seconds, html_decode, html_encode, include_path?, links_from_document, links_from_response, normalize_url, page_from_response, page_from_url, parse_set_cookie, path_in_domain?, path_too_deep?, port_available?, rand_port, random_seed, redundant_path?, remove_constants, request_parse_body, seconds_to_hms, skip_page?, skip_path?, skip_resource?, skip_response?, to_absolute, uri_decode, uri_encode, uri_parse, uri_parse_query, uri_parser, uri_rewrite
Methods included from UI::Output
debug?, debug_off, debug_on, disable_only_positives, included, mute, muted?, only_positives, only_positives?, print_bad, print_debug, print_debug_backtrace, print_debug_level_1, print_debug_level_2, print_debug_level_3, print_error, print_error_backtrace, print_exception, print_info, print_line, print_ok, print_status, print_verbose, reroute_to_file, reroute_to_file?, reset_output_options, unmute, verbose?, verbose_on
Constructor Details
#initialize(platforms = []) ⇒ Manager
Returns a new instance of Manager.
320 321 322 323 324 325 326 327 328 |
# File 'lib/arachni/platform/manager.rb', line 320 def initialize( platforms = [] ) @platforms = {} TYPES.keys.each do |type| @platforms[type] = List.new( self.class.const_get( type.to_s.upcase.to_sym ) ) end update [platforms | Options.platforms].flatten.compact end |
Class Method Details
.[](uri) ⇒ Manager
Returns Platform for the given ‘uri`.
296 297 298 299 |
# File 'lib/arachni/platform/manager.rb', line 296 def self.[]( uri ) return new if !(key = make_key( uri )) synchronize { @platforms[key] ||= new } end |
.[]=(uri, platforms) ⇒ Manager
Sets platform manager for the given ‘uri`.
258 259 260 261 262 263 264 265 |
# File 'lib/arachni/platform/manager.rb', line 258 def self.[]=( uri, platforms ) return new( platforms ) if !(key = make_key( uri )) synchronize do @platforms[key] = platforms.is_a?( self ) ? platforms : new( platforms ) end end |
.any? ⇒ Boolean
Returns ‘true` if there are platforms fingerprints, `false` otherwise.
309 310 311 |
# File 'lib/arachni/platform/manager.rb', line 309 def self.any? !empty? end |
.clear ⇒ Object
Clears global platforms DB.
199 200 201 |
# File 'lib/arachni/platform/manager.rb', line 199 def self.clear @platforms.clear end |
.empty? ⇒ Boolean
Returns ‘true` if there are no platforms fingerprints, `false` otherwise.
303 304 305 |
# File 'lib/arachni/platform/manager.rb', line 303 def self.empty? @platforms.empty? end |
.find_type(platform) ⇒ Object
163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 |
# File 'lib/arachni/platform/manager.rb', line 163 def self.find_type( platform ) @find_type ||= {} if @find_type.empty? TYPES.keys.each do |type| platforms = const_get( type.to_s.upcase.to_sym ) platforms = platforms.find_symbol_keys_recursively if platforms.is_a?( Hash ) platforms.each do |p| @find_type[p] = type end end end @find_type[platform] end |
.fingerprint(page) ⇒ Manager
Runs all fingerprinters against the given ‘page`.
238 239 240 241 242 243 244 245 246 247 |
# File 'lib/arachni/platform/manager.rb', line 238 def self.fingerprint( page ) return page if !fingerprint? page fingerprinters.available.each do |name| exception_jail( false ) do fingerprinters[name].new( page ).run end end page end |
.fingerprint?(resource) ⇒ Bool
Returns ‘true` if the resource should be fingerprinted, `false` otherwise.
226 227 228 229 |
# File 'lib/arachni/platform/manager.rb', line 226 def self.fingerprint?( resource ) !(!Options.fingerprint? || !resource.text? || include?( resource.url ) || resource.scope.out?) end |
.fingerprinters ⇒ Object
215 216 217 218 219 |
# File 'lib/arachni/platform/manager.rb', line 215 def self.fingerprinters @manager ||= Component::Manager.new( Options.paths.fingerprinters, Platform::Fingerprinters ) end |
.include?(uri) ⇒ Boolean
272 273 274 |
# File 'lib/arachni/platform/manager.rb', line 272 def self.include?( uri ) @platforms.include?( make_key( uri ) ) end |
.make_key(uri) ⇒ Object
313 314 315 316 |
# File 'lib/arachni/platform/manager.rb', line 313 def self.make_key( uri ) return if !(parsed = Arachni::URI( uri )) parsed.without_query end |
.reset ⇒ Object
Empties the global platform fingerprints.
204 205 206 207 208 209 210 211 212 |
# File 'lib/arachni/platform/manager.rb', line 204 def self.reset set Hash.new @manager.clear if @manager @manager = nil @mutex = Monitor.new self end |
.set(platforms) ⇒ Object
Sets global platforms fingerprints
192 193 194 195 196 |
# File 'lib/arachni/platform/manager.rb', line 192 def self.set( platforms ) @platforms = Support::Cache::RandomReplacement.new( PLATFORM_CACHE_SIZE ) platforms.each { |k, v| @platforms[k] = v } @platforms end |
.size ⇒ Object
267 268 269 |
# File 'lib/arachni/platform/manager.rb', line 267 def self.size @platforms.size end |
.synchronize(&block) ⇒ Object
159 160 161 |
# File 'lib/arachni/platform/manager.rb', line 159 def self.synchronize( &block ) @mutex.synchronize( &block ) end |
.update(uri, platforms) ⇒ Manager
Updates the ‘platforms` for the given `uri`.
286 287 288 289 290 |
# File 'lib/arachni/platform/manager.rb', line 286 def self.update( uri, platforms ) synchronize do self[uri].update platforms end end |
.valid ⇒ Object
181 182 183 |
# File 'lib/arachni/platform/manager.rb', line 181 def self.valid @valid ||= Set.new( PLATFORM_NAMES.keys ) end |
.valid?(platforms) ⇒ Boolean
185 186 187 188 |
# File 'lib/arachni/platform/manager.rb', line 185 def self.valid?( platforms ) platforms = [platforms].flatten.compact (valid & platforms).to_a == platforms end |
Instance Method Details
#<<(platform) ⇒ Manager
Returns ‘self`.
503 504 505 506 |
# File 'lib/arachni/platform/manager.rb', line 503 def <<( platform ) find_list( platform ) << platform self end |
#any? ⇒ Boolean
Returns ‘true` if there are applicable platforms, `false` otherwise.
474 475 476 |
# File 'lib/arachni/platform/manager.rb', line 474 def any? !empty? end |
#clear ⇒ Object
478 479 480 |
# File 'lib/arachni/platform/manager.rb', line 478 def clear @platforms.clear end |
#each(&block) ⇒ Enumerator, Manager
Returns ‘Enumerator` if no `block` is given, `self` otherwise.
448 449 450 451 452 |
# File 'lib/arachni/platform/manager.rb', line 448 def each( &block ) return enum_for( __method__ ) if !block_given? @platforms.map { |_, p| p.to_a }.flatten.each( &block ) self end |
#empty? ⇒ Boolean
Returns ‘true` if there are no applicable platforms, `false` otherwise.
468 469 470 |
# File 'lib/arachni/platform/manager.rb', line 468 def empty? !@platforms.map { |_, p| p.empty? }.include?( false ) end |
#find_list(platform) ⇒ List
Returns Platform list.
521 522 523 |
# File 'lib/arachni/platform/manager.rb', line 521 def find_list( platform ) @platforms[find_type( normalize( platform ) )] end |
#find_type(platform) ⇒ Symbol
Returns Platform type.
512 513 514 |
# File 'lib/arachni/platform/manager.rb', line 512 def find_type( platform ) self.class.find_type( platform ) end |
#frameworks ⇒ List
Returns Platform list for frameworks.
360 361 362 363 364 |
# File 'lib/arachni/platform/manager.rb', line 360 [:os, :db, :servers, :languages, :frameworks].each do |type| define_method type do @platforms[type] end end |
#fullname(platform) ⇒ String
Converts a platform shortname to a full name.
376 377 378 |
# File 'lib/arachni/platform/manager.rb', line 376 def fullname( platform ) PLATFORM_NAMES[normalize( platform )] end |
#include?(platform) ⇒ Boolean
Returns ‘true` if one of the lists contains the `platform`, `false` otherwise.
462 463 464 |
# File 'lib/arachni/platform/manager.rb', line 462 def include?( platform ) find_list( platform ).include?( platform ) end |
#invalid?(platform) ⇒ Boolean
Returns ‘true` if platform is invalid (i.e. not in #valid), `false` otherwise.
439 440 441 |
# File 'lib/arachni/platform/manager.rb', line 439 def invalid?( platform ) !valid?( platform ) end |
#languages ⇒ List
Returns Platform list for languages.
|
# File 'lib/arachni/platform/manager.rb', line 348
|
#os ⇒ List
Returns Platform list for operating systems.
|
# File 'lib/arachni/platform/manager.rb', line 330
|
#pick(data_per_platform) ⇒ Hash
Selects appropriate data, depending on the applicable platforms, from ‘data_per_platform`.
392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 |
# File 'lib/arachni/platform/manager.rb', line 392 def pick( data_per_platform ) data_per_list = {} data_per_platform.each do |platform, value| list = find_list( platform ) data_per_list[list] ||= {} data_per_list[list][platform] = value end picked = {} data_per_list.each do |list, data| # If a platform list is empty pass the given data without picking... if list.empty? picked.merge! data next end # ...otherwise enforce its platform restrictions. picked.merge! list.pick( data ) end picked end |
#servers ⇒ List
Returns Platform list for web servers.
|
# File 'lib/arachni/platform/manager.rb', line 342
|
#update(enum) ⇒ Manager
Returns Updated ‘self`.
490 491 492 493 |
# File 'lib/arachni/platform/manager.rb', line 490 def update( enum ) enum.each { |p| self << p } self end |
#valid ⇒ Set<Symbol>
Returns List of valid platforms.
417 418 419 |
# File 'lib/arachni/platform/manager.rb', line 417 def valid self.class.valid end |
#valid?(platform) ⇒ Boolean
Returns ‘true` if platform is valid (i.e. in #valid), `false` otherwise.
428 429 430 |
# File 'lib/arachni/platform/manager.rb', line 428 def valid?( platform ) valid.include? platform end |