61 lines
1.3 KiB
Ruby
61 lines
1.3 KiB
Ruby
# -*- coding: binary -*-
|
|
require 'rex/socket'
|
|
|
|
module Msf
|
|
module Handler
|
|
module Reverse
|
|
|
|
###
|
|
#
|
|
# Implements the reverse Rex::Socket::Comm handlng.
|
|
#
|
|
###
|
|
module Comm
|
|
|
|
def initialize(info = {})
|
|
super
|
|
|
|
register_advanced_options(
|
|
[
|
|
OptString.new('ReverseListenerComm', [ false, 'The specific communication channel to use for this listener']),
|
|
], Msf::Handler::Reverse::Comm)
|
|
end
|
|
|
|
def select_comm
|
|
rl_comm = datastore['ReverseListenerComm'].to_s
|
|
case rl_comm
|
|
when 'local'
|
|
comm = ::Rex::Socket::Comm::Local
|
|
when /\A[0-9]+\Z/
|
|
comm = framework.sessions[rl_comm.to_i]
|
|
raise(RuntimeError, "Reverse Listener Comm (Session #{rl_comm}) does not exist") unless comm
|
|
raise(RuntimeError, "Reverse Listener Comm (Session #{rl_comm}) does not implement Rex::Socket::Comm") unless comm.is_a? ::Rex::Socket::Comm
|
|
when nil, ''
|
|
comm = nil
|
|
else
|
|
raise(RuntimeError, "Reverse Listener Comm '#{rl_comm}' is invalid")
|
|
end
|
|
|
|
comm
|
|
end
|
|
|
|
def via_string_for_ip(ip, comm)
|
|
comm_used = comm
|
|
comm_used ||= Rex::Socket::SwitchBoard.best_comm(ip)
|
|
comm_used ||= Rex::Socket::Comm::Local
|
|
|
|
if comm_used.respond_to?(:type) && comm_used.respond_to?(:sid)
|
|
via = "via the #{comm_used.type} on session #{comm_used.sid}"
|
|
else
|
|
via = ""
|
|
end
|
|
|
|
via
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
end
|
|
end
|