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

158 lines
3.1 KiB
Ruby

module Msf
module Ui
module Gtk2
class Console
require 'rex/io/bidirectional_pipe'
ID_SESSION, PEER, PAYLOAD, O_SESSION, O_BUFFER = *(0..5).to_a
#
# Classic console herited from Gtk::Window
#
class Basic < Gtk::Window
include Msf::Ui::Gtk2::MyControls
def initialize(iter)
# Style
console_style = File.join(driver.resource_directory, 'style', 'console.rc')
Gtk::RC.parse(console_style)
super(Gtk::Window::TOPLEVEL)
@session = iter[O_SESSION]
@buffer = iter[O_BUFFER]
# Layout stuff
self.set_default_size(500, 400)
self.set_border_width(10)
# Set title with the tunnel peer
self.set_title(@session.tunnel_peer)
# Skeleton ;-)
vbox = Gtk::VBox.new(false, 5)
self.add(vbox)
@textview = Gtk::TextView.new
scrolled_window = Gtk::ScrolledWindow.new
scrolled_window.add(@textview)
vbox.pack_start(scrolled_window, true, true, 5)
scrolled_window.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC)
@cmd_entry = Gtk::Entry.new
vbox.pack_start(@cmd_entry, false, false, 0)
hbox = Gtk::HButtonBox.new
hbox.layout_style = Gtk::ButtonBox::END
button = Gtk::Button.new(Gtk::Stock::CLOSE)
button.signal_connect("clicked") do
close_console
end
hbox.pack_end(button, false, false, 5)
vbox.pack_start(hbox, false, false, 0)
@textview.set_buffer(@buffer)
@textview.editable = false
@textview.set_cursor_visible(false)
@buffer.create_mark('end_mark', @buffer.end_iter, false)
# Give focus to Gtk::Entry
@cmd_entry.can_focus = true
@cmd_entry.grab_focus()
# Signal
@cmd_entry.signal_connect('activate') do
on_cmd_entry_activate
end
# Create the pipe interface
@pipe = Rex::IO::BidirectionalPipe.new
# Start the session interaction
@t_run = Thread.new do
@session.interact(@pipe, @pipe)
end
# Create a subscriber with a callback for the UI
@sid = @pipe.create_subscriber_proc() do |data|
@buffer.insert(@buffer.end_iter, Rex::Text.to_utf8(data))
@buffer.move_mark('end_mark', @buffer.end_iter)
@textview.scroll_mark_onscreen(@buffer.get_mark('end_mark'))
end
#Gtk::RC.parse(console_style)
self.show_all
# Kill the interaction thread
#@t_run.kill
# Close the pipes
#@pipe.close
end
#
# update access
#
def update_access
last_access = Time.now
end
#
# Signal for user entry
#
def on_cmd_entry_activate
send_cmd(@cmd_entry.text)
end
#
# Send command to bidirectionnal_pipe
#
def send_cmd(cmd)
update_access
# Write the command plus a newline to the input
@pipe.write_input(cmd + "\n")
# Clear the text entry
@cmd_entry.set_text("")
end
#
# Just close the console, not kill !
#
def close_console
self.destroy
end
end
#
# Meterpreter Console
#
class Meterpreter < Msf::Ui::Gtk2::Console::Basic
def inititialize(iter)
print "On the meterpreter console place"
super(iter)
print @session.run_cmd("help")
end
end
end
class GtkConsolePipe < Rex::IO::BidirectionalPipe
def prompting?
false
end
end
end
end
end