msfpayload 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. #!/usr/bin/env ruby
  2. # -*- coding: binary -*-
  3. #
  4. # $Id$
  5. # $Revision$
  6. #
  7. $stderr.puts "[!] ************************************************************************"
  8. $stderr.puts "[!] * The utility msfpayload is deprecated! *"
  9. $stderr.puts "[!] * It will be removed on or about 2015-06-08 *"
  10. $stderr.puts "[!] * Please use msfvenom instead *"
  11. $stderr.puts "[!] * Details: https://github.com/rapid7/metasploit-framework/pull/4333 *"
  12. $stderr.puts "[!] ************************************************************************"
  13. msfbase = __FILE__
  14. while File.symlink?(msfbase)
  15. msfbase = File.expand_path(File.readlink(msfbase), File.dirname(msfbase))
  16. end
  17. $:.unshift(File.expand_path(File.join(File.dirname(msfbase), 'lib')))
  18. require 'msfenv'
  19. $:.unshift(ENV['MSF_LOCAL_LIB']) if ENV['MSF_LOCAL_LIB']
  20. require 'rex'
  21. $args = Rex::Parser::Arguments.new(
  22. "-h" => [ false, "Help banner" ],
  23. "-l" => [ false, "List available payloads" ]
  24. )
  25. #
  26. # Nuff said.
  27. #
  28. def usage
  29. $stderr.puts("\n" +
  30. " Usage: #{$0} [<options>] <payload> [var=val] <[S]ummary|C|Cs[H]arp|" +
  31. "[P]erl|Rub[Y]|[R]aw|[J]s|e[X]e|[D]ll|[V]BA|[W]ar|Pytho[N]|s[O]>\n" +
  32. $args.usage)
  33. exit
  34. end
  35. cmd = nil
  36. rest = []
  37. # Parse the argument and rock it
  38. $args.parse(ARGV) { |opt, idx, val|
  39. #puts "opt[%d]: #{opt.inspect} / #{val.inspect}" % idx
  40. case opt
  41. when "-l"
  42. cmd = "list"
  43. break
  44. # Non-option (don't begin with '-') are processed here
  45. when nil
  46. rest << val
  47. end
  48. }
  49. usage if cmd != "list" && rest.length < 2
  50. require 'msf/ui'
  51. require 'msf/base'
  52. #
  53. # Dump the list of payloads
  54. #
  55. def dump_payloads
  56. tbl = Rex::Ui::Text::Table.new(
  57. 'Indent' => 4,
  58. 'Header' => "Framework Payloads (#{$framework.stats.num_payloads} total)",
  59. 'Columns' =>
  60. [
  61. "Name",
  62. "Description"
  63. ])
  64. $framework.payloads.each_module { |name, mod|
  65. tbl << [ name, mod.new.description ]
  66. }
  67. "\n" + tbl.to_s + "\n"
  68. end
  69. # Initialize the simplified framework instance.
  70. $framework = Msf::Simple::Framework.create(
  71. :module_types => [ Msf::MODULE_PAYLOAD, Msf::MODULE_NOP ],
  72. 'DisableDatabase' => true
  73. )
  74. if cmd == "list"
  75. puts dump_payloads
  76. exit
  77. end
  78. # Get the payload name we'll be using
  79. payload_name = rest.shift
  80. # Process special var/val pairs...
  81. Msf::Ui::Common.process_cli_arguments($framework, rest)
  82. # Create the payload instance
  83. payload = $framework.payloads.create(payload_name)
  84. if (payload == nil)
  85. $stderr.puts "Invalid payload: #{payload_name}"
  86. exit
  87. end
  88. # Evalulate the command
  89. cmd = rest.pop.downcase
  90. # Populate the framework datastore
  91. options = {}
  92. rest.each do |x|
  93. k,v = x.split("=", 2)
  94. options[k.upcase] = v.to_s
  95. end
  96. # if LHOST is not set auto set it
  97. if payload_name =~ /[\_\/]reverse/ and options['LHOST'].nil?
  98. options['LHOST'] = Rex::Socket.source_address
  99. end
  100. payload.datastore.merge! options
  101. if cmd =~ /^(p|y|r|d|c|h|j|x|b|v|w|n|o)$/
  102. fmt = 'perl' if cmd =~ /^p$/
  103. fmt = 'ruby' if cmd =~ /^y$/
  104. fmt = 'raw' if cmd =~ /^(r|x|d|o)$/
  105. fmt = 'raw' if cmd =~ /^v$/
  106. fmt = 'c' if cmd =~ /^c$/
  107. fmt = 'csharp' if cmd =~ /^h$/
  108. fmt = 'js_be' if cmd =~ /^j$/ && Rex::Arch.endian(payload.arch) == ENDIAN_BIG
  109. fmt = 'js_le' if cmd =~ /^j$/ && !fmt
  110. fmt = 'java' if cmd =~ /^b$/
  111. fmt = 'raw' if cmd =~ /^w$/
  112. fmt = 'python' if cmd =~ /^n$/
  113. enc = options['ENCODER']
  114. begin
  115. buf = payload.generate_simple(
  116. 'Format' => fmt,
  117. 'Options' => options)
  118. rescue
  119. $stderr.puts "Error generating payload: #{$!}"
  120. exit
  121. end
  122. $stdout.binmode
  123. if cmd =~ /^x$/
  124. note =
  125. "Created by msfpayload (http://www.metasploit.com).\n" +
  126. "Payload: " + payload.refname + "\n" +
  127. " Length: " + buf.length.to_s + "\n" +
  128. "Options: " + options.inspect + "\n"
  129. arch = payload.arch
  130. plat = payload.platform.platforms
  131. exe = Msf::Util::EXE.to_executable($framework, arch, plat, buf)
  132. if !exe && plat.index(Msf::Module::Platform::Java)
  133. exe = payload.generate_jar.pack
  134. end
  135. if exe
  136. $stderr.puts(note)
  137. $stdout.write(exe)
  138. exit(0)
  139. end
  140. $stderr.puts "No executable format support for this arch/platform"
  141. exit(-1)
  142. end
  143. if cmd =~ /^v$/
  144. exe = Msf::Util::EXE.to_win32pe($framework, buf)
  145. note =
  146. "'Created by msfpayload (http://www.metasploit.com).\r\n" +
  147. "'Payload: " + payload.refname + "\r\n" +
  148. "' Length: " + buf.length.to_s + "\r\n" +
  149. "'Options: " + options.inspect + "\r\n"
  150. vba = note + "\r\n" + Msf::Util::EXE.to_exe_vba(exe)
  151. $stdout.write(vba)
  152. exit(0)
  153. end
  154. if cmd =~ /^d$/
  155. dll = Msf::Util::EXE.to_win32pe_dll($framework, buf)
  156. note =
  157. "Created by msfpayload (http://www.metasploit.com).\r\n" +
  158. "Payload: " + payload.refname + "\r\n" +
  159. " Length: " + buf.length.to_s + "\r\n" +
  160. "Options: " + options.inspect + "\r\n"
  161. if dll
  162. $stderr.puts(note)
  163. $stdout.write(dll)
  164. exit(0)
  165. end
  166. $stderr.puts "Failed to build dll"
  167. exit(-1)
  168. end
  169. if cmd =~ /^o$/
  170. so = Msf::Util::EXE.to_linux_x64_elf_dll($framework, buf)
  171. note =
  172. "Created by msfpayload (http://www.metasploit.com).\r\n" +
  173. "Payload: " + payload.refname + "\r\n" +
  174. " Length: " + buf.length.to_s + "\r\n" +
  175. "Options: " + options.inspect + "\r\n"
  176. if so
  177. $stderr.puts(note)
  178. $stdout.write(so)
  179. exit(0)
  180. end
  181. $stderr.puts "Failed to build dll"
  182. exit(-1)
  183. end
  184. if cmd =~ /^w$/
  185. note =
  186. "Created by msfpayload (http://www.metasploit.com).\n" +
  187. "Payload: " + payload.refname + "\n" +
  188. " Length: " + buf.length.to_s + "\n" +
  189. "Options: " + options.inspect + "\n"
  190. arch = payload.arch
  191. plat = payload.platform.platforms
  192. exe = Msf::Util::EXE.to_executable($framework, arch, plat, buf)
  193. if (!exe && payload.respond_to?(:generate_war))
  194. exe = payload.generate_war.pack
  195. elsif exe
  196. exe = Msf::Util::EXE.to_jsp_war(exe)
  197. end
  198. if exe
  199. $stderr.puts(note)
  200. $stdout.write(exe)
  201. exit(0)
  202. end
  203. $stderr.puts "No executable format support for this arch/platform"
  204. exit(-1)
  205. end
  206. $stdout.write(buf)
  207. elsif cmd =~ /^(s|o)$/
  208. payload.datastore.import_options_from_s(rest.join('_|_'), '_|_')
  209. puts Msf::Serializer::ReadableText.dump_module(payload)
  210. else
  211. $stderr.puts "Invalid command: #{cmd.inspect}"
  212. end