206 lines
3.9 KiB
Ruby
206 lines
3.9 KiB
Ruby
# -*- coding: binary -*-
|
|
|
|
require 'msf/base'
|
|
|
|
require 'rex/post/hwbridge'
|
|
|
|
module Msf
|
|
module Sessions
|
|
|
|
###
|
|
#
|
|
# This class provides an interactive session with a hardware bridge.
|
|
# The hardware bridge must support the current API supported by Metasploit.
|
|
#
|
|
###
|
|
class HWBridge < Rex::Post::HWBridge::Client
|
|
|
|
#
|
|
# This interface supports basic interaction.
|
|
#
|
|
include Msf::Session::Basic
|
|
|
|
#
|
|
# This interface supports interactive commands.
|
|
#
|
|
include Msf::Session::Interactive
|
|
|
|
#
|
|
# Initialize the HWBridge console
|
|
#
|
|
def initialize(opts={})
|
|
super
|
|
#
|
|
# The module will manage it's alive state
|
|
#
|
|
self.alive = true
|
|
|
|
#
|
|
# Initialize the hwbridge client
|
|
#
|
|
self.init_hwbridge(rstream, opts)
|
|
|
|
#
|
|
# Create the console instance
|
|
#
|
|
self.console = Rex::Post::HWBridge::Ui::Console.new(self)
|
|
end
|
|
|
|
#
|
|
# Returns the type of session.
|
|
#
|
|
def self.type
|
|
"hwbridge"
|
|
end
|
|
|
|
#
|
|
# Returns the session description.
|
|
#
|
|
def desc
|
|
"Hardware bridge interface"
|
|
end
|
|
|
|
#
|
|
# We could tie this into payload UUID
|
|
#
|
|
def platform
|
|
"hardware"
|
|
end
|
|
|
|
#
|
|
# We could tie this into payload UUID
|
|
#
|
|
def arch
|
|
ARCH_CMD
|
|
end
|
|
|
|
#
|
|
# Session info based on the type of hw bridge we are connected to
|
|
# This information comes after connecting to a bridge and pulling status info
|
|
#
|
|
def info
|
|
if exploit
|
|
if exploit.hw_specialty
|
|
info = ""
|
|
exploit.hw_specialty.each_key do |k|
|
|
if exploit.hw_specialty[k] == true
|
|
info += "," if info.length > 0
|
|
info += k
|
|
end
|
|
end
|
|
return info
|
|
end
|
|
end
|
|
end
|
|
|
|
##
|
|
# :category: Msf::Session::Interactive implementors
|
|
#
|
|
# Initializes the console's I/O handles.
|
|
#
|
|
def init_ui(input, output)
|
|
self.user_input = input
|
|
self.user_output = output
|
|
console.init_ui(input, output)
|
|
console.set_log_source(log_source)
|
|
|
|
super
|
|
end
|
|
|
|
##
|
|
# :category: Msf::Session::Interactive implementors
|
|
#
|
|
# Resets the console's I/O handles.
|
|
#
|
|
def reset_ui
|
|
console.unset_log_source
|
|
console.reset_ui
|
|
end
|
|
|
|
|
|
##
|
|
# :category: Msf::Session::Interactive implementors
|
|
#
|
|
# Interacts with the hwbridge client at a user interface level.
|
|
#
|
|
def _interact
|
|
framework.events.on_session_interact(self)
|
|
# Call the console interaction subsystem of the meterpreter client and
|
|
# pass it a block that returns whether or not we should still be
|
|
# interacting. This will allow the shell to abort if interaction is
|
|
# canceled.
|
|
console.interact { self.interacting != true }
|
|
|
|
# If the stop flag has been set, then that means the user exited. Raise
|
|
# the EOFError so we can drop this handle like a bad habit.
|
|
raise EOFError if (console.stopped? == true)
|
|
end
|
|
|
|
def alive?
|
|
self.alive
|
|
end
|
|
|
|
#
|
|
# Calls the class method.
|
|
#
|
|
def type
|
|
self.class.type
|
|
end
|
|
|
|
#
|
|
# Loads the automotive extension
|
|
#
|
|
def load_automotive
|
|
original = console.disable_output
|
|
console.disable_output = true
|
|
console.run_single('load automotive')
|
|
console.disable_output = original
|
|
end
|
|
|
|
#
|
|
# Loads the zigbee extension
|
|
#
|
|
def load_zigbee
|
|
original = console.disable_output
|
|
console.disable_output = true
|
|
console.run_single('load zigbee')
|
|
console.disable_output = original
|
|
end
|
|
|
|
#
|
|
# Loads the rftransceiver extension
|
|
#
|
|
def load_rftransceiver
|
|
original = console.disable_output
|
|
console.disable_output = true
|
|
console.run_single('load rftransceiver')
|
|
console.disable_output = original
|
|
end
|
|
|
|
#
|
|
# Load custom methods provided by the hardware
|
|
#
|
|
def load_custom_methods
|
|
original = console.disable_output
|
|
console.disable_output = true
|
|
console.run_single('load_custom_methods')
|
|
console.disable_output = original
|
|
end
|
|
|
|
#
|
|
# The shell will have been initialized by default.
|
|
#
|
|
def shell_init
|
|
return true
|
|
end
|
|
|
|
attr_accessor :console # :nodoc:
|
|
attr_accessor :alive # :nodoc:
|
|
private
|
|
attr_accessor :rstream # :nodoc:
|
|
|
|
end
|
|
|
|
end
|
|
end
|