mirror of
https://github.com/rapid7/metasploit-payloads
synced 2024-11-26 17:41:08 +01:00
175 lines
7.5 KiB
Markdown
175 lines
7.5 KiB
Markdown
Native C meterpreter >
|
|
=============
|
|
|
|
Building - Windows
|
|
==================
|
|
|
|
As of [commit
|
|
a2888b1b4862819c9aae81bf46d8c92d8164c598](https://github.com/rapid7/meterpreter/commit/a2888b1b4862819c9aae81bf46d8c92d8164c598),
|
|
Windows Meterpreter is built with [Visual Studio 2013 Express for
|
|
Desktop][vs_express] or any paid version of [Visual Studio
|
|
2013][vs_paid]. Earlier toolsets on Windows are no longer supported --
|
|
this includes Visual Studio 2012. Make sure that the version that you
|
|
download is `Visual Studio Express 2013 for Windows Desktop` -- dependng
|
|
on your operating system, if you get the wrong version of VS2013, the
|
|
installer will complain about needing "a more recent version of
|
|
Windows." If you are using a dedicated build machine, your best bet is
|
|
to uninstall Visual Studio 2012 if your only project is Meterpreter.
|
|
|
|
Visual Studio 2013 requires .NET 4.5.1 in order to run, and as a result isn't compatible
|
|
with Windows XP due to the fact that .NET 4.5 will not run on Windows XP. However, this
|
|
does not mean that Metepreter itself will not run on Windows XP, it just means that it's
|
|
not possible to _build_ it on Windows XP.
|
|
|
|
Windows Meterpreter has the following repositories set up as submodule dependencies:
|
|
|
|
* [Reflective DLL Injection][rdi]
|
|
|
|
For Meterpreter to build correctly, these submodules must be initialised and updated,
|
|
like so:
|
|
|
|
``` bash
|
|
$ git clone https://github.com/rapid7/metasploit-payloads
|
|
$ cd metasploit-payloads
|
|
$ git submodule init && git submodule update
|
|
```
|
|
|
|
At this point the dependencies will be ready to use and Meterpreter should be ready to
|
|
build.
|
|
|
|
* [OpenSSL][openssl]
|
|
|
|
Occasionally, new versions of OpenSSL are released and need to be
|
|
incorporated into the Meterpreter build. See the README under
|
|
`source/openssl/lib` for build instructions. You will also need to
|
|
refresh the header files from the source tarball as well. TODO: This
|
|
entire process appears automatable given a proper build environment.
|
|
|
|
An example of updating OpenSSL is detailed in
|
|
[Pull Request #86](https://github.com/rapid7/meterpreter/pull/86).
|
|
|
|
Running the Build
|
|
-----------------
|
|
|
|
Open up a Visual Studio command prompt by selecting `Developer Command Prompt for VS2013`
|
|
from the Start menu. Alternatively you can run `vcvars32.bat` from an existing command
|
|
line prompt, just make sure it's the VS2013 one if you have multiple versions of VS
|
|
installed on your machine.
|
|
|
|
Once you have your environment variables set up, change to the root folder where the
|
|
meterpreter source is located. From here you can:
|
|
|
|
* Build the x86 version by running: `make x86`
|
|
* Build the x64 version by running: `make x64`
|
|
* Build both x86 and x64 versions by running: `make`
|
|
|
|
The compiled binaries are written to the `output/x86` and `output/x64` folders.
|
|
|
|
If you are not a Rapid7 employee, make sure you build the source using the `debug` or
|
|
`release` configurations when inside Visual Studio. If you attempt to build `r7_debug` or
|
|
`r7_release` you will get compiler errors due to missing libraries.
|
|
|
|
If you build the source from the command line the toolset will choose the most
|
|
appropriate build configuration for you and hence calling `make` should "Just Work™".
|
|
|
|
If you are a Rapid7 employee you will need the PSSDK source in order to build the
|
|
extra components using the `r7_*` build configurations.
|
|
|
|
If submodule dependencies are not found on the file system, the script should display
|
|
an error message like so:
|
|
|
|
```
|
|
Meterpreter's submodule dependencies can't be found.
|
|
From your git console, please run:
|
|
$ git submodule init && git submodule update
|
|
```
|
|
|
|
Testing
|
|
=======
|
|
|
|
There is currently no automated testing for meterpreter, but we're
|
|
working on it.
|
|
|
|
Once you've made changes and compiled a new .dll or .so, copy the
|
|
contents of the output/ directory into your Metasploit Framework's
|
|
`data/meterpreter/` directory.
|
|
|
|
If you made any changes to `metsrv.dll` ensure that all extensions still load
|
|
and function properly.
|
|
|
|
Creating Extensions
|
|
===================
|
|
|
|
Creating extensions isn't complicated, but it's not simple either. In an
|
|
attempt make the set up a little easier on the Meterpreter side, a new
|
|
project called `ext_server_bare` has been created which is just the
|
|
shell of a project which can be used as the starting point for your
|
|
code. To use this as a template to create your own project, you can
|
|
follow these steps.
|
|
|
|
Note: All paths listed here are relative to the root `meterpreter`
|
|
folder where this document resides.
|
|
|
|
Pick a name for your extension, make sure it's something meaningful and
|
|
short. For the sake of example, we'll create a new extension called
|
|
`splat`. Once you have a cool an meaningful name, you can get your
|
|
project going by doing the following:
|
|
|
|
1. Create a new folder called `workspace/ext_server_splat`.
|
|
1. Copy `workspace/ext_server_bare/ext_server_bare.vcxproj` to
|
|
`workspace/ext_server_splat/ext_server_splat.vcxproj`
|
|
1. Open `workspace/ext_server_splat/ext_server_splat.vcxproj` with a text
|
|
editor and..
|
|
* Replace all instances of `BARE` with `SPLAT`.
|
|
* Replace all instances of `bare` with `splat`.
|
|
* Search for the `ProjectGuid` property in the document. It looks
|
|
like `<ProjectGuid>{D3F39324-040D-4B1F-ADA9-762F16A120E6}</ProjectGuid>`.
|
|
When found, generate a new GUID for your project either using
|
|
`guidgen.exe` or an online tool, and replace this GUID with your
|
|
new GUID. Make sure you keep the curly braces.
|
|
1. Create a new folder called `source/extensions/splat`.
|
|
1. Copy `source/extensions/bare/bare.c` to `source/extensions/splat/splat.c`
|
|
1. Copy `source/extensions/bare/bare.h` to `source/extensions/splat/splat.h`
|
|
1. Open `workspace/meterpreter.sln` in Visual Studio 2013.
|
|
1. Right-click on the solution item called `Solution 'meterpreter'` and
|
|
select `Add`, then `Existing Project...`.
|
|
1. Browse to your new project's location at `workspace/ext_server_splat`
|
|
and select `ext_server_splat.vcxproj`.
|
|
1. The solution should automagically pick up your project configurations
|
|
and wire them in where appropriate.
|
|
1. Right-click, again, on the solution item and select `Configuration Manager`.
|
|
1. In the resulting window, iterate through all combinations
|
|
`Active Solution Configuration` and `Active Solution Platform` and
|
|
make sure that:
|
|
* `Configuration` matches with all the other extensions in each case.
|
|
* `Platform` matches with all the other extensions in each case.
|
|
* `Build` is checked in each case.
|
|
* `Deploy` is **NOT** checked in each case.
|
|
1. Modify the contents of `splat.c` and `splat.h` so that the file
|
|
header commands are up to date, and that all references to `bare`
|
|
have been removed.
|
|
|
|
At this point you're ready to start adding your extension's functionality.
|
|
|
|
Things to Remember
|
|
------------------
|
|
|
|
* Your extension is set up to build both 32 and 64 bit versions. Make
|
|
sure you're mindful of this when you are writing your code. All of the
|
|
usual pitfalls apply when dealing with things like pointer sizes,
|
|
value trunction, etc.
|
|
* Make sure your extension builds correctly from the command line using
|
|
`make`.
|
|
* The outputs of your builds, when successful, are copied to
|
|
`output/x64` and `output/x86`.
|
|
|
|
Good luck!
|
|
|
|
[vs_express]: http://www.microsoft.com/visualstudio/eng/downloads#d-2013-express
|
|
[vs_paid]: http://www.microsoft.com/visualstudio/eng/downloads#d-2013-editions
|
|
[source]: https://github.com/rapid7/meterpreter
|
|
[framework]: https://github.com/rapid7/metasploit-framework
|
|
[build_icon]: https://ci.metasploit.com/buildStatus/icon?job=MeterpreterWin
|
|
[rdi]: https://github.com/rapid7/ReflectiveDLLInjection
|
|
[openssl]: https://github.com/rapid7/meterpreter/tree/master/source/openssl
|