Skip to content

Commit 4f0ca5f

Browse files
committed
Land rapid7#8013, Docker Compose for Metasploit
2 parents 4882927 + 6ccd3c7 commit 4f0ca5f

File tree

9 files changed

+290
-0
lines changed

9 files changed

+290
-0
lines changed

.dockerignore

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
.dockerignore
2+
.gitignore
3+
.env*
4+
docker-compose*.yml
5+
docker/
6+
!docker/msfconsole.rc
7+
README.md
8+
9+
.bundle
10+
Gemfile.local
11+
Gemfile.local.lock
12+
# Rubymine project directory
13+
.idea
14+
# Sublime Text project directory (not created by ST by default)
15+
.sublime-project
16+
# RVM control file, keep this to avoid backdooring Metasploit
17+
.rvmrc
18+
# Allow for a local choice of (unsupported / semi-supported) ruby versions
19+
# See PR #4136 for usage, but example usage for rvm:
20+
# rvm --create --versions-conf use 2.1.4@metasploit-framework
21+
# Because rbenv doesn't use .versions.conf, to achieve this same functionality, run:
22+
# rbenv shell 2.1.4
23+
.versions.conf
24+
# YARD cache directory
25+
.yardoc
26+
# Mac OS X files
27+
.DS_Store
28+
# database config for testing
29+
config/database.yml
30+
# target config file for testing
31+
features/support/targets.yml
32+
# simplecov coverage data
33+
coverage
34+
doc/
35+
external/source/meterpreter/java/bin
36+
external/source/meterpreter/java/build
37+
external/source/meterpreter/java/extensions
38+
external/source/javapayload/bin
39+
external/source/javapayload/build
40+
# Java binary ignores. Replace the 5 above with this once we're merged.
41+
external/source/javapayload/*/.classpath
42+
external/source/javapayload/*/.project
43+
external/source/javapayload/*/.settings
44+
external/source/javapayload/*/bin
45+
external/source/javapayload/*/target
46+
external/source/javapayload/*/*/.classpath
47+
external/source/javapayload/*/*/.project
48+
external/source/javapayload/*/*/.settings
49+
external/source/javapayload/*/*/bin
50+
external/source/javapayload/*/*/target
51+
# Packaging directory
52+
pkg
53+
tags
54+
*.swp
55+
*.orig
56+
*.rej
57+
*~
58+
# Ignore backups of retabbed files
59+
*.notab
60+
61+
# ignore Visual Studio external source garbage
62+
*.suo
63+
*.sdf
64+
*.opensdf
65+
*.user
66+
67+
# Rails log directory
68+
/log
69+
# Rails tmp directory
70+
/tmp
71+
72+
# ignore release/debug folders for exploits
73+
external/source/exploits/**/Debug
74+
external/source/exploits/**/Release
75+
76+
# Avoid checking in Meterpreter binaries. These are supplied upstream by
77+
# the metasploit-payloads gem.
78+
data/meterpreter/*.dll
79+
data/meterpreter/*.php
80+
data/meterpreter/*.py
81+
data/meterpreter/*.bin
82+
data/meterpreter/*.jar
83+
data/meterpreter/*.lso
84+
data/android
85+
data/java
86+
87+
# Avoid checking in Meterpreter libs that are built from
88+
# private source. If you're interested in this functionality,
89+
# check out Metasploit Pro: http://metasploit.com/download
90+
data/meterpreter/ext_server_pivot.*.dll
91+
92+
# Avoid checking in metakitty, the source for
93+
# https://rapid7.github.io/metasploit-framework. It's an orphan branch.
94+
/metakitty
95+
.vagrant

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,3 +85,6 @@ data/meterpreter/ext_server_pivot.*.dll
8585
# https://rapid7.github.io/metasploit-framework. It's an orphan branch.
8686
/metakitty
8787
.vagrant
88+
89+
# local docker compose overrides
90+
docker-compose.local*

docker-compose.yml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
version: '2'
2+
services:
3+
ms: &ms
4+
image: metasploit
5+
build:
6+
context: .
7+
dockerfile: ./docker/Dockerfile
8+
environment:
9+
DATABASE_URL: postgres://postgres@db:5432/msf
10+
links:
11+
- db
12+
ports:
13+
- 4444:4444
14+
volumes:
15+
- $HOME/.msf4:/root/.msf4
16+
17+
db:
18+
image: postgres:9.6
19+
volumes:
20+
- pg_data:/var/lib/postgresql/data
21+
22+
volumes:
23+
pg_data:
24+
driver: local

docker/Dockerfile

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
FROM ruby:2.3-alpine
2+
MAINTAINER Rapid7
3+
4+
ARG BUNDLER_ARGS="--system --jobs=8"
5+
ENV APP_HOME /usr/src/metasploit-framework/
6+
WORKDIR $APP_HOME
7+
8+
COPY Gemfile* m* Rakefile $APP_HOME
9+
COPY lib $APP_HOME/lib
10+
11+
RUN apk update && \
12+
apk add \
13+
ruby-bigdecimal \
14+
ruby-bundler \
15+
ruby-io-console \
16+
autoconf \
17+
bison \
18+
subversion \
19+
git \
20+
sqlite \
21+
nmap \
22+
libxslt \
23+
postgresql \
24+
ncurses \
25+
&& apk add --virtual .ruby-builddeps \
26+
build-base \
27+
ruby-dev \
28+
libffi-dev\
29+
openssl-dev \
30+
readline-dev \
31+
sqlite-dev \
32+
postgresql-dev \
33+
libpcap-dev \
34+
libxml2-dev \
35+
libxslt-dev \
36+
yaml-dev \
37+
zlib-dev \
38+
ncurses-dev \
39+
bison \
40+
autoconf \
41+
&& echo "gem: --no-ri --no-rdoc" > /etc/gemrc \
42+
&& bundle install $BUNDLER_ARGS \
43+
&& apk del .ruby-builddeps \
44+
&& rm -rf /var/cache/apk/*
45+
46+
ADD ./ $APP_HOME
47+
CMD ["./msfconsole", "-r", "docker/msfconsole.rc"]

docker/README.md

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
# Metasploit in Docker
2+
## Getting Started
3+
4+
To run `msfconsole`
5+
```bash
6+
docker-compose run --rm --service-ports ms
7+
```
8+
9+
To run `msfvenom`
10+
```bash
11+
docker-compose run --rm ms ./msfvenom
12+
```
13+
14+
### I don't like typing `docker-compose --rm ...`
15+
16+
We have included some binstubs `./bin`, you can symlink them to your path.
17+
18+
Assuming you have `$HOME/bin`, and it's in your `$PATH`. You can run this from the project root:
19+
20+
```bash
21+
ln -s `pwd`/docker/bin/msfconsole $HOME/bin/
22+
ln -s `pwd`/docker/bin/msfvenom $HOME/bin/
23+
```
24+
25+
### But I want reverse shells...
26+
27+
By default we expose port `4444`. You'll need to set `LHOST` to be a hostname/ip
28+
of your host machine.
29+
30+
If you want to expose more ports, or have `LHOST` prepopulated with a specific
31+
value; you'll need to setup a local docker-compose override for this.
32+
33+
Create `docker/docker-compose.local.override.yml` with:
34+
```yml
35+
version: '2'
36+
services:
37+
ms:
38+
environment:
39+
# example of setting LHOST
40+
LHOST: 10.0.8.2
41+
# example of adding more ports
42+
ports:
43+
- 8080:8080
44+
```
45+
46+
Make sure you set `LHOST` to valid hostname that resolves to your host machine.
47+
48+
Now you need to set the `COMPOSE_FILE` environment variable to load your local
49+
override.
50+
51+
```bash
52+
echo "COMPOSE_FILE=./docker-compose.yml:./docker/docker-compose.local.override.yml" >> .env
53+
```
54+
Now you should be able get reverse shells working
55+
56+
## Developing
57+
58+
To setup you environment for development, you need to `docker/docker-compose.development.override.yml`
59+
to your `COMPOSE_FILE` environment variable.
60+
61+
If you don't have a `COMPOSE_FILE` environment variable, you can set it up with this:
62+
63+
```bash
64+
echo "COMPOSE_FILE=./docker-compose.yml:./docker/docker-compose.development.override.yml" >> .env
65+
```

docker/bin/msfconsole

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#! /bin/bash
2+
3+
if [[ -z "$MSF_PATH" ]]; then
4+
path=`dirname $0`
5+
6+
# check for ./docker/msfconsole.rc
7+
if [[ ! -f $path/../msfconsole.rc ]] ; then
8+
9+
# we are not inside the project
10+
realpath --version > /dev/null 2>&1 || { echo >&2 "I couldn't find where metasploit is. Set \$MSF_PATH or execute this from the project root"; exit 1 ;}
11+
12+
# determine script path
13+
pushd $(dirname $(realpath $0)) > /dev/null
14+
path=$(pwd)
15+
popd > /dev/null
16+
fi
17+
MSF_PATH=$(dirname $(dirname $path))
18+
fi
19+
20+
cd $MSF_PATH
21+
docker-compose run --rm --service-ports ms ./msfconsole -r docker/msfconsole.rc "$@"

docker/bin/msfvenom

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#! /bin/bash
2+
3+
if [[ -z "$MSF_PATH" ]]; then
4+
path=`dirname $0`
5+
6+
# check for ./docker/msfconsole.rc
7+
if [[ ! -f $path/../msfconsole.rc ]] ; then
8+
9+
# we are not inside the project
10+
realpath --version > /dev/null 2>&1 || { echo >&2 "I couldn't find where metasploit is. Set \$MSF_PATH or execute this from the project root"; exit 1 ;}
11+
12+
# determine script path
13+
pushd $(dirname $(realpath $0)) > /dev/null
14+
path=$(pwd)
15+
popd > /dev/null
16+
fi
17+
MSF_PATH=$(dirname $(dirname $path))
18+
fi
19+
20+
cd $MSF_PATH
21+
docker-compose run --rm --service-ports ms ./msfvenom "$@"
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
version: '2'
2+
3+
services:
4+
ms: &ms
5+
environment:
6+
DATABASE_URL: postgres://postgres@db:5432/msf_dev
7+
8+
volumes:
9+
- .:/usr/src/app

docker/msfconsole.rc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<ruby>
2+
run_single("setg LHOST #{ENV['LHOST']}") if ENV['LHOST']
3+
run_single("setg LPORT #{ENV['LPORT']}") if ENV['LPORT']
4+
run_single("db_connect #{ENV['DATABASE_URL'].gsub('postrgres://', '')}") if ENV['DATABASE_URL']
5+
</ruby>

0 commit comments

Comments
 (0)