86 lines
2.6 KiB
Ruby
86 lines
2.6 KiB
Ruby
#
|
|
# Standard Library
|
|
#
|
|
|
|
require 'fileutils'
|
|
|
|
#
|
|
# Metasploit gem engines
|
|
#
|
|
|
|
require 'metasploit/model/engine'
|
|
require 'metasploit/concern/engine'
|
|
Metasploit::Framework::Require.optionally_require_metasploit_db_gem_engines
|
|
|
|
# `Rails::Engine` behavior common to both {Metasploit::Framework::Application} and {Metasploit::Framework::Engine}.
|
|
module Metasploit::Framework::CommonEngine
|
|
extend ActiveSupport::Concern
|
|
|
|
included do
|
|
#
|
|
# config
|
|
#
|
|
|
|
# Force binary encoding to remove necessity to set external and internal encoding when construct Strings from
|
|
# from files. Socket#read always returns a String in ASCII-8bit encoding
|
|
#
|
|
# @see http://rubydoc.info/stdlib/core/IO:read
|
|
config.before_initialize do
|
|
encoding = 'binary'
|
|
Encoding.default_external = encoding
|
|
Encoding.default_internal = encoding
|
|
end
|
|
|
|
config.root = Msf::Config::install_root
|
|
config.paths.add 'app/concerns', autoload: true
|
|
config.paths.add 'data/meterpreter', glob: '**/ext_*'
|
|
config.paths.add 'modules'
|
|
|
|
config.active_support.deprecation = :notify
|
|
|
|
#
|
|
# `initializer`s
|
|
#
|
|
|
|
initializer 'metasploit_framework.merge_meterpreter_extensions' do
|
|
Rails.application.railties.engines.each do |engine|
|
|
merge_meterpreter_extensions(engine)
|
|
end
|
|
|
|
# The Rails.application itself could have paths['data/meterpreter'], but will not be part of
|
|
# Rails.application.railties.engines because only direct subclasses of `Rails::Engine` are returned.
|
|
merge_meterpreter_extensions(Rails.application)
|
|
end
|
|
end
|
|
|
|
#
|
|
# Instance Methods
|
|
#
|
|
|
|
private
|
|
|
|
# Merges the meterpreter extensions from `engine`'s `paths['data/meterpreter]`.
|
|
#
|
|
# @param engine [Rails::Engine] a Rails engine or application that has meterpreter extensions
|
|
# @return [void]
|
|
# @todo Make metasploit-framework look for meterpreter extension in paths['data/meterpreter'] from the engine instead of copying them.
|
|
def merge_meterpreter_extensions(engine)
|
|
data_meterpreter_paths = engine.paths['data/meterpreter']
|
|
|
|
# may be `nil` since 'data/meterpreter' is not part of the core Rails::Engine paths set.
|
|
if data_meterpreter_paths
|
|
source_paths = data_meterpreter_paths.existent
|
|
destination_directory = root.join('data', 'meterpreter').to_path
|
|
|
|
source_paths.each do |source_path|
|
|
basename = File.basename(source_path)
|
|
destination_path = File.join(destination_directory, basename)
|
|
|
|
unless destination_path == source_path
|
|
FileUtils.copy(source_path, destination_directory)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|