@@ -22,6 +22,16 @@ permissions:
2222 statuses : none
2323
2424on :
25+ workflow_dispatch :
26+ inputs :
27+ metasploitPayloadsCommit :
28+ description : ' metasploit-payloads branch would like to test'
29+ required : true
30+ default : ' master'
31+ mettleCommit :
32+ description : ' mettle branch you would like to test'
33+ required : true
34+ default : ' master'
2535 push :
2636 branches-ignore :
2737 - gh-pages
@@ -81,10 +91,12 @@ jobs:
8191
8292 runs-on : ${{ matrix.os }}
8393
84- timeout-minutes : 25
94+ timeout-minutes : 50
8595
8696 env :
8797 RAILS_ENV : test
98+ metasploitPayloadsCommit : ${{ github.event.inputs.metasploitPayloadsCommit || 'master' }}
99+ mettleCommit : ${{ github.event.inputs.mettleCommit|| 'master' }}
88100 HOST_RUNNER_IMAGE : ${{ matrix.os }}
89101 METERPRETER : ${{ matrix.meterpreter.name }}
90102 METERPRETER_RUNTIME_VERSION : ${{ matrix.meterpreter.runtime_version }}
@@ -129,8 +141,58 @@ jobs:
129141 dir %WINDIR%
130142 type %WINDIR%\\system32\\drivers\\etc\\hosts
131143
132- - name : Checkout code
144+ # The job checkout structure is:
145+ # .
146+ # ├── metasploit-framework
147+ # └── metasploit-payloads (Only if the "payload-testing-branch" GitHub label is applied)
148+ # └── mettle (Only if the "payload-testing-mettle-branch" GitHub label is applied)
149+
150+ - name : Install Docker - macOS
151+ if : ${{ ( matrix.meterpreter.name == 'java') && (runner.os == 'macos' ) && (contains(github.event.issue.labels.*.name, 'payload-testing-mettle-branch')) }}
152+ run : |
153+ brew install docker
154+ colima delete
155+ colima start --arch x86_64
156+
157+ - name : Checkout mettle
158+ if : ${{ matrix.meterpreter.name == 'mettle' && (contains(github.event.issue.labels.*.name, 'payload-testing-mettle-branch')) }}
159+ uses : actions/checkout@v4
160+ with :
161+ repository : rapid7/mettle
162+ path : mettle
163+ ref : ${{ env.mettleCommit }}
164+
165+ - name : Get mettle version
166+ if : ${{ matrix.meterpreter.name == 'mettle' && (contains(github.event.issue.labels.*.name, 'payload-testing-mettle-branch')) }}
167+ run : |
168+ echo "METTLE_VERSION=$(grep -oh '[0-9].[0-9].[0-9]*' lib/metasploit_payloads/mettle/version.rb)" | tee -a $GITHUB_ENV
169+ working-directory : mettle
170+
171+ - name : Prerequisite mettle gem setup
172+ if : ${{ matrix.meterpreter.name == 'mettle' && (contains(github.event.issue.labels.*.name, 'payload-testing-mettle-branch')) }}
173+ run : |
174+ set -x
175+ ruby -pi.bak -e "gsub(/${{ env.METTLE_VERSION }}/, '${{ env.METTLE_VERSION }}-dev')" lib/metasploit_payloads/mettle/version.rb
176+ working-directory : mettle
177+
178+ - name : Compile mettle payloads
179+ if : ${{ matrix.meterpreter.name == 'mettle' && runner.os != 'macos' && (contains(github.event.issue.labels.*.name, 'payload-testing-mettle-branch')) }}
180+ run : |
181+ docker run --rm=true --tty --volume=$(pwd):/mettle --workdir=/mettle rapid7/build:mettle rake mettle:build mettle:check
182+ rake build
183+ working-directory : mettle
184+
185+ - name : Compile mettle payloads - macOS
186+ if : ${{ matrix.meterpreter.name == 'mettle' && runner.os == 'macos' && (contains(github.event.issue.labels.*.name, 'payload-testing-mettle-branch')) }}
187+ run : |
188+ make TARGET=x86_64-apple-darwin
189+ rake build
190+ working-directory : mettle
191+
192+ - name : Checkout metasploit-framework code
133193 uses : actions/checkout@v4
194+ with :
195+ path : metasploit-framework
134196
135197 - name : Setup Ruby
136198 env :
@@ -140,11 +202,66 @@ jobs:
140202 ruby-version : ${{ matrix.ruby }}
141203 bundler-cache : true
142204 cache-version : 4
205+ working-directory : metasploit-framework
143206 # Github actions with Ruby requires Bundler 2.2.18+
144207 # https://github.com/ruby/setup-ruby/tree/d2b39ad0b52eca07d23f3aa14fdf2a3fcc1f411c#windows
145208 bundler : 2.2.33
146209
147- - name : acceptance
210+ - name : Move mettle gem into framework
211+ if : ${{ matrix.meterpreter.name == 'mettle' && (contains(github.event.issue.labels.*.name, 'mettle-testing-branch')) }}
212+ run : |
213+ cp ./mettle/pkg/metasploit_payloads-mettle-${{ env.METTLE_VERSION }}.pre.dev.gem ./metasploit-framework
214+ working-directory : metasploit-framework
215+
216+ - name : Install mettle gem
217+ if : ${{ matrix.meterpreter.name == 'mettle' && (contains(github.event.issue.labels.*.name, 'payload-testing-mettle-branch')) }}
218+ run : |
219+ set -x
220+ bundle exec gem install metasploit_payloads-mettle-${{ env.METTLE_VERSION }}.pre.dev.gem
221+ ruby -pi.bak -e "gsub(/'metasploit_payloads-mettle', '${{ env.METTLE_VERSION }}'/, '\'metasploit_payloads-mettle\', \'${{ env.METTLE_VERSION }}.pre.dev\'')" metasploit-framework.gemspec
222+ bundle config unset deployment
223+ bundle update metasploit_payloads-mettle
224+ bundle install
225+ working-directory : metasploit-framework
226+
227+ - name : Checkout metasploit-payloads
228+ if : contains(github.event.issue.labels.*.name, 'payload-testing-branch')
229+ uses : actions/checkout@v4
230+ with :
231+ repository : rapid7/metasploit-payloads
232+ path : metasploit-payloads
233+ ref : ${{ env.metasploitPayloadsCommit }}
234+
235+ - name : Build Java and Android payloads
236+ if : ${{ (matrix.meterpreter.name == 'java') && (runner.os != 'Windows') && (contains(github.event.issue.labels.*.name, 'payload-testing-branch')) }}
237+ run : |
238+ docker run --rm -w "$(pwd)" -v "$(pwd):$(pwd)" rapid7/msf-ubuntu-x64-meterpreter:latest /bin/bash -c "cd metasploit-payloads/java && make clean && make android && mvn -P deploy package"
239+
240+ - name : Build Windows payloads via Visual Studio 2019 Build (Windows)
241+ shell : cmd
242+ if : ${{ (runner.os == 'Windows') && (matrix.os == 'windows-2019') && (contains(github.event.issue.labels.*.name, 'payload-testing-branch')) }}
243+ run : |
244+ cd c/meterpreter
245+ git submodule init && git submodule update
246+ "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\Tools\VsDevCmd.bat" && make.bat
247+ working-directory : metasploit-payloads
248+
249+ - name : Build Windows payloads via Visual Studio 2022 Build (Windows)
250+ shell : cmd
251+ if : ${{ (runner.os == 'Windows') && (matrix.os == 'windows-2022') && (contains(github.event.issue.labels.*.name, 'payload-testing-branch'))}}
252+ run : |
253+ cd c/meterpreter
254+ git submodule init && git submodule update
255+ make.bat
256+ working-directory : metasploit-payloads
257+
258+ - name : Build PHP, Python and Windows payloads
259+ if : ${{ ((matrix.meterpreter.name == 'php') || (matrix.meterpreter.name == 'python') || (runner.os == 'Windows')) && (contains(github.event.issue.labels.*.name, 'payload-testing-branch'))}}
260+ run : |
261+ make install-php install-python install-windows
262+ working-directory : metasploit-payloads
263+
264+ - name : Acceptance
148265 env :
149266 SPEC_HELPER_LOAD_METASPLOIT : false
150267 SPEC_OPTS : " --tag acceptance --require acceptance_spec_helper.rb --color --format documentation --format AllureRspec::RSpecFormatter"
@@ -157,14 +274,15 @@ jobs:
157274 # Additionally - flakey tests should be fixed or marked as flakey instead of silently retried
158275 run : |
159276 bundle exec rspec spec/acceptance/meterpreter_spec.rb
277+ working-directory : metasploit-framework
160278
161279 - name : Archive results
162280 if : always()
163281 uses : actions/upload-artifact@v4
164282 with :
165283 # Provide a unique artifact for each matrix os, otherwise race conditions can lead to corrupt zips
166284 name : raw-data-${{ matrix.meterpreter.name }}-${{ matrix.meterpreter.runtime_version }}-${{ matrix.os }}
167- path : tmp/allure-raw-data
285+ path : metasploit-framework/ tmp/allure-raw-data
168286
169287 # Generate a final report from the previous test results
170288 report :
0 commit comments