| 1 |
#!/usr/bin/env ruby |
|---|
| 2 |
# |
|---|
| 3 |
# This is a basic user interface using the Gtk2 GUI library |
|---|
| 4 |
# |
|---|
| 5 |
|
|---|
| 6 |
msfbase = File.symlink?(__FILE__) ? File.readlink(__FILE__) : __FILE__ |
|---|
| 7 |
$:.unshift(File.join(File.dirname(msfbase), 'lib')) |
|---|
| 8 |
$:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB'] |
|---|
| 9 |
|
|---|
| 10 |
require 'rex' |
|---|
| 11 |
require 'msf/base' |
|---|
| 12 |
require 'msf/ui' |
|---|
| 13 |
|
|---|
| 14 |
# Check for ruby packages |
|---|
| 15 |
begin |
|---|
| 16 |
require 'gtk2' |
|---|
| 17 |
require 'libglade2' |
|---|
| 18 |
rescue ::Exception => e |
|---|
| 19 |
$stderr.puts "[*] The msfgui interface requires the ruby-gtk2 and ruby-libglade2 packages" |
|---|
| 20 |
$stderr.puts "[*] Dependencies include ruby-pango, ruby-glib2, ruby-gdkpixbuf2, and ruby-atk" |
|---|
| 21 |
$stderr.puts "[*] Error: #{e.class} #{e}" |
|---|
| 22 |
exit(0) |
|---|
| 23 |
end |
|---|
| 24 |
|
|---|
| 25 |
# Check for Gtk+ version |
|---|
| 26 |
# Returns: nil if the GTK+ library is compatible with the given version, |
|---|
| 27 |
# or a string describing the version mismatch. |
|---|
| 28 |
if gtkversion = Gtk.check_version(2,8,0) |
|---|
| 29 |
$stderr.puts "[*] The msfgui interface requires Gtk+ 2.8 or later" |
|---|
| 30 |
$stderr.puts "[*] Your Gtk+ version : #{gtkversion}" |
|---|
| 31 |
exit |
|---|
| 32 |
end |
|---|
| 33 |
|
|---|
| 34 |
require 'msf/ui/gtk2' |
|---|
| 35 |
|
|---|
| 36 |
# Declare the argument parser for msfgui |
|---|
| 37 |
arguments = Rex::Parser::Arguments.new( |
|---|
| 38 |
"-v" => [ true, "A number between 0 and 3 that controls log verbosity" ], |
|---|
| 39 |
"-r" => [ true, "Execute the specified resource file" ], |
|---|
| 40 |
"-d" => [ false, "Keep running in the foreground" ], |
|---|
| 41 |
"-D" => [ false, "Keep stdio and stderr open for debugging" ], |
|---|
| 42 |
"-h" => [ false, "Help banner" ]) |
|---|
| 43 |
|
|---|
| 44 |
opts = {} |
|---|
| 45 |
foreground = true |
|---|
| 46 |
debug = false |
|---|
| 47 |
|
|---|
| 48 |
# Parse command line arguments. |
|---|
| 49 |
arguments.parse(ARGV) { |opt, idx, val| |
|---|
| 50 |
case opt |
|---|
| 51 |
when "-v" |
|---|
| 52 |
opts['LogLevel'] = val |
|---|
| 53 |
when "-r" |
|---|
| 54 |
opts['Resource'] = val |
|---|
| 55 |
when "-d" |
|---|
| 56 |
foreground = false |
|---|
| 57 |
when "-D" |
|---|
| 58 |
debug = true |
|---|
| 59 |
when "-h" |
|---|
| 60 |
print( |
|---|
| 61 |
"\nUsage: msfgui <options>\n" + |
|---|
| 62 |
arguments.usage) |
|---|
| 63 |
exit |
|---|
| 64 |
end |
|---|
| 65 |
} |
|---|
| 66 |
|
|---|
| 67 |
# Fork into the background if requested |
|---|
| 68 |
begin |
|---|
| 69 |
if (not foreground) |
|---|
| 70 |
exit(0) if Process.fork() |
|---|
| 71 |
end |
|---|
| 72 |
rescue ::NotImplementedError |
|---|
| 73 |
$stderr.puts "[*] Background mode is not available on this platform" |
|---|
| 74 |
end |
|---|
| 75 |
|
|---|
| 76 |
class FakeOut |
|---|
| 77 |
def write(buff) |
|---|
| 78 |
buff.length |
|---|
| 79 |
end |
|---|
| 80 |
|
|---|
| 81 |
def method_missing(meth, *args) |
|---|
| 82 |
end |
|---|
| 83 |
end |
|---|
| 84 |
|
|---|
| 85 |
if(not debug) |
|---|
| 86 |
|
|---|
| 87 |
begin; $stdout.close; rescue; end |
|---|
| 88 |
begin; $stderr.close; rescue; end |
|---|
| 89 |
|
|---|
| 90 |
fake = FakeOut.new |
|---|
| 91 |
$stdout = fake |
|---|
| 92 |
$stderr = fake |
|---|
| 93 |
|
|---|
| 94 |
# Only treat super nasty Gtk errors as fatal |
|---|
| 95 |
GLib::Log.set_fatal_mask("GLib", GLib::Log::LEVEL_ERROR) |
|---|
| 96 |
GLib::Log.set_fatal_mask("Gtk", GLib::Log::LEVEL_ERROR) |
|---|
| 97 |
GLib::Log.set_fatal_mask("Gdk", GLib::Log::LEVEL_ERROR) |
|---|
| 98 |
GLib::Log.set_fatal_mask(nil, GLib::Log::LEVEL_ERROR) |
|---|
| 99 |
|
|---|
| 100 |
# GLib::Log.log("Gtk", GLib::Log::LEVEL_CRITICAL, "TESTING > /dev/null") |
|---|
| 101 |
end |
|---|
| 102 |
|
|---|
| 103 |
$stderr.puts "[*] Debugging mode is enabled" |
|---|
| 104 |
|
|---|
| 105 |
# Language is English |
|---|
| 106 |
ENV['LANG'] = 'C' |
|---|
| 107 |
|
|---|
| 108 |
# Create the driver instance and run it. |
|---|
| 109 |
Msf::Ui::Gtk2::Driver.new(opts).run |
|---|
| 110 |
|
|---|
| 111 |
|
|---|