2005-12-17 06:46:23 +00:00
|
|
|
#!/usr/bin/env ruby
|
2005-10-01 09:10:41 +00:00
|
|
|
|
2006-07-31 15:36:08 +00:00
|
|
|
msfbase = File.symlink?(__FILE__) ? File.readlink(__FILE__) : __FILE__
|
|
|
|
$:.unshift(File.join(File.dirname(msfbase), 'lib'))
|
2005-10-01 09:10:41 +00:00
|
|
|
|
|
|
|
require 'rex'
|
|
|
|
require 'msf/ui'
|
|
|
|
require 'msf/base'
|
|
|
|
|
|
|
|
#
|
|
|
|
# Dump the list of payloads
|
|
|
|
#
|
|
|
|
def dump_payloads
|
|
|
|
tbl = Rex::Ui::Text::Table.new(
|
|
|
|
'Indent' => 4,
|
2005-10-12 05:44:15 +00:00
|
|
|
'Header' => "Framework Payloads (#{$framework.stats.num_payloads} total)",
|
2005-10-01 09:10:41 +00:00
|
|
|
'Columns' =>
|
|
|
|
[
|
|
|
|
"Name",
|
|
|
|
"Description"
|
|
|
|
])
|
|
|
|
|
|
|
|
$framework.payloads.each_module { |name, mod|
|
|
|
|
tbl << [ name, mod.new.description ]
|
|
|
|
}
|
|
|
|
|
|
|
|
"\n" + tbl.to_s + "\n"
|
|
|
|
end
|
|
|
|
|
2005-10-01 21:26:17 +00:00
|
|
|
# Initialize the simplified framework instance.
|
|
|
|
$framework = Msf::Simple::Framework.create
|
2005-10-01 09:10:41 +00:00
|
|
|
|
|
|
|
if (ARGV.length <= 1)
|
2006-07-31 04:05:20 +00:00
|
|
|
puts "\n" + " Usage: #{$0} <payload> [var=val] <S[ummary]|C|P[erl]|R[aw]|J[avascript]|e[X]ecutable>\n"
|
2005-10-01 09:10:41 +00:00
|
|
|
puts dump_payloads
|
|
|
|
exit
|
|
|
|
end
|
|
|
|
|
|
|
|
# Get the payload name we'll be using
|
|
|
|
payload_name = ARGV.shift
|
|
|
|
payload = $framework.payloads.create(payload_name)
|
|
|
|
|
|
|
|
if (payload == nil)
|
|
|
|
puts "Invalid payload: #{payload_name}"
|
|
|
|
exit
|
|
|
|
end
|
|
|
|
|
|
|
|
# Evalulate the command
|
|
|
|
cmd = ARGV.pop.downcase
|
|
|
|
|
|
|
|
# Populate the framework datastore
|
|
|
|
options = ARGV.join(',')
|
|
|
|
|
2006-07-31 04:05:20 +00:00
|
|
|
if (cmd =~ /^(p|r|c|j|x)/)
|
|
|
|
fmt = 'perl' if (cmd =~ /^p/)
|
|
|
|
fmt = 'raw' if (cmd =~ /^(r|x)/)
|
2006-09-25 11:34:04 +00:00
|
|
|
fmt = 'c' if (cmd == 'c')
|
2006-07-31 04:05:20 +00:00
|
|
|
fmt = 'js_be' if (cmd =~ /^j/ and Rex::Arch.endian(payload.arch) == ENDIAN_BIG)
|
|
|
|
fmt = 'js_le' if (cmd =~ /^j/ and ! fmt)
|
|
|
|
|
2005-10-01 09:10:41 +00:00
|
|
|
begin
|
|
|
|
buf = payload.generate_simple(
|
2006-07-31 04:05:20 +00:00
|
|
|
'Format' => fmt,
|
2005-10-01 09:10:41 +00:00
|
|
|
'OptionStr' => options)
|
|
|
|
rescue
|
|
|
|
puts "Error generating payload: #{$!}"
|
|
|
|
exit
|
|
|
|
end
|
2006-07-31 04:05:20 +00:00
|
|
|
|
|
|
|
if (cmd =~ /^x/)
|
|
|
|
note =
|
|
|
|
"Created by msfpayload (http://www.metasploit.com).\n" +
|
|
|
|
"Payload: " + payload.refname + "\n" +
|
|
|
|
" Length: " + buf.length.to_s + "\n" +
|
|
|
|
"Options: " + options + "\n"
|
|
|
|
|
|
|
|
arch = payload.arch
|
|
|
|
plat = payload.platform.platforms
|
2006-11-15 22:04:36 +00:00
|
|
|
|
|
|
|
# Automatically prepend stack adjustment
|
|
|
|
buf = Rex::Arch.adjust_stack_pointer('x86', -3500) + buf
|
2006-07-31 04:05:20 +00:00
|
|
|
|
|
|
|
if (plat.index(Msf::Module::Platform::Windows) and arch.index("x86"))
|
|
|
|
buf = Rex::Text.to_win32pe(buf, note)
|
|
|
|
$stderr.puts(note)
|
|
|
|
$stdout.write(buf)
|
|
|
|
exit(0)
|
|
|
|
end
|
|
|
|
|
|
|
|
$stderr.puts "No executable format support for this arch/platform"
|
|
|
|
exit(-1)
|
|
|
|
end
|
|
|
|
|
|
|
|
puts buf
|
|
|
|
|
2005-10-01 09:10:41 +00:00
|
|
|
elsif (cmd =~ /^s/)
|
|
|
|
puts Msf::Serializer::ReadableText.dump_module(payload)
|
|
|
|
end
|