metasploit-framework/lib/msf/base/simple/evasion.rb

114 lines
3.3 KiB
Ruby

# -*- coding: binary -*-
require 'msf/base'
module Msf
module Simple
module Evasion
include Module
def self.run_simple(oevasion, opts, &block)
evasion = oevasion.replicant
# Trap and print errors here (makes them UI-independent)
begin
# Clone the module to prevent changes to the original instance
Msf::Simple::Framework.simplify_module( evasion, false )
yield(evasion) if block_given?
# Import options from the OptionStr or Option hash.
evasion._import_extra_options(opts)
# Make sure parameters are valid.
if (opts['Payload'] == nil)
raise MissingPayloadError.new, caller
end
# Verify the options
evasion.options.validate(evasion.datastore)
# Start it up
driver = EvasionDriver.new(evasion.framework)
# Initialize the driver instance
driver.evasion = evasion
driver.payload = evasion.framework.payloads.create(opts['Payload'])
# Was the payload valid?
if (driver.payload == nil)
raise MissingPayloadError,
"You specified an invalid payload: #{opts['Payload']}", caller
end
# Use the supplied encoder, if any. If one was not specified, then
# nil will be assigned causing the evasion to default to picking the
# best encoder.
evasion.datastore['ENCODER'] = opts['Encoder'] if opts['Encoder']
# Use the supplied NOP generator, if any. If one was not specified, then
# nil will be assigned causing the evasion to default to picking a
# compatible NOP generator.
evasion.datastore['NOP'] = opts['Nop'] if opts['Nop']
# Force the payload to share the evasion's datastore
driver.payload.share_datastore(driver.evasion.datastore)
# Verify the payload options
driver.payload.options.validate(driver.payload.datastore)
# Set the target and then work some magic to derive index
evasion.datastore['TARGET'] = opts['Target'] if opts['Target']
target_idx = evasion.target_index
if (target_idx == nil or target_idx < 0)
raise MissingTargetError,
"You must select a target.", caller
end
driver.target_idx = target_idx
# Set the payload and evasion's subscriber values
if ! opts['Quiet']
driver.evasion.init_ui(opts['LocalInput'] || evasion.user_input, opts['LocalOutput'] || evasion.user_output)
driver.payload.init_ui(opts['LocalInput'] || evasion.user_input, opts['LocalOutput'] || evasion.user_output)
else
driver.evasion.init_ui(nil, nil)
driver.payload.init_ui(nil, nil)
end
if (opts['RunAsJob'])
driver.use_job = true
end
# Let's rock this party
driver.run
# Save the job identifier this evasion is running as
evasion.job_id = driver.job_id
# Propagate this back to the caller for console mgmt
oevasion.job_id = evasion.job_id
rescue ::Interrupt
evasion.error = $!
raise $!
rescue ::Exception => e
evasion.error = e
evasion.print_error("evasion failed: #{e}")
elog("Evasion failed (#{evasion.refname}): #{e}", 'core', LEV_0)
dlog("Call stack:\n#{e.backtrace.join("\n")}", 'core', LEV_3)
end
nil
end
def run_simple(opts, &block)
Msf::Simple::Evasion.run_simple(self, opts, &block)
end
end
end
end