186 lines
4.1 KiB
Ruby
186 lines
4.1 KiB
Ruby
# -*- coding: binary -*-
|
|
module Msf
|
|
module Simple
|
|
|
|
###
|
|
#
|
|
# A simplified auxiliary wrapper.
|
|
#
|
|
###
|
|
module Auxiliary
|
|
|
|
include Module
|
|
|
|
#
|
|
# Wraps the auxiliary process in a simple single method. The options
|
|
# hash can have the following values passed in it:
|
|
#
|
|
# Action
|
|
#
|
|
# The selected action name.
|
|
#
|
|
# OptionStr
|
|
#
|
|
# A string of comma separated option values that should be imported into
|
|
# the datastore.
|
|
#
|
|
# Options
|
|
#
|
|
# A hash of values to be imported directly into the datastore.
|
|
#
|
|
# LocalInput
|
|
#
|
|
# The local input handle that data can be read in from.
|
|
#
|
|
# LocalOutput
|
|
#
|
|
# The local output through which data can be displayed.
|
|
#
|
|
# RunAsJob
|
|
#
|
|
# Whether or not the exploit should be run in the context of a background
|
|
# job.
|
|
#
|
|
def self.run_simple(omod, opts = {}, &block)
|
|
|
|
# Clone the module to prevent changes to the original instance
|
|
mod = omod.replicant
|
|
Msf::Simple::Framework.simplify_module( mod, false )
|
|
yield(mod) if block_given?
|
|
|
|
# Import options from the OptionStr or Option hash.
|
|
mod._import_extra_options(opts)
|
|
|
|
mod.datastore['ACTION'] = opts['Action'] if opts['Action']
|
|
|
|
# Verify the ACTION
|
|
if (mod.actions.length > 0 and not mod.action)
|
|
raise MissingActionError, "Please use: #{mod.actions.collect {|e| e.name} * ", "}"
|
|
end
|
|
|
|
# Verify the options
|
|
mod.options.validate(mod.datastore)
|
|
|
|
# Initialize user interaction
|
|
if ! opts['Quiet']
|
|
mod.init_ui(opts['LocalInput'] || mod.user_input, opts['LocalOutput'] || mod.user_output)
|
|
else
|
|
mod.init_ui(nil, nil)
|
|
end
|
|
|
|
ctx = [ mod ]
|
|
if(mod.passive? or opts['RunAsJob'])
|
|
mod.job_id = mod.framework.jobs.start_bg_job(
|
|
"Auxiliary: #{mod.refname}",
|
|
ctx,
|
|
Proc.new { |ctx_| self.job_run_proc(ctx_) },
|
|
Proc.new { |ctx_| self.job_cleanup_proc(ctx_) }
|
|
)
|
|
# Propagate this back to the caller for console mgmt
|
|
omod.job_id = mod.job_id
|
|
else
|
|
self.job_run_proc(ctx)
|
|
self.job_cleanup_proc(ctx)
|
|
end
|
|
|
|
end
|
|
|
|
#
|
|
# Calls the class method.
|
|
#
|
|
def run_simple(opts = {}, &block)
|
|
Msf::Simple::Auxiliary.run_simple(self, opts, &block)
|
|
end
|
|
|
|
#
|
|
# Initiates a check, setting up the exploit to be used. The following
|
|
# options can be specified:
|
|
#
|
|
# LocalInput
|
|
#
|
|
# The local input handle that data can be read in from.
|
|
#
|
|
# LocalOutput
|
|
#
|
|
# The local output through which data can be displayed.
|
|
#
|
|
def self.check_simple(mod, opts)
|
|
if opts['LocalInput']
|
|
mod.init_ui(opts['LocalInput'], opts['LocalOutput'])
|
|
end
|
|
|
|
# Validate the option container state so that options will
|
|
# be normalized
|
|
mod.validate
|
|
|
|
mod.setup
|
|
|
|
# Run check
|
|
mod.check
|
|
end
|
|
|
|
#
|
|
# Calls the class method.
|
|
#
|
|
def check_simple(opts)
|
|
Msf::Simple::Auxiliary.check_simple(self, opts)
|
|
end
|
|
|
|
|
|
protected
|
|
|
|
#
|
|
# Job run proc, sets up the module and kicks it off.
|
|
#
|
|
def self.job_run_proc(ctx)
|
|
mod = ctx[0]
|
|
begin
|
|
mod.setup
|
|
mod.framework.events.on_module_run(mod)
|
|
mod.run
|
|
rescue ::Timeout::Error => e
|
|
mod.error = e
|
|
mod.print_error("Auxiliary triggered a timeout exception")
|
|
mod.cleanup
|
|
return
|
|
rescue ::Interrupt => e
|
|
mod.error = e
|
|
mod.print_error("Auxiliary interrupted by the console user")
|
|
mod.cleanup
|
|
return
|
|
rescue ::Exception => e
|
|
mod.error = e
|
|
mod.print_error("Auxiliary failed: #{e.class} #{e}")
|
|
if(e.class.to_s != 'Msf::OptionValidateError')
|
|
mod.print_error("Call stack:")
|
|
e.backtrace.each do |line|
|
|
break if line =~ /lib.msf.base.simple.auxiliary.rb/
|
|
mod.print_error(" #{line}")
|
|
end
|
|
end
|
|
|
|
elog("Auxiliary failed: #{e.class} #{e}", 'core', LEV_0)
|
|
dlog("Call stack:\n#{$@.join("\n")}", 'core', LEV_3)
|
|
|
|
mod.cleanup
|
|
|
|
return
|
|
end
|
|
end
|
|
|
|
#
|
|
# Clean up the module after the job completes.
|
|
#
|
|
def self.job_cleanup_proc(ctx)
|
|
mod = ctx[0]
|
|
mod.framework.events.on_module_complete(mod)
|
|
# Allow the exploit to cleanup after itself, that messy bugger.
|
|
mod.cleanup
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
end
|
|
|