95 lines
2.2 KiB
Ruby
95 lines
2.2 KiB
Ruby
# -*- coding: binary -*-
|
|
|
|
module Msf::Session
|
|
|
|
module Scriptable
|
|
|
|
def self.included(base)
|
|
base.extend(ClassMethods)
|
|
end
|
|
|
|
module ClassMethods
|
|
#
|
|
# If the +script+ exists, return its path. Otherwise return nil
|
|
#
|
|
def find_script_path(script)
|
|
# Find the full file path of the specified argument
|
|
check_paths =
|
|
[
|
|
script,
|
|
::File.join(script_base, "#{script}"),
|
|
::File.join(script_base, "#{script}.rb"),
|
|
::File.join(user_script_base, "#{script}"),
|
|
::File.join(user_script_base, "#{script}.rb")
|
|
]
|
|
|
|
full_path = nil
|
|
|
|
# Scan all of the path combinations
|
|
check_paths.each { |path|
|
|
if ::File.exists?(path)
|
|
full_path = path
|
|
break
|
|
end
|
|
}
|
|
|
|
full_path
|
|
end
|
|
def script_base
|
|
::File.join(Msf::Config.script_directory, self.type)
|
|
end
|
|
def user_script_base
|
|
::File.join(Msf::Config.user_script_directory, self.type)
|
|
end
|
|
|
|
end
|
|
|
|
#
|
|
# Override
|
|
#
|
|
def execute_file
|
|
raise NotImplementedError
|
|
end
|
|
|
|
#
|
|
# Executes the supplied script or Post module with arguments +args+
|
|
#
|
|
# Will search the script path.
|
|
#
|
|
def execute_script(script_name, *args)
|
|
mod = framework.modules.create(script_name)
|
|
if (mod and mod.type == "post")
|
|
# Don't report module run events here as it will be taken care of
|
|
# in +Post.run_simple+
|
|
opts = { 'SESSION' => self.sid }
|
|
args.each do |arg|
|
|
k,v = arg.split("=", 2)
|
|
opts[k] = v
|
|
end
|
|
mod.run_simple(
|
|
# Run with whatever the default stance is for now. At some
|
|
# point in the future, we'll probably want a way to force a
|
|
# module to run in the background
|
|
#'RunAsJob' => true,
|
|
'LocalInput' => self.user_input,
|
|
'LocalOutput' => self.user_output,
|
|
'Options' => opts
|
|
)
|
|
else
|
|
full_path = self.class.find_script_path(script_name)
|
|
|
|
# No path found? Weak.
|
|
if full_path.nil?
|
|
print_error("The specified script could not be found: #{script_name}")
|
|
return true
|
|
end
|
|
framework.events.on_session_script_run(self, full_path)
|
|
execute_file(full_path, args)
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|