125 lines
3.5 KiB
Ruby
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
|