This is an implementation of a native-code Meterpreter, designed for portability, embeddability, and low resource utilization. It can run on the smallest embedded Linux targets to big iron, and targets Android, iOS, macOS, Linux, and Windows, but can be ported to almost any POSIX-compliant environment.
Debain, Ubuntu, and derivatives are most supported for builds. To build, you need at least 5GB of free disk space, and the following packages available:
# Dependencies
apt install curl build-essential git autoconf automake libtool bison flex gcc ruby rake bundler git mingw-w64
The Dockerfile under docker/Dockerfile contains a pre-configured build environment as well.
On macOS you will need to install the xcode command line tools as follows:
xcode-select --install
For general development, there are a few make targets defined:
Running make
will build for the local environment. E.g. if you're on macOS,
it will build for macOS using your native compiler and tools.
make TARGET=triple
will build for a specific host triple. See below for some
common ones.
make clean
will clean the 'mettle' directory for the current build target
make distclean
will clean the entire build target`
make all-parallel
will build for every known target, useful with '-j' to build multiple targets at once.
make clean-parallel
and make distclean-parallel
do similar for all targets.
To build the gem for distribution (currently requires Linux or macOS):
rake build
To check the resulting binaries:
rake check
To completely reset your dev environment and delete all binary artifacts:
rake mettle:ultraclean
To generate a payload with Mettle:
mettle = MetasploitPayloads::Mettle.new(platform_triple, config={})
The available platform triples for Linux targets are:
aarch64-linux-musl
armv5l-linux-musleabi
armv5b-linux-musleabi
i486-linux-musl
x86_64-linux-musl
powerpc-linux-muslsf
powerpc64le-linux-musl
mips-linux-muslsf
mipsel-linux-muslsf
mips64-linux-muslsf
s390x-linux-musl
For Mingw32-64 Windows targets, the following triples are added. On up-to-date
Debian / Ubuntu systems, the mingw-w64
package will install both toolchains.
x86_64-w64-mingw32
i686-w64-mingw32
For macOS/iOS builds, the following triples are added. To target older macOS/OSX versions, see https://github.com/phracker/MacOSX-SDKs to get the appropriate SDK folder.
arm-iphone-darwin
aarch64-iphone-darwin
i386-apple-darwin
x86_64-apple-darwin
aarch64-apple-darwin
Available config options are:
:background
- fork to background as a daemon:debug
- to turn on debug messages:log_file
- the file to send debug messages to instead of stderr
:uri
- the uri to connect back to:uuid
- the UUID to identify the payloadConfig options can also be set with:
mettle.config[:key] = val
To get a binary with installed options call:
mettle.to_binary(format=:process_image)
The formats are:
:exec
- a standalone executable that can take command-line arguments (see mettle -h
) or use pre-set ones:process_image
- a process image that must be started with a custom stack (see doc/stack_requirements.md
)To pull your local changes of mettle into your Metasploit install:
-dev
to the version in lib/metasploit_payloads/mettle/version.rb
pkg/metasploit-payloads-mettle-X.X.X.pre.dev.gem
to the box you are using for Metasploit if it is differentgem install <path to new gem>
(for example: 'metasploit_payloads-mettle', '0.4.1.pre.dev')bundle install
in your Framework directory, and ensure you see something like Using metasploit_payloads-mettle 0.4.1.pre.dev (was 0.4.1)
in the outputBuild CI will automatically publish new gems when commits land to master and pass build.