module MetasploitPayloads

This module dispenses Metasploit payload binary files

Constants

EXTENSION_PREFIX
METERPRETER_SUBFOLDER
USER_DATA_SUBFOLDER
VERSION

Public Class Methods

data_directory() click to toggle source

Full path to the local gem folder containing the base data

# File lib/metasploit-payloads.rb, line 94
def self.data_directory
  ::File.realpath(::File.join(::File.dirname(__FILE__), '..', 'data'))
end
list_meterpreter_extension_suffixes(extension_name=nil) click to toggle source

List all the available suffixes, optionally filtered by the given extension name. This is mostly useful for determining support for a specific extension.

@param [String] extension_name An optional extension name to use for filtering results. If omitted, all suffixes

will be returned.

@return [Array<String>] Returns an array of binary suffixes.

# File lib/metasploit-payloads.rb, line 87
def self.list_meterpreter_extension_suffixes(extension_name=nil)
  list_meterpreter_dirs { |dir| meterpreter_enum_ext_suffixes(dir, extension_name) }
end
list_meterpreter_extensions(binary_suffix=nil) click to toggle source

List all the available extensions, optionally filtered by the given suffix.

@param [String] binary_suffix An optional suffix to use for filtering results. If omitted, all extensions will be

returned.

@return [Array<String>] Returns an array of extensions.

# File lib/metasploit-payloads.rb, line 76
def self.list_meterpreter_extensions(binary_suffix=nil)
  list_meterpreter_dirs { |dir| meterpreter_enum_ext(dir, binary_suffix) }
end
local_meterpreter_dir() click to toggle source

Full path to the local gem folder which contains the meterpreter binaries.

# File lib/metasploit-payloads.rb, line 115
def self.local_meterpreter_dir
  ::File.join(data_directory, METERPRETER_SUBFOLDER)
end
meterpreter_enum_ext(root_dir, binary_suffix=nil) click to toggle source

Enumerate extensions in the given root folder based on an optional suffix.

@param [String] root_dir The path to the directory from which to enumerate extensions. @param [String] binary_suffix An optional suffix to use for filtering results. If omitted, all extensions will be

returned.

@return [Array<String>] Returns an array of extensions.

# File lib/metasploit-payloads.rb, line 126
def self.meterpreter_enum_ext(root_dir, binary_suffix=nil)
  exts = []
  binary_suffix ||= '.*'
  ::Dir.entries(root_dir).each do |f|
    if ::File.readable?(::File.join(root_dir, f)) && \
       f =~ /#{EXTENSION_PREFIX}(\w+)\.#{binary_suffix}/
      exts.push($1)
    end
  end
  exts
end
meterpreter_enum_ext_suffixes(root_dir, extension_name=nil) click to toggle source

Enumerate binary suffixes in the given root folder based on an optional extension name.

@param [String] root_dir The path to the directory from which to enumerate extension suffixes. @param [String] extension_name An optional extension name to use for filtering results. If omitted, all suffixes will

be returned.

@return [Array<String>] Returns an array of binary suffixes.

# File lib/metasploit-payloads.rb, line 145
def self.meterpreter_enum_ext_suffixes(root_dir, extension_name=nil)
  suffixes = []
  extension_name ||= '\w+'
  ::Dir.entries(root_dir).each do |f|
    if ::File.readable?(::File.join(root_dir, f)) && \
       f =~ /#{EXTENSION_PREFIX}#{extension_name}\.(\w+(\.\w+)*)/
      suffixes.push($1)
    end
  end
  suffixes
end
meterpreter_ext_path(ext_name, binary_suffix) click to toggle source

Get the path to an extension based on its name (no prefix).

# File lib/metasploit-payloads.rb, line 17
def self.meterpreter_ext_path(ext_name, binary_suffix)
  path(METERPRETER_SUBFOLDER, "#{EXTENSION_PREFIX}#{ext_name}.#{binary_suffix}")
end
meterpreter_path(name, binary_suffix) click to toggle source

Get the path to a meterpreter binary by full name.

# File lib/metasploit-payloads.rb, line 41
def self.meterpreter_path(name, binary_suffix)
  path(METERPRETER_SUBFOLDER, "#{name}.#{binary_suffix}".downcase)
end
msf_meterpreter_dir() click to toggle source

Full path to the MSF data folder which contains the meterpreter binaries.

# File lib/metasploit-payloads.rb, line 101
def self.msf_meterpreter_dir
  ::File.join(Msf::Config.data_directory, METERPRETER_SUBFOLDER)
end
path(*path_parts) click to toggle source

Get the full path to any file packaged in this gem by local path and name.

# File lib/metasploit-payloads.rb, line 48
def self.path(*path_parts)
  gem_path = expand(data_directory, ::File.join(path_parts))
  if metasploit_installed?
    user_path = expand(Msf::Config.config_directory, ::File.join(USER_DATA_SUBFOLDER, path_parts))
    msf_path = expand(Msf::Config.data_directory, ::File.join(path_parts))
  end
  readable_path(gem_path, user_path, msf_path)
end
read(*path_parts) click to toggle source

Get the contents of any file packaged in this gem by local path and name.

# File lib/metasploit-payloads.rb, line 60
def self.read(*path_parts)
  file_path = path(path_parts)
  if file_path.nil?
    full_path = ::File.join(path_parts)
    fail RuntimeError, "#{full_path} not found", caller
  end

  ::File.binread(file_path)
end
readable_path(gem_path, *extra_paths) click to toggle source
# File lib/metasploit-payloads.rb, line 21
def self.readable_path(gem_path, *extra_paths)
  # Try the MSF path first to see if the file exists, allowing the MSF data
  # folder to override what is in the gem. This is very helpful for
  # testing/development without having to move the binaries to the gem folder
  # each time. We only do this is MSF is installed.
  extra_paths.each do |extra_path|
    if ::File.readable? extra_path
      warn_local_path(extra_path) if ::File.readable? gem_path
      return extra_path
    end
  end

  return gem_path if ::File.readable? gem_path

  nil
end
user_meterpreter_dir() click to toggle source

Full path to the user's MSF data folder which contains the meterpreter binaries.

# File lib/metasploit-payloads.rb, line 108
def self.user_meterpreter_dir
  ::File.join(Msf::Config.config_directory, USER_DATA_SUBFOLDER, METERPRETER_SUBFOLDER)
end
version() click to toggle source
# File lib/metasploit-payloads/version.rb, line 4
def self.version
  VERSION
end

Private Class Methods

expand(root_dir, file_name) click to toggle source

Expand the given root path and file name into a full file location.

# File lib/metasploit-payloads.rb, line 169
def self.expand(root_dir, file_name)
  ::File.expand_path(::File.join(root_dir, file_name))
end
list_meterpreter_dirs() { |dir).each do |e| push| ... } click to toggle source
# File lib/metasploit-payloads.rb, line 187
def list_meterpreter_dirs(&block)
  things = [] # *things* is whatever is being enumerated (extension names, suffixes, etc.) as determined by the block
  root_dirs = [local_meterpreter_dir]

  # Find the valid extensions in the data folder first, if MSF
  # is installed.
  if metasploit_installed?
    root_dirs.unshift(msf_meterpreter_dir)
    root_dirs.unshift(user_meterpreter_dir)
  end

  root_dirs.each do |dir|
    next unless ::File.directory?(dir)

    # Merge in any that don't already exist in the collection.
    (yield dir).each do |e|
      things.push(e) unless things.include?(e)
    end
  end
metasploit_installed?() click to toggle source

Determine if MSF has been installed and is being used.

# File lib/metasploit-payloads.rb, line 162
def self.metasploit_installed?
  defined? Msf::Config
end
warn_local_path(path) click to toggle source
# File lib/metasploit-payloads.rb, line 175
def self.warn_local_path(path)
  unless @local_paths.include?(path)
    STDERR.puts("WARNING: Local file #{path} is being used")
    if @local_paths.empty?
      STDERR.puts('WARNING: Local files may be incompatible with the Metasploit Framework')
    end
    @local_paths << path
  end
end