metasploit-framework/lib/msf/ui/gtk2/console/console.rb

125 lines
3.5 KiB
Ruby

module Msf
module Ui
module Gtk2
class Console
###
#
# Classic console herited from SkeletonConsole
#
###
class Shell < Msf::Ui::Gtk2::SkeletonConsole
def initialize(iter)
session = iter[3]
super(iter)
# When the session type is meterperter
if (session.type == "meterpreter")
require 'msf/ui/gtk2/console/interactive_channel.rb'
self.type = "shell"
meterconsole = Rex::Post::Meterpreter::Ui::Console.new(session)
meterconsole.extend(Pipe)
cmd_exec = "cmd.exe"
cmd_args = nil
channelized = true
hidden = true
from_mem = false
dummy_exec = "cmd"
p = session.sys.process.execute(cmd_exec, cmd_args,
'Channelized' => channelized,
'Hidden' => hidden,
'InMemory' => (from_mem) ? dummy_exec : nil)
# Create a new pipe to not use the pipe class
@pipe = Rex::IO::BidirectionalPipe.new
# Create a subscriber with a callback for the UI
@pipe.create_subscriber_proc() do |data|
self.insert_text(Rex::Text.to_utf8(data))
end
# When the close button was clicked ...
self.button_close.signal_connect('clicked') do
begin
iter[4] = nil
p.channel.close
session.sys.process.kill(p.pid)
self.destroy
session.channels.each_pair { |cid, channel|
puts "#{cid}: #{channel.class.cls}"
}
rescue IOError
end
end
# Interact with the supplied channel
meterconsole.interact_with_channel(p.channel, @pipe)
else
# Bind the signal to the close button
self.button_close.signal_connect('clicked') do
self.close_console
end
end
end
#
# Send command to bidirectionnal_pipe
#
def send_cmd(cmd)
# Write the command plus a newline to the input
@pipe.write_input(cmd + "\n")
end
end # Console::Shell
###
#
# Meterpreter Console herited from SkeletonConsole
#
###
class Meterpreter < Msf::Ui::Gtk2::SkeletonConsole
def initialize(iter)
# meterpreter client
session = iter[3]
# call the parent
super(iter)
meterconsole = Rex::Post::Meterpreter::Ui::Console.new(session)
# Create a new pipe to not use the pipe class
@pipe = Rex::IO::BidirectionalPipe.new
# Create a subscriber with a callback for the UI
@pipe.create_subscriber_proc() do |data|
self.insert_text(Rex::Text.to_utf8(data))
end
meterconsole.init_ui(@pipe, @pipe)
@t_run = Thread.new do
meterconsole.interact { self.interacting != true }
end
end
#
# Send command to bidirectionnal_pipe
#
def send_cmd(cmd)
# Write the command plus a newline to the input
@pipe.write_input(cmd + "\n")
end
end # Console::Meterpreter
end # Console
end
end
end