From aadefdbc828f67eec99912c37e693c64149419a9 Mon Sep 17 00:00:00 2001 From: Kevin Kirsche Date: Fri, 12 Oct 2018 11:11:52 -0400 Subject: [PATCH 1/3] Update msfvenom formatter to be case insensitive --- lib/msf/base/simple/buffer.rb | 6 +++--- lib/msf/core/payload_generator.rb | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/msf/base/simple/buffer.rb b/lib/msf/base/simple/buffer.rb index 5047ba1c49..08656f654c 100644 --- a/lib/msf/base/simple/buffer.rb +++ b/lib/msf/base/simple/buffer.rb @@ -25,7 +25,7 @@ module Buffer buf = encrypt_buffer(buf, encryption_opts) end - case fmt + case fmt.downcase when 'raw' when 'num' buf = Rex::Text.to_num(buf) @@ -69,7 +69,7 @@ module Buffer # raw, ruby, python, perl, bash, js_be, js_le, c, and java. # def self.comment(buf, fmt = "ruby") - case fmt + case fmt.downcase when 'raw' when 'num', 'dword', 'dw', 'hex' buf = Rex::Text.to_js_comment(buf) @@ -138,7 +138,7 @@ module Buffer def self.encrypt_buffer(value, encryption_opts) buf = '' - case encryption_opts[:format] + case encryption_opts[:format].downcase when 'aes256' if encryption_opts[:iv].blank? raise ArgumentError, 'Initialization vector is missing' diff --git a/lib/msf/core/payload_generator.rb b/lib/msf/core/payload_generator.rb index bbda2196c9..9367874839 100644 --- a/lib/msf/core/payload_generator.rb +++ b/lib/msf/core/payload_generator.rb @@ -316,7 +316,7 @@ module Msf def generate_java_payload payload_module = framework.payloads.create(payload) payload_module.datastore.import_options_from_hash(datastore) - case format + case format.downcase when "raw", "jar" if payload_module.respond_to? :generate_jar payload_module.generate_jar.pack @@ -373,7 +373,7 @@ module Msf elsif gen_payload.length > @space and not @smallest raise PayloadSpaceViolation, 'The payload exceeds the specified space' else - if format.to_s != 'raw' + if format.to_s.downcase != 'raw' cli_print "Final size of #{format} file: #{gen_payload.length} bytes" end From 9f77966ec90a1b1a9fdffa3b7880e5b8ab8907a6 Mon Sep 17 00:00:00 2001 From: Kevin Kirsche Date: Sun, 4 Nov 2018 08:57:45 -0500 Subject: [PATCH 2/3] Revert downcase throughout, instead use single downcase within option parsing --- lib/msf/base/simple/buffer.rb | 6 +++--- lib/msf/core/payload_generator.rb | 4 ++-- msfvenom | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/msf/base/simple/buffer.rb b/lib/msf/base/simple/buffer.rb index 08656f654c..5047ba1c49 100644 --- a/lib/msf/base/simple/buffer.rb +++ b/lib/msf/base/simple/buffer.rb @@ -25,7 +25,7 @@ module Buffer buf = encrypt_buffer(buf, encryption_opts) end - case fmt.downcase + case fmt when 'raw' when 'num' buf = Rex::Text.to_num(buf) @@ -69,7 +69,7 @@ module Buffer # raw, ruby, python, perl, bash, js_be, js_le, c, and java. # def self.comment(buf, fmt = "ruby") - case fmt.downcase + case fmt when 'raw' when 'num', 'dword', 'dw', 'hex' buf = Rex::Text.to_js_comment(buf) @@ -138,7 +138,7 @@ module Buffer def self.encrypt_buffer(value, encryption_opts) buf = '' - case encryption_opts[:format].downcase + case encryption_opts[:format] when 'aes256' if encryption_opts[:iv].blank? raise ArgumentError, 'Initialization vector is missing' diff --git a/lib/msf/core/payload_generator.rb b/lib/msf/core/payload_generator.rb index 9367874839..bbda2196c9 100644 --- a/lib/msf/core/payload_generator.rb +++ b/lib/msf/core/payload_generator.rb @@ -316,7 +316,7 @@ module Msf def generate_java_payload payload_module = framework.payloads.create(payload) payload_module.datastore.import_options_from_hash(datastore) - case format.downcase + case format when "raw", "jar" if payload_module.respond_to? :generate_jar payload_module.generate_jar.pack @@ -373,7 +373,7 @@ module Msf elsif gen_payload.length > @space and not @smallest raise PayloadSpaceViolation, 'The payload exceeds the specified space' else - if format.to_s.downcase != 'raw' + if format.to_s != 'raw' cli_print "Final size of #{format} file: #{gen_payload.length} bytes" end diff --git a/msfvenom b/msfvenom index adf68eff41..a525fb8b27 100755 --- a/msfvenom +++ b/msfvenom @@ -90,7 +90,7 @@ def parse_args(args) end opt.on('-f', '--format ', String, "Output format (use --list formats to list)") do |f| - opts[:format] = f + opts[:format] = f.downcase end opt.on('-e', '--encoder ', String, 'The encoder to use (use --list encoders to list)') do |e| From ad58930e9bae91fd2eaf37ecf8d985866887e946 Mon Sep 17 00:00:00 2001 From: Kevin Kirsche Date: Sun, 4 Nov 2018 09:25:37 -0500 Subject: [PATCH 3/3] Dump formats when invalid format is selected --- lib/msf/base/simple/buffer.rb | 5 +++-- lib/msf/core/payload_generator.rb | 2 +- msfvenom | 3 +++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/msf/base/simple/buffer.rb b/lib/msf/base/simple/buffer.rb index 5047ba1c49..33ce28ee1f 100644 --- a/lib/msf/base/simple/buffer.rb +++ b/lib/msf/base/simple/buffer.rb @@ -14,6 +14,7 @@ module Simple ### module Buffer + class BufferFormatError < ::ArgumentError; end # # Serializes a buffer to a provided format. The formats supported are raw, # num, dword, ruby, python, perl, bash, c, js_be, js_le, java and psh @@ -58,7 +59,7 @@ module Buffer when 'vbapplication' buf = Rex::Text.to_vbapplication(buf, var_name) else - raise ArgumentError, "Unsupported buffer format: #{fmt}", caller + raise BufferFormatError, "Unsupported buffer format: #{fmt}", caller end return buf @@ -88,7 +89,7 @@ module Buffer when 'java' buf = Rex::Text.to_c_comment(buf) else - raise ArgumentError, "Unsupported buffer format: #{fmt}", caller + raise BufferFormatError, "Unsupported buffer format: #{fmt}", caller end return buf diff --git a/lib/msf/core/payload_generator.rb b/lib/msf/core/payload_generator.rb index bbda2196c9..db7c7a9e75 100644 --- a/lib/msf/core/payload_generator.rb +++ b/lib/msf/core/payload_generator.rb @@ -139,7 +139,7 @@ module Msf @framework = opts.fetch(:framework) raise ArgumentError, "Invalid Payload Selected" unless payload_is_valid? - raise ArgumentError, "Invalid Format Selected" unless format_is_valid? + raise ::Msf::Simple::Buffer::BufferFormatError, "Invalid Format Selected" unless format_is_valid? # In smallest mode, override the payload @space & @encoder_space settings if @smallest diff --git a/msfvenom b/msfvenom index a525fb8b27..c3a7b1137c 100755 --- a/msfvenom +++ b/msfvenom @@ -440,6 +440,9 @@ generator_opts[:cli] = true begin venom_generator = Msf::PayloadGenerator.new(generator_opts) payload = venom_generator.generate_payload +rescue ::Msf::Simple::Buffer::BufferFormatError => e + $stderr.puts "Error: #{e.message}" + $stderr.puts dump_formats rescue ::Exception => e elog("#{e.class} : #{e.message}\n#{e.backtrace * "\n"}") $stderr.puts "Error: #{e.message}"