commit for debug with skape

git-svn-id: file:///home/svn/framework3/trunk@5026 4d416f70-5f16-0410-b530-b9f4589650da
unstable
fab 2007-07-03 20:55:24 +00:00
parent e4e674003d
commit 49e63b95b5
3 changed files with 175 additions and 29 deletions

View File

@ -10,16 +10,138 @@ module Msf
#
###
class Shell < Msf::Ui::Gtk2::SkeletonConsole
module InteractiveChannel
include Rex::Ui::Interactive
#
# Interacts with self.
#
def _interact
# If the channel has a left-side socket, then we can interact with it.
if (self.lsock)
self.interactive(true)
interact_stream(self)
self.interactive(false)
else
print_error("Channel #{self.cid} does not support interaction.")
self.interacting = false
end
end
#
# Called when an interrupt is sent.
#
def _interrupt
prompt_yesno("Terminate channel #{self.cid}?")
end
#
# Suspends interaction with the channel.
#
def _suspend
# Ask the user if they would like to background the session
if (prompt_yesno("Background channel #{self.cid}?") == true)
self.interactive(false)
self.interacting = false
end
end
#
# Closes the channel like it aint no thang.
#
def _interact_complete
begin
self.interactive(false)
self.close
rescue IOError
end
end
#
# Reads data from local input and writes it remotely.
#
def _stream_read_local_write_remote(channel)
data = user_input.gets
self.write(data)
end
#
# Reads from the channel and writes locally.
#
def _stream_read_remote_write_local(channel)
data = self.lsock.sysread(16384)
user_output.print(data)
end
#
# Returns the remote file descriptor to select on
#
def _remote_fd(stream)
self.lsock
end
end
module Pipe
#
# Interacts with the supplied channel.
#
def interact_with_channel(channel, pipe)
channel.extend(InteractiveChannel) unless (channel.kind_of?(InteractiveChannel) == true)
@t_run = Thread.new do
channel.interact(pipe, pipe)
end
end
end
def initialize(iter)
client = iter[3]
session = iter[3]
super(iter)
if (client.type == "meterpreter")
if (session.type == "meterpreter")
self.type = "shell"
# TODO: use the API instead writing into the pipe
send_cmd("execute -f cmd.exe -i -H")
end
meterconsole = Rex::Post::Meterpreter::Ui::Console.new(session)
meterconsole.extend(Pipe)
#send_cmd("execute -f cmd.exe -i -H")
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)
@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.interact_with_channel(p.channel, @pipe)
end
#
# Send command to bidirectionnal_pipe
#
def send_cmd(cmd)
# What time is it ?
# update_access
# Write the command plus a newline to the input
@pipe.write_input(cmd + "\n")
end
end
end # Console::Shell
@ -30,14 +152,14 @@ module Msf
#
###
class Meterpreter < Msf::Ui::Gtk2::SkeletonConsole
def initialize(iter)
# meterpreter client
client = iter[3]
# call the parent
super(iter)
# TODO: use the API instead writing into the pipe
send_cmd("help")
end

View File

@ -11,10 +11,6 @@ module Msf
require 'rex/io/bidirectional_pipe'
include Msf::Ui::Gtk2::MyControls
ID_SESSION, PEER, PAYLOAD, O_SESSION, O_BUFFER = *(0..5).to_a
@@offset = 0
###
#
# Basic command history class
@ -70,6 +66,14 @@ module Msf
end
ID_SESSION, PEER, TYPE, O_SESSION = *(0..4).to_a
@@offset = 0
attr_accessor :type, :buffer
#
# Init the SkeletonConsole class
#
def initialize(iter)
# Style
console_style = File.join(driver.resource_directory, 'style', 'console.rc')
@ -78,9 +82,8 @@ module Msf
# Call the parent
super(Gtk::Window::TOPLEVEL)
# initialize the session and buffer vars from the iter sessions tree
# initialize the session var from the iter sessions tree
@session = iter[O_SESSION]
@buffer = iter[O_BUFFER]
# Layout stuff
self.set_default_size(500, 400)
@ -93,8 +96,9 @@ module Msf
vbox = Gtk::VBox.new(false, 5)
self.add(vbox)
# Setup text view
# Setup text view and buffer
@textview = Gtk::TextView.new
@buffer = Gtk::TextBuffer.new
scrolled_window = Gtk::ScrolledWindow.new
scrolled_window.add(@textview)
vbox.pack_start(scrolled_window, true, true, 5)
@ -111,7 +115,7 @@ module Msf
hbox.layout_style = Gtk::ButtonBox::END
button = Gtk::Button.new(Gtk::Stock::CLOSE)
button.signal_connect("clicked") do
close_console
close_console()
end
# Pack
@ -136,25 +140,23 @@ module Msf
insert_text(Rex::Text.to_utf8(data))
end
# Init an history object
@historic = History.new()
# Init the prompt variable with the session type
@type = @session.type
# Display all
self.show_all
end #intialize
#
# update access
#
def update_access
last_access = Time.now
end
#
# Send command to bidirectionnal_pipe
#
def send_cmd(cmd)
update_access
# What time is it ?
# update_access
# Write the command plus a newline to the input
@pipe.write_input(cmd + "\n")
@ -171,6 +173,27 @@ module Msf
protected #
###########
#
# update access
#
def update_access
last_access = Time.now
end
#
# meterpreter prompt
#
def prompt
null_prompt = ""
meta_prompt = "meterpreter >> "
if (@type == "meterpreter")
@buffer.insert(@buffer.end_iter, meta_prompt)
else
@buffer.insert(@buffer.end_iter, null_prompt)
end
@@offset = @buffer.end_iter.offset
end
#
# Get the current line
#
@ -220,6 +243,9 @@ module Msf
# Add a return line to our buffer
insert_text("\n")
# Call the prompt
prompt()
# Create the mark tag if not exist
if (not @buffer.get_mark('end_mark'))
@buffer.create_mark('end_mark', @buffer.end_iter, false)

View File

@ -8,7 +8,7 @@ module Msf
#
###
class MySessionTree
ID_SESSION, PEER, TYPE, O_SESSION, O_BUFFER = *(0..5).to_a
ID_SESSION, PEER, TYPE, O_SESSION = *(0..4).to_a
include Msf::Ui::Gtk2::MyControls
@ -17,8 +17,7 @@ module Msf
@model = Gtk::ListStore.new(String, # Session ID
String, # IP Address
String, # Session Type
Object, # Session Object
Object # Gtk::TextBuffer
Object # Session Object
)
# Renderer
@ -108,7 +107,6 @@ module Msf
iter[TYPE] = session.type ? session.type : nil
#iter[PAYLOAD] = session.via_payload ? session.via_payload : nil
iter[O_SESSION] = session
iter[O_BUFFER] = Gtk::TextBuffer.new
end
#